Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- MasterChefX
- Optimization enabled
- false
- Compiler version
- v0.8.20+commit.a1b79de6
- EVM Version
- shanghai
- Verified at
- 2025-06-29T09:49:46.349027Z
Contract source code
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IERC20 {
function totalSupply() external view returns (uint256);
function name() external view returns(string memory);
function symbol() external view returns(string memory);
function decimals() external view returns (uint8);
function balanceOf(address account) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transfer(address recipient, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
interface IToken is IERC20 {
function mint(address _to, uint256 _amount) external;
function burn(uint256 _amount) external;
}
interface IOwnable {
function acceptOwnership() external;
function proposeNewOwner(address newOwner) external;
}
interface ISwapFactory {
function getPair(address tokenA, address tokenB) external view returns (address pair);
function createPair(address tokenA, address tokenB) external returns (address pair);
}
library Address {
function isContract(address account) internal view returns (bool) {
uint256 size;
assembly { size := extcodesize(account) }
return size > 0;
}
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");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
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");
}
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);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
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);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
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);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
library SafeMath {
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
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));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this;
return msg.data;
}
}
abstract contract Ownable is Context {
address private _owner;
address private _proposedOwner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
event NewOwnerProposed(address indexed proposedNewOwner);
error NotOwner();
error NotProposedOwner();
error SameAddress();
error ZeroAddress();
error NoOwnershipTransfer();
constructor () {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view virtual returns (address) {
return _owner;
}
function proposedNewOwner() public view returns (address) {
return _proposedOwner;
}
modifier onlyOwner() {
if(_msgSender() != owner()) revert NotOwner();
_;
}
modifier onlyProposedOwner() {
if (_msgSender() != proposedNewOwner()) revert NotProposedOwner();
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function proposeNewOwner(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) revert ZeroAddress();
if (newOwner == _owner) revert SameAddress();
emit NewOwnerProposed(newOwner);
_proposedOwner = newOwner;
}
function acceptOwnership() public virtual onlyProposedOwner {
if (_proposedOwner == address(0)) revert NoOwnershipTransfer();
emit OwnershipTransferred(_owner, _proposedOwner);
_owner = _proposedOwner;
_proposedOwner = address(0);
}
}
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
_;
_status = _NOT_ENTERED;
}
}
contract MasterChefX is Ownable, ReentrancyGuard {
using SafeMath for uint256;
using SafeERC20 for IERC20;
// Modifier: isLaunched - this helps to allow for setup prior to launch
modifier isLaunched() {
require(setupMode == false || msg.sender == deployer, "SETUP_MODE_ENGAGED");
_;
}
///////////////////////////////
// CONFIGURABLES & VARIABLES //
///////////////////////////////
address public feeRecipient; // Where the deposit/withdraw fees on LP Pools go
bool public setupMode; // Whether or not the contract is in setup mode
uint256 public yieldPerSecond; // How many YIELD per second to emit for rewards
uint256 public totalAllocPoint; // Total allocPts between all pools
////////////////////////////
// CONSTANTS & IMMUTABLES //
////////////////////////////
ISwapFactory public constant PulseXV2Factory = ISwapFactory(0x29eA7545DEf87022BAdc76323F373EA1e707C523);
IERC20 public constant gem = IERC20(ISLAND);
IToken public constant rewards = IToken(YIELD);
address public constant PLSX = 0x95B303987A60C71504D99Aa1b13B4DA07b0790ab;
address public constant DAI = 0xefD766cCb38EaF1dfd701853BFCe31359239F305;
address public constant WPLS = 0xA1077a294dDE1B09bB078844df40758a5D0f9a27;
address public constant ISLAND = 0xDFB10795E6fE7D0Db68F9778Ba4C575a28E8Cd4c;
address public constant YIELD = 0xfc56F3098533446b2226E9D526780cF40018D4c4;
uint16 public constant maxFeePercentage = 500; // 5% fee on deposit/withdraw, maximum.
uint256 public constant lockPeriod = 4 weeks;
address public immutable deployer;
uint256 public immutable startTime;
///////////////////////////////
// DATA STRUCTURES & STORAGE //
///////////////////////////////
// Info of each stake.
struct StakeInfo {
uint256 amount;
uint256 stakeTime;
}
// Info of each user.
struct UserInfo {
uint256 amount;
uint256 rewardDebt;
}
// Ref reward info.
struct RewardInfo {
uint256 pending;
uint256 total;
}
// Info of each pool.
struct PoolInfo {
IERC20 lpToken; // Address of LP token contract.
uint256 allocPoint; // How many allocation points assigned to this pool.
uint256 lockThreshold; // How much ISLAND must be locked to have no fees on this pool.
uint256 lastRewardTime; // Last time that YIELD distribution occurs.
uint256 accYieldPerShare; // Accumulated YIELD per share, times 1e12. See below.
}
PoolInfo[] public poolInfo;
mapping (address => StakeInfo) public stakeData;
mapping (address => RewardInfo) public rewardData;
mapping (address => bool) public poolExists;
mapping (uint256 => mapping (address => UserInfo)) public userInfo;
/////////////////////
// CONTRACT EVENTS //
/////////////////////
event Claim(address indexed user, uint256 amount);
event Stake(address indexed user, uint256 amountOut);
event Unstake(address indexed user, uint256 amountOut);
event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
event Exit(address indexed user, uint256 indexed pid, uint256 amount);
event FeeCollected(address indexed recipient, uint256 amount, uint256 pid);
event PoolAdded(uint256 indexed pid, address lpToken, uint256 allocPoint, uint256 lockThreshold);
event updatedAllocPts(uint256 indexed pid, uint256 oldAllocPoint, uint256 newAllocPoint);
event updatedEmissions(uint256 oldYieldPerSecond, uint256 newYieldPerSecond);
event updatedLockThreshold(uint256 poolId, uint16 threshold);
event updatedFeeRecipient(address oldRecipient, address newRecipient);
event LFG_WAGMI_FAM();
////////////////////////////
// CONSTRUCTOR & FALLBACK //
////////////////////////////
constructor() {
yieldPerSecond = 1e15; // Should be 0.001 YIELD per second
deployer = msg.sender;
feeRecipient = msg.sender;
startTime = block.timestamp;
setupMode = true;
}
////////////////////
// VIEW FUNCTIONS //
////////////////////
// Get how many pools there are in total
function poolLength() external view returns (uint256) {
return poolInfo.length;
}
// Get reward multiplier over the given _from to _to time
function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) {
_from = _from > startTime ? _from : startTime;
if (_to < startTime) {
return 0;
}
return _to - _from;
}
// Get potential referral bonus
function getReferralBonus(uint256 _rewards) public pure returns (uint256) {
return ((_rewards * 300) / 10000);
}
// Get dynamic fee bp rate based on amount locked
function getDynamicFeeBP(uint256 _pid, address _user) public view returns (uint16) {
StakeInfo storage stakeInfo = stakeData[_user];
PoolInfo storage pool = poolInfo[_pid];
uint256 userLocked = stakeInfo.amount;
uint256 requiredAmt = pool.lockThreshold;
if (requiredAmt == 0 || userLocked >= requiredAmt) {
return 0;
}
userLocked = SafeMath.min(userLocked, requiredAmt);
uint256 feeBP = uint256(maxFeePercentage)
.mul(requiredAmt.sub(userLocked))
.div(requiredAmt);
return uint16(feeBP);
}
// Calculate the fees on an amount for a particular address
function getAmountWithFees(uint256 _pid, address _user, uint256 _amountIn) public view returns (uint256 feeAmount, uint256 amountAfterFees) {
if (isExcludedFromFees(_pid, _user)) {
return (0, _amountIn);
}
uint256 _feeAmount = (_amountIn.mul(getDynamicFeeBP(_pid, _user))).div(10000);
uint256 _amountOut = _amountIn.sub(_feeAmount);
return (_feeAmount, _amountOut);
}
// Get pending YIELD of an address in a pool
function pendingYield(uint256 _pid, address _user) external view returns (uint256) {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][_user];
uint256 accYieldPerShare = pool.accYieldPerShare;
uint256 lpSupply = pool.lpToken.balanceOf(address(this));
if (block.timestamp > pool.lastRewardTime && lpSupply != 0) {
uint256 multiplier = getMultiplier(pool.lastRewardTime, block.timestamp);
uint256 yieldReward = multiplier.mul(yieldPerSecond).mul(pool.allocPoint).div(totalAllocPoint);
accYieldPerShare = accYieldPerShare.add(yieldReward.mul(1e12).div(lpSupply));
}
return user.amount.mul(accYieldPerShare).div(1e12).sub(user.rewardDebt);
}
// Get pending referral rewards for a user
function pendingRewards(address _user) external view returns (RewardInfo memory) {
return rewardData[_user];
}
// Get staked tokens of an address
function lockedTokens(address _user) external view returns (uint256) {
return stakeData[_user].amount;
}
// Get time till unlock of staked tokens
function timeToUnlock(address _user) external view returns (uint256 timeRemaining) {
StakeInfo memory _stake = stakeData[_user];
// If no stake exists, or stake amount is zero, return 0
if (_stake.amount == 0) return 0;
// If current time is before stake time (shouldn't happen, but safe fallback)
if (block.timestamp < _stake.stakeTime) return 0;
uint256 elapsedTime = block.timestamp - _stake.stakeTime;
// If lock already expired
if (elapsedTime >= lockPeriod) return 0;
// Return remaining lock time
return lockPeriod - elapsedTime;
}
// Check if an address is excluded from fees
function isExcludedFromFees(uint256 _pid, address _user) public view returns (bool excluded) {
excluded = (stakeData[_user].amount >= poolInfo[_pid].lockThreshold);
}
/////////////////////
// WRITE FUNCTIONS //
/////////////////////
// Update a batch of the pools - mitigates gas issues if too many pools
function updatePoolsBatch(uint256 startIdx, uint256 endIdx) external {
require(endIdx < poolInfo.length, "End index out of bounds");
for (uint256 pid = startIdx; pid <= endIdx; ++pid) {
updatePool(pid);
}
}
// Update reward variables for all pools. Be careful of gas spending!
function massUpdatePools() public {
uint256 length = poolInfo.length;
for (uint256 pid = 0; pid < length; ++pid) {
updatePool(pid);
}
}
// Update reward variables of the given pool to be up-to-date.
function updatePool(uint256 _pid) public {
PoolInfo storage pool = poolInfo[_pid];
if (block.timestamp <= pool.lastRewardTime) {
return;
}
uint256 lpSupply = pool.lpToken.balanceOf(address(this));
if (lpSupply == 0) {
pool.lastRewardTime = block.timestamp;
return;
}
uint256 multiplier = getMultiplier(pool.lastRewardTime, block.timestamp);
uint256 yieldReward = multiplier.mul(yieldPerSecond).mul(pool.allocPoint).div(totalAllocPoint);
pool.accYieldPerShare = pool.accYieldPerShare.add(yieldReward.mul(1e12).div(lpSupply));
pool.lastRewardTime = block.timestamp;
}
// Deposit LP tokens to MasterChef for YIELD allocation.
function deposit(address _referrer, uint256 _pid, uint256 _amount) public isLaunched nonReentrant {
require(_pid < poolInfo.length, "Pool does not exist");
if (_referrer == address(0) || _referrer == msg.sender) {
_referrer = deployer;
}
// Effects - update state
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
updatePool(_pid);
uint256 pending = user.amount.mul(pool.accYieldPerShare).div(1e12).sub(user.rewardDebt);
(uint256 feeAmount, uint256 amountOut) = getAmountWithFees(_pid, msg.sender, _amount);
user.amount = user.amount.add(amountOut);
user.rewardDebt = user.amount.mul(pool.accYieldPerShare).div(1e12);
// Interactions - external calls
pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount);
if (feeAmount > 0) {
pool.lpToken.safeTransfer(address(feeRecipient), feeAmount);
emit FeeCollected(feeRecipient, feeAmount, _pid);
}
if(pending > 0) {
rewards.mint(msg.sender, pending);
}
uint256 refBonus = getReferralBonus(pending);
if (refBonus > 0) {
_credit(_referrer, refBonus);
}
emit Deposit(msg.sender, _pid, _amount);
}
// Withdraw LP tokens from MasterChef.
function withdraw(address _referrer, uint256 _pid, uint256 _amount) public nonReentrant {
require(_pid < poolInfo.length, "Pool does not exist");
// Checks
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
require(user.amount >= _amount, "withdraw: not good");
if (_referrer == address(0) || _referrer == msg.sender) {
_referrer = deployer;
}
// Effects - update state
updatePool(_pid);
uint256 pending = user.amount.mul(pool.accYieldPerShare).div(1e12).sub(user.rewardDebt);
(uint256 feeAmount, uint256 amountOut) = getAmountWithFees(_pid, msg.sender, _amount);
user.amount = user.amount.sub(_amount);
user.rewardDebt = user.amount.mul(pool.accYieldPerShare).div(1e12);
// Interactions - external calls
pool.lpToken.safeTransfer(address(msg.sender), amountOut);
if (feeAmount > 0) {
pool.lpToken.safeTransfer(address(feeRecipient), feeAmount);
emit FeeCollected(feeRecipient, feeAmount, _pid);
}
if(pending > 0) {
rewards.mint(msg.sender, pending);
}
uint256 refBonus = getReferralBonus(pending);
if (refBonus > 0) {
_credit(_referrer, refBonus);
}
emit Withdraw(msg.sender, _pid, _amount);
}
// Stake tokens - lockPeriod starts over on deposit
function stake(uint256 _amountIn) public isLaunched nonReentrant {
StakeInfo storage _stake = stakeData[msg.sender];
// Sanity Checks
require(_amountIn > 0, "ZERO_AMOUNT_NOT_ALLOWED");
// Increase staked balance
_stake.amount = (_stake.amount).add(_amountIn);
// Set the time of last stake() for caller
_stake.stakeTime = block.timestamp;
// Collect gem from caller
gem.safeTransferFrom(msg.sender, address(this), _amountIn);
// Tell the network
emit Stake(msg.sender, _amountIn);
}
// Unstake tokens - only once lockPeriod has elapsed
function unstake() public nonReentrant returns (uint256 _amountOut) {
StakeInfo storage _stake = stakeData[msg.sender];
// Sanity checks
require(_stake.amount > 0, "ZERO_AMOUNT_NOT_ALLOWED");
// Calculate lockPeriod and the time since lock
uint256 sinceLock = (block.timestamp).sub(_stake.stakeTime);
require(sinceLock >= lockPeriod, "NOT_READY_TO_UNSTAKE_YET");
// Set amount out
_amountOut = _stake.amount;
// Update staked amount
_stake.amount = 0;
// Send stakedToken to the caller
gem.safeTransfer(msg.sender, _amountOut);
// Tell the network
emit Unstake(msg.sender, _amountOut);
}
// Claim Referral Rewards
function claimReferralRewards() public nonReentrant {
uint256 pending = 0;
RewardInfo memory data = rewardData[msg.sender];
if (data.pending > 0) {
pending = pending.add(data.pending);
_settle(msg.sender);
}
rewards.mint(msg.sender, pending);
emit Claim(msg.sender, pending);
}
// Withdraw without caring about rewards. EMERGENCY ONLY.
function emergencyWithdraw(uint256 _pid) public nonReentrant {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
uint oldUserAmount = user.amount;
user.amount = 0;
user.rewardDebt = 0;
pool.lpToken.safeTransfer(address(msg.sender), oldUserAmount);
emit Exit(msg.sender, _pid, oldUserAmount);
}
//////////////////////////
// RESTRICTED FUNCTIONS //
//////////////////////////
// Changes YIELD token reward per second
// Good practice to update pools without messing up the contract
function setYieldPerSecond(uint256 _yieldPerSecond) external onlyOwner {
uint256 oldValue = yieldPerSecond;
require(_yieldPerSecond < oldValue, "ONLY_DECREASES");
massUpdatePools();
yieldPerSecond = _yieldPerSecond;
emit updatedEmissions(oldValue, _yieldPerSecond);
}
// Add a new lp to the pool. Can only be called by the owner.
function addNewPool(uint256 _lockThreshold, uint256 _allocPoint, IERC20 _lpToken) external onlyOwner {
require(poolExists[address(_lpToken)] == false, "ALREADY_EXISTS");
_addPool(_lpToken, _lockThreshold, _allocPoint);
emit PoolAdded(poolInfo.length - 1, address(_lpToken), _allocPoint, _lockThreshold);
}
// Update the given pool's YIELD allocation point. Can only be called by the owner.
function setPoolAllocPts(uint256 _pid, uint256 _allocPoint) external onlyOwner {
uint256 oldAllocPoint = poolInfo[_pid].allocPoint;
if (poolInfo[_pid].allocPoint > _allocPoint) {
require(totalAllocPoint - (poolInfo[_pid].allocPoint - _allocPoint) > 0, "add: can't set totalAllocPoint to 0!!");
}
massUpdatePools();
totalAllocPoint = (totalAllocPoint.sub(poolInfo[_pid].allocPoint)).add(_allocPoint);
poolInfo[_pid].allocPoint = _allocPoint;
emit updatedAllocPts(_pid, oldAllocPoint, _allocPoint);
}
// Set the lock threshold
function setLockThreshold(uint256 _pid, uint16 _threshold) external onlyOwner {
require(_threshold < gem.totalSupply(), "THRESHOLD_EXCEEDS_SUPPLY");
poolInfo[_pid].lockThreshold = _threshold;
emit updatedLockThreshold(_pid, _threshold);
}
// Accept control of the mintable token
function control() external onlyOwner {
IOwnable(YIELD).acceptOwnership();
}
// Release control of the mintable token
function release() external onlyOwner {
IOwnable(YIELD).proposeNewOwner(owner());
}
// LAUNCH THE FARM
function launch() external onlyOwner {
require(setupMode == true, "ONLY_IN_SETUP");
// Get pair addresses
address yieldWplsLP = PulseXV2Factory.getPair(YIELD, WPLS); // Get YIELD-WPLS LP address
address yieldPlsxLP = PulseXV2Factory.getPair(YIELD, PLSX); // Get YIELD-PLSX LP address
address yieldDaiLP = PulseXV2Factory.getPair(YIELD, DAI); // Get YIELD-DAI LP address
// LP Token, Lock Requirement, AllocPts, Deposit Fee, Withdraw Fee
_addPool(IERC20(yieldWplsLP), 300e18, 1000);
_addPool(IERC20(yieldPlsxLP), 300e18, 1000);
_addPool(IERC20(yieldDaiLP), 300e18, 1000);
// Liquidity Setup
rewards.mint(msg.sender, 86.4 ether);
// Team Rewards - one day's worth of rewards each
rewards.mint(0x19Bb40BC1f5b6c9ADFA29Cb7DbdaBE66C2aD9151, 86.4 ether);
rewards.mint(0x19C1BB001fAa97bD0a07AC75719F380787Ae4759, 86.4 ether);
rewards.mint(0xc600D3e564adF666614fb81834BDfED3D75Be1E4, 86.4 ether);
_launch();
emit LFG_WAGMI_FAM();
}
// Set the fee recipient
function setFeeRecipient(address newRecipient) external onlyOwner {
require(newRecipient != address(0), "YEAH_NAH_MATE");
address oldRecipient = feeRecipient;
feeRecipient = newRecipient;
emit updatedFeeRecipient(oldRecipient, newRecipient);
}
////////////////////////
// INTERNAL FUNCTIONS //
////////////////////////
function _launch() internal {
setupMode = false;
}
function _addPool(IERC20 _lpToken, uint256 _lockThreshold, uint256 _allocPoint) internal {
massUpdatePools();
uint256 lastRewardTime = block.timestamp > startTime ? block.timestamp : startTime;
totalAllocPoint = totalAllocPoint.add(_allocPoint);
poolInfo.push(PoolInfo({
lpToken: _lpToken,
allocPoint: _allocPoint,
lastRewardTime: lastRewardTime,
lockThreshold: _lockThreshold,
accYieldPerShare: 0
}));
poolExists[address(_lpToken)] = true;
}
function _credit(address _user, uint256 _amount) internal {
rewardData[_user].pending += _amount;
rewardData[_user].total += _amount;
}
function _settle(address _user) internal {
rewardData[_user].pending = 0;
}
}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"error","name":"NoOwnershipTransfer","inputs":[]},{"type":"error","name":"NotOwner","inputs":[]},{"type":"error","name":"NotProposedOwner","inputs":[]},{"type":"error","name":"SameAddress","inputs":[]},{"type":"error","name":"ZeroAddress","inputs":[]},{"type":"event","name":"Claim","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Deposit","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Exit","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"FeeCollected","inputs":[{"type":"address","name":"recipient","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"pid","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LFG_WAGMI_FAM","inputs":[],"anonymous":false},{"type":"event","name":"NewOwnerProposed","inputs":[{"type":"address","name":"proposedNewOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"PoolAdded","inputs":[{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"address","name":"lpToken","internalType":"address","indexed":false},{"type":"uint256","name":"allocPoint","internalType":"uint256","indexed":false},{"type":"uint256","name":"lockThreshold","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Stake","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amountOut","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Unstake","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amountOut","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Withdraw","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"updatedAllocPts","inputs":[{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"oldAllocPoint","internalType":"uint256","indexed":false},{"type":"uint256","name":"newAllocPoint","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"updatedEmissions","inputs":[{"type":"uint256","name":"oldYieldPerSecond","internalType":"uint256","indexed":false},{"type":"uint256","name":"newYieldPerSecond","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"updatedFeeRecipient","inputs":[{"type":"address","name":"oldRecipient","internalType":"address","indexed":false},{"type":"address","name":"newRecipient","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"updatedLockThreshold","inputs":[{"type":"uint256","name":"poolId","internalType":"uint256","indexed":false},{"type":"uint16","name":"threshold","internalType":"uint16","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"DAI","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ISLAND","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"PLSX","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ISwapFactory"}],"name":"PulseXV2Factory","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"WPLS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"YIELD","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"acceptOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addNewPool","inputs":[{"type":"uint256","name":"_lockThreshold","internalType":"uint256"},{"type":"uint256","name":"_allocPoint","internalType":"uint256"},{"type":"address","name":"_lpToken","internalType":"contract IERC20"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimReferralRewards","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"control","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"deployer","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deposit","inputs":[{"type":"address","name":"_referrer","internalType":"address"},{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"emergencyWithdraw","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"feeRecipient","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"gem","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"feeAmount","internalType":"uint256"},{"type":"uint256","name":"amountAfterFees","internalType":"uint256"}],"name":"getAmountWithFees","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"address","name":"_user","internalType":"address"},{"type":"uint256","name":"_amountIn","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"getDynamicFeeBP","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getMultiplier","inputs":[{"type":"uint256","name":"_from","internalType":"uint256"},{"type":"uint256","name":"_to","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getReferralBonus","inputs":[{"type":"uint256","name":"_rewards","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"excluded","internalType":"bool"}],"name":"isExcludedFromFees","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"launch","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lockPeriod","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lockedTokens","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"massUpdatePools","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"maxFeePercentage","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct MasterChefX.RewardInfo","components":[{"type":"uint256","name":"pending","internalType":"uint256"},{"type":"uint256","name":"total","internalType":"uint256"}]}],"name":"pendingRewards","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"pendingYield","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"poolExists","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"lpToken","internalType":"contract IERC20"},{"type":"uint256","name":"allocPoint","internalType":"uint256"},{"type":"uint256","name":"lockThreshold","internalType":"uint256"},{"type":"uint256","name":"lastRewardTime","internalType":"uint256"},{"type":"uint256","name":"accYieldPerShare","internalType":"uint256"}],"name":"poolInfo","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"poolLength","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"proposeNewOwner","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"proposedNewOwner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"release","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"pending","internalType":"uint256"},{"type":"uint256","name":"total","internalType":"uint256"}],"name":"rewardData","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IToken"}],"name":"rewards","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeRecipient","inputs":[{"type":"address","name":"newRecipient","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLockThreshold","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"uint16","name":"_threshold","internalType":"uint16"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPoolAllocPts","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"uint256","name":"_allocPoint","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setYieldPerSecond","inputs":[{"type":"uint256","name":"_yieldPerSecond","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"setupMode","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"stake","inputs":[{"type":"uint256","name":"_amountIn","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"stakeTime","internalType":"uint256"}],"name":"stakeData","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"startTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"timeRemaining","internalType":"uint256"}],"name":"timeToUnlock","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalAllocPoint","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"_amountOut","internalType":"uint256"}],"name":"unstake","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updatePool","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updatePoolsBatch","inputs":[{"type":"uint256","name":"startIdx","internalType":"uint256"},{"type":"uint256","name":"endIdx","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"rewardDebt","internalType":"uint256"}],"name":"userInfo","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"address","name":"_referrer","internalType":"address"},{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"yieldPerSecond","inputs":[]}]
Contract Creation Code
0x60c060405234801562000010575f80fd5b505f620000226200017160201b60201c565b9050805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600160028190555066038d7ea4c680006004819055503373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250503360035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504260a081815250506001600360146101000a81548160ff02191690831515021790555062000178565b5f33905090565b60805160a05161524d620001d95f395f81816123cf015281816128bd015281816128e40152818161290e01528181613a690152613a9001525f8181611155015281816112e0015281816129ca01528181612fa00152613573015261524d5ff3fe608060405234801561000f575f80fd5b5060043610610325575f3560e01c806378e97925116101b6578063b5c5f67211610102578063d5f39488116100a0578063e0bab4c41161007a578063e0bab4c414610937578063e74b981b14610955578063ef8ef56f14610971578063fc2f3d821461098f57610325565b8063d5f39488146108f1578063d6d0883c1461090f578063d8de65871461092d57610325565b8063c50defb9116100dc578063c50defb91461086a578063c691d19114610886578063cc15f538146108b7578063cc4e2ec4146108d557610325565b8063b5c5f672146107ff578063ba05d4171461081b578063bf654aac1461084c57610325565b80638dbb1e3a1161016f578063a3cea33b11610149578063a3cea33b14610779578063a694fc3a14610797578063ad33e21d146107b3578063b1f8100d146107e357610325565b80638dbb1e3a146106fa57806393f1a40b1461072a5780639ec5a8941461075b57610325565b806378e979251461067057806379ba50971461068e5780637bd2bea7146106985780637c7de5e9146106b657806386d1a69f146106d25780638da5cb5b146106dc57610325565b806331d7a2621161027557806351eb05a61161022e5780635eb7413a116102085780635eb7413a1461060e578063630b5ba11461063e57806363dd9d7414610648578063715018a61461066657610325565b806351eb05a6146105ba5780635312ea8e146105d657806358a0a734146105f257610325565b806331d7a262146104bd5780633345d3d0146104ed5780633fd8b02f1461051d578063469048401461053b57806348e5d9f8146105595780634cf1bfe01461058a57610325565b80631526fe27116102e25780631dfa45e3116102bc5780631dfa45e3146104355780631e1c6a0714610453578063272183c9146104835780632def66201461049f57610325565b80631526fe27146103b357806317caf6f1146103e757806318952aff1461040557610325565b806301339c211461032957806305eaab4b14610333578063081e3eda1461033d5780630efe6a8b1461035b5780630fc8c4ed1461037757806313bf812614610395575b5f80fd5b6103316109bf565b005b61033b610f7e565b005b61034561112b565b6040516103529190614121565b60405180910390f35b610375600480360381019061037091906141c2565b611137565b005b61037f61166b565b60405161038c9190614221565b60405180910390f35b61039d611693565b6040516103aa9190614254565b60405180910390f35b6103cd60048036038101906103c8919061426d565b6116a6565b6040516103de9594939291906142f3565b60405180910390f35b6103ef611706565b6040516103fc9190614121565b60405180910390f35b61041f600480360381019061041a9190614344565b61170c565b60405161042c9190614254565b60405180910390f35b61043d61177b565b60405161044a9190614221565b60405180910390f35b61046d60048036038101906104689190614382565b611793565b60405161047a9190614254565b60405180910390f35b61049d6004803603810190610498919061426d565b6117b0565b005b6104a76118b7565b6040516104b49190614121565b60405180910390f35b6104d760048036038101906104d29190614382565b611a90565b6040516104e491906143e9565b60405180910390f35b61050760048036038101906105029190614382565b611afa565b6040516105149190614121565b60405180910390f35b610525611bc1565b6040516105329190614121565b60405180910390f35b610543611bc8565b6040516105509190614221565b60405180910390f35b610573600480360381019061056e9190614382565b611bed565b604051610581929190614402565b60405180910390f35b6105a4600480360381019061059f9190614344565b611c0d565b6040516105b19190614445565b60405180910390f35b6105d460048036038101906105cf919061426d565b611cfa565b005b6105f060048036038101906105eb919061426d565b611e8e565b005b61060c6004803603810190610607919061445e565b61200d565b005b61062860048036038101906106239190614382565b61220f565b6040516106359190614121565b60405180910390f35b610646612257565b005b610650612288565b60405161065d9190614221565b60405180910390f35b61066e6122a0565b005b6106786123cd565b6040516106859190614121565b60405180910390f35b6106966123f1565b005b6106a0612626565b6040516106ad919061449c565b60405180910390f35b6106d060048036038101906106cb91906144f0565b61263e565b005b6106da61279d565b005b6106e4612893565b6040516106f19190614221565b60405180910390f35b610714600480360381019061070f919061445e565b6128ba565b6040516107219190614121565b60405180910390f35b610744600480360381019061073f9190614344565b612951565b604051610752929190614402565b60405180910390f35b61076361297c565b6040516107709190614560565b60405180910390f35b610781612994565b60405161078e9190614221565b60405180910390f35b6107b160048036038101906107ac919061426d565b6129ac565b005b6107cd60048036038101906107c8919061426d565b612be5565b6040516107da9190614121565b60405180910390f35b6107fd60048036038101906107f89190614382565b612c08565b005b610819600480360381019061081491906141c2565b612dea565b005b61083560048036038101906108309190614579565b6132b7565b604051610843929190614402565b60405180910390f35b610854613331565b6040516108619190614445565b60405180910390f35b610884600480360381019061087f919061445e565b613337565b005b6108a0600480360381019061089b9190614382565b6133a9565b6040516108ae929190614402565b60405180910390f35b6108bf6133c9565b6040516108cc9190614121565b60405180910390f35b6108ef60048036038101906108ea91906145f3565b6133cf565b005b6108f9613571565b6040516109069190614221565b60405180910390f35b610917613595565b6040516109249190614651565b60405180910390f35b6109356135ad565b005b61093f613691565b60405161094c9190614221565b60405180910390f35b61096f600480360381019061096a9190614382565b6136a9565b005b61097961382c565b6040516109869190614221565b60405180910390f35b6109a960048036038101906109a49190614344565b613844565b6040516109b69190614121565b60405180910390f35b6109c7612893565b73ffffffffffffffffffffffffffffffffffffffff166109e5613a57565b73ffffffffffffffffffffffffffffffffffffffff1614610a32576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60011515600360149054906101000a900460ff16151514610a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7f906146c4565b60405180910390fd5b5f7329ea7545def87022badc76323f373ea1e707c52373ffffffffffffffffffffffffffffffffffffffff1663e6a4390573fc56f3098533446b2226e9d526780cf40018d4c473a1077a294dde1b09bb078844df40758a5d0f9a276040518363ffffffff1660e01b8152600401610b009291906146e2565b602060405180830381865afa158015610b1b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3f919061471d565b90505f7329ea7545def87022badc76323f373ea1e707c52373ffffffffffffffffffffffffffffffffffffffff1663e6a4390573fc56f3098533446b2226e9d526780cf40018d4c47395b303987a60c71504d99aa1b13b4da07b0790ab6040518363ffffffff1660e01b8152600401610bb99291906146e2565b602060405180830381865afa158015610bd4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf8919061471d565b90505f7329ea7545def87022badc76323f373ea1e707c52373ffffffffffffffffffffffffffffffffffffffff1663e6a4390573fc56f3098533446b2226e9d526780cf40018d4c473efd766ccb38eaf1dfd701853bfce31359239f3056040518363ffffffff1660e01b8152600401610c729291906146e2565b602060405180830381865afa158015610c8d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb1919061471d565b9050610cc983681043561a88293000006103e8613a5e565b610cdf82681043561a88293000006103e8613a5e565b610cf581681043561a88293000006103e8613a5e565b73fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f19336804af0a763bb1c000006040518363ffffffff1660e01b8152600401610d4d929190614781565b5f604051808303815f87803b158015610d64575f80fd5b505af1158015610d76573d5f803e3d5ffd5b5050505073fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f197319bb40bc1f5b6c9adfa29cb7dbdabe66c2ad91516804af0a763bb1c000006040518363ffffffff1660e01b8152600401610de6929190614781565b5f604051808303815f87803b158015610dfd575f80fd5b505af1158015610e0f573d5f803e3d5ffd5b5050505073fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f197319c1bb001faa97bd0a07ac75719f380787ae47596804af0a763bb1c000006040518363ffffffff1660e01b8152600401610e7f929190614781565b5f604051808303815f87803b158015610e96575f80fd5b505af1158015610ea8573d5f803e3d5ffd5b5050505073fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f1973c600d3e564adf666614fb81834bdfed3d75be1e46804af0a763bb1c000006040518363ffffffff1660e01b8152600401610f18929190614781565b5f604051808303815f87803b158015610f2f575f80fd5b505af1158015610f41573d5f803e3d5ffd5b50505050610f4d613c01565b7f452fb855fd3c6f57cc821ebea14d1467b0773817c62e449a071b1ea92ef0d3af60405160405180910390a1505050565b6002805403610fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb9906147f2565b60405180910390fd5b600280819055505f8060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f820154815260200160018201548152505090505f815f0151111561105557611049815f015183613c1d90919063ffffffff16565b915061105433613c32565b5b73fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f1933846040518363ffffffff1660e01b81526004016110a4929190614810565b5f604051808303815f87803b1580156110bb575f80fd5b505af11580156110cd573d5f803e3d5ffd5b505050503373ffffffffffffffffffffffffffffffffffffffff167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4836040516111179190614121565b60405180910390a250506001600281905550565b5f600680549050905090565b5f1515600360149054906101000a900460ff16151514806111a357507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d990614881565b60405180910390fd5b6002805403611226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121d906147f2565b60405180910390fd5b600280819055506006805490508210611274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126b906148e9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806112d957503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15611302577f000000000000000000000000000000000000000000000000000000000000000092505b5f6006838154811061131757611316614907565b5b905f5260205f20906005020190505f600a5f8581526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20905061137d84611cfa565b5f6113c582600101546113b764e8d4a510006113a98760040154875f0154613c7990919063ffffffff16565b613c8e90919063ffffffff16565b613ca390919063ffffffff16565b90505f806113d48733886132b7565b915091506113ee81855f0154613c1d90919063ffffffff16565b845f018190555061142664e8d4a510006114188760040154875f0154613c7990919063ffffffff16565b613c8e90919063ffffffff16565b846001018190555061147d333088885f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613cb8909392919063ffffffff16565b5f821115611565576114f360035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683875f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d419092919063ffffffff16565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f108516ddcf5ba43cea6bb2cd5ff6d59ac196c1c86ccb9178332b9dd72d1ca561838960405161155c929190614402565b60405180910390a25b5f8311156115ea5773fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f1933856040518363ffffffff1660e01b81526004016115bc929190614810565b5f604051808303815f87803b1580156115d3575f80fd5b505af11580156115e5573d5f803e3d5ffd5b505050505b5f6115f484612be5565b90505f811115611609576116088982613dc7565b5b873373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15896040516116509190614121565b60405180910390a35050505050506001600281905550505050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600360149054906101000a900460ff1681565b600681815481106116b5575f80fd5b905f5260205f2090600502015f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154905085565b60055481565b5f6006838154811061172157611720614907565b5b905f5260205f2090600502016002015460075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01541015905092915050565b73fc56f3098533446b2226e9d526780cf40018d4c481565b6009602052805f5260405f205f915054906101000a900460ff1681565b6117b8612893565b73ffffffffffffffffffffffffffffffffffffffff166117d6613a57565b73ffffffffffffffffffffffffffffffffffffffff1614611823576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600454905080821061186b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118629061497e565b60405180910390fd5b611873612257565b816004819055507f989a45b2e873512536614a9a484c6f002cd3a63f7c726fb049f9a890e5d4e75681836040516118ab929190614402565b60405180910390a15050565b5f60028054036118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f3906147f2565b60405180910390fd5b600280819055505f60075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f815f015411611988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197f906149e6565b60405180910390fd5b5f6119a0826001015442613ca390919063ffffffff16565b90506224ea008110156119e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119df90614a4e565b60405180910390fd5b815f015492505f825f0181905550611a35338473dfb10795e6fe7d0db68f9778ba4c575a28e8cd4c73ffffffffffffffffffffffffffffffffffffffff16613d419092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd84604051611a7b9190614121565b60405180910390a25050600160028190555090565b611a986140f1565b60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f82015481526020016001820154815250509050919050565b5f8060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f820154815260200160018201548152505090505f815f015103611b6c575f915050611bbc565b8060200151421015611b81575f915050611bbc565b5f816020015142611b929190614a99565b90506224ea008110611ba8575f92505050611bbc565b806224ea00611bb79190614a99565b925050505b919050565b6224ea0081565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6008602052805f5260405f205f91509050805f0154908060010154905082565b5f8060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f60068581548110611c6357611c62614907565b5b905f5260205f20906005020190505f825f015490505f826002015490505f811480611c8e5750808210155b15611c9f575f945050505050611cf4565b611ca98282613e76565b91505f611ce982611cdb611cc68686613ca390919063ffffffff16565b6101f461ffff16613c7990919063ffffffff16565b613c8e90919063ffffffff16565b905080955050505050505b92915050565b5f60068281548110611d0f57611d0e614907565b5b905f5260205f209060050201905080600301544211611d2e5750611e8b565b5f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611d8a9190614221565b602060405180830381865afa158015611da5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc99190614ae0565b90505f8103611de2574282600301819055505050611e8b565b5f611df18360030154426128ba565b90505f611e33600554611e258660010154611e1760045487613c7990919063ffffffff16565b613c7990919063ffffffff16565b613c8e90919063ffffffff16565b9050611e75611e6284611e5464e8d4a5100085613c7990919063ffffffff16565b613c8e90919063ffffffff16565b8560040154613c1d90919063ffffffff16565b8460040181905550428460030181905550505050505b50565b6002805403611ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec9906147f2565b60405180910390fd5b600280819055505f60068281548110611eee57611eed614907565b5b905f5260205f20906005020190505f600a5f8481526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f815f015490505f825f01819055505f8260010181905550611fb03382855f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d419092919063ffffffff16565b833373ffffffffffffffffffffffffffffffffffffffff167fbe0b6e5b3195df91f2e6b2b20501f84b085714f9e38073f499073c830565100983604051611ff79190614121565b60405180910390a3505050600160028190555050565b612015612893565b73ffffffffffffffffffffffffffffffffffffffff16612033613a57565b73ffffffffffffffffffffffffffffffffffffffff1614612080576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6006838154811061209557612094614907565b5b905f5260205f20906005020160010154905081600684815481106120bc576120bb614907565b5b905f5260205f209060050201600101541115612150575f82600685815481106120e8576120e7614907565b5b905f5260205f209060050201600101546121029190614a99565b60055461210f9190614a99565b1161214f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214690614b7b565b60405180910390fd5b5b612158612257565b6121a2826121946006868154811061217357612172614907565b5b905f5260205f20906005020160010154600554613ca390919063ffffffff16565b613c1d90919063ffffffff16565b60058190555081600684815481106121bd576121bc614907565b5b905f5260205f20906005020160010181905550827fab80a6685d88709a4e48d135d00c13ae6734f7563446d4ad4d132c67e9a627238284604051612202929190614402565b60405180910390a2505050565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01549050919050565b5f60068054905090505f5b818110156122845761227381611cfa565b8061227d90614b99565b9050612262565b5050565b7395b303987a60c71504d99aa1b13b4da07b0790ab81565b6122a8612893565b73ffffffffffffffffffffffffffffffffffffffff166122c6613a57565b73ffffffffffffffffffffffffffffffffffffffff1614612313576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b6123f961166b565b73ffffffffffffffffffffffffffffffffffffffff16612417613a57565b73ffffffffffffffffffffffffffffffffffffffff1614612464576040517f0f22ca5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036124ea576040517fec901e9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b73dfb10795e6fe7d0db68f9778ba4c575a28e8cd4c81565b612646612893565b73ffffffffffffffffffffffffffffffffffffffff16612664613a57565b73ffffffffffffffffffffffffffffffffffffffff16146126b1576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f151560095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151514612740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273790614c2a565b60405180910390fd5b61274b818484613a5e565b600160068054905061275d9190614a99565b7fcf71df2ad8f5180eea605cc5f16399aa74e3a68b2f23a5da121923b71b2ec36d82848660405161279093929190614c48565b60405180910390a2505050565b6127a5612893565b73ffffffffffffffffffffffffffffffffffffffff166127c3613a57565b73ffffffffffffffffffffffffffffffffffffffff1614612810576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff1663b1f8100d612848612893565b6040518263ffffffff1660e01b81526004016128649190614221565b5f604051808303815f87803b15801561287b575f80fd5b505af115801561288d573d5f803e3d5ffd5b50505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f7f00000000000000000000000000000000000000000000000000000000000000008311612908577f000000000000000000000000000000000000000000000000000000000000000061290a565b825b92507f000000000000000000000000000000000000000000000000000000000000000082101561293c575f905061294b565b82826129489190614a99565b90505b92915050565b600a602052815f5260405f20602052805f5260405f205f9150915050805f0154908060010154905082565b73fc56f3098533446b2226e9d526780cf40018d4c481565b73dfb10795e6fe7d0db68f9778ba4c575a28e8cd4c81565b5f1515600360149054906101000a900460ff1615151480612a1857507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4e90614881565b60405180910390fd5b6002805403612a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a92906147f2565b60405180910390fd5b600280819055505f60075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f8211612b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1b906149e6565b60405180910390fd5b612b3a82825f0154613c1d90919063ffffffff16565b815f0181905550428160010181905550612b8b33308473dfb10795e6fe7d0db68f9778ba4c575a28e8cd4c73ffffffffffffffffffffffffffffffffffffffff16613cb8909392919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a83604051612bd19190614121565b60405180910390a250600160028190555050565b5f61271061012c83612bf79190614c7d565b612c019190614ceb565b9050919050565b612c10612893565b73ffffffffffffffffffffffffffffffffffffffff16612c2e613a57565b73ffffffffffffffffffffffffffffffffffffffff1614612c7b576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ce0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612d64576040517f367558c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167fa50821a7869f90dcef86915c08ff04d916de378b5eadd9a9009e619f3b9b939060405160405180910390a28060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002805403612e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e25906147f2565b60405180910390fd5b600280819055506006805490508210612e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e73906148e9565b60405180910390fd5b5f60068381548110612e9157612e90614907565b5b905f5260205f20906005020190505f600a5f8581526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20905082815f01541015612f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2b90614d65565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612f9957503373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15612fc2577f000000000000000000000000000000000000000000000000000000000000000094505b612fcb84611cfa565b5f613013826001015461300564e8d4a51000612ff78760040154875f0154613c7990919063ffffffff16565b613c8e90919063ffffffff16565b613ca390919063ffffffff16565b90505f806130228733886132b7565b9150915061303c86855f0154613ca390919063ffffffff16565b845f018190555061307464e8d4a510006130668760040154875f0154613c7990919063ffffffff16565b613c8e90919063ffffffff16565b84600101819055506130c93382875f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d419092919063ffffffff16565b5f8211156131b15761313f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683875f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d419092919063ffffffff16565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f108516ddcf5ba43cea6bb2cd5ff6d59ac196c1c86ccb9178332b9dd72d1ca56183896040516131a8929190614402565b60405180910390a25b5f8311156132365773fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f1933856040518363ffffffff1660e01b8152600401613208929190614810565b5f604051808303815f87803b15801561321f575f80fd5b505af1158015613231573d5f803e3d5ffd5b505050505b5f61324084612be5565b90505f811115613255576132548982613dc7565b5b873373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5688960405161329c9190614121565b60405180910390a35050505050506001600281905550505050565b5f806132c3858561170c565b156132d3575f8391509150613329565b5f6133086127106132fa6132e78989611c0d565b61ffff1687613c7990919063ffffffff16565b613c8e90919063ffffffff16565b90505f61331e8286613ca390919063ffffffff16565b905081819350935050505b935093915050565b6101f481565b600680549050811061337e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337590614dcd565b60405180910390fd5b5f8290505b8181116133a45761339381611cfa565b8061339d90614b99565b9050613383565b505050565b6007602052805f5260405f205f91509050805f0154908060010154905082565b60045481565b6133d7612893565b73ffffffffffffffffffffffffffffffffffffffff166133f5613a57565b73ffffffffffffffffffffffffffffffffffffffff1614613442576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73dfb10795e6fe7d0db68f9778ba4c575a28e8cd4c73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561349f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134c39190614ae0565b8161ffff1610613508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ff90614e35565b60405180910390fd5b8061ffff166006838154811061352157613520614907565b5b905f5260205f209060050201600201819055507f0d3990e156c26a5f3f1e69eb1940ca2e18d4e814e4cb8b9783e2472a10c7c6858282604051613565929190614e53565b60405180910390a15050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7329ea7545def87022badc76323f373ea1e707c52381565b6135b5612893565b73ffffffffffffffffffffffffffffffffffffffff166135d3613a57565b73ffffffffffffffffffffffffffffffffffffffff1614613620576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166379ba50976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613679575f80fd5b505af115801561368b573d5f803e3d5ffd5b50505050565b73efd766ccb38eaf1dfd701853bfce31359239f30581565b6136b1612893565b73ffffffffffffffffffffffffffffffffffffffff166136cf613a57565b73ffffffffffffffffffffffffffffffffffffffff161461371c576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361378a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161378190614ec4565b60405180910390fd5b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f69cca87270f7727b8fbdfefbbb549c52795cf9b87f29eb4b52a55c11a30a38f881836040516138209291906146e2565b60405180910390a15050565b73a1077a294dde1b09bb078844df40758a5d0f9a2781565b5f806006848154811061385a57613859614907565b5b905f5260205f20906005020190505f600a5f8681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f826004015490505f835f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161391b9190614221565b602060405180830381865afa158015613936573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061395a9190614ae0565b905083600301544211801561396f57505f8114155b15613a08575f6139838560030154426128ba565b90505f6139c56005546139b788600101546139a960045487613c7990919063ffffffff16565b613c7990919063ffffffff16565b613c8e90919063ffffffff16565b9050613a036139f4846139e664e8d4a5100085613c7990919063ffffffff16565b613c8e90919063ffffffff16565b85613c1d90919063ffffffff16565b935050505b613a4b8360010154613a3d64e8d4a51000613a2f86885f0154613c7990919063ffffffff16565b613c8e90919063ffffffff16565b613ca390919063ffffffff16565b94505050505092915050565b5f33905090565b613a66612257565b5f7f00000000000000000000000000000000000000000000000000000000000000004211613ab4577f0000000000000000000000000000000000000000000000000000000000000000613ab6565b425b9050613acd82600554613c1d90919063ffffffff16565b60058190555060066040518060a001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018581526020018381526020015f815250908060018154018082558091505060019003905f5260205f2090600502015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030155608082015181600401555050600160095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050505050565b5f600360146101000a81548160ff021916908315150217905550565b5f8183613c2a9190614ee2565b905092915050565b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f018190555050565b5f8183613c869190614c7d565b905092915050565b5f8183613c9b9190614ceb565b905092915050565b5f8183613cb09190614a99565b905092915050565b613d3b846323b872dd60e01b858585604051602401613cd993929190614f15565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613e8e565b50505050565b613dc28363a9059cbb60e01b8484604051602401613d60929190614810565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613e8e565b505050565b8060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f828254613e159190614ee2565b925050819055508060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015f828254613e6b9190614ee2565b925050819055505050565b5f818310613e845781613e86565b825b905092915050565b5f613eef826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613f539092919063ffffffff16565b90505f81511115613f4e5780806020019051810190613f0e9190614f74565b613f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f449061500f565b60405180910390fd5b5b505050565b6060613f6184845f85613f6a565b90509392505050565b606082471015613faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fa69061509d565b60405180910390fd5b613fb88561407a565b613ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fee90615105565b60405180910390fd5b5f808673ffffffffffffffffffffffffffffffffffffffff16858760405161401f919061518f565b5f6040518083038185875af1925050503d805f8114614059576040519150601f19603f3d011682016040523d82523d5f602084013e61405e565b606091505b509150915061406e82828661408b565b92505050949350505050565b5f80823b90505f8111915050919050565b6060831561409b578290506140ea565b5f835111156140ad5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140e191906151f7565b60405180910390fd5b9392505050565b60405180604001604052805f81526020015f81525090565b5f819050919050565b61411b81614109565b82525050565b5f6020820190506141345f830184614112565b92915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6141678261413e565b9050919050565b6141778161415d565b8114614181575f80fd5b50565b5f813590506141928161416e565b92915050565b6141a181614109565b81146141ab575f80fd5b50565b5f813590506141bc81614198565b92915050565b5f805f606084860312156141d9576141d861413a565b5b5f6141e686828701614184565b93505060206141f7868287016141ae565b9250506040614208868287016141ae565b9150509250925092565b61421b8161415d565b82525050565b5f6020820190506142345f830184614212565b92915050565b5f8115159050919050565b61424e8161423a565b82525050565b5f6020820190506142675f830184614245565b92915050565b5f602082840312156142825761428161413a565b5b5f61428f848285016141ae565b91505092915050565b5f819050919050565b5f6142bb6142b66142b18461413e565b614298565b61413e565b9050919050565b5f6142cc826142a1565b9050919050565b5f6142dd826142c2565b9050919050565b6142ed816142d3565b82525050565b5f60a0820190506143065f8301886142e4565b6143136020830187614112565b6143206040830186614112565b61432d6060830185614112565b61433a6080830184614112565b9695505050505050565b5f806040838503121561435a5761435961413a565b5b5f614367858286016141ae565b925050602061437885828601614184565b9150509250929050565b5f602082840312156143975761439661413a565b5b5f6143a484828501614184565b91505092915050565b6143b681614109565b82525050565b604082015f8201516143d05f8501826143ad565b5060208201516143e360208501826143ad565b50505050565b5f6040820190506143fc5f8301846143bc565b92915050565b5f6040820190506144155f830185614112565b6144226020830184614112565b9392505050565b5f61ffff82169050919050565b61443f81614429565b82525050565b5f6020820190506144585f830184614436565b92915050565b5f80604083850312156144745761447361413a565b5b5f614481858286016141ae565b9250506020614492858286016141ae565b9150509250929050565b5f6020820190506144af5f8301846142e4565b92915050565b5f6144bf8261415d565b9050919050565b6144cf816144b5565b81146144d9575f80fd5b50565b5f813590506144ea816144c6565b92915050565b5f805f606084860312156145075761450661413a565b5b5f614514868287016141ae565b9350506020614525868287016141ae565b9250506040614536868287016144dc565b9150509250925092565b5f61454a826142c2565b9050919050565b61455a81614540565b82525050565b5f6020820190506145735f830184614551565b92915050565b5f805f606084860312156145905761458f61413a565b5b5f61459d868287016141ae565b93505060206145ae86828701614184565b92505060406145bf868287016141ae565b9150509250925092565b6145d281614429565b81146145dc575f80fd5b50565b5f813590506145ed816145c9565b92915050565b5f80604083850312156146095761460861413a565b5b5f614616858286016141ae565b9250506020614627858286016145df565b9150509250929050565b5f61463b826142c2565b9050919050565b61464b81614631565b82525050565b5f6020820190506146645f830184614642565b92915050565b5f82825260208201905092915050565b7f4f4e4c595f494e5f5345545550000000000000000000000000000000000000005f82015250565b5f6146ae600d8361466a565b91506146b98261467a565b602082019050919050565b5f6020820190508181035f8301526146db816146a2565b9050919050565b5f6040820190506146f55f830185614212565b6147026020830184614212565b9392505050565b5f815190506147178161416e565b92915050565b5f602082840312156147325761473161413a565b5b5f61473f84828501614709565b91505092915050565b5f819050919050565b5f61476b61476661476184614748565b614298565b614109565b9050919050565b61477b81614751565b82525050565b5f6040820190506147945f830185614212565b6147a16020830184614772565b9392505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6147dc601f8361466a565b91506147e7826147a8565b602082019050919050565b5f6020820190508181035f830152614809816147d0565b9050919050565b5f6040820190506148235f830185614212565b6148306020830184614112565b9392505050565b7f53455455505f4d4f44455f454e474147454400000000000000000000000000005f82015250565b5f61486b60128361466a565b915061487682614837565b602082019050919050565b5f6020820190508181035f8301526148988161485f565b9050919050565b7f506f6f6c20646f6573206e6f74206578697374000000000000000000000000005f82015250565b5f6148d360138361466a565b91506148de8261489f565b602082019050919050565b5f6020820190508181035f830152614900816148c7565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4f4e4c595f4445435245415345530000000000000000000000000000000000005f82015250565b5f614968600e8361466a565b915061497382614934565b602082019050919050565b5f6020820190508181035f8301526149958161495c565b9050919050565b7f5a45524f5f414d4f554e545f4e4f545f414c4c4f5745440000000000000000005f82015250565b5f6149d060178361466a565b91506149db8261499c565b602082019050919050565b5f6020820190508181035f8301526149fd816149c4565b9050919050565b7f4e4f545f52454144595f544f5f554e5354414b455f59455400000000000000005f82015250565b5f614a3860188361466a565b9150614a4382614a04565b602082019050919050565b5f6020820190508181035f830152614a6581614a2c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614aa382614109565b9150614aae83614109565b9250828203905081811115614ac657614ac5614a6c565b5b92915050565b5f81519050614ada81614198565b92915050565b5f60208284031215614af557614af461413a565b5b5f614b0284828501614acc565b91505092915050565b7f6164643a2063616e27742073657420746f74616c416c6c6f63506f696e7420745f8201527f6f20302121000000000000000000000000000000000000000000000000000000602082015250565b5f614b6560258361466a565b9150614b7082614b0b565b604082019050919050565b5f6020820190508181035f830152614b9281614b59565b9050919050565b5f614ba382614109565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614bd557614bd4614a6c565b5b600182019050919050565b7f414c52454144595f4558495354530000000000000000000000000000000000005f82015250565b5f614c14600e8361466a565b9150614c1f82614be0565b602082019050919050565b5f6020820190508181035f830152614c4181614c08565b9050919050565b5f606082019050614c5b5f830186614212565b614c686020830185614112565b614c756040830184614112565b949350505050565b5f614c8782614109565b9150614c9283614109565b9250828202614ca081614109565b91508282048414831517614cb757614cb6614a6c565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614cf582614109565b9150614d0083614109565b925082614d1057614d0f614cbe565b5b828204905092915050565b7f77697468647261773a206e6f7420676f6f6400000000000000000000000000005f82015250565b5f614d4f60128361466a565b9150614d5a82614d1b565b602082019050919050565b5f6020820190508181035f830152614d7c81614d43565b9050919050565b7f456e6420696e646578206f7574206f6620626f756e64730000000000000000005f82015250565b5f614db760178361466a565b9150614dc282614d83565b602082019050919050565b5f6020820190508181035f830152614de481614dab565b9050919050565b7f5448524553484f4c445f455843454544535f535550504c5900000000000000005f82015250565b5f614e1f60188361466a565b9150614e2a82614deb565b602082019050919050565b5f6020820190508181035f830152614e4c81614e13565b9050919050565b5f604082019050614e665f830185614112565b614e736020830184614436565b9392505050565b7f594541485f4e41485f4d415445000000000000000000000000000000000000005f82015250565b5f614eae600d8361466a565b9150614eb982614e7a565b602082019050919050565b5f6020820190508181035f830152614edb81614ea2565b9050919050565b5f614eec82614109565b9150614ef783614109565b9250828201905080821115614f0f57614f0e614a6c565b5b92915050565b5f606082019050614f285f830186614212565b614f356020830185614212565b614f426040830184614112565b949350505050565b614f538161423a565b8114614f5d575f80fd5b50565b5f81519050614f6e81614f4a565b92915050565b5f60208284031215614f8957614f8861413a565b5b5f614f9684828501614f60565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f614ff9602a8361466a565b915061500482614f9f565b604082019050919050565b5f6020820190508181035f83015261502681614fed565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f61508760268361466a565b91506150928261502d565b604082019050919050565b5f6020820190508181035f8301526150b48161507b565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f6150ef601d8361466a565b91506150fa826150bb565b602082019050919050565b5f6020820190508181035f83015261511c816150e3565b9050919050565b5f81519050919050565b5f81905092915050565b5f5b83811015615154578082015181840152602081019050615139565b5f8484015250505050565b5f61516982615123565b615173818561512d565b9350615183818560208601615137565b80840191505092915050565b5f61519a828461515f565b915081905092915050565b5f81519050919050565b5f601f19601f8301169050919050565b5f6151c9826151a5565b6151d3818561466a565b93506151e3818560208601615137565b6151ec816151af565b840191505092915050565b5f6020820190508181035f83015261520f81846151bf565b90509291505056fea2646970667358221220f71a2fd8aa41e54ca35f87dbcd21782d475c5975dec4cb7b183b2b2018a58d5a64736f6c63430008140033
Deployed ByteCode
0x608060405234801561000f575f80fd5b5060043610610325575f3560e01c806378e97925116101b6578063b5c5f67211610102578063d5f39488116100a0578063e0bab4c41161007a578063e0bab4c414610937578063e74b981b14610955578063ef8ef56f14610971578063fc2f3d821461098f57610325565b8063d5f39488146108f1578063d6d0883c1461090f578063d8de65871461092d57610325565b8063c50defb9116100dc578063c50defb91461086a578063c691d19114610886578063cc15f538146108b7578063cc4e2ec4146108d557610325565b8063b5c5f672146107ff578063ba05d4171461081b578063bf654aac1461084c57610325565b80638dbb1e3a1161016f578063a3cea33b11610149578063a3cea33b14610779578063a694fc3a14610797578063ad33e21d146107b3578063b1f8100d146107e357610325565b80638dbb1e3a146106fa57806393f1a40b1461072a5780639ec5a8941461075b57610325565b806378e979251461067057806379ba50971461068e5780637bd2bea7146106985780637c7de5e9146106b657806386d1a69f146106d25780638da5cb5b146106dc57610325565b806331d7a2621161027557806351eb05a61161022e5780635eb7413a116102085780635eb7413a1461060e578063630b5ba11461063e57806363dd9d7414610648578063715018a61461066657610325565b806351eb05a6146105ba5780635312ea8e146105d657806358a0a734146105f257610325565b806331d7a262146104bd5780633345d3d0146104ed5780633fd8b02f1461051d578063469048401461053b57806348e5d9f8146105595780634cf1bfe01461058a57610325565b80631526fe27116102e25780631dfa45e3116102bc5780631dfa45e3146104355780631e1c6a0714610453578063272183c9146104835780632def66201461049f57610325565b80631526fe27146103b357806317caf6f1146103e757806318952aff1461040557610325565b806301339c211461032957806305eaab4b14610333578063081e3eda1461033d5780630efe6a8b1461035b5780630fc8c4ed1461037757806313bf812614610395575b5f80fd5b6103316109bf565b005b61033b610f7e565b005b61034561112b565b6040516103529190614121565b60405180910390f35b610375600480360381019061037091906141c2565b611137565b005b61037f61166b565b60405161038c9190614221565b60405180910390f35b61039d611693565b6040516103aa9190614254565b60405180910390f35b6103cd60048036038101906103c8919061426d565b6116a6565b6040516103de9594939291906142f3565b60405180910390f35b6103ef611706565b6040516103fc9190614121565b60405180910390f35b61041f600480360381019061041a9190614344565b61170c565b60405161042c9190614254565b60405180910390f35b61043d61177b565b60405161044a9190614221565b60405180910390f35b61046d60048036038101906104689190614382565b611793565b60405161047a9190614254565b60405180910390f35b61049d6004803603810190610498919061426d565b6117b0565b005b6104a76118b7565b6040516104b49190614121565b60405180910390f35b6104d760048036038101906104d29190614382565b611a90565b6040516104e491906143e9565b60405180910390f35b61050760048036038101906105029190614382565b611afa565b6040516105149190614121565b60405180910390f35b610525611bc1565b6040516105329190614121565b60405180910390f35b610543611bc8565b6040516105509190614221565b60405180910390f35b610573600480360381019061056e9190614382565b611bed565b604051610581929190614402565b60405180910390f35b6105a4600480360381019061059f9190614344565b611c0d565b6040516105b19190614445565b60405180910390f35b6105d460048036038101906105cf919061426d565b611cfa565b005b6105f060048036038101906105eb919061426d565b611e8e565b005b61060c6004803603810190610607919061445e565b61200d565b005b61062860048036038101906106239190614382565b61220f565b6040516106359190614121565b60405180910390f35b610646612257565b005b610650612288565b60405161065d9190614221565b60405180910390f35b61066e6122a0565b005b6106786123cd565b6040516106859190614121565b60405180910390f35b6106966123f1565b005b6106a0612626565b6040516106ad919061449c565b60405180910390f35b6106d060048036038101906106cb91906144f0565b61263e565b005b6106da61279d565b005b6106e4612893565b6040516106f19190614221565b60405180910390f35b610714600480360381019061070f919061445e565b6128ba565b6040516107219190614121565b60405180910390f35b610744600480360381019061073f9190614344565b612951565b604051610752929190614402565b60405180910390f35b61076361297c565b6040516107709190614560565b60405180910390f35b610781612994565b60405161078e9190614221565b60405180910390f35b6107b160048036038101906107ac919061426d565b6129ac565b005b6107cd60048036038101906107c8919061426d565b612be5565b6040516107da9190614121565b60405180910390f35b6107fd60048036038101906107f89190614382565b612c08565b005b610819600480360381019061081491906141c2565b612dea565b005b61083560048036038101906108309190614579565b6132b7565b604051610843929190614402565b60405180910390f35b610854613331565b6040516108619190614445565b60405180910390f35b610884600480360381019061087f919061445e565b613337565b005b6108a0600480360381019061089b9190614382565b6133a9565b6040516108ae929190614402565b60405180910390f35b6108bf6133c9565b6040516108cc9190614121565b60405180910390f35b6108ef60048036038101906108ea91906145f3565b6133cf565b005b6108f9613571565b6040516109069190614221565b60405180910390f35b610917613595565b6040516109249190614651565b60405180910390f35b6109356135ad565b005b61093f613691565b60405161094c9190614221565b60405180910390f35b61096f600480360381019061096a9190614382565b6136a9565b005b61097961382c565b6040516109869190614221565b60405180910390f35b6109a960048036038101906109a49190614344565b613844565b6040516109b69190614121565b60405180910390f35b6109c7612893565b73ffffffffffffffffffffffffffffffffffffffff166109e5613a57565b73ffffffffffffffffffffffffffffffffffffffff1614610a32576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60011515600360149054906101000a900460ff16151514610a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7f906146c4565b60405180910390fd5b5f7329ea7545def87022badc76323f373ea1e707c52373ffffffffffffffffffffffffffffffffffffffff1663e6a4390573fc56f3098533446b2226e9d526780cf40018d4c473a1077a294dde1b09bb078844df40758a5d0f9a276040518363ffffffff1660e01b8152600401610b009291906146e2565b602060405180830381865afa158015610b1b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3f919061471d565b90505f7329ea7545def87022badc76323f373ea1e707c52373ffffffffffffffffffffffffffffffffffffffff1663e6a4390573fc56f3098533446b2226e9d526780cf40018d4c47395b303987a60c71504d99aa1b13b4da07b0790ab6040518363ffffffff1660e01b8152600401610bb99291906146e2565b602060405180830381865afa158015610bd4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf8919061471d565b90505f7329ea7545def87022badc76323f373ea1e707c52373ffffffffffffffffffffffffffffffffffffffff1663e6a4390573fc56f3098533446b2226e9d526780cf40018d4c473efd766ccb38eaf1dfd701853bfce31359239f3056040518363ffffffff1660e01b8152600401610c729291906146e2565b602060405180830381865afa158015610c8d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb1919061471d565b9050610cc983681043561a88293000006103e8613a5e565b610cdf82681043561a88293000006103e8613a5e565b610cf581681043561a88293000006103e8613a5e565b73fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f19336804af0a763bb1c000006040518363ffffffff1660e01b8152600401610d4d929190614781565b5f604051808303815f87803b158015610d64575f80fd5b505af1158015610d76573d5f803e3d5ffd5b5050505073fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f197319bb40bc1f5b6c9adfa29cb7dbdabe66c2ad91516804af0a763bb1c000006040518363ffffffff1660e01b8152600401610de6929190614781565b5f604051808303815f87803b158015610dfd575f80fd5b505af1158015610e0f573d5f803e3d5ffd5b5050505073fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f197319c1bb001faa97bd0a07ac75719f380787ae47596804af0a763bb1c000006040518363ffffffff1660e01b8152600401610e7f929190614781565b5f604051808303815f87803b158015610e96575f80fd5b505af1158015610ea8573d5f803e3d5ffd5b5050505073fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f1973c600d3e564adf666614fb81834bdfed3d75be1e46804af0a763bb1c000006040518363ffffffff1660e01b8152600401610f18929190614781565b5f604051808303815f87803b158015610f2f575f80fd5b505af1158015610f41573d5f803e3d5ffd5b50505050610f4d613c01565b7f452fb855fd3c6f57cc821ebea14d1467b0773817c62e449a071b1ea92ef0d3af60405160405180910390a1505050565b6002805403610fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb9906147f2565b60405180910390fd5b600280819055505f8060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f820154815260200160018201548152505090505f815f0151111561105557611049815f015183613c1d90919063ffffffff16565b915061105433613c32565b5b73fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f1933846040518363ffffffff1660e01b81526004016110a4929190614810565b5f604051808303815f87803b1580156110bb575f80fd5b505af11580156110cd573d5f803e3d5ffd5b505050503373ffffffffffffffffffffffffffffffffffffffff167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4836040516111179190614121565b60405180910390a250506001600281905550565b5f600680549050905090565b5f1515600360149054906101000a900460ff16151514806111a357507f0000000000000000000000007008d209d803b130db14ee6495262990b6e6e3cf73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d990614881565b60405180910390fd5b6002805403611226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121d906147f2565b60405180910390fd5b600280819055506006805490508210611274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126b906148e9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806112d957503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15611302577f0000000000000000000000007008d209d803b130db14ee6495262990b6e6e3cf92505b5f6006838154811061131757611316614907565b5b905f5260205f20906005020190505f600a5f8581526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20905061137d84611cfa565b5f6113c582600101546113b764e8d4a510006113a98760040154875f0154613c7990919063ffffffff16565b613c8e90919063ffffffff16565b613ca390919063ffffffff16565b90505f806113d48733886132b7565b915091506113ee81855f0154613c1d90919063ffffffff16565b845f018190555061142664e8d4a510006114188760040154875f0154613c7990919063ffffffff16565b613c8e90919063ffffffff16565b846001018190555061147d333088885f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613cb8909392919063ffffffff16565b5f821115611565576114f360035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683875f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d419092919063ffffffff16565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f108516ddcf5ba43cea6bb2cd5ff6d59ac196c1c86ccb9178332b9dd72d1ca561838960405161155c929190614402565b60405180910390a25b5f8311156115ea5773fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f1933856040518363ffffffff1660e01b81526004016115bc929190614810565b5f604051808303815f87803b1580156115d3575f80fd5b505af11580156115e5573d5f803e3d5ffd5b505050505b5f6115f484612be5565b90505f811115611609576116088982613dc7565b5b873373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15896040516116509190614121565b60405180910390a35050505050506001600281905550505050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600360149054906101000a900460ff1681565b600681815481106116b5575f80fd5b905f5260205f2090600502015f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154905085565b60055481565b5f6006838154811061172157611720614907565b5b905f5260205f2090600502016002015460075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01541015905092915050565b73fc56f3098533446b2226e9d526780cf40018d4c481565b6009602052805f5260405f205f915054906101000a900460ff1681565b6117b8612893565b73ffffffffffffffffffffffffffffffffffffffff166117d6613a57565b73ffffffffffffffffffffffffffffffffffffffff1614611823576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600454905080821061186b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118629061497e565b60405180910390fd5b611873612257565b816004819055507f989a45b2e873512536614a9a484c6f002cd3a63f7c726fb049f9a890e5d4e75681836040516118ab929190614402565b60405180910390a15050565b5f60028054036118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f3906147f2565b60405180910390fd5b600280819055505f60075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f815f015411611988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197f906149e6565b60405180910390fd5b5f6119a0826001015442613ca390919063ffffffff16565b90506224ea008110156119e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119df90614a4e565b60405180910390fd5b815f015492505f825f0181905550611a35338473dfb10795e6fe7d0db68f9778ba4c575a28e8cd4c73ffffffffffffffffffffffffffffffffffffffff16613d419092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd84604051611a7b9190614121565b60405180910390a25050600160028190555090565b611a986140f1565b60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f82015481526020016001820154815250509050919050565b5f8060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f820154815260200160018201548152505090505f815f015103611b6c575f915050611bbc565b8060200151421015611b81575f915050611bbc565b5f816020015142611b929190614a99565b90506224ea008110611ba8575f92505050611bbc565b806224ea00611bb79190614a99565b925050505b919050565b6224ea0081565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6008602052805f5260405f205f91509050805f0154908060010154905082565b5f8060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f60068581548110611c6357611c62614907565b5b905f5260205f20906005020190505f825f015490505f826002015490505f811480611c8e5750808210155b15611c9f575f945050505050611cf4565b611ca98282613e76565b91505f611ce982611cdb611cc68686613ca390919063ffffffff16565b6101f461ffff16613c7990919063ffffffff16565b613c8e90919063ffffffff16565b905080955050505050505b92915050565b5f60068281548110611d0f57611d0e614907565b5b905f5260205f209060050201905080600301544211611d2e5750611e8b565b5f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611d8a9190614221565b602060405180830381865afa158015611da5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc99190614ae0565b90505f8103611de2574282600301819055505050611e8b565b5f611df18360030154426128ba565b90505f611e33600554611e258660010154611e1760045487613c7990919063ffffffff16565b613c7990919063ffffffff16565b613c8e90919063ffffffff16565b9050611e75611e6284611e5464e8d4a5100085613c7990919063ffffffff16565b613c8e90919063ffffffff16565b8560040154613c1d90919063ffffffff16565b8460040181905550428460030181905550505050505b50565b6002805403611ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec9906147f2565b60405180910390fd5b600280819055505f60068281548110611eee57611eed614907565b5b905f5260205f20906005020190505f600a5f8481526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f815f015490505f825f01819055505f8260010181905550611fb03382855f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d419092919063ffffffff16565b833373ffffffffffffffffffffffffffffffffffffffff167fbe0b6e5b3195df91f2e6b2b20501f84b085714f9e38073f499073c830565100983604051611ff79190614121565b60405180910390a3505050600160028190555050565b612015612893565b73ffffffffffffffffffffffffffffffffffffffff16612033613a57565b73ffffffffffffffffffffffffffffffffffffffff1614612080576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6006838154811061209557612094614907565b5b905f5260205f20906005020160010154905081600684815481106120bc576120bb614907565b5b905f5260205f209060050201600101541115612150575f82600685815481106120e8576120e7614907565b5b905f5260205f209060050201600101546121029190614a99565b60055461210f9190614a99565b1161214f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214690614b7b565b60405180910390fd5b5b612158612257565b6121a2826121946006868154811061217357612172614907565b5b905f5260205f20906005020160010154600554613ca390919063ffffffff16565b613c1d90919063ffffffff16565b60058190555081600684815481106121bd576121bc614907565b5b905f5260205f20906005020160010181905550827fab80a6685d88709a4e48d135d00c13ae6734f7563446d4ad4d132c67e9a627238284604051612202929190614402565b60405180910390a2505050565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01549050919050565b5f60068054905090505f5b818110156122845761227381611cfa565b8061227d90614b99565b9050612262565b5050565b7395b303987a60c71504d99aa1b13b4da07b0790ab81565b6122a8612893565b73ffffffffffffffffffffffffffffffffffffffff166122c6613a57565b73ffffffffffffffffffffffffffffffffffffffff1614612313576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000006860fc2181565b6123f961166b565b73ffffffffffffffffffffffffffffffffffffffff16612417613a57565b73ffffffffffffffffffffffffffffffffffffffff1614612464576040517f0f22ca5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036124ea576040517fec901e9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b73dfb10795e6fe7d0db68f9778ba4c575a28e8cd4c81565b612646612893565b73ffffffffffffffffffffffffffffffffffffffff16612664613a57565b73ffffffffffffffffffffffffffffffffffffffff16146126b1576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f151560095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151514612740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273790614c2a565b60405180910390fd5b61274b818484613a5e565b600160068054905061275d9190614a99565b7fcf71df2ad8f5180eea605cc5f16399aa74e3a68b2f23a5da121923b71b2ec36d82848660405161279093929190614c48565b60405180910390a2505050565b6127a5612893565b73ffffffffffffffffffffffffffffffffffffffff166127c3613a57565b73ffffffffffffffffffffffffffffffffffffffff1614612810576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff1663b1f8100d612848612893565b6040518263ffffffff1660e01b81526004016128649190614221565b5f604051808303815f87803b15801561287b575f80fd5b505af115801561288d573d5f803e3d5ffd5b50505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f7f000000000000000000000000000000000000000000000000000000006860fc218311612908577f000000000000000000000000000000000000000000000000000000006860fc2161290a565b825b92507f000000000000000000000000000000000000000000000000000000006860fc2182101561293c575f905061294b565b82826129489190614a99565b90505b92915050565b600a602052815f5260405f20602052805f5260405f205f9150915050805f0154908060010154905082565b73fc56f3098533446b2226e9d526780cf40018d4c481565b73dfb10795e6fe7d0db68f9778ba4c575a28e8cd4c81565b5f1515600360149054906101000a900460ff1615151480612a1857507f0000000000000000000000007008d209d803b130db14ee6495262990b6e6e3cf73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4e90614881565b60405180910390fd5b6002805403612a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a92906147f2565b60405180910390fd5b600280819055505f60075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f8211612b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1b906149e6565b60405180910390fd5b612b3a82825f0154613c1d90919063ffffffff16565b815f0181905550428160010181905550612b8b33308473dfb10795e6fe7d0db68f9778ba4c575a28e8cd4c73ffffffffffffffffffffffffffffffffffffffff16613cb8909392919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a83604051612bd19190614121565b60405180910390a250600160028190555050565b5f61271061012c83612bf79190614c7d565b612c019190614ceb565b9050919050565b612c10612893565b73ffffffffffffffffffffffffffffffffffffffff16612c2e613a57565b73ffffffffffffffffffffffffffffffffffffffff1614612c7b576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ce0576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612d64576040517f367558c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167fa50821a7869f90dcef86915c08ff04d916de378b5eadd9a9009e619f3b9b939060405160405180910390a28060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002805403612e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e25906147f2565b60405180910390fd5b600280819055506006805490508210612e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e73906148e9565b60405180910390fd5b5f60068381548110612e9157612e90614907565b5b905f5260205f20906005020190505f600a5f8581526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20905082815f01541015612f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2b90614d65565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612f9957503373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15612fc2577f0000000000000000000000007008d209d803b130db14ee6495262990b6e6e3cf94505b612fcb84611cfa565b5f613013826001015461300564e8d4a51000612ff78760040154875f0154613c7990919063ffffffff16565b613c8e90919063ffffffff16565b613ca390919063ffffffff16565b90505f806130228733886132b7565b9150915061303c86855f0154613ca390919063ffffffff16565b845f018190555061307464e8d4a510006130668760040154875f0154613c7990919063ffffffff16565b613c8e90919063ffffffff16565b84600101819055506130c93382875f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d419092919063ffffffff16565b5f8211156131b15761313f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683875f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613d419092919063ffffffff16565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f108516ddcf5ba43cea6bb2cd5ff6d59ac196c1c86ccb9178332b9dd72d1ca56183896040516131a8929190614402565b60405180910390a25b5f8311156132365773fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166340c10f1933856040518363ffffffff1660e01b8152600401613208929190614810565b5f604051808303815f87803b15801561321f575f80fd5b505af1158015613231573d5f803e3d5ffd5b505050505b5f61324084612be5565b90505f811115613255576132548982613dc7565b5b873373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5688960405161329c9190614121565b60405180910390a35050505050506001600281905550505050565b5f806132c3858561170c565b156132d3575f8391509150613329565b5f6133086127106132fa6132e78989611c0d565b61ffff1687613c7990919063ffffffff16565b613c8e90919063ffffffff16565b90505f61331e8286613ca390919063ffffffff16565b905081819350935050505b935093915050565b6101f481565b600680549050811061337e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337590614dcd565b60405180910390fd5b5f8290505b8181116133a45761339381611cfa565b8061339d90614b99565b9050613383565b505050565b6007602052805f5260405f205f91509050805f0154908060010154905082565b60045481565b6133d7612893565b73ffffffffffffffffffffffffffffffffffffffff166133f5613a57565b73ffffffffffffffffffffffffffffffffffffffff1614613442576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73dfb10795e6fe7d0db68f9778ba4c575a28e8cd4c73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561349f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134c39190614ae0565b8161ffff1610613508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ff90614e35565b60405180910390fd5b8061ffff166006838154811061352157613520614907565b5b905f5260205f209060050201600201819055507f0d3990e156c26a5f3f1e69eb1940ca2e18d4e814e4cb8b9783e2472a10c7c6858282604051613565929190614e53565b60405180910390a15050565b7f0000000000000000000000007008d209d803b130db14ee6495262990b6e6e3cf81565b7329ea7545def87022badc76323f373ea1e707c52381565b6135b5612893565b73ffffffffffffffffffffffffffffffffffffffff166135d3613a57565b73ffffffffffffffffffffffffffffffffffffffff1614613620576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73fc56f3098533446b2226e9d526780cf40018d4c473ffffffffffffffffffffffffffffffffffffffff166379ba50976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613679575f80fd5b505af115801561368b573d5f803e3d5ffd5b50505050565b73efd766ccb38eaf1dfd701853bfce31359239f30581565b6136b1612893565b73ffffffffffffffffffffffffffffffffffffffff166136cf613a57565b73ffffffffffffffffffffffffffffffffffffffff161461371c576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361378a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161378190614ec4565b60405180910390fd5b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f69cca87270f7727b8fbdfefbbb549c52795cf9b87f29eb4b52a55c11a30a38f881836040516138209291906146e2565b60405180910390a15050565b73a1077a294dde1b09bb078844df40758a5d0f9a2781565b5f806006848154811061385a57613859614907565b5b905f5260205f20906005020190505f600a5f8681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f826004015490505f835f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161391b9190614221565b602060405180830381865afa158015613936573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061395a9190614ae0565b905083600301544211801561396f57505f8114155b15613a08575f6139838560030154426128ba565b90505f6139c56005546139b788600101546139a960045487613c7990919063ffffffff16565b613c7990919063ffffffff16565b613c8e90919063ffffffff16565b9050613a036139f4846139e664e8d4a5100085613c7990919063ffffffff16565b613c8e90919063ffffffff16565b85613c1d90919063ffffffff16565b935050505b613a4b8360010154613a3d64e8d4a51000613a2f86885f0154613c7990919063ffffffff16565b613c8e90919063ffffffff16565b613ca390919063ffffffff16565b94505050505092915050565b5f33905090565b613a66612257565b5f7f000000000000000000000000000000000000000000000000000000006860fc214211613ab4577f000000000000000000000000000000000000000000000000000000006860fc21613ab6565b425b9050613acd82600554613c1d90919063ffffffff16565b60058190555060066040518060a001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018581526020018381526020015f815250908060018154018082558091505060019003905f5260205f2090600502015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030155608082015181600401555050600160095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050505050565b5f600360146101000a81548160ff021916908315150217905550565b5f8183613c2a9190614ee2565b905092915050565b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f018190555050565b5f8183613c869190614c7d565b905092915050565b5f8183613c9b9190614ceb565b905092915050565b5f8183613cb09190614a99565b905092915050565b613d3b846323b872dd60e01b858585604051602401613cd993929190614f15565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613e8e565b50505050565b613dc28363a9059cbb60e01b8484604051602401613d60929190614810565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613e8e565b505050565b8060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f828254613e159190614ee2565b925050819055508060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015f828254613e6b9190614ee2565b925050819055505050565b5f818310613e845781613e86565b825b905092915050565b5f613eef826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613f539092919063ffffffff16565b90505f81511115613f4e5780806020019051810190613f0e9190614f74565b613f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f449061500f565b60405180910390fd5b5b505050565b6060613f6184845f85613f6a565b90509392505050565b606082471015613faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fa69061509d565b60405180910390fd5b613fb88561407a565b613ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fee90615105565b60405180910390fd5b5f808673ffffffffffffffffffffffffffffffffffffffff16858760405161401f919061518f565b5f6040518083038185875af1925050503d805f8114614059576040519150601f19603f3d011682016040523d82523d5f602084013e61405e565b606091505b509150915061406e82828661408b565b92505050949350505050565b5f80823b90505f8111915050919050565b6060831561409b578290506140ea565b5f835111156140ad5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140e191906151f7565b60405180910390fd5b9392505050565b60405180604001604052805f81526020015f81525090565b5f819050919050565b61411b81614109565b82525050565b5f6020820190506141345f830184614112565b92915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6141678261413e565b9050919050565b6141778161415d565b8114614181575f80fd5b50565b5f813590506141928161416e565b92915050565b6141a181614109565b81146141ab575f80fd5b50565b5f813590506141bc81614198565b92915050565b5f805f606084860312156141d9576141d861413a565b5b5f6141e686828701614184565b93505060206141f7868287016141ae565b9250506040614208868287016141ae565b9150509250925092565b61421b8161415d565b82525050565b5f6020820190506142345f830184614212565b92915050565b5f8115159050919050565b61424e8161423a565b82525050565b5f6020820190506142675f830184614245565b92915050565b5f602082840312156142825761428161413a565b5b5f61428f848285016141ae565b91505092915050565b5f819050919050565b5f6142bb6142b66142b18461413e565b614298565b61413e565b9050919050565b5f6142cc826142a1565b9050919050565b5f6142dd826142c2565b9050919050565b6142ed816142d3565b82525050565b5f60a0820190506143065f8301886142e4565b6143136020830187614112565b6143206040830186614112565b61432d6060830185614112565b61433a6080830184614112565b9695505050505050565b5f806040838503121561435a5761435961413a565b5b5f614367858286016141ae565b925050602061437885828601614184565b9150509250929050565b5f602082840312156143975761439661413a565b5b5f6143a484828501614184565b91505092915050565b6143b681614109565b82525050565b604082015f8201516143d05f8501826143ad565b5060208201516143e360208501826143ad565b50505050565b5f6040820190506143fc5f8301846143bc565b92915050565b5f6040820190506144155f830185614112565b6144226020830184614112565b9392505050565b5f61ffff82169050919050565b61443f81614429565b82525050565b5f6020820190506144585f830184614436565b92915050565b5f80604083850312156144745761447361413a565b5b5f614481858286016141ae565b9250506020614492858286016141ae565b9150509250929050565b5f6020820190506144af5f8301846142e4565b92915050565b5f6144bf8261415d565b9050919050565b6144cf816144b5565b81146144d9575f80fd5b50565b5f813590506144ea816144c6565b92915050565b5f805f606084860312156145075761450661413a565b5b5f614514868287016141ae565b9350506020614525868287016141ae565b9250506040614536868287016144dc565b9150509250925092565b5f61454a826142c2565b9050919050565b61455a81614540565b82525050565b5f6020820190506145735f830184614551565b92915050565b5f805f606084860312156145905761458f61413a565b5b5f61459d868287016141ae565b93505060206145ae86828701614184565b92505060406145bf868287016141ae565b9150509250925092565b6145d281614429565b81146145dc575f80fd5b50565b5f813590506145ed816145c9565b92915050565b5f80604083850312156146095761460861413a565b5b5f614616858286016141ae565b9250506020614627858286016145df565b9150509250929050565b5f61463b826142c2565b9050919050565b61464b81614631565b82525050565b5f6020820190506146645f830184614642565b92915050565b5f82825260208201905092915050565b7f4f4e4c595f494e5f5345545550000000000000000000000000000000000000005f82015250565b5f6146ae600d8361466a565b91506146b98261467a565b602082019050919050565b5f6020820190508181035f8301526146db816146a2565b9050919050565b5f6040820190506146f55f830185614212565b6147026020830184614212565b9392505050565b5f815190506147178161416e565b92915050565b5f602082840312156147325761473161413a565b5b5f61473f84828501614709565b91505092915050565b5f819050919050565b5f61476b61476661476184614748565b614298565b614109565b9050919050565b61477b81614751565b82525050565b5f6040820190506147945f830185614212565b6147a16020830184614772565b9392505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6147dc601f8361466a565b91506147e7826147a8565b602082019050919050565b5f6020820190508181035f830152614809816147d0565b9050919050565b5f6040820190506148235f830185614212565b6148306020830184614112565b9392505050565b7f53455455505f4d4f44455f454e474147454400000000000000000000000000005f82015250565b5f61486b60128361466a565b915061487682614837565b602082019050919050565b5f6020820190508181035f8301526148988161485f565b9050919050565b7f506f6f6c20646f6573206e6f74206578697374000000000000000000000000005f82015250565b5f6148d360138361466a565b91506148de8261489f565b602082019050919050565b5f6020820190508181035f830152614900816148c7565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4f4e4c595f4445435245415345530000000000000000000000000000000000005f82015250565b5f614968600e8361466a565b915061497382614934565b602082019050919050565b5f6020820190508181035f8301526149958161495c565b9050919050565b7f5a45524f5f414d4f554e545f4e4f545f414c4c4f5745440000000000000000005f82015250565b5f6149d060178361466a565b91506149db8261499c565b602082019050919050565b5f6020820190508181035f8301526149fd816149c4565b9050919050565b7f4e4f545f52454144595f544f5f554e5354414b455f59455400000000000000005f82015250565b5f614a3860188361466a565b9150614a4382614a04565b602082019050919050565b5f6020820190508181035f830152614a6581614a2c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614aa382614109565b9150614aae83614109565b9250828203905081811115614ac657614ac5614a6c565b5b92915050565b5f81519050614ada81614198565b92915050565b5f60208284031215614af557614af461413a565b5b5f614b0284828501614acc565b91505092915050565b7f6164643a2063616e27742073657420746f74616c416c6c6f63506f696e7420745f8201527f6f20302121000000000000000000000000000000000000000000000000000000602082015250565b5f614b6560258361466a565b9150614b7082614b0b565b604082019050919050565b5f6020820190508181035f830152614b9281614b59565b9050919050565b5f614ba382614109565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614bd557614bd4614a6c565b5b600182019050919050565b7f414c52454144595f4558495354530000000000000000000000000000000000005f82015250565b5f614c14600e8361466a565b9150614c1f82614be0565b602082019050919050565b5f6020820190508181035f830152614c4181614c08565b9050919050565b5f606082019050614c5b5f830186614212565b614c686020830185614112565b614c756040830184614112565b949350505050565b5f614c8782614109565b9150614c9283614109565b9250828202614ca081614109565b91508282048414831517614cb757614cb6614a6c565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614cf582614109565b9150614d0083614109565b925082614d1057614d0f614cbe565b5b828204905092915050565b7f77697468647261773a206e6f7420676f6f6400000000000000000000000000005f82015250565b5f614d4f60128361466a565b9150614d5a82614d1b565b602082019050919050565b5f6020820190508181035f830152614d7c81614d43565b9050919050565b7f456e6420696e646578206f7574206f6620626f756e64730000000000000000005f82015250565b5f614db760178361466a565b9150614dc282614d83565b602082019050919050565b5f6020820190508181035f830152614de481614dab565b9050919050565b7f5448524553484f4c445f455843454544535f535550504c5900000000000000005f82015250565b5f614e1f60188361466a565b9150614e2a82614deb565b602082019050919050565b5f6020820190508181035f830152614e4c81614e13565b9050919050565b5f604082019050614e665f830185614112565b614e736020830184614436565b9392505050565b7f594541485f4e41485f4d415445000000000000000000000000000000000000005f82015250565b5f614eae600d8361466a565b9150614eb982614e7a565b602082019050919050565b5f6020820190508181035f830152614edb81614ea2565b9050919050565b5f614eec82614109565b9150614ef783614109565b9250828201905080821115614f0f57614f0e614a6c565b5b92915050565b5f606082019050614f285f830186614212565b614f356020830185614212565b614f426040830184614112565b949350505050565b614f538161423a565b8114614f5d575f80fd5b50565b5f81519050614f6e81614f4a565b92915050565b5f60208284031215614f8957614f8861413a565b5b5f614f9684828501614f60565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f614ff9602a8361466a565b915061500482614f9f565b604082019050919050565b5f6020820190508181035f83015261502681614fed565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f61508760268361466a565b91506150928261502d565b604082019050919050565b5f6020820190508181035f8301526150b48161507b565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f6150ef601d8361466a565b91506150fa826150bb565b602082019050919050565b5f6020820190508181035f83015261511c816150e3565b9050919050565b5f81519050919050565b5f81905092915050565b5f5b83811015615154578082015181840152602081019050615139565b5f8484015250505050565b5f61516982615123565b615173818561512d565b9350615183818560208601615137565b80840191505092915050565b5f61519a828461515f565b915081905092915050565b5f81519050919050565b5f601f19601f8301169050919050565b5f6151c9826151a5565b6151d3818561466a565b93506151e3818560208601615137565b6151ec816151af565b840191505092915050565b5f6020820190508181035f83015261520f81846151bf565b90509291505056fea2646970667358221220f71a2fd8aa41e54ca35f87dbcd21782d475c5975dec4cb7b183b2b2018a58d5a64736f6c63430008140033