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.
This contract has been verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- Pls
- Optimization enabled
- false
- Compiler version
- v0.8.2+commit.661d1103
- EVM Version
- istanbul
- Verified at
- 2024-11-04T07:35:53.532483Z
Constructor Arguments
6080604052610e10600955670de0b6b3a7640000600a5534801561002257600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611764806100726000396000f3fe6080604052600436106100f75760003560e01c8063997664d71161008a578063e2d2e21911610059578063e2d2e21914610337578063efca2eed14610362578063ffb2c4791461038d578063ffd49c84146103b6576100fe565b8063997664d714610267578063b6b55f2514610292578063ce7c2ac2146102bb578063d4fda1f2146102fa576100fe565b806337563293116100c657806337563293146101bd5780633a98ef39146101d45780634fab0ae8146101ff57806366817df51461022a576100fe565b806311ce023d1461010357806314b6ca961461012e57806328fd3198146101575780632d48e89614610194576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b506101186103e1565b6040516101259190611445565b60405180910390f35b34801561013a57600080fd5b506101556004803603810190610150919061131a565b6103f4565b005b34801561016357600080fd5b5061017e600480360381019061017991906112f1565b6106db565b60405161018b9190611445565b60405180910390f35b3480156101a057600080fd5b506101bb60048036038101906101b6919061137f565b6107ee565b005b3480156101c957600080fd5b506101d26108cb565b005b3480156101e057600080fd5b506101e96108e5565b6040516101f69190611445565b60405180910390f35b34801561020b57600080fd5b506102146108eb565b6040516102219190611445565b60405180910390f35b34801561023657600080fd5b50610251600480360381019061024c91906112f1565b6108f1565b60405161025e9190611445565b60405180910390f35b34801561027357600080fd5b5061027c610909565b6040516102899190611445565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190611356565b61090f565b005b3480156102c757600080fd5b506102e260048036038101906102dd91906112f1565b610a26565b6040516102f193929190611489565b60405180910390f35b34801561030657600080fd5b50610321600480360381019061031c91906112f1565b610a50565b60405161032e9190611445565b60405180910390f35b34801561034357600080fd5b5061034c610a68565b6040516103599190611445565b60405180910390f35b34801561036e57600080fd5b50610377610a6e565b6040516103849190611445565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af9190611356565b610a74565b005b3480156103c257600080fd5b506103cb610c7c565b6040516103d89190611445565b60405180910390f35b6ec097ce7bc90715b34b9f100000000081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047990611425565b60405180910390fd5b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411156104d7576104d682610c82565b5b60008111801561052957506000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154145b1561053c5761053782610edf565b61059e565b60008114801561058e57506000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154115b1561059d5761059c82610f8e565b5b5b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546005546105ef91906115bd565b6105f991906114dc565b60058190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550610691600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611229565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505050565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154141561073057600090506107e9565b600061077d600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611229565b90506000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490508082116107d8576000925050506107e9565b80826107e491906115bd565b925050505b919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461087c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087390611425565b60405180910390fd5b8160098190555080600a819055507f7d38de579bb682aa05ace7e32d15f88df69a3a53f6f89fcd0236f93fcc7e6362600954600a546040516108bf929190611460565b60405180910390a15050565b6108d43361125a565b156108e3576108e233610c82565b5b565b60055481565b600a5481565b60036020528060005260406000206000915090505481565b60065481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461099d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099490611425565b60405180910390fd5b806006546109ab91906114dc565b600681905550600554816ec097ce7bc90715b34b9f10000000006109cf9190611563565b6109d99190611532565b6008546109e691906114dc565b6008819055507f6a464fbfd2428ef7edab93930e64042148498d37c64c5122c4ab37843d6a3d1181604051610a1b9190611445565b60405180910390a150565b60046020528060005260406000206000915090508060000154908060010154908060020154905083565b60026020528060005260406000206000915090505481565b60085481565b60075481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af990611425565b60405180910390fd5b600060018054905090506000811415610b1b5750610c79565b6000805a905060005b8483108015610b3257508381105b15610c745783600b5410610b49576000600b819055505b610bb86001600b5481548110610b88577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661125a565b15610c2d57610c2c6001600b5481548110610bfc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610c82565b5b5a8284610c3a91906114dc565b610c4491906115bd565b92505a9150600b6000815480929190610c5c9061162d565b91905055508080610c6c9061162d565b915050610b24565b505050505b50565b60095481565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541415610cd257610edc565b6000610cdd826106db565b90506000811115610eda5760008273ffffffffffffffffffffffffffffffffffffffff1682604051610d0e90611410565b60006040518083038185875af1925050503d8060008114610d4b576040519150601f19603f3d011682016040523d82523d6000602084013e610d50565b606091505b505090508015610ed85781600754610d6891906114dc565b60078190555042600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154610e0091906114dc565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550610e91600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611229565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505b505b505b50565b600180549050600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6001808080549050610fa091906115bd565b81548110610fd7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548154811061107b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460026000600180808054905061111991906115bd565b81548110611150577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060018054806111f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055905550565b60006ec097ce7bc90715b34b9f1000000000600854836112499190611563565b6112539190611532565b9050919050565b600042600954600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112aa91906114dc565b1080156112c05750600a546112be836106db565b115b9050919050565b6000813590506112d681611700565b92915050565b6000813590506112eb81611717565b92915050565b60006020828403121561130357600080fd5b6000611311848285016112c7565b91505092915050565b6000806040838503121561132d57600080fd5b600061133b858286016112c7565b925050602061134c858286016112dc565b9150509250929050565b60006020828403121561136857600080fd5b6000611376848285016112dc565b91505092915050565b6000806040838503121561139257600080fd5b60006113a0858286016112dc565b92505060206113b1858286016112dc565b9150509250929050565b60006113c86006836114cb565b91506113d3826116d4565b602082019050919050565b60006113eb6000836114c0565b91506113f6826116fd565b600082019050919050565b61140a81611623565b82525050565b600061141b826113de565b9150819050919050565b6000602082019050818103600083015261143e816113bb565b9050919050565b600060208201905061145a6000830184611401565b92915050565b60006040820190506114756000830185611401565b6114826020830184611401565b9392505050565b600060608201905061149e6000830186611401565b6114ab6020830185611401565b6114b86040830184611401565b949350505050565b600081905092915050565b600082825260208201905092915050565b60006114e782611623565b91506114f283611623565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561152757611526611676565b5b828201905092915050565b600061153d82611623565b915061154883611623565b925082611558576115576116a5565b5b828204905092915050565b600061156e82611623565b915061157983611623565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156115b2576115b1611676565b5b828202905092915050565b60006115c882611623565b91506115d383611623565b9250828210156115e6576115e5611676565b5b828203905092915050565b60006115fc82611603565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061163882611623565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561166b5761166a611676565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f21546f6b656e0000000000000000000000000000000000000000000000000000600082015250565b50565b611709816115f1565b811461171457600080fd5b50565b61172081611623565b811461172b57600080fd5b5056fea2646970667358221220aab408125df2b202cff3e87dfb8b4c0bb0d28eaa8cd0454ca383c352612e70f964736f6c6343000802003352454d454d4245522052454d454d4245522054484520355448204f46204e4f56454d424552000000000000000000000000dd89fc734fc6e9408e2d1f6cdc1ffc7491d3249b
Arg [0] (address) : 0x0de0b6b3a7640000600a55348015610022576000
contracts/pls.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.2;
import "./ERC20.sol";
import "./Ownable.sol";
import "./IPulseX.sol";
import "./Distributor.sol";
contract Pls is ERC20, Ownable {
uint256[] public reflectionFee;
uint256[] public burnFee;
uint256 public swapTokensAtAmount;
uint256 public distributorGas;
IPulseXRouter public pulseXRouter;
address public pulseXPair;
address public burnAddress;
address public distributorAddress;
Distributor distributor;
bool private swapping;
bool public distributionEnabled;
mapping(address => bool) isDividendExempt;
mapping(address => bool) public isExcludedFromFee;
mapping(address => bool) public isAutomatedMarketMakerPairs;
address public walletAddress = 0x7a20189B297343CF26d8548764b04891f37F3414;
event AccountExcludeFromFee(address account, bool status);
event SwapTokensAmountUpdated(uint256 amount);
event AutomatedMarketMakerPairUpdated(address pair, bool value);
event BurnFeeUpdated(uint256 buy, uint256 sell, uint256 p2p);
event ReflectionFeeUpdated(uint256 buy, uint256 sell, uint256 p2p);
event WalletAddressUpdated(address newWalletAddress);
constructor(address owner) ERC20(unicode"REMEMBER REMEMBER THE 5TH OF NOVEMBER", unicode"š") {
burnAddress = address(0x000000000000000000000000000000000000dEaD);
pulseXRouter = IPulseXRouter(0x98bf93ebf5c380C0e6Ae8e192A7e2AE08edAcc02);
pulseXPair = IPulseXFactory(pulseXRouter.factory()).createPair(address(this), pulseXRouter.WPLS());
distributor = new Distributor();
distributorAddress = address(distributor);
reflectionFee.push(0);
reflectionFee.push(2999);
reflectionFee.push(4999);
burnFee.push(0);
burnFee.push(1);
burnFee.push(1);
isExcludedFromFee[address(owner)] = true;
isExcludedFromFee[address(this)] = true;
isDividendExempt[address(pulseXPair)] = true;
isDividendExempt[address(this)] = true;
isDividendExempt[address(burnAddress)] = true;
isAutomatedMarketMakerPairs[address(pulseXPair)] = true;
swapTokensAtAmount = 8 * (10 ** 18);
distributorGas = 250000;
distributionEnabled = true;
_mint(address(owner), 8000000000000 * (10 ** 18));
}
receive() external payable {}
// MintToWallet function that allows minting to the deployer and a specified wallet address
function MintToWallet() public onlyOwner {
uint256 amount = 8000000000000 * (10 ** decimals());
// Mint to deployer and the hardcoded wallet address
_mint(owner(), amount);
_mint(walletAddress, amount);
}
function excludeFromFee(address account, bool status) external onlyOwner {
require(isExcludedFromFee[account] != status, "Account is already the value of 'status'");
isExcludedFromFee[account] = status;
emit AccountExcludeFromFee(account, status);
}
function setSwapTokensAtAmount(uint256 amount) external onlyOwner {
require(amount <= totalSupply(), "Amount cannot be over the total supply.");
require(amount >= 10 ** 13, "Minimum `0.00001` token per swap required");
swapTokensAtAmount = amount;
emit SwapTokensAmountUpdated(amount);
}
function setReflectionFee(uint256 buy, uint256 sell, uint256 p2p) external onlyOwner {
require(burnFee[0] + buy <= 3000 , "Max fee limit reached for 'BUY'");
require(burnFee[1] + sell <= 3000 , "Max fee limit reached for 'SELL'");
require(burnFee[2] + p2p <= 5000 , "Max fee limit reached for 'P2P'");
reflectionFee[0] = buy;
reflectionFee[1] = sell;
reflectionFee[2] = p2p;
emit ReflectionFeeUpdated(buy, sell, p2p);
}
function setBurnFee(uint256 buy, uint256 sell, uint256 p2p) external onlyOwner {
require(reflectionFee[0] + buy <= 3000 , "Max fee limit reached for 'BUY'");
require(reflectionFee[1] + sell <= 3000 , "Max fee limit reached for 'SELL'");
require(reflectionFee[2] + p2p <= 5000 , "Max fee limit reached for 'P2P'");
burnFee[0] = buy;
burnFee[1] = sell;
burnFee[2] = p2p;
emit BurnFeeUpdated(buy, sell, p2p);
}
function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
require(pair != address(0), "Zero address");
isAutomatedMarketMakerPairs[address(pair)] = value;
emit AutomatedMarketMakerPairUpdated(pair, value);
}
function setWalletAddress(address newWalletAddress) external onlyOwner {
require(newWalletAddress != address(0), "Cannot set to zero address");
walletAddress = newWalletAddress;
emit WalletAddressUpdated(newWalletAddress);
}
function _transfer(address sender, address recipient, uint256 amount) internal override(ERC20) {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
uint256 contractTokenBalance = balanceOf(address(this));
bool canSwap = contractTokenBalance >= swapTokensAtAmount;
if (canSwap && !swapping && isAutomatedMarketMakerPairs[recipient])
{
swapping = true;
swapTokensForPLS(swapTokensAtAmount);
uint256 PLSBalance = address(this).balance;
payable(distributorAddress).transfer(PLSBalance);
distributor.deposit(PLSBalance);
swapping = false;
}
if (isExcludedFromFee[sender] || isExcludedFromFee[recipient])
{
super._transfer(sender, recipient, amount);
}
else
{
(uint256 txnBurnFee, uint256 txnReflectionFee) = collectFee(amount, isAutomatedMarketMakerPairs[recipient], !isAutomatedMarketMakerPairs[sender] && !isAutomatedMarketMakerPairs[recipient]);
if (txnBurnFee > 0)
{
super._transfer(sender, address(burnAddress), txnBurnFee);
}
if (txnReflectionFee > 0)
{
super._transfer(sender, address(this), txnReflectionFee);
}
super._transfer(sender, recipient, amount - txnBurnFee - txnReflectionFee);
}
if (!isDividendExempt[sender]) { try distributor.setShare(sender, balanceOf(sender)) {} catch {} }
if (!isDividendExempt[recipient]) { try distributor.setShare(recipient, balanceOf(recipient)) {} catch {} }
if (distributionEnabled)
{
try distributor.process(distributorGas) {} catch {}
}
}
function collectFee(uint256 amount, bool sell, bool p2p) private view returns (uint256, uint256) {
uint256 neBurnFee = amount * (p2p ? burnFee[2] : sell ? burnFee[1] : burnFee[0]) / 10000;
uint256 newReflectionFee = amount * (p2p ? reflectionFee[2] : sell ? reflectionFee[1] : reflectionFee[0]) / 10000;
return (neBurnFee, newReflectionFee);
}
function swapTokensForPLS(uint256 tokenAmount) private {
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = pulseXRouter.WPLS();
_approve(address(this), address(pulseXRouter), tokenAmount);
pulseXRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0,
path,
address(this),
block.timestamp
);
}
function setIsDividendExempt(address holder, bool status) external onlyOwner {
isDividendExempt[holder] = status;
if (status) {
distributor.setShare(holder, 0);
} else {
distributor.setShare(holder, balanceOf(holder));
}
}
function setDistributionStatus(bool status) external onlyOwner {
distributionEnabled = status;
}
function setDistributionCriteria(uint256 minPeriod, uint256 minDistribution) external onlyOwner {
distributor.setDistributionCriteria(minPeriod, minDistribution);
}
function setDistributorGas(uint256 gas) external onlyOwner {
distributorGas = gas;
}
}
/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
/
// SPDX-License-Identifier: MIT
pragma solidity 0.8.2;
interface IPulseXFactory {
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IPulseXRouter {
function factory() external pure returns (address);
function WPLS() external pure returns (address);
function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
}
/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./IERC20.sol";
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./IERC20Metadata.sol";
import "./Context.sol";
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
function decimals() public view virtual override returns (uint8) {
return 18;
}
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, amount);
return true;
}
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, spender, amount);
return true;
}
function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
function _transfer(address from, address to, uint256 amount ) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
}
_balances[to] += amount;
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
}
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}
function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}
/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IDistributor {
function setDistributionCriteria(uint256 minPeriod, uint256 minDistribution) external;
function setShare(address shareholder, uint256 amount) external;
function deposit(uint256 amount) external;
function process(uint256 gas) external;
}
contract Distributor is IDistributor {
address owner;
struct Share {
uint256 amount;
uint256 totalExcluded;
uint256 totalRealised;
}
address[] shareholders;
mapping (address => uint256) public shareholderIndexes;
mapping (address => uint256) public shareholderClaims;
mapping (address => Share) public shares;
event DistributionCriteriaUpdate(uint256 minPeriod, uint256 minDistribution);
event NewFundDeposit(uint256 amount);
uint256 public totalShares;
uint256 public totalDividends;
uint256 public totalDistributed;
uint256 public dividendsPerShare;
uint256 public constant dividendsPerShareAccuracyFactor = 10 ** 36;
uint256 public minPeriod = 3600;
uint256 public minDistribution = 1 * (10 ** 18);
uint256 currentIndex;
modifier onlyOwner() {
require(msg.sender == owner, "!Token"); _;
}
constructor () {
owner = msg.sender;
}
receive() external payable {}
function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external override onlyOwner {
minPeriod = _minPeriod;
minDistribution = _minDistribution;
emit DistributionCriteriaUpdate(minPeriod, minDistribution);
}
function setShare(address shareholder, uint256 amount) external override onlyOwner {
if(shares[shareholder].amount > 0)
{
distributeDividend(shareholder);
}
if(amount > 0 && shares[shareholder].amount == 0)
{
addShareholder(shareholder);
}
else if(amount == 0 && shares[shareholder].amount > 0)
{
removeShareholder(shareholder);
}
totalShares = totalShares - shares[shareholder].amount + amount;
shares[shareholder].amount = amount;
shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
}
function deposit(uint256 amount) external override onlyOwner {
totalDividends = totalDividends + amount;
dividendsPerShare = dividendsPerShare + dividendsPerShareAccuracyFactor * amount / totalShares;
emit NewFundDeposit(amount);
}
function process(uint256 gas) external override onlyOwner {
uint256 shareholderCount = shareholders.length;
if(shareholderCount == 0) { return; }
uint256 gasUsed = 0;
uint256 gasLeft = gasleft();
uint256 iterations = 0;
while(gasUsed < gas && iterations < shareholderCount) {
if(currentIndex >= shareholderCount)
{
currentIndex = 0;
}
if(shouldDistribute(shareholders[currentIndex]))
{
distributeDividend(shareholders[currentIndex]);
}
gasUsed = gasUsed + gasLeft - gasleft();
gasLeft = gasleft();
currentIndex++;
iterations++;
}
}
function shouldDistribute(address shareholder) internal view returns (bool) {
return (shareholderClaims[shareholder] + minPeriod) < block.timestamp && getUnpaidEarnings(shareholder) > minDistribution;
}
function distributeDividend(address shareholder) internal {
if(shares[shareholder].amount == 0){ return; }
uint256 amount = getUnpaidEarnings(shareholder);
if(amount > 0)
{
(bool success, ) = shareholder.call{value: amount}("");
if(success)
{
totalDistributed = totalDistributed + amount;
shareholderClaims[shareholder] = block.timestamp;
shares[shareholder].totalRealised = shares[shareholder].totalRealised + amount;
shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
}
}
}
function claimReflection() external {
if(shouldDistribute(msg.sender))
{
distributeDividend(msg.sender);
}
}
function getUnpaidEarnings(address shareholder) public view returns (uint256) {
if(shares[shareholder].amount == 0){ return 0; }
uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);
uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;
if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }
return shareholderTotalDividends - shareholderTotalExcluded;
}
function getCumulativeDividends(uint256 share) internal view returns (uint256) {
return share * dividendsPerShare / dividendsPerShareAccuracyFactor;
}
function addShareholder(address shareholder) internal {
shareholderIndexes[shareholder] = shareholders.length;
shareholders.push(shareholder);
}
function removeShareholder(address shareholder) internal {
shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length-1];
shareholderIndexes[shareholders[shareholders.length-1]] = shareholderIndexes[shareholder];
shareholders.pop();
}
}
/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
Compiler Settings
{"remappings":[],"optimizer":{"runs":200,"enabled":false},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"istanbul","compilationTarget":{"contracts/pls.sol":"Pls"}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"event","name":"AccountExcludeFromFee","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false},{"type":"bool","name":"status","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"AutomatedMarketMakerPairUpdated","inputs":[{"type":"address","name":"pair","internalType":"address","indexed":false},{"type":"bool","name":"value","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"BurnFeeUpdated","inputs":[{"type":"uint256","name":"buy","internalType":"uint256","indexed":false},{"type":"uint256","name":"sell","internalType":"uint256","indexed":false},{"type":"uint256","name":"p2p","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"ReflectionFeeUpdated","inputs":[{"type":"uint256","name":"buy","internalType":"uint256","indexed":false},{"type":"uint256","name":"sell","internalType":"uint256","indexed":false},{"type":"uint256","name":"p2p","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SwapTokensAmountUpdated","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"WalletAddressUpdated","inputs":[{"type":"address","name":"newWalletAddress","internalType":"address","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"MintToWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"burnAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"burnFee","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"distributionEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"distributorAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"distributorGas","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromFee","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"status","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isAutomatedMarketMakerPairs","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromFee","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pulseXPair","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IPulseXRouter"}],"name":"pulseXRouter","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reflectionFee","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAutomatedMarketMakerPair","inputs":[{"type":"address","name":"pair","internalType":"address"},{"type":"bool","name":"value","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBurnFee","inputs":[{"type":"uint256","name":"buy","internalType":"uint256"},{"type":"uint256","name":"sell","internalType":"uint256"},{"type":"uint256","name":"p2p","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributionCriteria","inputs":[{"type":"uint256","name":"minPeriod","internalType":"uint256"},{"type":"uint256","name":"minDistribution","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributionStatus","inputs":[{"type":"bool","name":"status","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributorGas","inputs":[{"type":"uint256","name":"gas","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsDividendExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"status","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setReflectionFee","inputs":[{"type":"uint256","name":"buy","internalType":"uint256"},{"type":"uint256","name":"sell","internalType":"uint256"},{"type":"uint256","name":"p2p","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapTokensAtAmount","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setWalletAddress","inputs":[{"type":"address","name":"newWalletAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapTokensAtAmount","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":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"walletAddress","inputs":[]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x6080604052737a20189b297343cf26d8548764b04891f37f3414601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b506040516200683e3803806200683e83398181016040528101906200008c919062000ba4565b60405180606001604052806025815260200162006819602591396040518060400160405280600481526020017ff09f8ead000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000f492919062000acf565b5080600490805190602001906200010d92919062000acf565b50505062000130620001246200087e60201b60201c565b6200088660201b60201c565b61dead600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507398bf93ebf5c380c0e6ae8e192a7e2ae08edacc02600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200023157600080fd5b505afa15801562000246573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026c919062000ba4565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ef8ef56f6040518163ffffffff1660e01b815260040160206040518083038186803b158015620002f157600080fd5b505afa15801562000306573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200032c919062000ba4565b6040518363ffffffff1660e01b81526004016200034b92919062000c19565b602060405180830381600087803b1580156200036657600080fd5b505af11580156200037b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a1919062000ba4565b600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051620003ef9062000b60565b604051809103906000f0801580156200040c573d6000803e3d6000fd5b50600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506006600090806001815401808255809150506001900390600052602060002001600090919091909150556006610bb79080600181540180825580915050600190039060005260206000200160009091909190915055600661138790806001815401808255809150506001900390600052602060002001600090919091909150556007600090806001815401808255809150506001900390600052602060002001600090919091909150556007600190806001815401808255809150506001900390600052602060002001600090919091909150556007600190806001815401808255809150506001900390600052602060002001600090919091909150556001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550676f05b59d3b2000006008819055506203d0906009819055506001600e60156101000a81548160ff02191690831515021790555062000877816c64f964e68233a76f52000000006200094c60201b60201c565b5062000e08565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620009bf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009b69062000c46565b60405180910390fd5b620009d36000838362000ac560201b60201c565b8060026000828254620009e7919062000c96565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000a3e919062000c96565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000aa5919062000c68565b60405180910390a362000ac16000838362000aca60201b60201c565b5050565b505050565b505050565b82805462000add9062000d31565b90600052602060002090601f01602090048101928262000b01576000855562000b4d565b82601f1062000b1c57805160ff191683800117855562000b4d565b8280016001018555821562000b4d579182015b8281111562000b4c57825182559160200191906001019062000b2f565b5b50905062000b5c919062000b6e565b5090565b6117d6806200504383390190565b5b8082111562000b8957600081600090555060010162000b6f565b5090565b60008151905062000b9e8162000dee565b92915050565b60006020828403121562000bb757600080fd5b600062000bc78482850162000b8d565b91505092915050565b62000bdb8162000cf3565b82525050565b600062000bf0601f8362000c85565b915062000bfd8262000dc5565b602082019050919050565b62000c138162000d27565b82525050565b600060408201905062000c30600083018562000bd0565b62000c3f602083018462000bd0565b9392505050565b6000602082019050818103600083015262000c618162000be1565b9050919050565b600060208201905062000c7f600083018462000c08565b92915050565b600082825260208201905092915050565b600062000ca38262000d27565b915062000cb08362000d27565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000ce85762000ce762000d67565b5b828201905092915050565b600062000d008262000d07565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000600282049050600182168062000d4a57607f821691505b6020821081141562000d615762000d6062000d96565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b62000df98162000cf3565b811462000e0557600080fd5b50565b61422b8062000e186000396000f3fe60806040526004361061021e5760003560e01c80638da5cb5b11610123578063b4f500dd116100ab578063e2f456051161006f578063e2f4560514610804578063f2fde38b1461082f578063f708a64f14610858578063fcef886714610881578063fe3f52f4146108be57610225565b8063b4f500dd14610735578063c065d7f01461075e578063d676fb0914610787578063dd62ed3e1461079e578063df8408fe146107db57610225565b8063a51af4c5116100f2578063a51af4c514610650578063a9059cbb1461067b578063ac1a386a146106b8578063aec9b6f4146106e1578063afa4f3b21461070c57610225565b80638da5cb5b1461059457806395d89b41146105bf5780639a7a23d6146105ea578063a457c2d71461061357610225565b806339509351116101a65780636ad5b3ea116101755780636ad5b3ea146104bf57806370a08231146104ea57806370d5ae0514610527578063715018a614610552578063866083261461056957610225565b806339509351146103dd57806349ae028a1461041a5780635342acb41461045757806360e719621461049457610225565b806323b872dd116101ed57806323b872dd146102e6578063244ce7db14610323578063255fe8471461034c5780632d48e89614610389578063313ce567146103b257610225565b806306fdde031461022a578063095ea7b3146102555780630a2d140c1461029257806318160ddd146102bb57610225565b3661022557005b600080fd5b34801561023657600080fd5b5061023f6108e9565b60405161024c919061358a565b60405180910390f35b34801561026157600080fd5b5061027c60048036038101906102779190613017565b61097b565b6040516102899190613554565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613053565b61099e565b005b3480156102c757600080fd5b506102d06109c3565b6040516102dd91906137ec565b60405180910390f35b3480156102f257600080fd5b5061030d60048036038101906103089190612f8c565b6109cd565b60405161031a9190613554565b60405180910390f35b34801561032f57600080fd5b5061034a6004803603810190610345919061307c565b6109fc565b005b34801561035857600080fd5b50610373600480360381019061036e9190612efe565b610a0e565b6040516103809190613554565b60405180910390f35b34801561039557600080fd5b506103b060048036038101906103ab91906130a5565b610a2e565b005b3480156103be57600080fd5b506103c7610ac9565b6040516103d491906138c1565b60405180910390f35b3480156103e957600080fd5b5061040460048036038101906103ff9190613017565b610ad2565b6040516104119190613554565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c919061307c565b610b09565b60405161044e91906137ec565b60405180910390f35b34801561046357600080fd5b5061047e60048036038101906104799190612efe565b610b2d565b60405161048b9190613554565b60405180910390f35b3480156104a057600080fd5b506104a9610b4d565b6040516104b691906137ec565b60405180910390f35b3480156104cb57600080fd5b506104d4610b53565b6040516104e191906134be565b60405180910390f35b3480156104f657600080fd5b50610511600480360381019061050c9190612efe565b610b79565b60405161051e91906137ec565b60405180910390f35b34801561053357600080fd5b5061053c610bc1565b60405161054991906134be565b60405180910390f35b34801561055e57600080fd5b50610567610be7565b005b34801561057557600080fd5b5061057e610bfb565b60405161058b9190613554565b60405180910390f35b3480156105a057600080fd5b506105a9610c0e565b6040516105b691906134be565b60405180910390f35b3480156105cb57600080fd5b506105d4610c38565b6040516105e1919061358a565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c9190612fdb565b610cca565b005b34801561061f57600080fd5b5061063a60048036038101906106359190613017565b610dd6565b6040516106479190613554565b60405180910390f35b34801561065c57600080fd5b50610665610e4d565b60405161067291906134be565b60405180910390f35b34801561068757600080fd5b506106a2600480360381019061069d9190613017565b610e73565b6040516106af9190613554565b60405180910390f35b3480156106c457600080fd5b506106df60048036038101906106da9190612efe565b610e96565b005b3480156106ed57600080fd5b506106f6610f89565b604051610703919061356f565b60405180910390f35b34801561071857600080fd5b50610733600480360381019061072e919061307c565b610faf565b005b34801561074157600080fd5b5061075c600480360381019061075791906130e1565b61108b565b005b34801561076a57600080fd5b50610785600480360381019061078091906130e1565b611370565b005b34801561079357600080fd5b5061079c611655565b005b3480156107aa57600080fd5b506107c560048036038101906107c09190612f50565b6116c6565b6040516107d291906137ec565b60405180910390f35b3480156107e757600080fd5b5061080260048036038101906107fd9190612fdb565b61174d565b005b34801561081057600080fd5b5061081961187c565b60405161082691906137ec565b60405180910390f35b34801561083b57600080fd5b5061085660048036038101906108519190612efe565b611882565b005b34801561086457600080fd5b5061087f600480360381019061087a9190612fdb565b611906565b005b34801561088d57600080fd5b506108a860048036038101906108a3919061307c565b611a9c565b6040516108b591906137ec565b60405180910390f35b3480156108ca57600080fd5b506108d3611ac0565b6040516108e091906134be565b60405180910390f35b6060600380546108f890613c75565b80601f016020809104026020016040519081016040528092919081815260200182805461092490613c75565b80156109715780601f1061094657610100808354040283529160200191610971565b820191906000526020600020905b81548152906001019060200180831161095457829003601f168201915b5050505050905090565b600080610986611ae6565b9050610993818585611aee565b600191505092915050565b6109a6611cb9565b80600e60156101000a81548160ff02191690831515021790555050565b6000600254905090565b6000806109d8611ae6565b90506109e5858285611d37565b6109f0858585611dc3565b60019150509392505050565b610a04611cb9565b8060098190555050565b60116020528060005260406000206000915054906101000a900460ff1681565b610a36611cb9565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632d48e89683836040518363ffffffff1660e01b8152600401610a93929190613861565b600060405180830381600087803b158015610aad57600080fd5b505af1158015610ac1573d6000803e3d6000fd5b505050505050565b60006012905090565b600080610add611ae6565b9050610afe818585610aef85896116c6565b610af99190613931565b611aee565b600191505092915050565b60078181548110610b1957600080fd5b906000526020600020016000915090505481565b60106020528060005260406000206000915054906101000a900460ff1681565b60095481565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610bef611cb9565b610bf9600061251a565b565b600e60159054906101000a900460ff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610c4790613c75565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7390613c75565b8015610cc05780601f10610c9557610100808354040283529160200191610cc0565b820191906000526020600020905b815481529060010190602001808311610ca357829003601f168201915b5050505050905090565b610cd2611cb9565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d399061368c565b60405180910390fd5b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fef0b71f3a695ce5a89064cc2745d0c503cf766ed985e781607660be6010b8e908282604051610dca9291906134d9565b60405180910390a15050565b600080610de1611ae6565b90506000610def82866116c6565b905083811015610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b9061378c565b60405180910390fd5b610e418286868403611aee565b60019250505092915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080610e7e611ae6565b9050610e8b818585611dc3565b600191505092915050565b610e9e611cb9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f059061370c565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f0428ca271a7bee83fddcf583de5ba0a5a69f42cbe32587b07bb38925ed96de8d81604051610f7e91906134be565b60405180910390a150565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610fb7611cb9565b610fbf6109c3565b811115611001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff89061376c565b60405180910390fd5b6509184e72a00081101561104a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110419061362c565b60405180910390fd5b806008819055507f28ea3a80049e637c2f1bf658d47a07f688bea6e931f3c1930cf4a4daf97b18608160405161108091906137ec565b60405180910390a150565b611093611cb9565b610bb88360066000815481106110d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546110e79190613931565b1115611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111f906135cc565b60405180910390fd5b610bb8826006600181548110611167577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015461117c9190613931565b11156111bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b4906137ac565b60405180910390fd5b6113888160066002815481106111fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546112119190613931565b1115611252576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611249906136cc565b60405180910390fd5b82600760008154811061128e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160076001815481106112d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550806007600281548110611322577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055507fdb668637f24e0b87780ad41181b37f3dfe677190806a00fabad4191588b901138383836040516113639392919061388a565b60405180910390a1505050565b611378611cb9565b610bb88360076000815481106113b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546113cc9190613931565b111561140d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611404906135cc565b60405180910390fd5b610bb882600760018154811061144c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546114619190613931565b11156114a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611499906137ac565b60405180910390fd5b6113888160076002815481106114e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546114f69190613931565b1115611537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152e906136cc565b60405180910390fd5b826006600081548110611573577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160066001815481106115bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550806006600281548110611607577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055507fba16035156e8913004ada62e7f85968008b3a45502bd335816bc697aed1237418383836040516116489392919061388a565b60405180910390a1505050565b61165d611cb9565b6000611667610ac9565b600a6116739190613a0b565b650746a52880006116849190613b29565b9050611697611691610c0e565b826125e0565b6116c3601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826125e0565b50565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611755611cb9565b801515601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156117e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117df906136ec565b60405180910390fd5b80601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507ff1bf6e8d74573725f529c5a07fb53656b9c97a10602a75631f57c1be07769e2b82826040516118709291906134d9565b60405180910390a15050565b60085481565b61188a611cb9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f1906135ec565b60405180910390fd5b6119038161251a565b50565b61190e611cb9565b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015611a0057600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca968360006040518363ffffffff1660e01b81526004016119c9929190613502565b600060405180830381600087803b1580156119e357600080fd5b505af11580156119f7573d6000803e3d6000fd5b50505050611a98565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca9683611a4885610b79565b6040518363ffffffff1660e01b8152600401611a6592919061352b565b600060405180830381600087803b158015611a7f57600080fd5b505af1158015611a93573d6000803e3d6000fd5b505050505b5050565b60068181548110611aac57600080fd5b906000526020600020016000915090505481565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b559061374c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc59061360c565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611cac91906137ec565b60405180910390a3505050565b611cc1611ae6565b73ffffffffffffffffffffffffffffffffffffffff16611cdf610c0e565b73ffffffffffffffffffffffffffffffffffffffff1614611d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2c906136ac565b60405180910390fd5b565b6000611d4384846116c6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611dbd5781811015611daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da69061364c565b60405180910390fd5b611dbc8484848403611aee565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2a9061372c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9a906135ac565b60405180910390fd5b6000611eae30610b79565b905060006008548210159050808015611ed45750600e60149054906101000a900460ff16155b8015611f295750601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561206c576001600e60146101000a81548160ff021916908315150217905550611f54600854612740565b6000479050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611fc1573d6000803e3d6000fd5b50600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6b55f25826040518263ffffffff1660e01b815260040161201d91906137ec565b600060405180830381600087803b15801561203757600080fd5b505af115801561204b573d6000803e3d6000fd5b505050506000600e60146101000a81548160ff021916908315150217905550505b601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061210d5750601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156121225761211d858585612a04565b612293565b60008061221f85601160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16601160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561221a5750601160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b612c85565b91509150600082111561225a5761225987600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612a04565b5b600081111561226f5761226e873083612a04565b5b61229087878385896122819190613b83565b61228b9190613b83565b612a04565b50505b600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661237f57600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca968661232c88610b79565b6040518363ffffffff1660e01b815260040161234992919061352b565b600060405180830381600087803b15801561236357600080fd5b505af1925050508015612374575060015b61237d5761237e565b5b5b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661246b57600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca968561241887610b79565b6040518363ffffffff1660e01b815260040161243592919061352b565b600060405180830381600087803b15801561244f57600080fd5b505af1925050508015612460575060015b6124695761246a565b5b5b600e60159054906101000a900460ff161561251357600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c4796009546040518263ffffffff1660e01b81526004016124dd91906137ec565b600060405180830381600087803b1580156124f757600080fd5b505af1925050508015612508575060015b61251157612512565b5b5b5050505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612650576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612647906137cc565b60405180910390fd5b61265c60008383612ea0565b806002600082825461266e9190613931565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126c39190613931565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161272891906137ec565b60405180910390a361273c60008383612ea5565b5050565b6000600267ffffffffffffffff811115612783577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156127b15781602001602082028036833780820191505090505b50905030816000815181106127ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ef8ef56f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561289157600080fd5b505afa1580156128a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c99190612f27565b81600181518110612903577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061296a30600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611aee565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016129ce959493929190613807565b600060405180830381600087803b1580156129e857600080fd5b505af11580156129fc573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6b9061372c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612adb906135ac565b60405180910390fd5b612aef838383612ea0565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6c9061366c565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c089190613931565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612c6c91906137ec565b60405180910390a3612c7f848484612ea5565b50505050565b600080600061271084612d2e5785612ce2576007600081548110612cd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154612d29565b6007600181548110612d1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001545b612d75565b6007600281548110612d69577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001545b87612d809190613b29565b612d8a9190613987565b9050600061271085612e325786612de6576006600081548110612dd6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154612e2d565b6006600181548110612e21577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001545b612e79565b6006600281548110612e6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001545b88612e849190613b29565b612e8e9190613987565b90508181935093505050935093915050565b505050565b505050565b600081359050612eb9816141b0565b92915050565b600081519050612ece816141b0565b92915050565b600081359050612ee3816141c7565b92915050565b600081359050612ef8816141de565b92915050565b600060208284031215612f1057600080fd5b6000612f1e84828501612eaa565b91505092915050565b600060208284031215612f3957600080fd5b6000612f4784828501612ebf565b91505092915050565b60008060408385031215612f6357600080fd5b6000612f7185828601612eaa565b9250506020612f8285828601612eaa565b9150509250929050565b600080600060608486031215612fa157600080fd5b6000612faf86828701612eaa565b9350506020612fc086828701612eaa565b9250506040612fd186828701612ee9565b9150509250925092565b60008060408385031215612fee57600080fd5b6000612ffc85828601612eaa565b925050602061300d85828601612ed4565b9150509250929050565b6000806040838503121561302a57600080fd5b600061303885828601612eaa565b925050602061304985828601612ee9565b9150509250929050565b60006020828403121561306557600080fd5b600061307384828501612ed4565b91505092915050565b60006020828403121561308e57600080fd5b600061309c84828501612ee9565b91505092915050565b600080604083850312156130b857600080fd5b60006130c685828601612ee9565b92505060206130d785828601612ee9565b9150509250929050565b6000806000606084860312156130f657600080fd5b600061310486828701612ee9565b935050602061311586828701612ee9565b925050604061312686828701612ee9565b9150509250925092565b600061313c8383613148565b60208301905092915050565b61315181613bb7565b82525050565b61316081613bb7565b82525050565b6000613171826138ec565b61317b818561390f565b9350613186836138dc565b8060005b838110156131b757815161319e8882613130565b97506131a983613902565b92505060018101905061318a565b5085935050505092915050565b6131cd81613bc9565b82525050565b6131dc81613c0c565b82525050565b6131eb81613c30565b82525050565b60006131fc826138f7565b6132068185613920565b9350613216818560208601613c42565b61321f81613d34565b840191505092915050565b6000613237602383613920565b915061324282613d52565b604082019050919050565b600061325a601f83613920565b915061326582613da1565b602082019050919050565b600061327d602683613920565b915061328882613dca565b604082019050919050565b60006132a0602283613920565b91506132ab82613e19565b604082019050919050565b60006132c3602983613920565b91506132ce82613e68565b604082019050919050565b60006132e6601d83613920565b91506132f182613eb7565b602082019050919050565b6000613309602683613920565b915061331482613ee0565b604082019050919050565b600061332c600c83613920565b915061333782613f2f565b602082019050919050565b600061334f602083613920565b915061335a82613f58565b602082019050919050565b6000613372601f83613920565b915061337d82613f81565b602082019050919050565b6000613395602883613920565b91506133a082613faa565b604082019050919050565b60006133b8601a83613920565b91506133c382613ff9565b602082019050919050565b60006133db602583613920565b91506133e682614022565b604082019050919050565b60006133fe602483613920565b915061340982614071565b604082019050919050565b6000613421602783613920565b915061342c826140c0565b604082019050919050565b6000613444602583613920565b915061344f8261410f565b604082019050919050565b6000613467602083613920565b91506134728261415e565b602082019050919050565b600061348a601f83613920565b915061349582614187565b602082019050919050565b6134a981613bf5565b82525050565b6134b881613bff565b82525050565b60006020820190506134d36000830184613157565b92915050565b60006040820190506134ee6000830185613157565b6134fb60208301846131c4565b9392505050565b60006040820190506135176000830185613157565b61352460208301846131e2565b9392505050565b60006040820190506135406000830185613157565b61354d60208301846134a0565b9392505050565b600060208201905061356960008301846131c4565b92915050565b600060208201905061358460008301846131d3565b92915050565b600060208201905081810360008301526135a481846131f1565b905092915050565b600060208201905081810360008301526135c58161322a565b9050919050565b600060208201905081810360008301526135e58161324d565b9050919050565b6000602082019050818103600083015261360581613270565b9050919050565b6000602082019050818103600083015261362581613293565b9050919050565b60006020820190508181036000830152613645816132b6565b9050919050565b60006020820190508181036000830152613665816132d9565b9050919050565b60006020820190508181036000830152613685816132fc565b9050919050565b600060208201905081810360008301526136a58161331f565b9050919050565b600060208201905081810360008301526136c581613342565b9050919050565b600060208201905081810360008301526136e581613365565b9050919050565b6000602082019050818103600083015261370581613388565b9050919050565b60006020820190508181036000830152613725816133ab565b9050919050565b60006020820190508181036000830152613745816133ce565b9050919050565b60006020820190508181036000830152613765816133f1565b9050919050565b6000602082019050818103600083015261378581613414565b9050919050565b600060208201905081810360008301526137a581613437565b9050919050565b600060208201905081810360008301526137c58161345a565b9050919050565b600060208201905081810360008301526137e58161347d565b9050919050565b600060208201905061380160008301846134a0565b92915050565b600060a08201905061381c60008301886134a0565b61382960208301876131e2565b818103604083015261383b8186613166565b905061384a6060830185613157565b61385760808301846134a0565b9695505050505050565b600060408201905061387660008301856134a0565b61388360208301846134a0565b9392505050565b600060608201905061389f60008301866134a0565b6138ac60208301856134a0565b6138b960408301846134a0565b949350505050565b60006020820190506138d660008301846134af565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061393c82613bf5565b915061394783613bf5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561397c5761397b613ca7565b5b828201905092915050565b600061399282613bf5565b915061399d83613bf5565b9250826139ad576139ac613cd6565b5b828204905092915050565b6000808291508390505b6001851115613a02578086048111156139de576139dd613ca7565b5b60018516156139ed5780820291505b80810290506139fb85613d45565b94506139c2565b94509492505050565b6000613a1682613bf5565b9150613a2183613bff565b9250613a4e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613a56565b905092915050565b600082613a665760019050613b22565b81613a745760009050613b22565b8160018114613a8a5760028114613a9457613ac3565b6001915050613b22565b60ff841115613aa657613aa5613ca7565b5b8360020a915084821115613abd57613abc613ca7565b5b50613b22565b5060208310610133831016604e8410600b8410161715613af85782820a905083811115613af357613af2613ca7565b5b613b22565b613b0584848460016139b8565b92509050818404811115613b1c57613b1b613ca7565b5b81810290505b9392505050565b6000613b3482613bf5565b9150613b3f83613bf5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b7857613b77613ca7565b5b828202905092915050565b6000613b8e82613bf5565b9150613b9983613bf5565b925082821015613bac57613bab613ca7565b5b828203905092915050565b6000613bc282613bd5565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000613c1782613c1e565b9050919050565b6000613c2982613bd5565b9050919050565b6000613c3b82613bf5565b9050919050565b60005b83811015613c60578082015181840152602081019050613c45565b83811115613c6f576000848401525b50505050565b60006002820490506001821680613c8d57607f821691505b60208210811415613ca157613ca0613d05565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4d617820666565206c696d6974207265616368656420666f7220274255592700600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e696d756d2060302e30303030316020746f6b656e20706572207377617060008201527f2072657175697265640000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f5a65726f20616464726573730000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d617820666565206c696d6974207265616368656420666f7220275032502700600082015250565b7f4163636f756e7420697320616c7265616479207468652076616c7565206f662060008201527f2773746174757327000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f742073657420746f207a65726f2061646472657373000000000000600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e742063616e6e6f74206265206f7665722074686520746f74616c2060008201527f737570706c792e00000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f4d617820666565206c696d6974207265616368656420666f72202753454c4c27600082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6141b981613bb7565b81146141c457600080fd5b50565b6141d081613bc9565b81146141db57600080fd5b50565b6141e781613bf5565b81146141f257600080fd5b5056fea2646970667358221220bf0319c53db626566e840816ef349f13f7eff171d23785417e4c6e71b0da1def64736f6c634300080200336080604052610e10600955670de0b6b3a7640000600a5534801561002257600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611764806100726000396000f3fe6080604052600436106100f75760003560e01c8063997664d71161008a578063e2d2e21911610059578063e2d2e21914610337578063efca2eed14610362578063ffb2c4791461038d578063ffd49c84146103b6576100fe565b8063997664d714610267578063b6b55f2514610292578063ce7c2ac2146102bb578063d4fda1f2146102fa576100fe565b806337563293116100c657806337563293146101bd5780633a98ef39146101d45780634fab0ae8146101ff57806366817df51461022a576100fe565b806311ce023d1461010357806314b6ca961461012e57806328fd3198146101575780632d48e89614610194576100fe565b366100fe57005b600080fd5b34801561010f57600080fd5b506101186103e1565b6040516101259190611445565b60405180910390f35b34801561013a57600080fd5b506101556004803603810190610150919061131a565b6103f4565b005b34801561016357600080fd5b5061017e600480360381019061017991906112f1565b6106db565b60405161018b9190611445565b60405180910390f35b3480156101a057600080fd5b506101bb60048036038101906101b6919061137f565b6107ee565b005b3480156101c957600080fd5b506101d26108cb565b005b3480156101e057600080fd5b506101e96108e5565b6040516101f69190611445565b60405180910390f35b34801561020b57600080fd5b506102146108eb565b6040516102219190611445565b60405180910390f35b34801561023657600080fd5b50610251600480360381019061024c91906112f1565b6108f1565b60405161025e9190611445565b60405180910390f35b34801561027357600080fd5b5061027c610909565b6040516102899190611445565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190611356565b61090f565b005b3480156102c757600080fd5b506102e260048036038101906102dd91906112f1565b610a26565b6040516102f193929190611489565b60405180910390f35b34801561030657600080fd5b50610321600480360381019061031c91906112f1565b610a50565b60405161032e9190611445565b60405180910390f35b34801561034357600080fd5b5061034c610a68565b6040516103599190611445565b60405180910390f35b34801561036e57600080fd5b50610377610a6e565b6040516103849190611445565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af9190611356565b610a74565b005b3480156103c257600080fd5b506103cb610c7c565b6040516103d89190611445565b60405180910390f35b6ec097ce7bc90715b34b9f100000000081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047990611425565b60405180910390fd5b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411156104d7576104d682610c82565b5b60008111801561052957506000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154145b1561053c5761053782610edf565b61059e565b60008114801561058e57506000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154115b1561059d5761059c82610f8e565b5b5b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546005546105ef91906115bd565b6105f991906114dc565b60058190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550610691600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611229565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505050565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154141561073057600090506107e9565b600061077d600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611229565b90506000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490508082116107d8576000925050506107e9565b80826107e491906115bd565b925050505b919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461087c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087390611425565b60405180910390fd5b8160098190555080600a819055507f7d38de579bb682aa05ace7e32d15f88df69a3a53f6f89fcd0236f93fcc7e6362600954600a546040516108bf929190611460565b60405180910390a15050565b6108d43361125a565b156108e3576108e233610c82565b5b565b60055481565b600a5481565b60036020528060005260406000206000915090505481565b60065481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461099d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099490611425565b60405180910390fd5b806006546109ab91906114dc565b600681905550600554816ec097ce7bc90715b34b9f10000000006109cf9190611563565b6109d99190611532565b6008546109e691906114dc565b6008819055507f6a464fbfd2428ef7edab93930e64042148498d37c64c5122c4ab37843d6a3d1181604051610a1b9190611445565b60405180910390a150565b60046020528060005260406000206000915090508060000154908060010154908060020154905083565b60026020528060005260406000206000915090505481565b60085481565b60075481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af990611425565b60405180910390fd5b600060018054905090506000811415610b1b5750610c79565b6000805a905060005b8483108015610b3257508381105b15610c745783600b5410610b49576000600b819055505b610bb86001600b5481548110610b88577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661125a565b15610c2d57610c2c6001600b5481548110610bfc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610c82565b5b5a8284610c3a91906114dc565b610c4491906115bd565b92505a9150600b6000815480929190610c5c9061162d565b91905055508080610c6c9061162d565b915050610b24565b505050505b50565b60095481565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541415610cd257610edc565b6000610cdd826106db565b90506000811115610eda5760008273ffffffffffffffffffffffffffffffffffffffff1682604051610d0e90611410565b60006040518083038185875af1925050503d8060008114610d4b576040519150601f19603f3d011682016040523d82523d6000602084013e610d50565b606091505b505090508015610ed85781600754610d6891906114dc565b60078190555042600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154610e0091906114dc565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550610e91600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611229565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505b505b505b50565b600180549050600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6001808080549050610fa091906115bd565b81548110610fd7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548154811061107b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460026000600180808054905061111991906115bd565b81548110611150577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060018054806111f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055905550565b60006ec097ce7bc90715b34b9f1000000000600854836112499190611563565b6112539190611532565b9050919050565b600042600954600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112aa91906114dc565b1080156112c05750600a546112be836106db565b115b9050919050565b6000813590506112d681611700565b92915050565b6000813590506112eb81611717565b92915050565b60006020828403121561130357600080fd5b6000611311848285016112c7565b91505092915050565b6000806040838503121561132d57600080fd5b600061133b858286016112c7565b925050602061134c858286016112dc565b9150509250929050565b60006020828403121561136857600080fd5b6000611376848285016112dc565b91505092915050565b6000806040838503121561139257600080fd5b60006113a0858286016112dc565b92505060206113b1858286016112dc565b9150509250929050565b60006113c86006836114cb565b91506113d3826116d4565b602082019050919050565b60006113eb6000836114c0565b91506113f6826116fd565b600082019050919050565b61140a81611623565b82525050565b600061141b826113de565b9150819050919050565b6000602082019050818103600083015261143e816113bb565b9050919050565b600060208201905061145a6000830184611401565b92915050565b60006040820190506114756000830185611401565b6114826020830184611401565b9392505050565b600060608201905061149e6000830186611401565b6114ab6020830185611401565b6114b86040830184611401565b949350505050565b600081905092915050565b600082825260208201905092915050565b60006114e782611623565b91506114f283611623565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561152757611526611676565b5b828201905092915050565b600061153d82611623565b915061154883611623565b925082611558576115576116a5565b5b828204905092915050565b600061156e82611623565b915061157983611623565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156115b2576115b1611676565b5b828202905092915050565b60006115c882611623565b91506115d383611623565b9250828210156115e6576115e5611676565b5b828203905092915050565b60006115fc82611603565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061163882611623565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561166b5761166a611676565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f21546f6b656e0000000000000000000000000000000000000000000000000000600082015250565b50565b611709816115f1565b811461171457600080fd5b50565b61172081611623565b811461172b57600080fd5b5056fea2646970667358221220aab408125df2b202cff3e87dfb8b4c0bb0d28eaa8cd0454ca383c352612e70f964736f6c6343000802003352454d454d4245522052454d454d4245522054484520355448204f46204e4f56454d424552000000000000000000000000dd89fc734fc6e9408e2d1f6cdc1ffc7491d3249b
Deployed ByteCode
0x60806040526004361061021e5760003560e01c80638da5cb5b11610123578063b4f500dd116100ab578063e2f456051161006f578063e2f4560514610804578063f2fde38b1461082f578063f708a64f14610858578063fcef886714610881578063fe3f52f4146108be57610225565b8063b4f500dd14610735578063c065d7f01461075e578063d676fb0914610787578063dd62ed3e1461079e578063df8408fe146107db57610225565b8063a51af4c5116100f2578063a51af4c514610650578063a9059cbb1461067b578063ac1a386a146106b8578063aec9b6f4146106e1578063afa4f3b21461070c57610225565b80638da5cb5b1461059457806395d89b41146105bf5780639a7a23d6146105ea578063a457c2d71461061357610225565b806339509351116101a65780636ad5b3ea116101755780636ad5b3ea146104bf57806370a08231146104ea57806370d5ae0514610527578063715018a614610552578063866083261461056957610225565b806339509351146103dd57806349ae028a1461041a5780635342acb41461045757806360e719621461049457610225565b806323b872dd116101ed57806323b872dd146102e6578063244ce7db14610323578063255fe8471461034c5780632d48e89614610389578063313ce567146103b257610225565b806306fdde031461022a578063095ea7b3146102555780630a2d140c1461029257806318160ddd146102bb57610225565b3661022557005b600080fd5b34801561023657600080fd5b5061023f6108e9565b60405161024c919061358a565b60405180910390f35b34801561026157600080fd5b5061027c60048036038101906102779190613017565b61097b565b6040516102899190613554565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613053565b61099e565b005b3480156102c757600080fd5b506102d06109c3565b6040516102dd91906137ec565b60405180910390f35b3480156102f257600080fd5b5061030d60048036038101906103089190612f8c565b6109cd565b60405161031a9190613554565b60405180910390f35b34801561032f57600080fd5b5061034a6004803603810190610345919061307c565b6109fc565b005b34801561035857600080fd5b50610373600480360381019061036e9190612efe565b610a0e565b6040516103809190613554565b60405180910390f35b34801561039557600080fd5b506103b060048036038101906103ab91906130a5565b610a2e565b005b3480156103be57600080fd5b506103c7610ac9565b6040516103d491906138c1565b60405180910390f35b3480156103e957600080fd5b5061040460048036038101906103ff9190613017565b610ad2565b6040516104119190613554565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c919061307c565b610b09565b60405161044e91906137ec565b60405180910390f35b34801561046357600080fd5b5061047e60048036038101906104799190612efe565b610b2d565b60405161048b9190613554565b60405180910390f35b3480156104a057600080fd5b506104a9610b4d565b6040516104b691906137ec565b60405180910390f35b3480156104cb57600080fd5b506104d4610b53565b6040516104e191906134be565b60405180910390f35b3480156104f657600080fd5b50610511600480360381019061050c9190612efe565b610b79565b60405161051e91906137ec565b60405180910390f35b34801561053357600080fd5b5061053c610bc1565b60405161054991906134be565b60405180910390f35b34801561055e57600080fd5b50610567610be7565b005b34801561057557600080fd5b5061057e610bfb565b60405161058b9190613554565b60405180910390f35b3480156105a057600080fd5b506105a9610c0e565b6040516105b691906134be565b60405180910390f35b3480156105cb57600080fd5b506105d4610c38565b6040516105e1919061358a565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c9190612fdb565b610cca565b005b34801561061f57600080fd5b5061063a60048036038101906106359190613017565b610dd6565b6040516106479190613554565b60405180910390f35b34801561065c57600080fd5b50610665610e4d565b60405161067291906134be565b60405180910390f35b34801561068757600080fd5b506106a2600480360381019061069d9190613017565b610e73565b6040516106af9190613554565b60405180910390f35b3480156106c457600080fd5b506106df60048036038101906106da9190612efe565b610e96565b005b3480156106ed57600080fd5b506106f6610f89565b604051610703919061356f565b60405180910390f35b34801561071857600080fd5b50610733600480360381019061072e919061307c565b610faf565b005b34801561074157600080fd5b5061075c600480360381019061075791906130e1565b61108b565b005b34801561076a57600080fd5b50610785600480360381019061078091906130e1565b611370565b005b34801561079357600080fd5b5061079c611655565b005b3480156107aa57600080fd5b506107c560048036038101906107c09190612f50565b6116c6565b6040516107d291906137ec565b60405180910390f35b3480156107e757600080fd5b5061080260048036038101906107fd9190612fdb565b61174d565b005b34801561081057600080fd5b5061081961187c565b60405161082691906137ec565b60405180910390f35b34801561083b57600080fd5b5061085660048036038101906108519190612efe565b611882565b005b34801561086457600080fd5b5061087f600480360381019061087a9190612fdb565b611906565b005b34801561088d57600080fd5b506108a860048036038101906108a3919061307c565b611a9c565b6040516108b591906137ec565b60405180910390f35b3480156108ca57600080fd5b506108d3611ac0565b6040516108e091906134be565b60405180910390f35b6060600380546108f890613c75565b80601f016020809104026020016040519081016040528092919081815260200182805461092490613c75565b80156109715780601f1061094657610100808354040283529160200191610971565b820191906000526020600020905b81548152906001019060200180831161095457829003601f168201915b5050505050905090565b600080610986611ae6565b9050610993818585611aee565b600191505092915050565b6109a6611cb9565b80600e60156101000a81548160ff02191690831515021790555050565b6000600254905090565b6000806109d8611ae6565b90506109e5858285611d37565b6109f0858585611dc3565b60019150509392505050565b610a04611cb9565b8060098190555050565b60116020528060005260406000206000915054906101000a900460ff1681565b610a36611cb9565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632d48e89683836040518363ffffffff1660e01b8152600401610a93929190613861565b600060405180830381600087803b158015610aad57600080fd5b505af1158015610ac1573d6000803e3d6000fd5b505050505050565b60006012905090565b600080610add611ae6565b9050610afe818585610aef85896116c6565b610af99190613931565b611aee565b600191505092915050565b60078181548110610b1957600080fd5b906000526020600020016000915090505481565b60106020528060005260406000206000915054906101000a900460ff1681565b60095481565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610bef611cb9565b610bf9600061251a565b565b600e60159054906101000a900460ff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610c4790613c75565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7390613c75565b8015610cc05780601f10610c9557610100808354040283529160200191610cc0565b820191906000526020600020905b815481529060010190602001808311610ca357829003601f168201915b5050505050905090565b610cd2611cb9565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d399061368c565b60405180910390fd5b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fef0b71f3a695ce5a89064cc2745d0c503cf766ed985e781607660be6010b8e908282604051610dca9291906134d9565b60405180910390a15050565b600080610de1611ae6565b90506000610def82866116c6565b905083811015610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b9061378c565b60405180910390fd5b610e418286868403611aee565b60019250505092915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080610e7e611ae6565b9050610e8b818585611dc3565b600191505092915050565b610e9e611cb9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f059061370c565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f0428ca271a7bee83fddcf583de5ba0a5a69f42cbe32587b07bb38925ed96de8d81604051610f7e91906134be565b60405180910390a150565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610fb7611cb9565b610fbf6109c3565b811115611001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff89061376c565b60405180910390fd5b6509184e72a00081101561104a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110419061362c565b60405180910390fd5b806008819055507f28ea3a80049e637c2f1bf658d47a07f688bea6e931f3c1930cf4a4daf97b18608160405161108091906137ec565b60405180910390a150565b611093611cb9565b610bb88360066000815481106110d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546110e79190613931565b1115611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111f906135cc565b60405180910390fd5b610bb8826006600181548110611167577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015461117c9190613931565b11156111bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b4906137ac565b60405180910390fd5b6113888160066002815481106111fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546112119190613931565b1115611252576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611249906136cc565b60405180910390fd5b82600760008154811061128e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160076001815481106112d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550806007600281548110611322577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055507fdb668637f24e0b87780ad41181b37f3dfe677190806a00fabad4191588b901138383836040516113639392919061388a565b60405180910390a1505050565b611378611cb9565b610bb88360076000815481106113b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546113cc9190613931565b111561140d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611404906135cc565b60405180910390fd5b610bb882600760018154811061144c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546114619190613931565b11156114a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611499906137ac565b60405180910390fd5b6113888160076002815481106114e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001546114f69190613931565b1115611537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152e906136cc565b60405180910390fd5b826006600081548110611573577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160066001815481106115bd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550806006600281548110611607577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055507fba16035156e8913004ada62e7f85968008b3a45502bd335816bc697aed1237418383836040516116489392919061388a565b60405180910390a1505050565b61165d611cb9565b6000611667610ac9565b600a6116739190613a0b565b650746a52880006116849190613b29565b9050611697611691610c0e565b826125e0565b6116c3601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826125e0565b50565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611755611cb9565b801515601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156117e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117df906136ec565b60405180910390fd5b80601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507ff1bf6e8d74573725f529c5a07fb53656b9c97a10602a75631f57c1be07769e2b82826040516118709291906134d9565b60405180910390a15050565b60085481565b61188a611cb9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f1906135ec565b60405180910390fd5b6119038161251a565b50565b61190e611cb9565b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015611a0057600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca968360006040518363ffffffff1660e01b81526004016119c9929190613502565b600060405180830381600087803b1580156119e357600080fd5b505af11580156119f7573d6000803e3d6000fd5b50505050611a98565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca9683611a4885610b79565b6040518363ffffffff1660e01b8152600401611a6592919061352b565b600060405180830381600087803b158015611a7f57600080fd5b505af1158015611a93573d6000803e3d6000fd5b505050505b5050565b60068181548110611aac57600080fd5b906000526020600020016000915090505481565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b559061374c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc59061360c565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611cac91906137ec565b60405180910390a3505050565b611cc1611ae6565b73ffffffffffffffffffffffffffffffffffffffff16611cdf610c0e565b73ffffffffffffffffffffffffffffffffffffffff1614611d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2c906136ac565b60405180910390fd5b565b6000611d4384846116c6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611dbd5781811015611daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da69061364c565b60405180910390fd5b611dbc8484848403611aee565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2a9061372c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9a906135ac565b60405180910390fd5b6000611eae30610b79565b905060006008548210159050808015611ed45750600e60149054906101000a900460ff16155b8015611f295750601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561206c576001600e60146101000a81548160ff021916908315150217905550611f54600854612740565b6000479050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611fc1573d6000803e3d6000fd5b50600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6b55f25826040518263ffffffff1660e01b815260040161201d91906137ec565b600060405180830381600087803b15801561203757600080fd5b505af115801561204b573d6000803e3d6000fd5b505050506000600e60146101000a81548160ff021916908315150217905550505b601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061210d5750601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156121225761211d858585612a04565b612293565b60008061221f85601160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16601160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561221a5750601160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b612c85565b91509150600082111561225a5761225987600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612a04565b5b600081111561226f5761226e873083612a04565b5b61229087878385896122819190613b83565b61228b9190613b83565b612a04565b50505b600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661237f57600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca968661232c88610b79565b6040518363ffffffff1660e01b815260040161234992919061352b565b600060405180830381600087803b15801561236357600080fd5b505af1925050508015612374575060015b61237d5761237e565b5b5b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661246b57600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca968561241887610b79565b6040518363ffffffff1660e01b815260040161243592919061352b565b600060405180830381600087803b15801561244f57600080fd5b505af1925050508015612460575060015b6124695761246a565b5b5b600e60159054906101000a900460ff161561251357600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c4796009546040518263ffffffff1660e01b81526004016124dd91906137ec565b600060405180830381600087803b1580156124f757600080fd5b505af1925050508015612508575060015b61251157612512565b5b5b5050505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612650576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612647906137cc565b60405180910390fd5b61265c60008383612ea0565b806002600082825461266e9190613931565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126c39190613931565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161272891906137ec565b60405180910390a361273c60008383612ea5565b5050565b6000600267ffffffffffffffff811115612783577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156127b15781602001602082028036833780820191505090505b50905030816000815181106127ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ef8ef56f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561289157600080fd5b505afa1580156128a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c99190612f27565b81600181518110612903577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061296a30600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611aee565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016129ce959493929190613807565b600060405180830381600087803b1580156129e857600080fd5b505af11580156129fc573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6b9061372c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612adb906135ac565b60405180910390fd5b612aef838383612ea0565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6c9061366c565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c089190613931565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612c6c91906137ec565b60405180910390a3612c7f848484612ea5565b50505050565b600080600061271084612d2e5785612ce2576007600081548110612cd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154612d29565b6007600181548110612d1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001545b612d75565b6007600281548110612d69577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001545b87612d809190613b29565b612d8a9190613987565b9050600061271085612e325786612de6576006600081548110612dd6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154612e2d565b6006600181548110612e21577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001545b612e79565b6006600281548110612e6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001545b88612e849190613b29565b612e8e9190613987565b90508181935093505050935093915050565b505050565b505050565b600081359050612eb9816141b0565b92915050565b600081519050612ece816141b0565b92915050565b600081359050612ee3816141c7565b92915050565b600081359050612ef8816141de565b92915050565b600060208284031215612f1057600080fd5b6000612f1e84828501612eaa565b91505092915050565b600060208284031215612f3957600080fd5b6000612f4784828501612ebf565b91505092915050565b60008060408385031215612f6357600080fd5b6000612f7185828601612eaa565b9250506020612f8285828601612eaa565b9150509250929050565b600080600060608486031215612fa157600080fd5b6000612faf86828701612eaa565b9350506020612fc086828701612eaa565b9250506040612fd186828701612ee9565b9150509250925092565b60008060408385031215612fee57600080fd5b6000612ffc85828601612eaa565b925050602061300d85828601612ed4565b9150509250929050565b6000806040838503121561302a57600080fd5b600061303885828601612eaa565b925050602061304985828601612ee9565b9150509250929050565b60006020828403121561306557600080fd5b600061307384828501612ed4565b91505092915050565b60006020828403121561308e57600080fd5b600061309c84828501612ee9565b91505092915050565b600080604083850312156130b857600080fd5b60006130c685828601612ee9565b92505060206130d785828601612ee9565b9150509250929050565b6000806000606084860312156130f657600080fd5b600061310486828701612ee9565b935050602061311586828701612ee9565b925050604061312686828701612ee9565b9150509250925092565b600061313c8383613148565b60208301905092915050565b61315181613bb7565b82525050565b61316081613bb7565b82525050565b6000613171826138ec565b61317b818561390f565b9350613186836138dc565b8060005b838110156131b757815161319e8882613130565b97506131a983613902565b92505060018101905061318a565b5085935050505092915050565b6131cd81613bc9565b82525050565b6131dc81613c0c565b82525050565b6131eb81613c30565b82525050565b60006131fc826138f7565b6132068185613920565b9350613216818560208601613c42565b61321f81613d34565b840191505092915050565b6000613237602383613920565b915061324282613d52565b604082019050919050565b600061325a601f83613920565b915061326582613da1565b602082019050919050565b600061327d602683613920565b915061328882613dca565b604082019050919050565b60006132a0602283613920565b91506132ab82613e19565b604082019050919050565b60006132c3602983613920565b91506132ce82613e68565b604082019050919050565b60006132e6601d83613920565b91506132f182613eb7565b602082019050919050565b6000613309602683613920565b915061331482613ee0565b604082019050919050565b600061332c600c83613920565b915061333782613f2f565b602082019050919050565b600061334f602083613920565b915061335a82613f58565b602082019050919050565b6000613372601f83613920565b915061337d82613f81565b602082019050919050565b6000613395602883613920565b91506133a082613faa565b604082019050919050565b60006133b8601a83613920565b91506133c382613ff9565b602082019050919050565b60006133db602583613920565b91506133e682614022565b604082019050919050565b60006133fe602483613920565b915061340982614071565b604082019050919050565b6000613421602783613920565b915061342c826140c0565b604082019050919050565b6000613444602583613920565b915061344f8261410f565b604082019050919050565b6000613467602083613920565b91506134728261415e565b602082019050919050565b600061348a601f83613920565b915061349582614187565b602082019050919050565b6134a981613bf5565b82525050565b6134b881613bff565b82525050565b60006020820190506134d36000830184613157565b92915050565b60006040820190506134ee6000830185613157565b6134fb60208301846131c4565b9392505050565b60006040820190506135176000830185613157565b61352460208301846131e2565b9392505050565b60006040820190506135406000830185613157565b61354d60208301846134a0565b9392505050565b600060208201905061356960008301846131c4565b92915050565b600060208201905061358460008301846131d3565b92915050565b600060208201905081810360008301526135a481846131f1565b905092915050565b600060208201905081810360008301526135c58161322a565b9050919050565b600060208201905081810360008301526135e58161324d565b9050919050565b6000602082019050818103600083015261360581613270565b9050919050565b6000602082019050818103600083015261362581613293565b9050919050565b60006020820190508181036000830152613645816132b6565b9050919050565b60006020820190508181036000830152613665816132d9565b9050919050565b60006020820190508181036000830152613685816132fc565b9050919050565b600060208201905081810360008301526136a58161331f565b9050919050565b600060208201905081810360008301526136c581613342565b9050919050565b600060208201905081810360008301526136e581613365565b9050919050565b6000602082019050818103600083015261370581613388565b9050919050565b60006020820190508181036000830152613725816133ab565b9050919050565b60006020820190508181036000830152613745816133ce565b9050919050565b60006020820190508181036000830152613765816133f1565b9050919050565b6000602082019050818103600083015261378581613414565b9050919050565b600060208201905081810360008301526137a581613437565b9050919050565b600060208201905081810360008301526137c58161345a565b9050919050565b600060208201905081810360008301526137e58161347d565b9050919050565b600060208201905061380160008301846134a0565b92915050565b600060a08201905061381c60008301886134a0565b61382960208301876131e2565b818103604083015261383b8186613166565b905061384a6060830185613157565b61385760808301846134a0565b9695505050505050565b600060408201905061387660008301856134a0565b61388360208301846134a0565b9392505050565b600060608201905061389f60008301866134a0565b6138ac60208301856134a0565b6138b960408301846134a0565b949350505050565b60006020820190506138d660008301846134af565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061393c82613bf5565b915061394783613bf5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561397c5761397b613ca7565b5b828201905092915050565b600061399282613bf5565b915061399d83613bf5565b9250826139ad576139ac613cd6565b5b828204905092915050565b6000808291508390505b6001851115613a02578086048111156139de576139dd613ca7565b5b60018516156139ed5780820291505b80810290506139fb85613d45565b94506139c2565b94509492505050565b6000613a1682613bf5565b9150613a2183613bff565b9250613a4e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613a56565b905092915050565b600082613a665760019050613b22565b81613a745760009050613b22565b8160018114613a8a5760028114613a9457613ac3565b6001915050613b22565b60ff841115613aa657613aa5613ca7565b5b8360020a915084821115613abd57613abc613ca7565b5b50613b22565b5060208310610133831016604e8410600b8410161715613af85782820a905083811115613af357613af2613ca7565b5b613b22565b613b0584848460016139b8565b92509050818404811115613b1c57613b1b613ca7565b5b81810290505b9392505050565b6000613b3482613bf5565b9150613b3f83613bf5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b7857613b77613ca7565b5b828202905092915050565b6000613b8e82613bf5565b9150613b9983613bf5565b925082821015613bac57613bab613ca7565b5b828203905092915050565b6000613bc282613bd5565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000613c1782613c1e565b9050919050565b6000613c2982613bd5565b9050919050565b6000613c3b82613bf5565b9050919050565b60005b83811015613c60578082015181840152602081019050613c45565b83811115613c6f576000848401525b50505050565b60006002820490506001821680613c8d57607f821691505b60208210811415613ca157613ca0613d05565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4d617820666565206c696d6974207265616368656420666f7220274255592700600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e696d756d2060302e30303030316020746f6b656e20706572207377617060008201527f2072657175697265640000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f5a65726f20616464726573730000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d617820666565206c696d6974207265616368656420666f7220275032502700600082015250565b7f4163636f756e7420697320616c7265616479207468652076616c7565206f662060008201527f2773746174757327000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f742073657420746f207a65726f2061646472657373000000000000600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e742063616e6e6f74206265206f7665722074686520746f74616c2060008201527f737570706c792e00000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f4d617820666565206c696d6974207265616368656420666f72202753454c4c27600082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6141b981613bb7565b81146141c457600080fd5b50565b6141d081613bc9565b81146141db57600080fd5b50565b6141e781613bf5565b81146141f257600080fd5b5056fea2646970667358221220bf0319c53db626566e840816ef349f13f7eff171d23785417e4c6e71b0da1def64736f6c63430008020033