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:
- Granary
- Optimization enabled
- false
- Compiler version
- v0.7.6+commit.7338295f
- EVM Version
- default
- Verified at
- 2022-01-15T01:26:05.414526Z
Constructor Arguments
000000000000000000000000fcfe2562fb9edd16abba43295d66b154f79c56d1000000000000000000000000243e46d50130f346bede1d9548b41c49c6440872000000000000000000000000bd451b952de19f2c7ba2c8c516b0740484e953b200000000000000000000000000000000000000000000000000000000000000070000000000000000000000006074e20633d2d8fbdf82119867a81581cabe06dd000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000426a4a4b73d4cd173c9ab78d18c0d79d1717eaa90000000000000000000000000000000000000000000000000000000000000002000000000000000000000000bd451b952de19f2c7ba2c8c516b0740484e953b20000000000000000000000004446fc4eb47f2f6586f9faab68b3498f86c075210000000000000000000000000000000000000000000000000000000000000003000000000000000000000000bd451b952de19f2c7ba2c8c516b0740484e953b20000000000000000000000004446fc4eb47f2f6586f9faab68b3498f86c07521000000000000000000000000980a5afef3d17ad98635f6c5aebcbaeded3c343000000000000000000000000000000000000000000000000000000000000000043331303300000000000000000000000000000000000000000000000000000000
Contract source code
/*
KK KK CCCCC CCCCC GGGGG U U RRRRR U U
KK KKK CC CC G U U RR R U U
KKKK CC CC G GGG U U RRRRR U U
KK KK CC CC O G G U U RR R U U
KK KKK CCCCCC CCCCCC GGGGG UUUU RR RRR UUUU
FFFFF TTTTTTT M M GGGGG U U RRRRR U U
FF TTT M M M M G U U RR R U U
FFFFF TTT M M M G GGG U U RRRRR U U
FF TTT M M M O G G U U RR R U U
FF TTT M M GGGGG UUUU RR RRR UUUU
*************************
** **
** GRANARY & WORKERS **
** ftm.guru/GRAIN **
** kcc.guru/kompound **
** **
*************************
Create a farm & vault for your own projects for free with ftm.guru
Contact us at:
https://discord.com/invite/QpyfMarNrV
https://t.me/FTM1337
*/
/*
- KOMPOUND PROTOCOL -
https://kcc.guru/kompound
- GRANARY & WORKERS -
https://ftm.guru/GRAIN
Yield Compounding Service
Created by Guru Network
Community Mediums:
https://discord.com/invite/QpyfMarNrV
https://medium.com/@ftm1337
https://twitter.com/ftm1337
https://twitter.com/kucino
https://t.me/ftm1337
https://t.me/kccguru
Other Products:
KUCINO CASINO - The First and Most used Casino of KCC
fmc.guru - FantomMarketCap : On-Chain Data Aggregator
ELITE - ftm.guru is an indie growth-hacker for Fantom
*/
/*
FREQUENTLY ASKED QUESTIONS
Q.1 WHY USE THIS VAULT?
Ans Most of the popular vaults' owners can switch "strategy" and steal (a.k.a. hard-rug) your valuable assets.
Granaries or Kompound Protocol cannot change its own behaviour or strategy once its deployed on-chain.
Our code uses unchangeable constants for tokens and external contracts. All fees & incentives are capped.
Unlike the other (you-know-who) famous vaults.
Q.2 WHAT IS ELITENESS?
Ans Simply holding ELITE (ftm.guru) token in your wallet ascribes you Eliteness.
It is required to earn worker incentives from this Granary.
Deposits incur nil fee if the user posseses adequate eliteness.
ELITE has a fixed supply of 250.
*/
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.7.6;
pragma abicoder v2;
// Part: IMasterchef
//ftm.guru's Universal On-chain TVL Calculator
//Source: https://ftm.guru/rawdata/tvl
interface ITVL {
//Using Version = 6
function p_lpt_coin_usd(address lp) external view returns(uint256);
}
interface IMasterchef {
// Info of each pool.
struct PoolInfo {
address lpToken; // Address of LP token contract.
uint256 allocPoint; // How many allocation points assigned to this pool. Tokenss to distribute per block.
uint256 lastRewardBlock; // Last block number that Tokens distribution occurs.
uint256 accKudexPerShare; // Accumulated Tokens per share, times 1e12. See below.
uint16 depositFeeBP; // Deposit fee in basis points.
uint256 harvestInterval; // Harvest interval in seconds.
}
// Info of each user.
struct UserInfo {
uint256 amount; // How many LP tokens the user has provided.
uint256 rewardDebt; // Reward debt.
uint256 rewardLockedUp; // Reward locked up.
uint256 nextHarvestUntil; // When can the user harvest again.
}
function deposit(uint256 _pid, uint256 _amount, address _ref) external;
function withdraw(uint256 _pid, uint256 _amount) external;
function emergencyWithdraw(uint256 _pid) external;
function userInfo(uint256, address) external view returns (UserInfo memory);
function poolInfo(uint256) external view returns (PoolInfo memory);
function totalAllocPoint() external view returns (uint256);
function canHarvest(uint256 _pid, address _user) external view returns (bool);
function pendingKudex(uint256 _pid, address _user) external view returns (uint256);
}
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
//Uniswap-style Pair (LPT)
function getReserves() external view returns (uint112, uint112, uint32);
}
interface IRouter {
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
}
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
contract Granary
{
using SafeMath for uint256;
constructor (address _w, address _m, address _e, uint8 _p, address _R, address[] memory _rA, address[] memory _rB, string memory _id, address _v)
{
want=IERC20(_w);
mc=IMasterchef(_m);
earn=IERC20(_e);
allnums[0]=_p; //pid
router = _R;
routeA = _rA;
routeB = _rB;
id=_id;//GRAIN#ID
utvl=_v;
//Approvals
//mc to take what it may want
IERC20(address(want)).approve(address(mc),uint256(-1));
//router to sell what we earn
IERC20(address(earn)).approve(address(router),uint256(-1));
//router to add routeA[routeA.length-1]
IERC20(_rA[_rA.length-1]).approve(address(router),uint256(-1));
//router to add routeB[routeB.length-1]
IERC20(_rB[_rB.length-1]).approve(address(router),uint256(-1));
dao = 0x167D87A906dA361A10061fe42bbe89451c2EE584;
treasury = dao;
}
modifier DAO {require(msg.sender==dao,"Only E.L.I.T.E. D.A.O. Treasury can rescue treasures!");_;}
struct Elites {
address ELITE;
uint256 ELITES;
}
Elites[] public Eliteness;
function pushElite(address elite, uint256 elites) public DAO {
Eliteness.push(Elites({ELITE:elite,ELITES:elites}));
}
function pullElite(uint256 n) public DAO {
Eliteness[n]=Eliteness[Eliteness.length-1];Eliteness.pop();
}
//@xref takeFee=eliteness(msg.sender)?false:true;
function eliteness(address u) public view returns(bool)
{
if(Eliteness.length==0){return(true);}//When nobody is an Elite, everyone is an Elite.
for(uint i;i<Eliteness.length;i++){
if(IERC20(Eliteness[i].ELITE).balanceOf(u)>=Eliteness[i].ELITES)
{
return(true);
}
}
return(false);
}
function config(//address _w,
uint256 _mw, uint256 _wi, uint256 _pf, address _t, uint256 _df) public DAO
{
allnums[4] = _mw;
treasury = _t;
//Max 10%, 1e6 = 100%
require(_wi<1e5,"!wi: high");allnums[3] = _wi;
require(_pf<1e5,"!pf: high");allnums[2] = _pf;
require(_df<1e5,"!df: high");allnums[1] = _df;
}
uint8 RG = 0;
modifier rg {
require(RG == 0,"!RG");
RG = 1;
_;
RG = 0;
}
function isContract(address account) internal view returns (bool)
{
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
assembly { codehash := extcodehash(account) }
return (codehash != accountHash && codehash != 0x0);
}
//Using getter functions to circumvent "Stack too deep!" errors
string public id;
/*
string public name;
string public symbol;
uint8 public decimals = 18;
*/
function name() public view returns(string memory){return(string(abi.encodePacked("kcc.guru/GRAIN/", id)));}
function symbol() public view returns(string memory){return(string(abi.encodePacked("GRAIN#", id)));}
function decimals() public pure returns(uint256){return(18);}
uint256 public totalSupply;
IERC20 public want;
IERC20 public earn;
address public router;
address[] public routeA;
address[] public routeB;
IMasterchef public mc;
bool public emergency = false;
address public dao;
address public treasury;
address public utvl;
/*
uint8 public pid;
uint256 public df = 1e3;//deposit fee = 0.1%, 1e6=100%
uint256 public pf = 1e4;//performance fee to treasury, paid from profits = 1%, 1e6=100%
uint256 public wi = 1e4;//worker incentive, paid from profits = 1%, 1e6=100%
uint256 public mw;//Minimum earnings to reinvest
uint64[2] ct;//Timestamp of first & latest Kompound
*/
//Using array to avoid "Stack too deep!" errors
uint256[7] public allnums = [
0, //pid 0 constant
1e3,//df 1 config, <= 10% (1e5), default 0.1%
1e4,//pf 2 config, <= 10% (1e5), default 1%
1e4,//wi 3 config, <= 10% (1e5), default 1%
1, //mw 4 config, default 1 (near zero)
0, //ct[0] 5 nonce, then constant
0 //ct[1] 6 up only
];
event Approval(address indexed src, address indexed guy, uint wad);
event Transfer(address indexed src, address indexed dst, uint wad);
mapping (address => uint) public balanceOf;
mapping (address => mapping (address => uint)) public allowance;
function approve(address guy) public returns (bool) {
return approve(guy, uint(-1));
}
function approve(address guy, uint wad) public returns (bool) {
allowance[msg.sender][guy] = wad;
emit Approval(msg.sender, guy, wad);
return true;
}
function transfer(address dst, uint wad) public returns (bool) {
return transferFrom(msg.sender, dst, wad);
}
function transferFrom(address src, address dst, uint wad) public returns (bool)
{
require(balanceOf[src] >= wad,"Insufficient Balance");
if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) {
require(allowance[src][msg.sender] >= wad);
allowance[src][msg.sender] -= wad;
}
balanceOf[src] -= wad;
balanceOf[dst] += wad;
emit Transfer(src, dst, wad);
return true;
}
event Staked(address indexed user, uint256 amount);
event Withdrawn(address indexed user, uint256 amount);
event Compounded(address indexed user, uint256 amount);
function deposit(uint256 _amt) public rg
{
require(!emergency,"Its an emergency. Please don't deposit.");
//require(isContract(msg.sender)==false,"Humans only");
//require(msg.sender==tx.origin,"Humans only");
//Some fancy math to take care of Fee-on-Transfer tokens
uint256 vbb = want.balanceOf(address(this));
uint256 mcbb = mc.userInfo(allnums[0],address(this)).amount;
require(want.transferFrom(msg.sender,address(this),_amt), "Unable to onboard");
uint256 vba = want.balanceOf(address(this));
uint256 D = vba.sub(vbb,"Dirty deposit");
mc.deposit(allnums[0],D,address(dao));
//Some more fancy math to take care of Deposit Fee
uint256 mcba = mc.userInfo(allnums[0],address(this)).amount;
uint256 M = mcba.sub(mcbb,"Dirty stake");
//require(M>mindep,"Deposit Too Low");
uint256 _mint = 0;
(totalSupply > 0)
// k: SharePerDeposit should be constant before & after
// Mint = SharesPerDeposit * IncreaseInDeposit
// bal += (totalSupply / oldDeposits) * thisDeposit
? _mint = ( M.mul(totalSupply) ).div(mcbb)
: _mint = M;
totalSupply += _mint;
uint256 _fee;
//allnums[1]===df, deposit fee
if(allnums[1]>0){_fee = eliteness(msg.sender)? 0 : (_mint.mul(allnums[1])).div(1e6);}//gas savings
if(_fee>0)//gas savings
{
balanceOf[treasury] += _fee;
emit Transfer(address(0), treasury, _fee);
}
balanceOf[msg.sender] += _mint.sub(_fee);
emit Transfer(address(0), msg.sender, _mint.sub(_fee));
//hardWork()
//allnums[4]===mw, min work : smallest harvest
if(earn.balanceOf(address(this)) > allnums[4]) {work(address(this));}
}
function withdraw(uint256 _amt) public rg
{
require(!emergency,"Its an emergency. Use emergencyWithdraw() please.");
require(balanceOf[msg.sender] >= _amt,"Insufficient Balance");
//Burn _amt of Vault Tokens
balanceOf[msg.sender] -= _amt;
uint256 ts = totalSupply;
totalSupply -= _amt;
emit Transfer(msg.sender, address(0), _amt);
uint256 vbb = want.balanceOf(address(this));
uint256 mcbb = mc.userInfo(allnums[0],address(this)).amount;
// W = DepositsPerShare * SharesBurnt
uint256 W = ( _amt.mul(mcbb) ).div(ts);
mc.withdraw(allnums[0],W);
uint256 vba = want.balanceOf(address(this));
uint256 D = vba.sub(vbb,"Dirty withdrawal");
require(want.transfer(msg.sender,D), "Unable to deboard");
//hardWork()
if(earn.balanceOf(address(this)) > allnums[4]) {work(address(this));}
}
function doHardWork() public rg
{
require(eliteness(msg.sender),"Elites only!");
salvage();
require(earn.balanceOf(address(this)) > allnums[4], "Not much work to do!");
work(msg.sender);
}
function salvage() public
{
//harvest()
mc.withdraw(allnums[0],0);
}
function work(address ben) internal
{
require(!emergency,"Its an emergency. Use emergencyWithdraw() please.");
//has inputs from salvage() if this work is done via doHardWork()
IRouter R = IRouter(router);
IERC20 A = IERC20(routeA[routeA.length-1]);
IERC20 B = IERC20(routeB[routeB.length-1]);
uint256 vbb = (earn.balanceOf(address(this))).div(2);
R.swapExactTokensForTokensSupportingFeeOnTransferTokens(vbb,1,routeA,address(this),block.timestamp);
R.swapExactTokensForTokensSupportingFeeOnTransferTokens(vbb,1,routeB,address(this),block.timestamp);
R.addLiquidity(
address(A),
address(B),
A.balanceOf(address(this)),
B.balanceOf(address(this)),
(A.balanceOf(address(this)).mul(90).div(100)),
(B.balanceOf(address(this)).mul(90).div(100)),
address(this),
block.timestamp
);
uint256 D = want.balanceOf(address(this));
uint256 mcbb = mc.userInfo(allnums[0],address(this)).amount;
mc.deposit(allnums[0],D,address(dao));
uint256 mcba = mc.userInfo(allnums[0],address(this)).amount;
uint256 M = mcba.sub(mcbb,"Dirty stake");
//Performance Fee Mint, conserves TVL
uint256 _mint = 0;
//allnums[5] & allnums[6] are First & Latest Compound's timestamps. Used in info() for APY of AUM.
if(allnums[5]==0){allnums[5]=uint64(block.timestamp);}//only on the first run
allnums[6]=uint64(block.timestamp);
(totalSupply > 0)
// k: SharePerDeposit should be constant before & after
// Mint = SharesPerDeposit * IncreaseInDeposit
// bal += (totalSupply / oldDeposits) * thisDeposit
? _mint = ( M.mul(totalSupply) ).div(mcbb)
: _mint = M;
//allnums[2] === pf, Performance Fee
balanceOf[treasury] += (_mint.mul(allnums[2])).div(1e6);
//Worker Incentive Mint, conserves TVL
address worker = ben == address(this) ? treasury : ben;
//allnums[3] === wi, Worker Incentive
balanceOf[worker] += (_mint.mul(allnums[3])).div(1e6);
totalSupply += ((_mint.mul(allnums[2])).div(1e6)).add( (_mint.mul(allnums[3])).div(1e6) );
emit Transfer(address(0), treasury, (_mint.mul(allnums[2])).div(1e6));
emit Transfer(address(0), worker, (_mint.mul(allnums[3])).div(1e6));
}
function declareEmergency() public DAO
{
require(!emergency,"Emergency already declared.");
mc.emergencyWithdraw(allnums[0]);
emergency=true;
}
function revokeEmergency() public DAO
{
require(emergency,"Emergency not declared.");
uint256 D = want.balanceOf(address(this));
mc.deposit(allnums[0],D,address(dao));
emergency=false;
}
function emergencyWithdraw(uint256 _amt) public rg
{
require(emergency,"Its not an emergency. Use withdraw() instead.");
require(balanceOf[msg.sender] >= _amt,"Insufficient Balance");
uint256 ts = totalSupply;
//Burn _amt of Vault Tokens
balanceOf[msg.sender] -= _amt;
totalSupply -= _amt;
emit Transfer(msg.sender, address(0), _amt);
uint256 vbb = want.balanceOf(address(this));
uint256 W = ( _amt.mul(vbb) ).div(ts);
require(want.transfer(msg.sender,W), "Unable to deboard");
}
function rescue(address tokenAddress, uint256 tokens) public DAO returns (bool success)
{
//Generally, there are not supposed to be any tokens in this contract itself:
//Upon Deposits, the assets go from User to the MasterChef of Strategy,
//Upon Withdrawals, the assets go from MasterChef of Strategy to the User, and
//Upon HardWork, the harvest is reconverted to want and sent to MasterChef of Strategy.
//Never allow draining main "want" token from the Granary:
//Main token can only be withdrawn using the EmergencyWithdraw
require(tokenAddress != address(want), "Funds are Safu in emergency!");
if(tokenAddress==address(0)) {(success, ) = dao.call{value:tokens}("");return success;}
else if(tokenAddress!=address(0)) {return IERC20(tokenAddress).transfer(dao, tokens);}
else return false;
}
//Read-Only Functions
//Useful for performance analysis
function info() public view returns (uint256, uint256, uint256, IMasterchef.UserInfo memory, IMasterchef.PoolInfo memory, uint256, bool, uint256)
{
uint256 aum = mc.userInfo(allnums[0],address(this)).amount + IERC20(want).balanceOf(address(this));
uint256 roi = aum*1e18/totalSupply;//ROI: 1e18 === 1x
uint256 apy = ((roi-1e18)*(365*86400)*100)/(allnums[6]-allnums[5]);//APY: 1e18 === 1%
return(
aum,
roi,
apy,
mc.userInfo(allnums[0],address(this)),
mc.poolInfo(allnums[0]),
mc.totalAllocPoint(),
mc.canHarvest(allnums[0],address(this)),
mc.pendingKudex(allnums[0],address(this))
);
}
//TVL in USD, 1e18===$1.
//Source code Derived from ftm.guru's Universal On-chain TVL Calculator: https://ftm.guru/rawdata/tvl
function tvl() public view returns(uint256)
{
ITVL tc = ITVL(utvl);
uint256 aum = mc.userInfo(allnums[0],address(this)).amount + IERC20(want).balanceOf(address(this));
return ((tc.p_lpt_coin_usd(address(want))).mul(aum)).div(1e18);
}
}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_w","internalType":"address"},{"type":"address","name":"_m","internalType":"address"},{"type":"address","name":"_e","internalType":"address"},{"type":"uint8","name":"_p","internalType":"uint8"},{"type":"address","name":"_R","internalType":"address"},{"type":"address[]","name":"_rA","internalType":"address[]"},{"type":"address[]","name":"_rB","internalType":"address[]"},{"type":"string","name":"_id","internalType":"string"},{"type":"address","name":"_v","internalType":"address"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"src","internalType":"address","indexed":true},{"type":"address","name":"guy","internalType":"address","indexed":true},{"type":"uint256","name":"wad","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Compounded","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Staked","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"src","internalType":"address","indexed":true},{"type":"address","name":"dst","internalType":"address","indexed":true},{"type":"uint256","name":"wad","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Withdrawn","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"ELITE","internalType":"address"},{"type":"uint256","name":"ELITES","internalType":"uint256"}],"name":"Eliteness","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allnums","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"guy","internalType":"address"},{"type":"uint256","name":"wad","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"guy","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"config","inputs":[{"type":"uint256","name":"_mw","internalType":"uint256"},{"type":"uint256","name":"_wi","internalType":"uint256"},{"type":"uint256","name":"_pf","internalType":"uint256"},{"type":"address","name":"_t","internalType":"address"},{"type":"uint256","name":"_df","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"dao","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"declareEmergency","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deposit","inputs":[{"type":"uint256","name":"_amt","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"doHardWork","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"earn","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"eliteness","inputs":[{"type":"address","name":"u","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"emergency","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"emergencyWithdraw","inputs":[{"type":"uint256","name":"_amt","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"id","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"tuple","name":"","internalType":"struct IMasterchef.UserInfo","components":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"rewardDebt","internalType":"uint256"},{"type":"uint256","name":"rewardLockedUp","internalType":"uint256"},{"type":"uint256","name":"nextHarvestUntil","internalType":"uint256"}]},{"type":"tuple","name":"","internalType":"struct IMasterchef.PoolInfo","components":[{"type":"address","name":"lpToken","internalType":"address"},{"type":"uint256","name":"allocPoint","internalType":"uint256"},{"type":"uint256","name":"lastRewardBlock","internalType":"uint256"},{"type":"uint256","name":"accKudexPerShare","internalType":"uint256"},{"type":"uint16","name":"depositFeeBP","internalType":"uint16"},{"type":"uint256","name":"harvestInterval","internalType":"uint256"}]},{"type":"uint256","name":"","internalType":"uint256"},{"type":"bool","name":"","internalType":"bool"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"info","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IMasterchef"}],"name":"mc","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pullElite","inputs":[{"type":"uint256","name":"n","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pushElite","inputs":[{"type":"address","name":"elite","internalType":"address"},{"type":"uint256","name":"elites","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"rescue","inputs":[{"type":"address","name":"tokenAddress","internalType":"address"},{"type":"uint256","name":"tokens","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeEmergency","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"routeA","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"routeB","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"router","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"salvage","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"dst","internalType":"address"},{"type":"uint256","name":"wad","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"src","internalType":"address"},{"type":"address","name":"dst","internalType":"address"},{"type":"uint256","name":"wad","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"treasury","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tvl","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"utvl","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"want","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"uint256","name":"_amt","internalType":"uint256"}]}]
Contract Creation Code
0x60806040526000600160006101000a81548160ff021916908360ff1602179055506000600960146101000a81548160ff0219169083151502179055506040518060e00160405280600061ffff1681526020016103e861ffff16815260200161271061ffff16815260200161271061ffff168152602001600161ffff168152602001600061ffff168152602001600061ffff16815250600d906007620000a692919062000715565b50348015620000b457600080fd5b5060405162006d1238038062006d128339818101604052810190620000da9190620009fe565b88600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555087600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600d600060078110620001b057fe5b018190555084600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600790805190602001906200020e92919062000760565b5082600890805190602001906200022792919062000760565b50816002908051906020019062000240929190620007ef565b5080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200032392919062000b70565b602060405180830381600087803b1580156200033e57600080fd5b505af115801562000353573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000379919062000b22565b50600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200041b92919062000b70565b602060405180830381600087803b1580156200043657600080fd5b505af11580156200044b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000471919062000b22565b50836001855103815181106200048357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200050992919062000b70565b602060405180830381600087803b1580156200052457600080fd5b505af115801562000539573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200055f919062000b22565b50826001845103815181106200057157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401620005f792919062000b70565b602060405180830381600087803b1580156200061257600080fd5b505af115801562000627573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200064d919062000b22565b5073167d87a906da361a10061fe42bbe89451c2ee584600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050505062000d10565b82600781019282156200074d579160200282015b828111156200074c578251829061ffff1690559160200191906001019062000729565b5b5090506200075c919062000886565b5090565b828054828255906000526020600020908101928215620007dc579160200282015b82811115620007db5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000781565b5b509050620007eb919062000886565b5090565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928262000827576000855562000873565b82601f106200084257805160ff191683800117855562000873565b8280016001018555821562000873579182015b828111156200087257825182559160200191906001019062000855565b5b50905062000882919062000886565b5090565b5b80821115620008a157600081600090555060010162000887565b5090565b6000620008bc620008b68462000bd1565b62000b9d565b90508083825260208201905082856020860282011115620008dc57600080fd5b60005b85811015620009105781620008f588826200095f565b845260208401935060208301925050600181019050620008df565b5050509392505050565b6000620009316200092b8462000c00565b62000b9d565b9050828152602081018484840111156200094a57600080fd5b6200095784828562000c8a565b509392505050565b600081519050620009708162000cc2565b92915050565b600082601f8301126200098857600080fd5b81516200099a848260208601620008a5565b91505092915050565b600081519050620009b48162000cdc565b92915050565b600082601f830112620009cc57600080fd5b8151620009de8482602086016200091a565b91505092915050565b600081519050620009f88162000cf6565b92915050565b60008060008060008060008060006101208a8c03121562000a1e57600080fd5b600062000a2e8c828d016200095f565b995050602062000a418c828d016200095f565b985050604062000a548c828d016200095f565b975050606062000a678c828d01620009e7565b965050608062000a7a8c828d016200095f565b95505060a08a015167ffffffffffffffff81111562000a9857600080fd5b62000aa68c828d0162000976565b94505060c08a015167ffffffffffffffff81111562000ac457600080fd5b62000ad28c828d0162000976565b93505060e08a015167ffffffffffffffff81111562000af057600080fd5b62000afe8c828d01620009ba565b92505061010062000b128c828d016200095f565b9150509295985092959850929598565b60006020828403121562000b3557600080fd5b600062000b4584828501620009a3565b91505092915050565b62000b598162000c33565b82525050565b62000b6a8162000c73565b82525050565b600060408201905062000b87600083018562000b4e565b62000b96602083018462000b5f565b9392505050565b6000604051905081810181811067ffffffffffffffff8211171562000bc75762000bc662000cc0565b5b8060405250919050565b600067ffffffffffffffff82111562000bef5762000bee62000cc0565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000c1e5762000c1d62000cc0565b5b601f19601f8301169050602081019050919050565b600062000c408262000c53565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b8381101562000caa57808201518184015260208101905062000c8d565b8381111562000cba576000848401525b50505050565bfe5b62000ccd8162000c33565b811462000cd957600080fd5b50565b62000ce78162000c47565b811462000cf357600080fd5b50565b62000d018162000c7d565b811462000d0d57600080fd5b50565b615ff28062000d206000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c80635312ea8e11610130578063af640d0f116100b8578063daea85c51161007c578063daea85c51461064e578063dd62ed3e1461067e578063e5328e06146106ae578063ef1b8140146106cc578063f887ea40146106e857610227565b8063af640d0f146105ba578063b6b55f25146105d8578063caa6fea4146105f4578063cb7956b014610612578063d389800f1461063057610227565b80637919b71b116100ff5780637919b71b146104dc5780637a4e4ecf1461050c5780638ed5f3731461053c57806395d89b411461056c578063a9059cbb1461058a57610227565b80635312ea8e1461045657806361d027b314610472578063685c8ca51461049057806370a08231146104ac57610227565b806327d9cf44116101b3578063370158ea11610182578063370158ea146103bd5780633d456f43146103e25780634162169f146104125780634b292cae146104305780634fa5d8541461044c57610227565b806327d9cf441461035b5780632e1a7d4d14610379578063313ce5671461039557806331e244e5146103b357610227565b80631e534906116101fa5780631e534906146102c95780631f1fcd51146102d357806323b872dd146102f157806323e1d0e81461032157806324aa95ec1461035157610227565b806306fdde031461022c578063095ea7b31461024a57806318160ddd1461027a5780631b5f9c4214610298575b600080fd5b610234610706565b6040516102419190615908565b60405180910390f35b610264600480360381019061025f9190614cdc565b61072e565b60405161027191906158b7565b60405180910390f35b610282610820565b60405161028f9190615b6a565b60405180910390f35b6102b260048036038101906102ad9190614d93565b610826565b6040516102c092919061588e565b60405180910390f35b6102d161087a565b005b6102db61091b565b6040516102e891906158d2565b60405180910390f35b61030b60048036038101906103069190614c8d565b610941565b60405161031891906158b7565b60405180910390f35b61033b60048036038101906103369190614d93565b610cc0565b6040516103489190615b6a565b60405180910390f35b610359610cdb565b005b610363610f49565b6040516103709190615795565b60405180910390f35b610393600480360381019061038e9190614d93565b610f6f565b005b61039d611690565b6040516103aa9190615b6a565b60405180910390f35b6103bb611699565b005b6103c5611832565b6040516103d9989796959493929190615c91565b60405180910390f35b6103fc60048036038101906103f79190614d93565b611dc4565b6040516104099190615795565b60405180910390f35b61041a611e03565b6040516104279190615795565b60405180910390f35b61044a60048036038101906104459190614e34565b611e29565b005b610454612020565b005b610470600480360381019061046b9190614d93565b612202565b005b61047a6125f5565b6040516104879190615795565b60405180910390f35b6104aa60048036038101906104a59190614cdc565b61261b565b005b6104c660048036038101906104c19190614c28565b612758565b6040516104d39190615b6a565b60405180910390f35b6104f660048036038101906104f19190614d93565b612770565b6040516105039190615795565b60405180910390f35b61052660048036038101906105219190614cdc565b6127af565b60405161053391906158b7565b60405180910390f35b61055660048036038101906105519190614c28565b612a8f565b60405161056391906158b7565b60405180910390f35b610574612bc4565b6040516105819190615908565b60405180910390f35b6105a4600480360381019061059f9190614cdc565b612bec565b6040516105b191906158b7565b60405180910390f35b6105c2612c01565b6040516105cf9190615908565b60405180910390f35b6105f260048036038101906105ed9190614d93565b612c9f565b005b6105fc613615565b60405161060991906158b7565b60405180910390f35b61061a613628565b60405161062791906158ed565b60405180910390f35b61063861364e565b60405161064591906158d2565b60405180910390f35b61066860048036038101906106639190614c28565b613674565b60405161067591906158b7565b60405180910390f35b61069860048036038101906106939190614c51565b6136a7565b6040516106a59190615b6a565b60405180910390f35b6106b66136cc565b6040516106c39190615b6a565b60405180910390f35b6106e660048036038101906106e19190614d93565b613942565b005b6106f0613ada565b6040516106fd9190615795565b60405180910390f35b6060600260405160200161071a919061573c565b604051602081830303815290604052905090565b600081601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161080e9190615b6a565b60405180910390a36001905092915050565b60035481565b6000818154811061083657600080fd5b90600052602060002090600202016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e70600d6000600781106108c657fe5b015460006040518363ffffffff1660e01b81526004016108e7929190615bae565b600060405180830381600087803b15801561090157600080fd5b505af1158015610915573d6000803e3d6000fd5b50505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600081601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156109c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bc90615aca565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015610a9d57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b15610bb65781601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610b2b57600080fd5b81601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081601460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610cad9190615b6a565b60405180910390a3600190509392505050565b600d8160078110610cd057600080fd5b016000915090505481565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6290615aea565b60405180910390fd5b600960149054906101000a900460ff16610dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db190615a8a565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e179190615795565b60206040518083038186803b158015610e2f57600080fd5b505afa158015610e43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e679190614dbc565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638dbdbe6d600d600060078110610eb557fe5b015483600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff1660e01b8152600401610ef993929190615c5a565b600060405180830381600087803b158015610f1357600080fd5b505af1158015610f27573d6000803e3d6000fd5b505050506000600960146101000a81548160ff02191690831515021790555050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160009054906101000a900460ff1660ff1614610fc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbb9061594a565b60405180910390fd5b60018060006101000a81548160ff021916908360ff160217905550600960149054906101000a900460ff161561102f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102690615a2a565b60405180910390fd5b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156110b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a890615aca565b60405180910390fd5b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506000600354905081600360008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516111739190615b6a565b60405180910390a36000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111d89190615795565b60206040518083038186803b1580156111f057600080fd5b505afa158015611204573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112289190614dbc565b90506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d60006007811061127857fe5b0154306040518363ffffffff1660e01b8152600401611298929190615b85565b60806040518083038186803b1580156112b057600080fd5b505afa1580156112c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e89190614d6a565b6000015190506000611315846113078488613b0090919063ffffffff16565b613b7090919063ffffffff16565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e70600d60006007811061136357fe5b0154836040518363ffffffff1660e01b8152600401611383929190615c31565b600060405180830381600087803b15801561139d57600080fd5b505af11580156113b1573d6000803e3d6000fd5b505050506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114129190615795565b60206040518083038186803b15801561142a57600080fd5b505afa15801561143e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114629190614dbc565b905060006114b0856040518060400160405280601081526020017f4469727479207769746864726177616c0000000000000000000000000000000081525084613bba9092919063ffffffff16565b9050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161150f9291906157e7565b602060405180830381600087803b15801561152957600080fd5b505af115801561153d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115619190614d18565b6115a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159790615b2a565b60405180910390fd5b600d6004600781106115ae57fe5b0154600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161160b9190615795565b60206040518083038186803b15801561162357600080fd5b505afa158015611637573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165b9190614dbc565b111561166b5761166a30613c15565b5b5050505050506000600160006101000a81548160ff021916908360ff16021790555050565b60006012905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172090615aea565b60405180910390fd5b600960149054906101000a900460ff1615611779576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611770906159ca565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635312ea8e600d6000600781106117c557fe5b01546040518263ffffffff1660e01b81526004016117e39190615b6a565b600060405180830381600087803b1580156117fd57600080fd5b505af1158015611811573d6000803e3d6000fd5b505050506001600960146101000a81548160ff021916908315150217905550565b600080600061183f614a22565b611847614a4a565b600080600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118a89190615795565b60206040518083038186803b1580156118c057600080fd5b505afa1580156118d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f89190614dbc565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d60006007811061194457fe5b0154306040518363ffffffff1660e01b8152600401611964929190615b85565b60806040518083038186803b15801561197c57600080fd5b505afa158015611990573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b49190614d6a565b600001510190506000600354670de0b6b3a76400008302816119d257fe5b0490506000600d6005600781106119e557fe5b0154600d6006600781106119f557fe5b01540360646301e13380670de0b6b3a76400008503020281611a1357fe5b049050828282600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d600060078110611a6557fe5b0154306040518363ffffffff1660e01b8152600401611a85929190615b85565b60806040518083038186803b158015611a9d57600080fd5b505afa158015611ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad59190614d6a565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631526fe27600d600060078110611b2157fe5b01546040518263ffffffff1660e01b8152600401611b3f9190615b6a565b60c06040518083038186803b158015611b5757600080fd5b505afa158015611b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8f9190614d41565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166317caf6f16040518163ffffffff1660e01b815260040160206040518083038186803b158015611bf757600080fd5b505afa158015611c0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2f9190614dbc565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e6c998d600d600060078110611c7b57fe5b0154306040518363ffffffff1660e01b8152600401611c9b929190615b85565b60206040518083038186803b158015611cb357600080fd5b505afa158015611cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ceb9190614d18565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166351ffcdcc600d600060078110611d3757fe5b0154306040518363ffffffff1660e01b8152600401611d57929190615b85565b60206040518083038186803b158015611d6f57600080fd5b505afa158015611d83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da79190614dbc565b9a509a509a509a509a509a509a509a505050509091929394959697565b60088181548110611dd457600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb090615aea565b60405180910390fd5b84600d600460078110611ec857fe5b018190555081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620186a08410611f53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4a906159ea565b60405180910390fd5b83600d600360078110611f6257fe5b0181905550620186a08310611fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa390615a6a565b60405180910390fd5b82600d600260078110611fbb57fe5b0181905550620186a08110612005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffc90615a0a565b60405180910390fd5b80600d60016007811061201457fe5b01819055505050505050565b6000600160009054906101000a900460ff1660ff1614612075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206c9061594a565b60405180910390fd5b60018060006101000a81548160ff021916908360ff16021790555061209933612a8f565b6120d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cf90615b4a565b60405180910390fd5b6120e061087a565b600d6004600781106120ee57fe5b0154600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161214b9190615795565b60206040518083038186803b15801561216357600080fd5b505afa158015612177573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219b9190614dbc565b116121db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d29061592a565b60405180910390fd5b6121e433613c15565b6000600160006101000a81548160ff021916908360ff160217905550565b6000600160009054906101000a900460ff1660ff1614612257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224e9061594a565b60405180910390fd5b60018060006101000a81548160ff021916908360ff160217905550600960149054906101000a900460ff166122c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b890615aaa565b60405180910390fd5b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015612343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233a90615aca565b60405180910390fd5b6000600354905081601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516124059190615b6a565b60405180910390a36000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161246a9190615795565b60206040518083038186803b15801561248257600080fd5b505afa158015612496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ba9190614dbc565b905060006124e3836124d58487613b0090919063ffffffff16565b613b7090919063ffffffff16565b9050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016125429291906157e7565b602060405180830381600087803b15801561255c57600080fd5b505af1158015612570573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125949190614d18565b6125d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ca90615b2a565b60405180910390fd5b5050506000600160006101000a81548160ff021916908360ff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146126ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a290615aea565b60405180910390fd5b600060405180604001604052808473ffffffffffffffffffffffffffffffffffffffff16815260200183815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550505050565b60146020528060005260406000206000915090505481565b6007818154811061278057600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283890615aea565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c990615b0a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561299a57600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161294d90615780565b60006040518083038185875af1925050503d806000811461298a576040519150601f19603f3d011682016040523d82523d6000602084013e61298f565b606091505b505080915050612a89565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a84578273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401612a2b92919061588e565b602060405180830381600087803b158015612a4557600080fd5b505af1158015612a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7d9190614d18565b9050612a89565b600090505b92915050565b6000806000805490501415612aa75760019050612bbf565b60005b600080549050811015612bb95760008181548110612ac457fe5b90600052602060002090600202016001015460008281548110612ae357fe5b906000526020600020906002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401612b4d9190615795565b60206040518083038186803b158015612b6557600080fd5b505afa158015612b79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9d9190614dbc565b10612bac576001915050612bbf565b8080600101915050612aaa565b50600090505b919050565b60606002604051602001612bd8919061575e565b604051602081830303815290604052905090565b6000612bf9338484610941565b905092915050565b60028054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612c975780601f10612c6c57610100808354040283529160200191612c97565b820191906000526020600020905b815481529060010190602001808311612c7a57829003601f168201915b505050505081565b6000600160009054906101000a900460ff1660ff1614612cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ceb9061594a565b60405180910390fd5b60018060006101000a81548160ff021916908360ff160217905550600960149054906101000a900460ff1615612d5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d569061598a565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612dbc9190615795565b60206040518083038186803b158015612dd457600080fd5b505afa158015612de8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e0c9190614dbc565b90506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d600060078110612e5c57fe5b0154306040518363ffffffff1660e01b8152600401612e7c929190615b85565b60806040518083038186803b158015612e9457600080fd5b505afa158015612ea8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ecc9190614d6a565b600001519050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401612f31939291906157b0565b602060405180830381600087803b158015612f4b57600080fd5b505af1158015612f5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f839190614d18565b612fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb9906159aa565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161301f9190615795565b60206040518083038186803b15801561303757600080fd5b505afa15801561304b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061306f9190614dbc565b905060006130bd846040518060400160405280600d81526020017f4469727479206465706f7369740000000000000000000000000000000000000081525084613bba9092919063ffffffff16565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638dbdbe6d600d60006007811061310b57fe5b015483600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff1660e01b815260040161314f93929190615c5a565b600060405180830381600087803b15801561316957600080fd5b505af115801561317d573d6000803e3d6000fd5b505050506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d6000600781106131cf57fe5b0154306040518363ffffffff1660e01b81526004016131ef929190615b85565b60806040518083038186803b15801561320757600080fd5b505afa15801561321b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061323f9190614d6a565b6000015190506000613291856040518060400160405280600b81526020017f4469727479207374616b6500000000000000000000000000000000000000000081525084613bba9092919063ffffffff16565b9050600080600354116132a757819050806132d2565b6132ce866132c060035485613b0090919063ffffffff16565b613b7090919063ffffffff16565b9050805b5080600360008282540192505081905550600080600d6001600781106132f457fe5b0154111561334b5761330533612a8f565b61334557613340620f4240613332600d60016007811061332157fe5b015485613b0090919063ffffffff16565b613b7090919063ffffffff16565b613348565b60005b90505b600081111561344c578060146000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516134439190615b6a565b60405180910390a35b61345f818361492290919063ffffffff16565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61350e848661492290919063ffffffff16565b60405161351b9190615b6a565b60405180910390a3600d60046007811061353157fe5b0154600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161358e9190615795565b60206040518083038186803b1580156135a657600080fd5b505afa1580156135ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135de9190614dbc565b11156135ee576135ed30613c15565b5b50505050505050506000600160006101000a81548160ff021916908360ff16021790555050565b600960149054906101000a900460ff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006136a0827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61072e565b9050919050565b6015602052816000526040600020602052806000526040600020600091509150505481565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016137519190615795565b60206040518083038186803b15801561376957600080fd5b505afa15801561377d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137a19190614dbc565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d6000600781106137ed57fe5b0154306040518363ffffffff1660e01b815260040161380d929190615b85565b60806040518083038186803b15801561382557600080fd5b505afa158015613839573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061385d9190614d6a565b6000015101905061393b670de0b6b3a764000061392d838573ffffffffffffffffffffffffffffffffffffffff166333281305600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016138cf9190615795565b60206040518083038186803b1580156138e757600080fd5b505afa1580156138fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061391f9190614dbc565b613b0090919063ffffffff16565b613b7090919063ffffffff16565b9250505090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146139d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139c990615aea565b60405180910390fd5b6000600160008054905003815481106139e757fe5b906000526020600020906002020160008281548110613a0257fe5b90600052602060002090600202016000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600182015481600101559050506000805480613a8f57fe5b6001900381819060005260206000209060020201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090555050905550565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080831415613b135760009050613b6a565b6000828402905082848281613b2457fe5b0414613b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b5c90615a4a565b60405180910390fd5b809150505b92915050565b6000613bb283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061496c565b905092915050565b6000838311158290613c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bf99190615908565b60405180910390fd5b5060008385039050809150509392505050565b600960149054906101000a900460ff1615613c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c5c90615a2a565b60405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600760016007805490500381548110613ca357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600860016008805490500381548110613ce757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000613dd46002600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613d769190615795565b60206040518083038186803b158015613d8e57600080fd5b505afa158015613da2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dc69190614dbc565b613b7090919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff16635c11d795826001600730426040518663ffffffff1660e01b8152600401613e19959493929190615bd7565b600060405180830381600087803b158015613e3357600080fd5b505af1158015613e47573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff16635c11d795826001600830426040518663ffffffff1660e01b8152600401613e8e959493929190615bd7565b600060405180830381600087803b158015613ea857600080fd5b505af1158015613ebc573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff1663e8e3370084848673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613f179190615795565b60206040518083038186803b158015613f2f57600080fd5b505afa158015613f43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f679190614dbc565b8673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613fa09190615795565b60206040518083038186803b158015613fb857600080fd5b505afa158015613fcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ff09190614dbc565b61409f6064614091605a8c73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016140339190615795565b60206040518083038186803b15801561404b57600080fd5b505afa15801561405f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140839190614dbc565b613b0090919063ffffffff16565b613b7090919063ffffffff16565b61414e6064614140605a8c73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016140e29190615795565b60206040518083038186803b1580156140fa57600080fd5b505afa15801561410e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141329190614dbc565b613b0090919063ffffffff16565b613b7090919063ffffffff16565b30426040518963ffffffff1660e01b8152600401614173989796959493929190615810565b606060405180830381600087803b15801561418d57600080fd5b505af11580156141a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141c59190614de5565b5050506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016142259190615795565b60206040518083038186803b15801561423d57600080fd5b505afa158015614251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142759190614dbc565b90506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d6000600781106142c557fe5b0154306040518363ffffffff1660e01b81526004016142e5929190615b85565b60806040518083038186803b1580156142fd57600080fd5b505afa158015614311573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143359190614d6a565b600001519050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638dbdbe6d600d60006007811061438757fe5b015484600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff1660e01b81526004016143cb93929190615c5a565b600060405180830381600087803b1580156143e557600080fd5b505af11580156143f9573d6000803e3d6000fd5b505050506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d60006007811061444b57fe5b0154306040518363ffffffff1660e01b815260040161446b929190615b85565b60806040518083038186803b15801561448357600080fd5b505afa158015614497573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144bb9190614d6a565b600001519050600061450d836040518060400160405280600b81526020017f4469727479207374616b6500000000000000000000000000000000000000000081525084613bba9092919063ffffffff16565b9050600080600d60056007811061452057fe5b01541415614547574267ffffffffffffffff16600d60056007811061454157fe5b01819055505b4267ffffffffffffffff16600d60066007811061456057fe5b018190555060006003541161457857819050806145a3565b61459f8461459160035485613b0090919063ffffffff16565b613b7090919063ffffffff16565b9050805b506145db620f42406145cd600d6002600781106145bc57fe5b015484613b0090919063ffffffff16565b613b7090919063ffffffff16565b60146000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060003073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614614684578a6146a8565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b90506146e1620f42406146d3600d6003600781106146c257fe5b015485613b0090919063ffffffff16565b613b7090919063ffffffff16565b601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506147ac614767620f4240614759600d60036007811061474857fe5b015486613b0090919063ffffffff16565b613b7090919063ffffffff16565b61479e620f4240614790600d60026007811061477f57fe5b015487613b0090919063ffffffff16565b613b7090919063ffffffff16565b6149cd90919063ffffffff16565b600360008282540192505081905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef614864620f4240614856600d60026007811061484557fe5b015488613b0090919063ffffffff16565b613b7090919063ffffffff16565b6040516148719190615b6a565b60405180910390a38073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef614900620f42406148f2600d6003600781106148e157fe5b015488613b0090919063ffffffff16565b613b7090919063ffffffff16565b60405161490d9190615b6a565b60405180910390a35050505050505050505050565b600061496483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613bba565b905092915050565b600080831182906149b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016149aa9190615908565b60405180910390fd5b5060008385816149bf57fe5b049050809150509392505050565b600080828401905083811015614a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614a0f9061596a565b60405180910390fd5b8091505092915050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600061ffff168152602001600081525090565b600081359050614aa981615f60565b92915050565b600081519050614abe81615f60565b92915050565b600081519050614ad381615f77565b92915050565b600060c08284031215614aeb57600080fd5b614af560c0615d12565b90506000614b0584828501614aaf565b6000830152506020614b1984828501614c13565b6020830152506040614b2d84828501614c13565b6040830152506060614b4184828501614c13565b6060830152506080614b5584828501614be9565b60808301525060a0614b6984828501614c13565b60a08301525092915050565b600060808284031215614b8757600080fd5b614b916080615d12565b90506000614ba184828501614c13565b6000830152506020614bb584828501614c13565b6020830152506040614bc984828501614c13565b6040830152506060614bdd84828501614c13565b60608301525092915050565b600081519050614bf881615f8e565b92915050565b600081359050614c0d81615fa5565b92915050565b600081519050614c2281615fa5565b92915050565b600060208284031215614c3a57600080fd5b6000614c4884828501614a9a565b91505092915050565b60008060408385031215614c6457600080fd5b6000614c7285828601614a9a565b9250506020614c8385828601614a9a565b9150509250929050565b600080600060608486031215614ca257600080fd5b6000614cb086828701614a9a565b9350506020614cc186828701614a9a565b9250506040614cd286828701614bfe565b9150509250925092565b60008060408385031215614cef57600080fd5b6000614cfd85828601614a9a565b9250506020614d0e85828601614bfe565b9150509250929050565b600060208284031215614d2a57600080fd5b6000614d3884828501614ac4565b91505092915050565b600060c08284031215614d5357600080fd5b6000614d6184828501614ad9565b91505092915050565b600060808284031215614d7c57600080fd5b6000614d8a84828501614b75565b91505092915050565b600060208284031215614da557600080fd5b6000614db384828501614bfe565b91505092915050565b600060208284031215614dce57600080fd5b6000614ddc84828501614c13565b91505092915050565b600080600060608486031215614dfa57600080fd5b6000614e0886828701614c13565b9350506020614e1986828701614c13565b9250506040614e2a86828701614c13565b9150509250925092565b600080600080600060a08688031215614e4c57600080fd5b6000614e5a88828901614bfe565b9550506020614e6b88828901614bfe565b9450506040614e7c88828901614bfe565b9350506060614e8d88828901614a9a565b9250506080614e9e88828901614bfe565b9150509295509295909350565b6000614eb78383614ed2565b60208301905092915050565b614ecc81615e3e565b82525050565b614edb81615de8565b82525050565b614eea81615de8565b82525050565b6000614efb82615d6d565b614f058185615d90565b9350614f1083615d43565b8060005b83811015614f4857614f2582615f2f565b614f2f8882614eab565b9750614f3a83615d83565b925050600181019050614f14565b5085935050505092915050565b614f5e81615dfa565b82525050565b614f6d81615e50565b82525050565b614f7c81615e74565b82525050565b614f8b81615e98565b82525050565b614f9a81615eaa565b82525050565b6000614fab82615d78565b614fb58185615dac565b9350614fc5818560208601615ee0565b614fce81615f42565b840191505092915050565b600081546001811660008114614ff6576001811461501b5761505f565b607f60028304166150078187615dbd565b955060ff198316865280860193505061505f565b600282046150298187615dbd565b955061503485615d58565b60005b8281101561505657815481890152600182019150602081019050615037565b82880195505050505b505092915050565b6000615074600f83615dbd565b91507f6b63632e677572752f475241494e2f00000000000000000000000000000000006000830152600f82019050919050565b60006150b4601483615dac565b91507f4e6f74206d75636820776f726b20746f20646f210000000000000000000000006000830152602082019050919050565b60006150f4600383615dac565b91507f21524700000000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000615134601b83615dac565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000615174600683615dbd565b91507f475241494e2300000000000000000000000000000000000000000000000000006000830152600682019050919050565b60006151b4602783615dac565b91507f49747320616e20656d657267656e63792e20506c6561736520646f6e2774206460008301527f65706f7369742e000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061521a601183615dac565b91507f556e61626c6520746f206f6e626f6172640000000000000000000000000000006000830152602082019050919050565b600061525a601b83615dac565b91507f456d657267656e637920616c7265616479206465636c617265642e00000000006000830152602082019050919050565b600061529a600983615dac565b91507f2177693a206869676800000000000000000000000000000000000000000000006000830152602082019050919050565b60006152da600983615dac565b91507f2164663a206869676800000000000000000000000000000000000000000000006000830152602082019050919050565b600061531a603183615dac565b91507f49747320616e20656d657267656e63792e2055736520656d657267656e63795760008301527f69746864726177282920706c656173652e0000000000000000000000000000006020830152604082019050919050565b6000615380602183615dac565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006153e6600983615dac565b91507f2170663a206869676800000000000000000000000000000000000000000000006000830152602082019050919050565b6000615426601783615dac565b91507f456d657267656e6379206e6f74206465636c617265642e0000000000000000006000830152602082019050919050565b6000615466602d83615dac565b91507f497473206e6f7420616e20656d657267656e63792e205573652077697468647260008301527f6177282920696e73746561642e000000000000000000000000000000000000006020830152604082019050919050565b60006154cc601483615dac565b91507f496e73756666696369656e742042616c616e63650000000000000000000000006000830152602082019050919050565b600061550c603583615dac565b91507f4f6e6c7920452e4c2e492e542e452e20442e412e4f2e2054726561737572792060008301527f63616e20726573637565207472656173757265732100000000000000000000006020830152604082019050919050565b6000615572600083615da1565b9150600082019050919050565b600061558c601c83615dac565b91507f46756e647320617265205361667520696e20656d657267656e637921000000006000830152602082019050919050565b60006155cc601183615dac565b91507f556e61626c6520746f206465626f6172640000000000000000000000000000006000830152602082019050919050565b600061560c600c83615dac565b91507f456c69746573206f6e6c792100000000000000000000000000000000000000006000830152602082019050919050565b60c0820160008201516156556000850182614ed2565b506020820151615668602085018261571e565b50604082015161567b604085018261571e565b50606082015161568e606085018261571e565b5060808201516156a1608085018261570f565b5060a08201516156b460a085018261571e565b50505050565b6080820160008201516156d0600085018261571e565b5060208201516156e3602085018261571e565b5060408201516156f6604085018261571e565b506060820151615709606085018261571e565b50505050565b61571881615e06565b82525050565b61572781615e34565b82525050565b61573681615e34565b82525050565b600061574782615067565b91506157538284614fd9565b915081905092915050565b600061576982615167565b91506157758284614fd9565b915081905092915050565b600061578b82615565565b9150819050919050565b60006020820190506157aa6000830184614ee1565b92915050565b60006060820190506157c56000830186614ec3565b6157d26020830185614ee1565b6157df604083018461572d565b949350505050565b60006040820190506157fc6000830185614ec3565b615809602083018461572d565b9392505050565b600061010082019050615826600083018b614ee1565b615833602083018a614ee1565b615840604083018961572d565b61584d606083018861572d565b61585a608083018761572d565b61586760a083018661572d565b61587460c0830185614ee1565b61588160e083018461572d565b9998505050505050505050565b60006040820190506158a36000830185614ee1565b6158b0602083018461572d565b9392505050565b60006020820190506158cc6000830184614f55565b92915050565b60006020820190506158e76000830184614f64565b92915050565b60006020820190506159026000830184614f73565b92915050565b600060208201905081810360008301526159228184614fa0565b905092915050565b60006020820190508181036000830152615943816150a7565b9050919050565b60006020820190508181036000830152615963816150e7565b9050919050565b6000602082019050818103600083015261598381615127565b9050919050565b600060208201905081810360008301526159a3816151a7565b9050919050565b600060208201905081810360008301526159c38161520d565b9050919050565b600060208201905081810360008301526159e38161524d565b9050919050565b60006020820190508181036000830152615a038161528d565b9050919050565b60006020820190508181036000830152615a23816152cd565b9050919050565b60006020820190508181036000830152615a438161530d565b9050919050565b60006020820190508181036000830152615a6381615373565b9050919050565b60006020820190508181036000830152615a83816153d9565b9050919050565b60006020820190508181036000830152615aa381615419565b9050919050565b60006020820190508181036000830152615ac381615459565b9050919050565b60006020820190508181036000830152615ae3816154bf565b9050919050565b60006020820190508181036000830152615b03816154ff565b9050919050565b60006020820190508181036000830152615b238161557f565b9050919050565b60006020820190508181036000830152615b43816155bf565b9050919050565b60006020820190508181036000830152615b63816155ff565b9050919050565b6000602082019050615b7f600083018461572d565b92915050565b6000604082019050615b9a600083018561572d565b615ba76020830184614ee1565b9392505050565b6000604082019050615bc3600083018561572d565b615bd06020830184614f82565b9392505050565b600060a082019050615bec600083018861572d565b615bf96020830187614f91565b8181036040830152615c0b8186614ef0565b9050615c1a6060830185614ee1565b615c27608083018461572d565b9695505050505050565b6000604082019050615c46600083018561572d565b615c53602083018461572d565b9392505050565b6000606082019050615c6f600083018661572d565b615c7c602083018561572d565b615c896040830184614ee1565b949350505050565b600061020082019050615ca7600083018b61572d565b615cb4602083018a61572d565b615cc1604083018961572d565b615cce60608301886156ba565b615cdb60e083018761563f565b615ce96101a083018661572d565b615cf76101c0830185614f55565b615d056101e083018461572d565b9998505050505050505050565b6000604051905081810181811067ffffffffffffffff82111715615d3957615d38615f2d565b5b8060405250919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081549050919050565b600081519050919050565b6000600182019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000615df382615e14565b9050919050565b60008115159050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000615e4982615ebc565b9050919050565b6000615e5b82615e62565b9050919050565b6000615e6d82615e14565b9050919050565b6000615e7f82615e86565b9050919050565b6000615e9182615e14565b9050919050565b6000615ea382615e34565b9050919050565b6000615eb582615e34565b9050919050565b6000615ec782615ece565b9050919050565b6000615ed982615e14565b9050919050565b60005b83811015615efe578082015181840152602081019050615ee3565b83811115615f0d576000848401525b50505050565b6000615f26615f2183615f53565b615dc8565b9050919050565bfe5b6000615f3b8254615f13565b9050919050565b6000601f19601f8301169050919050565b60008160001c9050919050565b615f6981615de8565b8114615f7457600080fd5b50565b615f8081615dfa565b8114615f8b57600080fd5b50565b615f9781615e06565b8114615fa257600080fd5b50565b615fae81615e34565b8114615fb957600080fd5b5056fea26469706673582212209ed89d5da3e39c4c2ea1a819b2c3e592254a9c04c222ace68f24ff6a9106a56364736f6c63430007060033000000000000000000000000fcfe2562fb9edd16abba43295d66b154f79c56d1000000000000000000000000243e46d50130f346bede1d9548b41c49c6440872000000000000000000000000bd451b952de19f2c7ba2c8c516b0740484e953b200000000000000000000000000000000000000000000000000000000000000070000000000000000000000006074e20633d2d8fbdf82119867a81581cabe06dd000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000426a4a4b73d4cd173c9ab78d18c0d79d1717eaa90000000000000000000000000000000000000000000000000000000000000002000000000000000000000000bd451b952de19f2c7ba2c8c516b0740484e953b20000000000000000000000004446fc4eb47f2f6586f9faab68b3498f86c075210000000000000000000000000000000000000000000000000000000000000003000000000000000000000000bd451b952de19f2c7ba2c8c516b0740484e953b20000000000000000000000004446fc4eb47f2f6586f9faab68b3498f86c07521000000000000000000000000980a5afef3d17ad98635f6c5aebcbaeded3c343000000000000000000000000000000000000000000000000000000000000000043331303300000000000000000000000000000000000000000000000000000000
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106102275760003560e01c80635312ea8e11610130578063af640d0f116100b8578063daea85c51161007c578063daea85c51461064e578063dd62ed3e1461067e578063e5328e06146106ae578063ef1b8140146106cc578063f887ea40146106e857610227565b8063af640d0f146105ba578063b6b55f25146105d8578063caa6fea4146105f4578063cb7956b014610612578063d389800f1461063057610227565b80637919b71b116100ff5780637919b71b146104dc5780637a4e4ecf1461050c5780638ed5f3731461053c57806395d89b411461056c578063a9059cbb1461058a57610227565b80635312ea8e1461045657806361d027b314610472578063685c8ca51461049057806370a08231146104ac57610227565b806327d9cf44116101b3578063370158ea11610182578063370158ea146103bd5780633d456f43146103e25780634162169f146104125780634b292cae146104305780634fa5d8541461044c57610227565b806327d9cf441461035b5780632e1a7d4d14610379578063313ce5671461039557806331e244e5146103b357610227565b80631e534906116101fa5780631e534906146102c95780631f1fcd51146102d357806323b872dd146102f157806323e1d0e81461032157806324aa95ec1461035157610227565b806306fdde031461022c578063095ea7b31461024a57806318160ddd1461027a5780631b5f9c4214610298575b600080fd5b610234610706565b6040516102419190615908565b60405180910390f35b610264600480360381019061025f9190614cdc565b61072e565b60405161027191906158b7565b60405180910390f35b610282610820565b60405161028f9190615b6a565b60405180910390f35b6102b260048036038101906102ad9190614d93565b610826565b6040516102c092919061588e565b60405180910390f35b6102d161087a565b005b6102db61091b565b6040516102e891906158d2565b60405180910390f35b61030b60048036038101906103069190614c8d565b610941565b60405161031891906158b7565b60405180910390f35b61033b60048036038101906103369190614d93565b610cc0565b6040516103489190615b6a565b60405180910390f35b610359610cdb565b005b610363610f49565b6040516103709190615795565b60405180910390f35b610393600480360381019061038e9190614d93565b610f6f565b005b61039d611690565b6040516103aa9190615b6a565b60405180910390f35b6103bb611699565b005b6103c5611832565b6040516103d9989796959493929190615c91565b60405180910390f35b6103fc60048036038101906103f79190614d93565b611dc4565b6040516104099190615795565b60405180910390f35b61041a611e03565b6040516104279190615795565b60405180910390f35b61044a60048036038101906104459190614e34565b611e29565b005b610454612020565b005b610470600480360381019061046b9190614d93565b612202565b005b61047a6125f5565b6040516104879190615795565b60405180910390f35b6104aa60048036038101906104a59190614cdc565b61261b565b005b6104c660048036038101906104c19190614c28565b612758565b6040516104d39190615b6a565b60405180910390f35b6104f660048036038101906104f19190614d93565b612770565b6040516105039190615795565b60405180910390f35b61052660048036038101906105219190614cdc565b6127af565b60405161053391906158b7565b60405180910390f35b61055660048036038101906105519190614c28565b612a8f565b60405161056391906158b7565b60405180910390f35b610574612bc4565b6040516105819190615908565b60405180910390f35b6105a4600480360381019061059f9190614cdc565b612bec565b6040516105b191906158b7565b60405180910390f35b6105c2612c01565b6040516105cf9190615908565b60405180910390f35b6105f260048036038101906105ed9190614d93565b612c9f565b005b6105fc613615565b60405161060991906158b7565b60405180910390f35b61061a613628565b60405161062791906158ed565b60405180910390f35b61063861364e565b60405161064591906158d2565b60405180910390f35b61066860048036038101906106639190614c28565b613674565b60405161067591906158b7565b60405180910390f35b61069860048036038101906106939190614c51565b6136a7565b6040516106a59190615b6a565b60405180910390f35b6106b66136cc565b6040516106c39190615b6a565b60405180910390f35b6106e660048036038101906106e19190614d93565b613942565b005b6106f0613ada565b6040516106fd9190615795565b60405180910390f35b6060600260405160200161071a919061573c565b604051602081830303815290604052905090565b600081601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161080e9190615b6a565b60405180910390a36001905092915050565b60035481565b6000818154811061083657600080fd5b90600052602060002090600202016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e70600d6000600781106108c657fe5b015460006040518363ffffffff1660e01b81526004016108e7929190615bae565b600060405180830381600087803b15801561090157600080fd5b505af1158015610915573d6000803e3d6000fd5b50505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600081601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156109c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bc90615aca565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015610a9d57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b15610bb65781601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610b2b57600080fd5b81601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81601460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081601460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610cad9190615b6a565b60405180910390a3600190509392505050565b600d8160078110610cd057600080fd5b016000915090505481565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6290615aea565b60405180910390fd5b600960149054906101000a900460ff16610dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db190615a8a565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e179190615795565b60206040518083038186803b158015610e2f57600080fd5b505afa158015610e43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e679190614dbc565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638dbdbe6d600d600060078110610eb557fe5b015483600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff1660e01b8152600401610ef993929190615c5a565b600060405180830381600087803b158015610f1357600080fd5b505af1158015610f27573d6000803e3d6000fd5b505050506000600960146101000a81548160ff02191690831515021790555050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160009054906101000a900460ff1660ff1614610fc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbb9061594a565b60405180910390fd5b60018060006101000a81548160ff021916908360ff160217905550600960149054906101000a900460ff161561102f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102690615a2a565b60405180910390fd5b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156110b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a890615aca565b60405180910390fd5b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506000600354905081600360008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516111739190615b6a565b60405180910390a36000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111d89190615795565b60206040518083038186803b1580156111f057600080fd5b505afa158015611204573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112289190614dbc565b90506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d60006007811061127857fe5b0154306040518363ffffffff1660e01b8152600401611298929190615b85565b60806040518083038186803b1580156112b057600080fd5b505afa1580156112c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e89190614d6a565b6000015190506000611315846113078488613b0090919063ffffffff16565b613b7090919063ffffffff16565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663441a3e70600d60006007811061136357fe5b0154836040518363ffffffff1660e01b8152600401611383929190615c31565b600060405180830381600087803b15801561139d57600080fd5b505af11580156113b1573d6000803e3d6000fd5b505050506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114129190615795565b60206040518083038186803b15801561142a57600080fd5b505afa15801561143e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114629190614dbc565b905060006114b0856040518060400160405280601081526020017f4469727479207769746864726177616c0000000000000000000000000000000081525084613bba9092919063ffffffff16565b9050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161150f9291906157e7565b602060405180830381600087803b15801561152957600080fd5b505af115801561153d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115619190614d18565b6115a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159790615b2a565b60405180910390fd5b600d6004600781106115ae57fe5b0154600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161160b9190615795565b60206040518083038186803b15801561162357600080fd5b505afa158015611637573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165b9190614dbc565b111561166b5761166a30613c15565b5b5050505050506000600160006101000a81548160ff021916908360ff16021790555050565b60006012905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172090615aea565b60405180910390fd5b600960149054906101000a900460ff1615611779576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611770906159ca565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635312ea8e600d6000600781106117c557fe5b01546040518263ffffffff1660e01b81526004016117e39190615b6a565b600060405180830381600087803b1580156117fd57600080fd5b505af1158015611811573d6000803e3d6000fd5b505050506001600960146101000a81548160ff021916908315150217905550565b600080600061183f614a22565b611847614a4a565b600080600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118a89190615795565b60206040518083038186803b1580156118c057600080fd5b505afa1580156118d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f89190614dbc565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d60006007811061194457fe5b0154306040518363ffffffff1660e01b8152600401611964929190615b85565b60806040518083038186803b15801561197c57600080fd5b505afa158015611990573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b49190614d6a565b600001510190506000600354670de0b6b3a76400008302816119d257fe5b0490506000600d6005600781106119e557fe5b0154600d6006600781106119f557fe5b01540360646301e13380670de0b6b3a76400008503020281611a1357fe5b049050828282600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d600060078110611a6557fe5b0154306040518363ffffffff1660e01b8152600401611a85929190615b85565b60806040518083038186803b158015611a9d57600080fd5b505afa158015611ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad59190614d6a565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631526fe27600d600060078110611b2157fe5b01546040518263ffffffff1660e01b8152600401611b3f9190615b6a565b60c06040518083038186803b158015611b5757600080fd5b505afa158015611b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8f9190614d41565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166317caf6f16040518163ffffffff1660e01b815260040160206040518083038186803b158015611bf757600080fd5b505afa158015611c0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2f9190614dbc565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e6c998d600d600060078110611c7b57fe5b0154306040518363ffffffff1660e01b8152600401611c9b929190615b85565b60206040518083038186803b158015611cb357600080fd5b505afa158015611cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ceb9190614d18565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166351ffcdcc600d600060078110611d3757fe5b0154306040518363ffffffff1660e01b8152600401611d57929190615b85565b60206040518083038186803b158015611d6f57600080fd5b505afa158015611d83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da79190614dbc565b9a509a509a509a509a509a509a509a505050509091929394959697565b60088181548110611dd457600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb090615aea565b60405180910390fd5b84600d600460078110611ec857fe5b018190555081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620186a08410611f53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4a906159ea565b60405180910390fd5b83600d600360078110611f6257fe5b0181905550620186a08310611fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa390615a6a565b60405180910390fd5b82600d600260078110611fbb57fe5b0181905550620186a08110612005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffc90615a0a565b60405180910390fd5b80600d60016007811061201457fe5b01819055505050505050565b6000600160009054906101000a900460ff1660ff1614612075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206c9061594a565b60405180910390fd5b60018060006101000a81548160ff021916908360ff16021790555061209933612a8f565b6120d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cf90615b4a565b60405180910390fd5b6120e061087a565b600d6004600781106120ee57fe5b0154600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161214b9190615795565b60206040518083038186803b15801561216357600080fd5b505afa158015612177573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219b9190614dbc565b116121db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d29061592a565b60405180910390fd5b6121e433613c15565b6000600160006101000a81548160ff021916908360ff160217905550565b6000600160009054906101000a900460ff1660ff1614612257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224e9061594a565b60405180910390fd5b60018060006101000a81548160ff021916908360ff160217905550600960149054906101000a900460ff166122c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b890615aaa565b60405180910390fd5b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015612343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233a90615aca565b60405180910390fd5b6000600354905081601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516124059190615b6a565b60405180910390a36000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161246a9190615795565b60206040518083038186803b15801561248257600080fd5b505afa158015612496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ba9190614dbc565b905060006124e3836124d58487613b0090919063ffffffff16565b613b7090919063ffffffff16565b9050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016125429291906157e7565b602060405180830381600087803b15801561255c57600080fd5b505af1158015612570573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125949190614d18565b6125d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ca90615b2a565b60405180910390fd5b5050506000600160006101000a81548160ff021916908360ff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146126ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a290615aea565b60405180910390fd5b600060405180604001604052808473ffffffffffffffffffffffffffffffffffffffff16815260200183815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550505050565b60146020528060005260406000206000915090505481565b6007818154811061278057600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283890615aea565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c990615b0a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561299a57600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161294d90615780565b60006040518083038185875af1925050503d806000811461298a576040519150601f19603f3d011682016040523d82523d6000602084013e61298f565b606091505b505080915050612a89565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a84578273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401612a2b92919061588e565b602060405180830381600087803b158015612a4557600080fd5b505af1158015612a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7d9190614d18565b9050612a89565b600090505b92915050565b6000806000805490501415612aa75760019050612bbf565b60005b600080549050811015612bb95760008181548110612ac457fe5b90600052602060002090600202016001015460008281548110612ae357fe5b906000526020600020906002020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401612b4d9190615795565b60206040518083038186803b158015612b6557600080fd5b505afa158015612b79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9d9190614dbc565b10612bac576001915050612bbf565b8080600101915050612aaa565b50600090505b919050565b60606002604051602001612bd8919061575e565b604051602081830303815290604052905090565b6000612bf9338484610941565b905092915050565b60028054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612c975780601f10612c6c57610100808354040283529160200191612c97565b820191906000526020600020905b815481529060010190602001808311612c7a57829003601f168201915b505050505081565b6000600160009054906101000a900460ff1660ff1614612cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ceb9061594a565b60405180910390fd5b60018060006101000a81548160ff021916908360ff160217905550600960149054906101000a900460ff1615612d5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d569061598a565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612dbc9190615795565b60206040518083038186803b158015612dd457600080fd5b505afa158015612de8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e0c9190614dbc565b90506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d600060078110612e5c57fe5b0154306040518363ffffffff1660e01b8152600401612e7c929190615b85565b60806040518083038186803b158015612e9457600080fd5b505afa158015612ea8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ecc9190614d6a565b600001519050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401612f31939291906157b0565b602060405180830381600087803b158015612f4b57600080fd5b505af1158015612f5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f839190614d18565b612fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb9906159aa565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161301f9190615795565b60206040518083038186803b15801561303757600080fd5b505afa15801561304b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061306f9190614dbc565b905060006130bd846040518060400160405280600d81526020017f4469727479206465706f7369740000000000000000000000000000000000000081525084613bba9092919063ffffffff16565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638dbdbe6d600d60006007811061310b57fe5b015483600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff1660e01b815260040161314f93929190615c5a565b600060405180830381600087803b15801561316957600080fd5b505af115801561317d573d6000803e3d6000fd5b505050506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d6000600781106131cf57fe5b0154306040518363ffffffff1660e01b81526004016131ef929190615b85565b60806040518083038186803b15801561320757600080fd5b505afa15801561321b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061323f9190614d6a565b6000015190506000613291856040518060400160405280600b81526020017f4469727479207374616b6500000000000000000000000000000000000000000081525084613bba9092919063ffffffff16565b9050600080600354116132a757819050806132d2565b6132ce866132c060035485613b0090919063ffffffff16565b613b7090919063ffffffff16565b9050805b5080600360008282540192505081905550600080600d6001600781106132f457fe5b0154111561334b5761330533612a8f565b61334557613340620f4240613332600d60016007811061332157fe5b015485613b0090919063ffffffff16565b613b7090919063ffffffff16565b613348565b60005b90505b600081111561344c578060146000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516134439190615b6a565b60405180910390a35b61345f818361492290919063ffffffff16565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61350e848661492290919063ffffffff16565b60405161351b9190615b6a565b60405180910390a3600d60046007811061353157fe5b0154600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161358e9190615795565b60206040518083038186803b1580156135a657600080fd5b505afa1580156135ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135de9190614dbc565b11156135ee576135ed30613c15565b5b50505050505050506000600160006101000a81548160ff021916908360ff16021790555050565b600960149054906101000a900460ff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006136a0827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61072e565b9050919050565b6015602052816000526040600020602052806000526040600020600091509150505481565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016137519190615795565b60206040518083038186803b15801561376957600080fd5b505afa15801561377d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137a19190614dbc565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d6000600781106137ed57fe5b0154306040518363ffffffff1660e01b815260040161380d929190615b85565b60806040518083038186803b15801561382557600080fd5b505afa158015613839573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061385d9190614d6a565b6000015101905061393b670de0b6b3a764000061392d838573ffffffffffffffffffffffffffffffffffffffff166333281305600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016138cf9190615795565b60206040518083038186803b1580156138e757600080fd5b505afa1580156138fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061391f9190614dbc565b613b0090919063ffffffff16565b613b7090919063ffffffff16565b9250505090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146139d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139c990615aea565b60405180910390fd5b6000600160008054905003815481106139e757fe5b906000526020600020906002020160008281548110613a0257fe5b90600052602060002090600202016000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600182015481600101559050506000805480613a8f57fe5b6001900381819060005260206000209060020201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090555050905550565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080831415613b135760009050613b6a565b6000828402905082848281613b2457fe5b0414613b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b5c90615a4a565b60405180910390fd5b809150505b92915050565b6000613bb283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061496c565b905092915050565b6000838311158290613c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bf99190615908565b60405180910390fd5b5060008385039050809150509392505050565b600960149054906101000a900460ff1615613c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c5c90615a2a565b60405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600760016007805490500381548110613ca357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600860016008805490500381548110613ce757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000613dd46002600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613d769190615795565b60206040518083038186803b158015613d8e57600080fd5b505afa158015613da2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dc69190614dbc565b613b7090919063ffffffff16565b90508373ffffffffffffffffffffffffffffffffffffffff16635c11d795826001600730426040518663ffffffff1660e01b8152600401613e19959493929190615bd7565b600060405180830381600087803b158015613e3357600080fd5b505af1158015613e47573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff16635c11d795826001600830426040518663ffffffff1660e01b8152600401613e8e959493929190615bd7565b600060405180830381600087803b158015613ea857600080fd5b505af1158015613ebc573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff1663e8e3370084848673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613f179190615795565b60206040518083038186803b158015613f2f57600080fd5b505afa158015613f43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f679190614dbc565b8673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613fa09190615795565b60206040518083038186803b158015613fb857600080fd5b505afa158015613fcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ff09190614dbc565b61409f6064614091605a8c73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016140339190615795565b60206040518083038186803b15801561404b57600080fd5b505afa15801561405f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140839190614dbc565b613b0090919063ffffffff16565b613b7090919063ffffffff16565b61414e6064614140605a8c73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016140e29190615795565b60206040518083038186803b1580156140fa57600080fd5b505afa15801561410e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141329190614dbc565b613b0090919063ffffffff16565b613b7090919063ffffffff16565b30426040518963ffffffff1660e01b8152600401614173989796959493929190615810565b606060405180830381600087803b15801561418d57600080fd5b505af11580156141a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141c59190614de5565b5050506000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016142259190615795565b60206040518083038186803b15801561423d57600080fd5b505afa158015614251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142759190614dbc565b90506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d6000600781106142c557fe5b0154306040518363ffffffff1660e01b81526004016142e5929190615b85565b60806040518083038186803b1580156142fd57600080fd5b505afa158015614311573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143359190614d6a565b600001519050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638dbdbe6d600d60006007811061438757fe5b015484600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff1660e01b81526004016143cb93929190615c5a565b600060405180830381600087803b1580156143e557600080fd5b505af11580156143f9573d6000803e3d6000fd5b505050506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166393f1a40b600d60006007811061444b57fe5b0154306040518363ffffffff1660e01b815260040161446b929190615b85565b60806040518083038186803b15801561448357600080fd5b505afa158015614497573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144bb9190614d6a565b600001519050600061450d836040518060400160405280600b81526020017f4469727479207374616b6500000000000000000000000000000000000000000081525084613bba9092919063ffffffff16565b9050600080600d60056007811061452057fe5b01541415614547574267ffffffffffffffff16600d60056007811061454157fe5b01819055505b4267ffffffffffffffff16600d60066007811061456057fe5b018190555060006003541161457857819050806145a3565b61459f8461459160035485613b0090919063ffffffff16565b613b7090919063ffffffff16565b9050805b506145db620f42406145cd600d6002600781106145bc57fe5b015484613b0090919063ffffffff16565b613b7090919063ffffffff16565b60146000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060003073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614614684578a6146a8565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b90506146e1620f42406146d3600d6003600781106146c257fe5b015485613b0090919063ffffffff16565b613b7090919063ffffffff16565b601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506147ac614767620f4240614759600d60036007811061474857fe5b015486613b0090919063ffffffff16565b613b7090919063ffffffff16565b61479e620f4240614790600d60026007811061477f57fe5b015487613b0090919063ffffffff16565b613b7090919063ffffffff16565b6149cd90919063ffffffff16565b600360008282540192505081905550600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef614864620f4240614856600d60026007811061484557fe5b015488613b0090919063ffffffff16565b613b7090919063ffffffff16565b6040516148719190615b6a565b60405180910390a38073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef614900620f42406148f2600d6003600781106148e157fe5b015488613b0090919063ffffffff16565b613b7090919063ffffffff16565b60405161490d9190615b6a565b60405180910390a35050505050505050505050565b600061496483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613bba565b905092915050565b600080831182906149b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016149aa9190615908565b60405180910390fd5b5060008385816149bf57fe5b049050809150509392505050565b600080828401905083811015614a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614a0f9061596a565b60405180910390fd5b8091505092915050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600061ffff168152602001600081525090565b600081359050614aa981615f60565b92915050565b600081519050614abe81615f60565b92915050565b600081519050614ad381615f77565b92915050565b600060c08284031215614aeb57600080fd5b614af560c0615d12565b90506000614b0584828501614aaf565b6000830152506020614b1984828501614c13565b6020830152506040614b2d84828501614c13565b6040830152506060614b4184828501614c13565b6060830152506080614b5584828501614be9565b60808301525060a0614b6984828501614c13565b60a08301525092915050565b600060808284031215614b8757600080fd5b614b916080615d12565b90506000614ba184828501614c13565b6000830152506020614bb584828501614c13565b6020830152506040614bc984828501614c13565b6040830152506060614bdd84828501614c13565b60608301525092915050565b600081519050614bf881615f8e565b92915050565b600081359050614c0d81615fa5565b92915050565b600081519050614c2281615fa5565b92915050565b600060208284031215614c3a57600080fd5b6000614c4884828501614a9a565b91505092915050565b60008060408385031215614c6457600080fd5b6000614c7285828601614a9a565b9250506020614c8385828601614a9a565b9150509250929050565b600080600060608486031215614ca257600080fd5b6000614cb086828701614a9a565b9350506020614cc186828701614a9a565b9250506040614cd286828701614bfe565b9150509250925092565b60008060408385031215614cef57600080fd5b6000614cfd85828601614a9a565b9250506020614d0e85828601614bfe565b9150509250929050565b600060208284031215614d2a57600080fd5b6000614d3884828501614ac4565b91505092915050565b600060c08284031215614d5357600080fd5b6000614d6184828501614ad9565b91505092915050565b600060808284031215614d7c57600080fd5b6000614d8a84828501614b75565b91505092915050565b600060208284031215614da557600080fd5b6000614db384828501614bfe565b91505092915050565b600060208284031215614dce57600080fd5b6000614ddc84828501614c13565b91505092915050565b600080600060608486031215614dfa57600080fd5b6000614e0886828701614c13565b9350506020614e1986828701614c13565b9250506040614e2a86828701614c13565b9150509250925092565b600080600080600060a08688031215614e4c57600080fd5b6000614e5a88828901614bfe565b9550506020614e6b88828901614bfe565b9450506040614e7c88828901614bfe565b9350506060614e8d88828901614a9a565b9250506080614e9e88828901614bfe565b9150509295509295909350565b6000614eb78383614ed2565b60208301905092915050565b614ecc81615e3e565b82525050565b614edb81615de8565b82525050565b614eea81615de8565b82525050565b6000614efb82615d6d565b614f058185615d90565b9350614f1083615d43565b8060005b83811015614f4857614f2582615f2f565b614f2f8882614eab565b9750614f3a83615d83565b925050600181019050614f14565b5085935050505092915050565b614f5e81615dfa565b82525050565b614f6d81615e50565b82525050565b614f7c81615e74565b82525050565b614f8b81615e98565b82525050565b614f9a81615eaa565b82525050565b6000614fab82615d78565b614fb58185615dac565b9350614fc5818560208601615ee0565b614fce81615f42565b840191505092915050565b600081546001811660008114614ff6576001811461501b5761505f565b607f60028304166150078187615dbd565b955060ff198316865280860193505061505f565b600282046150298187615dbd565b955061503485615d58565b60005b8281101561505657815481890152600182019150602081019050615037565b82880195505050505b505092915050565b6000615074600f83615dbd565b91507f6b63632e677572752f475241494e2f00000000000000000000000000000000006000830152600f82019050919050565b60006150b4601483615dac565b91507f4e6f74206d75636820776f726b20746f20646f210000000000000000000000006000830152602082019050919050565b60006150f4600383615dac565b91507f21524700000000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000615134601b83615dac565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000615174600683615dbd565b91507f475241494e2300000000000000000000000000000000000000000000000000006000830152600682019050919050565b60006151b4602783615dac565b91507f49747320616e20656d657267656e63792e20506c6561736520646f6e2774206460008301527f65706f7369742e000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061521a601183615dac565b91507f556e61626c6520746f206f6e626f6172640000000000000000000000000000006000830152602082019050919050565b600061525a601b83615dac565b91507f456d657267656e637920616c7265616479206465636c617265642e00000000006000830152602082019050919050565b600061529a600983615dac565b91507f2177693a206869676800000000000000000000000000000000000000000000006000830152602082019050919050565b60006152da600983615dac565b91507f2164663a206869676800000000000000000000000000000000000000000000006000830152602082019050919050565b600061531a603183615dac565b91507f49747320616e20656d657267656e63792e2055736520656d657267656e63795760008301527f69746864726177282920706c656173652e0000000000000000000000000000006020830152604082019050919050565b6000615380602183615dac565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006153e6600983615dac565b91507f2170663a206869676800000000000000000000000000000000000000000000006000830152602082019050919050565b6000615426601783615dac565b91507f456d657267656e6379206e6f74206465636c617265642e0000000000000000006000830152602082019050919050565b6000615466602d83615dac565b91507f497473206e6f7420616e20656d657267656e63792e205573652077697468647260008301527f6177282920696e73746561642e000000000000000000000000000000000000006020830152604082019050919050565b60006154cc601483615dac565b91507f496e73756666696369656e742042616c616e63650000000000000000000000006000830152602082019050919050565b600061550c603583615dac565b91507f4f6e6c7920452e4c2e492e542e452e20442e412e4f2e2054726561737572792060008301527f63616e20726573637565207472656173757265732100000000000000000000006020830152604082019050919050565b6000615572600083615da1565b9150600082019050919050565b600061558c601c83615dac565b91507f46756e647320617265205361667520696e20656d657267656e637921000000006000830152602082019050919050565b60006155cc601183615dac565b91507f556e61626c6520746f206465626f6172640000000000000000000000000000006000830152602082019050919050565b600061560c600c83615dac565b91507f456c69746573206f6e6c792100000000000000000000000000000000000000006000830152602082019050919050565b60c0820160008201516156556000850182614ed2565b506020820151615668602085018261571e565b50604082015161567b604085018261571e565b50606082015161568e606085018261571e565b5060808201516156a1608085018261570f565b5060a08201516156b460a085018261571e565b50505050565b6080820160008201516156d0600085018261571e565b5060208201516156e3602085018261571e565b5060408201516156f6604085018261571e565b506060820151615709606085018261571e565b50505050565b61571881615e06565b82525050565b61572781615e34565b82525050565b61573681615e34565b82525050565b600061574782615067565b91506157538284614fd9565b915081905092915050565b600061576982615167565b91506157758284614fd9565b915081905092915050565b600061578b82615565565b9150819050919050565b60006020820190506157aa6000830184614ee1565b92915050565b60006060820190506157c56000830186614ec3565b6157d26020830185614ee1565b6157df604083018461572d565b949350505050565b60006040820190506157fc6000830185614ec3565b615809602083018461572d565b9392505050565b600061010082019050615826600083018b614ee1565b615833602083018a614ee1565b615840604083018961572d565b61584d606083018861572d565b61585a608083018761572d565b61586760a083018661572d565b61587460c0830185614ee1565b61588160e083018461572d565b9998505050505050505050565b60006040820190506158a36000830185614ee1565b6158b0602083018461572d565b9392505050565b60006020820190506158cc6000830184614f55565b92915050565b60006020820190506158e76000830184614f64565b92915050565b60006020820190506159026000830184614f73565b92915050565b600060208201905081810360008301526159228184614fa0565b905092915050565b60006020820190508181036000830152615943816150a7565b9050919050565b60006020820190508181036000830152615963816150e7565b9050919050565b6000602082019050818103600083015261598381615127565b9050919050565b600060208201905081810360008301526159a3816151a7565b9050919050565b600060208201905081810360008301526159c38161520d565b9050919050565b600060208201905081810360008301526159e38161524d565b9050919050565b60006020820190508181036000830152615a038161528d565b9050919050565b60006020820190508181036000830152615a23816152cd565b9050919050565b60006020820190508181036000830152615a438161530d565b9050919050565b60006020820190508181036000830152615a6381615373565b9050919050565b60006020820190508181036000830152615a83816153d9565b9050919050565b60006020820190508181036000830152615aa381615419565b9050919050565b60006020820190508181036000830152615ac381615459565b9050919050565b60006020820190508181036000830152615ae3816154bf565b9050919050565b60006020820190508181036000830152615b03816154ff565b9050919050565b60006020820190508181036000830152615b238161557f565b9050919050565b60006020820190508181036000830152615b43816155bf565b9050919050565b60006020820190508181036000830152615b63816155ff565b9050919050565b6000602082019050615b7f600083018461572d565b92915050565b6000604082019050615b9a600083018561572d565b615ba76020830184614ee1565b9392505050565b6000604082019050615bc3600083018561572d565b615bd06020830184614f82565b9392505050565b600060a082019050615bec600083018861572d565b615bf96020830187614f91565b8181036040830152615c0b8186614ef0565b9050615c1a6060830185614ee1565b615c27608083018461572d565b9695505050505050565b6000604082019050615c46600083018561572d565b615c53602083018461572d565b9392505050565b6000606082019050615c6f600083018661572d565b615c7c602083018561572d565b615c896040830184614ee1565b949350505050565b600061020082019050615ca7600083018b61572d565b615cb4602083018a61572d565b615cc1604083018961572d565b615cce60608301886156ba565b615cdb60e083018761563f565b615ce96101a083018661572d565b615cf76101c0830185614f55565b615d056101e083018461572d565b9998505050505050505050565b6000604051905081810181811067ffffffffffffffff82111715615d3957615d38615f2d565b5b8060405250919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081549050919050565b600081519050919050565b6000600182019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000615df382615e14565b9050919050565b60008115159050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000615e4982615ebc565b9050919050565b6000615e5b82615e62565b9050919050565b6000615e6d82615e14565b9050919050565b6000615e7f82615e86565b9050919050565b6000615e9182615e14565b9050919050565b6000615ea382615e34565b9050919050565b6000615eb582615e34565b9050919050565b6000615ec782615ece565b9050919050565b6000615ed982615e14565b9050919050565b60005b83811015615efe578082015181840152602081019050615ee3565b83811115615f0d576000848401525b50505050565b6000615f26615f2183615f53565b615dc8565b9050919050565bfe5b6000615f3b8254615f13565b9050919050565b6000601f19601f8301169050919050565b60008160001c9050919050565b615f6981615de8565b8114615f7457600080fd5b50565b615f8081615dfa565b8114615f8b57600080fd5b50565b615f9781615e06565b8114615fa257600080fd5b50565b615fae81615e34565b8114615fb957600080fd5b5056fea26469706673582212209ed89d5da3e39c4c2ea1a819b2c3e592254a9c04c222ace68f24ff6a9106a56364736f6c63430007060033