Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- Blastar
- Optimization enabled
- true
- Compiler version
- v0.8.18+commit.87f61d96
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2024-01-11T17:59:08.798284Z
Constructor Arguments
0x0000000000000000000000008bda04d2c7b67ce96116eb21cf9cfea41db7ce8100000000000000000000000047bb3c2349f2050d5bac06494b54c6c3e896b4bc
Arg [0] (address) : 0x8bda04d2c7b67ce96116eb21cf9cfea41db7ce81
Arg [1] (address) : 0x47bb3c2349f2050d5bac06494b54c6c3e896b4bc
Contract source code
// SPDX-License-Identifier: MIT
pragma solidity 0.8.18;
interface IERC20 {
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);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
}
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
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 9;
}
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, _allowances[owner][spender] + addedValue);
return true;
}
function decreaseAllowance(
address spender,
uint256 subtractedValue
) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = _allowances[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 {}
}
library SafeMath {
function tryAdd(
uint256 a,
uint256 b
) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
function trySub(
uint256 a,
uint256 b
) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
function tryMul(
uint256 a,
uint256 b
) internal pure returns (bool, uint256) {
unchecked {
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
function tryDiv(
uint256 a,
uint256 b
) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
function tryMod(
uint256 a,
uint256 b
) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
library Counters {
struct Counter {
uint256 _value;
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
function reset(Counter storage counter) internal {
counter._value = 0;
}
}
contract Ownable {
address private _owner;
address private _previousOwner;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
constructor() {
_owner = msg.sender;
emit OwnershipTransferred(address(0), _owner);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(_owner == msg.sender, "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
}
interface IUniswapV2Router02 {
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable;
function factory() external pure returns (address);
function WPLS() external pure returns (address);
function addLiquidityETH(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
}
interface IUniswapV2Factory {
function createPair(
address tokenA,
address tokenB
) external returns (address pair);
}
library SignedSafeMath {
function mul(int256 a, int256 b) internal pure returns (int256) {
return a * b;
}
function div(int256 a, int256 b) internal pure returns (int256) {
return a / b;
}
function sub(int256 a, int256 b) internal pure returns (int256) {
return a - b;
}
function add(int256 a, int256 b) internal pure returns (int256) {
return a + b;
}
}
library SafeCast {
function toUint224(uint256 value) internal pure returns (uint224) {
require(
value <= type(uint224).max,
"SafeCast: value doesn't fit in 224 bits"
);
return uint224(value);
}
function toUint128(uint256 value) internal pure returns (uint128) {
require(
value <= type(uint128).max,
"SafeCast: value doesn't fit in 128 bits"
);
return uint128(value);
}
function toUint96(uint256 value) internal pure returns (uint96) {
require(
value <= type(uint96).max,
"SafeCast: value doesn't fit in 96 bits"
);
return uint96(value);
}
function toUint64(uint256 value) internal pure returns (uint64) {
require(
value <= type(uint64).max,
"SafeCast: value doesn't fit in 64 bits"
);
return uint64(value);
}
function toUint32(uint256 value) internal pure returns (uint32) {
require(
value <= type(uint32).max,
"SafeCast: value doesn't fit in 32 bits"
);
return uint32(value);
}
function toUint16(uint256 value) internal pure returns (uint16) {
require(
value <= type(uint16).max,
"SafeCast: value doesn't fit in 16 bits"
);
return uint16(value);
}
function toUint8(uint256 value) internal pure returns (uint8) {
require(
value <= type(uint8).max,
"SafeCast: value doesn't fit in 8 bits"
);
return uint8(value);
}
function toUint256(int256 value) internal pure returns (uint256) {
require(value >= 0, "SafeCast: value must be positive");
return uint256(value);
}
function toInt128(int256 value) internal pure returns (int128) {
require(
value >= type(int128).min && value <= type(int128).max,
"SafeCast: value doesn't fit in 128 bits"
);
return int128(value);
}
function toInt64(int256 value) internal pure returns (int64) {
require(
value >= type(int64).min && value <= type(int64).max,
"SafeCast: value doesn't fit in 64 bits"
);
return int64(value);
}
function toInt32(int256 value) internal pure returns (int32) {
require(
value >= type(int32).min && value <= type(int32).max,
"SafeCast: value doesn't fit in 32 bits"
);
return int32(value);
}
function toInt16(int256 value) internal pure returns (int16) {
require(
value >= type(int16).min && value <= type(int16).max,
"SafeCast: value doesn't fit in 16 bits"
);
return int16(value);
}
function toInt8(int256 value) internal pure returns (int8) {
require(
value >= type(int8).min && value <= type(int8).max,
"SafeCast: value doesn't fit in 8 bits"
);
return int8(value);
}
function toInt256(uint256 value) internal pure returns (int256) {
require(
value <= uint256(type(int256).max),
"SafeCast: value doesn't fit in an int256"
);
return int256(value);
}
}
interface DividendPayingTokenInterface {
function dividendOf(address _owner) external view returns (uint256);
function distributeDividends() external payable;
function withdrawDividend() external;
event DividendsDistributed(address indexed from, uint256 weiAmount);
event DividendWithdrawn(
address indexed to,
uint256 weiAmount,
address received
);
}
interface DividendPayingTokenOptionalInterface {
function withdrawableDividendOf(
address _owner
) external view returns (uint256);
function withdrawnDividendOf(
address _owner
) external view returns (uint256);
function accumulativeDividendOf(
address _owner
) external view returns (uint256);
}
abstract contract DividendPayingToken is
ERC20,
DividendPayingTokenInterface,
DividendPayingTokenOptionalInterface
{
using SafeMath for uint256;
using SignedSafeMath for int256;
using SafeCast for uint256;
using SafeCast for int256;
uint256 internal constant magnitude = 2 ** 128;
uint256 internal magnifiedDividendPerShare;
mapping(address => int256) internal magnifiedDividendCorrections;
mapping(address => uint256) internal withdrawnDividends;
uint256 public totalDividendsDistributed;
constructor(
string memory _name,
string memory _symbol
) ERC20(_name, _symbol) {}
receive() external payable {
distributeDividends();
}
function distributeDividends() public payable override {
require(totalSupply() > 0);
if (msg.value > 0) {
magnifiedDividendPerShare = magnifiedDividendPerShare.add(
(msg.value).mul(magnitude) / totalSupply()
);
emit DividendsDistributed(msg.sender, msg.value);
totalDividendsDistributed = totalDividendsDistributed.add(
msg.value
);
}
}
function withdrawDividend() public virtual override {
_withdrawDividendOfUser(payable(msg.sender), payable(msg.sender));
}
function _withdrawDividendOfUser(
address payable user,
address payable to
) internal returns (uint256) {
uint256 _withdrawableDividend = withdrawableDividendOf(user);
if (_withdrawableDividend > 0) {
withdrawnDividends[user] = withdrawnDividends[user].add(
_withdrawableDividend
);
emit DividendWithdrawn(user, _withdrawableDividend, to);
(bool success, ) = to.call{value: _withdrawableDividend}("");
if (!success) {
withdrawnDividends[user] = withdrawnDividends[user].sub(
_withdrawableDividend
);
return 0;
}
return _withdrawableDividend;
}
return 0;
}
function dividendOf(address _owner) public view override returns (uint256) {
return withdrawableDividendOf(_owner);
}
function withdrawableDividendOf(
address _owner
) public view override returns (uint256) {
if (magnifiedDividendPerShare > 0) {
return
accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
}
return 0;
}
function withdrawnDividendOf(
address _owner
) public view override returns (uint256) {
return withdrawnDividends[_owner];
}
function accumulativeDividendOf(
address _owner
) public view override returns (uint256) {
return
magnifiedDividendPerShare
.mul(balanceOf(_owner))
.toInt256()
.add(magnifiedDividendCorrections[_owner])
.toUint256() / magnitude;
}
function _mint(address account, uint256 value) internal override {
super._mint(account, value);
magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
account
].sub((magnifiedDividendPerShare.mul(value)).toInt256());
}
function _burn(address account, uint256 value) internal override {
super._burn(account, value);
magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
account
].add((magnifiedDividendPerShare.mul(value)).toInt256());
}
function _setBalance(address account, uint256 newBalance) internal {
uint256 currentBalance = balanceOf(account);
if (newBalance > currentBalance) {
uint256 mintAmount = newBalance.sub(currentBalance);
_mint(account, mintAmount);
} else if (newBalance < currentBalance) {
uint256 burnAmount = currentBalance.sub(newBalance);
_burn(account, burnAmount);
}
}
function getAccount(
address _account
)
public
view
returns (uint256 _withdrawableDividends, uint256 _withdrawnDividends)
{
_withdrawableDividends = withdrawableDividendOf(_account);
_withdrawnDividends = withdrawnDividends[_account];
}
}
contract BlastDividendTracker is DividendPayingToken, Ownable {
using SafeMath for uint256;
using Counters for Counters.Counter;
Counters.Counter private tokenHoldersCount;
mapping(address => bool) private tokenHoldersMap;
mapping(address => bool) public excludedFromDividends;
uint256 public immutable minimumTokenBalanceForDividends;
event ExcludeFromDividends(address indexed account);
constructor()
DividendPayingToken("Blast_Dividend_Tracker", "Blast_Dividend_Tracker")
{
minimumTokenBalanceForDividends = 10000 * 10 ** 9;
}
function decimals() public view virtual override returns (uint8) {
return 9;
}
function _approve(address, address, uint256) internal pure override {
require(false, "Blast_Dividend_Tracker: No approvals allowed");
}
function _transfer(address, address, uint256) internal pure override {
require(false, "Blast_Dividend_Tracker: No transfers allowed");
}
function withdrawDividend() public pure override {
require(
false,
"Blast_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main Blast contract."
);
}
function excludeFromDividends(address account) external onlyOwner {
excludedFromDividends[account] = true;
_setBalance(account, 0);
if (tokenHoldersMap[account] == true) {
tokenHoldersMap[account] = false;
tokenHoldersCount.decrement();
}
emit ExcludeFromDividends(account);
}
function includeFromDividends(
address account,
uint256 balance
) external onlyOwner {
excludedFromDividends[account] = false;
if (balance >= minimumTokenBalanceForDividends) {
_setBalance(account, balance);
if (tokenHoldersMap[account] == false) {
tokenHoldersMap[account] = true;
tokenHoldersCount.increment();
}
}
emit ExcludeFromDividends(account);
}
function isExcludeFromDividends(
address account
) external view onlyOwner returns (bool) {
return excludedFromDividends[account];
}
function getNumberOfTokenHolders() external view returns (uint256) {
return tokenHoldersCount.current();
}
function setBalance(
address payable account,
uint256 newBalance
) external onlyOwner {
if (excludedFromDividends[account]) {
return;
}
if (newBalance >= minimumTokenBalanceForDividends) {
_setBalance(account, newBalance);
if (tokenHoldersMap[account] == false) {
tokenHoldersMap[account] = true;
tokenHoldersCount.increment();
}
} else {
_setBalance(account, 0);
if (tokenHoldersMap[account] == true) {
tokenHoldersMap[account] = false;
tokenHoldersCount.decrement();
}
}
}
function processAccount(
address account,
address toAccount
) public onlyOwner returns (uint256) {
uint256 amount = _withdrawDividendOfUser(
payable(account),
payable(toAccount)
);
return amount;
}
function emergencyWithdraw(address _receiver) external onlyOwner {
magnifiedDividendPerShare = 0;
uint256 totalBalance = address(this).balance;
require(totalBalance > 0, "no balance");
(bool success, ) = _receiver.call{value: totalBalance}("");
require(success);
}
}
contract Blastar is ERC20, Ownable {
using SafeMath for uint256;
using Counters for Counters.Counter;
string private constant _name = "Blastar";
string private constant _symbol = "BLAST";
uint8 private constant _decimals = 9;
uint256 private constant _tTotal = 1e12 * 10 ** 9;
IUniswapV2Router02 private uniswapV2Router =
IUniswapV2Router02(0x98bf93ebf5c380C0e6Ae8e192A7e2AE08edAcc02);
bool private tradingOpen = false;
address private uniswapV2Pair;
mapping(address => bool) private automatedMarketMakerPairs;
mapping(address => bool) public isExcludeFromFee;
mapping(address => bool) public isBot;
uint256 private walletLimitPercentage = 100;
mapping(address => bool) public isExludeFromWalletLimit;
uint256 private baseBuyTax = 5;
uint256 public baseSellTax = 5;
uint256 private autoLP = 0;
uint256 private devFee = 50;
uint256 private marketingFee = 50;
uint256 public minContractTokensToSwap = 2e9 * 10 ** 9;
bool public swapAll = false;
struct MinutesRangeTax {
uint256 from;
uint256 to;
uint256 tax;
}
mapping(address => uint256) public initialBuyTimestamp;
mapping(uint8 => MinutesRangeTax) public minutesRangeTaxes;
uint8 public maxIndexMinutesRange;
address private devWalletAddress;
address private marketingWalletAddress;
BlastDividendTracker public dividendTracker;
uint256 minimumTokenBalanceForDividends = 10000 * 10 ** 9;
mapping(address => uint256) public lastTransfer;
uint256 public pendingTokensForReward;
uint256 public minRewardTokensToSwap = 10000 * 10 ** 9;
uint256 public pendingEthReward;
struct ClaimedEth {
uint256 ethAmount;
uint256 tokenAmount;
uint256 timestamp;
}
Counters.Counter private claimedHistoryIds;
mapping(uint256 => ClaimedEth) private claimedEthMap;
mapping(address => uint256[]) private userClaimedIds;
event BuyFees(address from, address to, uint256 amountTokens);
event SellFees(address from, address to, uint256 amountTokens);
event AddLiquidity(uint256 amountTokens, uint256 amountEth);
event SwapTokensForEth(uint256 sentTokens, uint256 receivedEth);
event SwapEthForTokens(uint256 sentEth, uint256 receivedTokens);
event DistributeFees(uint256 devEth, uint256 remarketingEth);
event AddRewardPool(uint256 _ethAmount);
event SendDividends(uint256 amount);
event DividendClaimed(
uint256 ethAmount,
uint256 tokenAmount,
address account
);
constructor(
address _devWalletAddress,
address _marketingWalletAddress
) ERC20(_name, _symbol) {
devWalletAddress = _devWalletAddress;
marketingWalletAddress = _marketingWalletAddress;
isExcludeFromFee[owner()] = true;
isExcludeFromFee[address(this)] = true;
isExludeFromWalletLimit[owner()] = true;
isExludeFromWalletLimit[address(this)] = true;
isExludeFromWalletLimit[address(uniswapV2Router)] = true;
dividendTracker = new BlastDividendTracker();
dividendTracker.excludeFromDividends(address(dividendTracker));
dividendTracker.excludeFromDividends(address(this));
dividendTracker.excludeFromDividends(owner());
dividendTracker.excludeFromDividends(address(uniswapV2Router));
dividendTracker.excludeFromDividends(address(0x0000000000000000000000000000000000000369));
minutesRangeTaxes[1].from = 0 minutes;
minutesRangeTaxes[1].to = 7200 minutes;
minutesRangeTaxes[1].tax = 30;
minutesRangeTaxes[2].from = 7200 minutes;
minutesRangeTaxes[2].to = 14400 minutes;
minutesRangeTaxes[2].tax = 25;
minutesRangeTaxes[3].from = 14400 minutes;
minutesRangeTaxes[3].to = 21600 minutes;
minutesRangeTaxes[3].tax = 20;
minutesRangeTaxes[4].from = 21600 minutes;
minutesRangeTaxes[4].to = 28800 minutes;
minutesRangeTaxes[4].tax = 15;
minutesRangeTaxes[5].from = 28800 minutes;
minutesRangeTaxes[5].to = 36000 minutes;
minutesRangeTaxes[5].tax = 10;
maxIndexMinutesRange = 5;
_mint(owner(), _tTotal);
}
function openTrading() external onlyOwner {
require(!tradingOpen, "Blast: Trading is already open");
uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
address(this),
uniswapV2Router.WPLS()
);
automatedMarketMakerPairs[uniswapV2Pair] = true;
dividendTracker.excludeFromDividends(uniswapV2Pair);
addLiquidity(balanceOf(address(this)), address(this).balance);
IERC20(uniswapV2Pair).approve(
address(uniswapV2Router),
type(uint256).max
);
tradingOpen = true;
}
function manualSwap() external onlyOwner {
uint256 totalTokens = balanceOf(address(this)).sub(
pendingTokensForReward
);
swapTokensForEth(totalTokens);
}
function manualSend() external onlyOwner {
uint256 totalEth = address(this).balance.sub(pendingEthReward);
uint256 devFeesToSend = totalEth.mul(devFee).div(
uint256(100).sub(autoLP)
);
uint256 marketingFeesToSend = totalEth.mul(marketingFee).div(
uint256(100).sub(autoLP)
);
uint256 remainingEthForFees = totalEth.sub(devFeesToSend).sub(
marketingFeesToSend
);
devFeesToSend = devFeesToSend.add(remainingEthForFees);
sendEthToWallets(devFeesToSend, marketingFeesToSend);
}
function getTax(address _ad) public view returns (uint256) {
uint256 tax = baseSellTax;
for (uint8 x = 1; x <= maxIndexMinutesRange; x++) {
if (
(initialBuyTimestamp[_ad] + minutesRangeTaxes[x].from <=
block.timestamp &&
initialBuyTimestamp[_ad] + minutesRangeTaxes[x].to >=
block.timestamp)
) {
tax = minutesRangeTaxes[x].tax;
return tax;
}
}
return tax;
}
function getTotalDividendsDistributed() external view returns (uint256) {
return dividendTracker.totalDividendsDistributed();
}
function withdrawableDividendOf(
address _account
) public view returns (uint256) {
return dividendTracker.withdrawableDividendOf(_account);
}
function dividendTokenBalanceOf(
address _account
) public view returns (uint256) {
return dividendTracker.balanceOf(_account);
}
function claim() external {
_claim(payable(msg.sender), false);
}
function reinvest() external {
_claim(payable(msg.sender), true);
}
function _claim(address payable _account, bool _reinvest) private {
uint256 withdrawableAmount = dividendTracker.withdrawableDividendOf(
_account
);
require(
withdrawableAmount > 0,
"Blast: Claimer has no withdrawable dividend"
);
uint256 ethAmount;
uint256 tokenAmount;
if (!_reinvest) {
ethAmount = dividendTracker.processAccount(_account, _account);
} else {
ethAmount = dividendTracker.processAccount(_account, address(this));
if (ethAmount > 0) {
tokenAmount = swapEthForTokens(ethAmount, _account);
}
}
if (ethAmount > 0) {
claimedHistoryIds.increment();
uint256 hId = claimedHistoryIds.current();
claimedEthMap[hId].ethAmount = ethAmount;
claimedEthMap[hId].tokenAmount = tokenAmount;
claimedEthMap[hId].timestamp = block.timestamp;
userClaimedIds[_account].push(hId);
emit DividendClaimed(ethAmount, tokenAmount, _account);
}
}
function getNumberOfDividendTokenHolders() external view returns (uint256) {
return dividendTracker.getNumberOfTokenHolders();
}
function getAccount(
address _account
)
public
view
returns (
uint256 withdrawableDividends,
uint256 withdrawnDividends,
uint256 balance
)
{
(withdrawableDividends, withdrawnDividends) = dividendTracker
.getAccount(_account);
return (withdrawableDividends, withdrawnDividends, balanceOf(_account));
}
function decimals() public view virtual override returns (uint8) {
return _decimals;
}
function _transfer(
address _from,
address _to,
uint256 _amount
) internal virtual override {
require(!isBot[_from] && !isBot[_to]);
uint256 transferAmount = _amount;
uint256 prevWalletLimit = walletLimitPercentage;
if (
tradingOpen &&
(automatedMarketMakerPairs[_from] ||
automatedMarketMakerPairs[_to]) &&
!isExcludeFromFee[_from] &&
!isExcludeFromFee[_to]
) {
transferAmount = takeFees(_from, _to, _amount);
}
if (initialBuyTimestamp[_to] == 0) {
initialBuyTimestamp[_to] = block.timestamp;
}
if (!automatedMarketMakerPairs[_to] && !isExludeFromWalletLimit[_to]) {
uint256 addressBalance = balanceOf(_to).add(transferAmount);
require(
addressBalance <=
totalSupply().mul(walletLimitPercentage).div(10000),
"Blast: Wallet balance limit reached"
);
}
super._transfer(_from, _to, transferAmount);
walletLimitPercentage = prevWalletLimit;
if (!dividendTracker.isExcludeFromDividends(_from)) {
try
dividendTracker.setBalance(payable(_from), balanceOf(_from))
{} catch {}
}
if (!dividendTracker.isExcludeFromDividends(_to)) {
try
dividendTracker.setBalance(payable(_to), balanceOf(_to))
{} catch {}
}
}
function _setAutomatedMarketMakerPair(address _pair, bool _value) private {
require(
automatedMarketMakerPairs[_pair] != _value,
"Blast: Automated market maker pair is already set to that value"
);
automatedMarketMakerPairs[_pair] = _value;
if (_value) {
dividendTracker.excludeFromDividends(_pair);
}
}
function setExcludeFromFee(
address _address,
bool _isExludeFromFee
) external onlyOwner {
isExcludeFromFee[_address] = _isExludeFromFee;
}
function setExludeFromDividends(
address _address,
bool _isExludeFromDividends
) external onlyOwner {
if (_isExludeFromDividends) {
dividendTracker.excludeFromDividends(_address);
} else {
dividendTracker.includeFromDividends(_address, balanceOf(_address));
}
}
function setExludeFromWalletLimit(
address _address,
bool _isExludeFromWalletLimit
) external onlyOwner {
isExludeFromWalletLimit[_address] = _isExludeFromWalletLimit;
}
function setWalletLimitPercentage(uint256 _percentage) external onlyOwner {
walletLimitPercentage = _percentage;
}
function setTaxes(
uint256 _baseBuyTax,
uint256 _baseSellTax,
uint256 _autoLP,
uint256 _devFee,
uint256 _marketingFee
) external onlyOwner {
require(_baseBuyTax <= 10 && baseSellTax <= 5);
baseBuyTax = _baseBuyTax;
baseSellTax = _baseSellTax;
autoLP = _autoLP;
devFee = _devFee;
marketingFee = _marketingFee;
}
function setMinContractTokensToSwap(uint256 _numToken) public onlyOwner {
minContractTokensToSwap = _numToken;
}
function setMinRewardTokensToSwap(uint256 _numToken) public onlyOwner {
minRewardTokensToSwap = _numToken;
}
function setSwapAll(bool _isWapAll) public onlyOwner {
swapAll = _isWapAll;
}
function setMinutesRangeTax(
uint8 _index,
uint256 _from,
uint256 _to,
uint256 _tax
) external onlyOwner {
minutesRangeTaxes[_index].from = _from.mul(1 minutes);
minutesRangeTaxes[_index].to = _to.mul(1 minutes);
minutesRangeTaxes[_index].tax = _tax;
}
function setMaxIndexMinutesRange(uint8 _maxIndex) external onlyOwner {
maxIndexMinutesRange = _maxIndex;
}
function setBots(address[] calldata _bots, bool value) public onlyOwner {
for (uint256 i = 0; i < _bots.length; i++) {
if (
_bots[i] != uniswapV2Pair &&
_bots[i] != address(uniswapV2Router)
) {
isBot[_bots[i]] = value;
}
}
}
function setWalletAddress(
address _devWallet,
address _marketingWallet
) external onlyOwner {
devWalletAddress = _devWallet;
marketingWalletAddress = _marketingWallet;
}
function takeFees(
address _from,
address _to,
uint256 _amount
) private returns (uint256) {
uint256 fees;
uint256 remainingAmount;
require(
automatedMarketMakerPairs[_from] || automatedMarketMakerPairs[_to],
"Blast: No market makers found"
);
if (automatedMarketMakerPairs[_from]) {
fees = _amount.mul(baseBuyTax).div(100);
remainingAmount = _amount.sub(fees);
super._transfer(_from, address(this), fees);
emit BuyFees(_from, address(this), fees);
} else {
uint256 totalSellTax = getTax(_from);
fees = _amount.mul(totalSellTax).div(100);
uint256 rewardTokens = _amount
.mul(totalSellTax.sub(baseSellTax))
.div(100);
pendingTokensForReward = pendingTokensForReward.add(rewardTokens);
remainingAmount = _amount.sub(fees);
super._transfer(_from, address(this), fees);
uint256 tokensToSwap = balanceOf(address(this)).sub(
pendingTokensForReward
);
if (tokensToSwap > minContractTokensToSwap) {
if (!swapAll) {
tokensToSwap = minContractTokensToSwap;
}
distributeTokensEth(tokensToSwap);
}
if (pendingTokensForReward > minRewardTokensToSwap) {
swapAndSendDividends(pendingTokensForReward);
}
emit SellFees(_from, address(this), fees);
}
return remainingAmount;
}
function distributeTokensEth(uint256 _tokenAmount) private {
uint256 tokensForLiquidity = _tokenAmount.mul(autoLP).div(100);
uint256 halfLiquidity = tokensForLiquidity.div(2);
uint256 tokensForSwap = _tokenAmount.sub(halfLiquidity);
uint256 totalEth = swapTokensForEth(tokensForSwap);
uint256 ethForAddLP = totalEth.mul(autoLP).div(100);
uint256 devFeesToSend = totalEth.mul(devFee).div(100);
uint256 marketingFeesToSend = totalEth.mul(marketingFee).div(100);
uint256 remainingEthForFees = totalEth
.sub(ethForAddLP)
.sub(devFeesToSend)
.sub(marketingFeesToSend);
devFeesToSend = devFeesToSend.add(remainingEthForFees);
sendEthToWallets(devFeesToSend, marketingFeesToSend);
if (halfLiquidity > 0 && ethForAddLP > 0) {
addLiquidity(halfLiquidity, ethForAddLP);
}
}
function sendEthToWallets(
uint256 _devFees,
uint256 _marketingFees
) private {
if (_devFees > 0) {
payable(devWalletAddress).transfer(_devFees);
}
if (_marketingFees > 0) {
payable(marketingWalletAddress).transfer(_marketingFees);
}
emit DistributeFees(_devFees, _marketingFees);
}
function swapTokensForEth(uint256 _tokenAmount) private returns (uint256) {
uint256 initialEthBalance = address(this).balance;
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = uniswapV2Router.WPLS();
_approve(address(this), address(uniswapV2Router), _tokenAmount);
uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
_tokenAmount,
0,
path,
address(this),
block.timestamp
);
uint256 receivedEth = address(this).balance.sub(initialEthBalance);
emit SwapTokensForEth(_tokenAmount, receivedEth);
return receivedEth;
}
function swapEthForTokens(
uint256 _ethAmount,
address _to
) private returns (uint256) {
uint256 initialTokenBalance = balanceOf(address(this));
address[] memory path = new address[](2);
path[0] = uniswapV2Router.WPLS();
path[1] = address(this);
uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{
value: _ethAmount
}(0, path, _to, block.timestamp);
uint256 receivedTokens = balanceOf(address(this)).sub(
initialTokenBalance
);
emit SwapEthForTokens(_ethAmount, receivedTokens);
return receivedTokens;
}
function addLiquidity(uint256 _tokenAmount, uint256 _ethAmount) private {
_approve(address(this), address(uniswapV2Router), _tokenAmount);
uniswapV2Router.addLiquidityETH{value: _ethAmount}(
address(this),
_tokenAmount,
0,
0,
owner(),
block.timestamp
);
emit AddLiquidity(_tokenAmount, _ethAmount);
}
function swapAndSendDividends(uint256 _tokenAmount) private {
uint256 dividends = swapTokensForEth(_tokenAmount);
pendingTokensForReward = pendingTokensForReward.sub(_tokenAmount);
uint256 totalEthToSend = dividends.add(pendingEthReward);
(bool success, ) = address(dividendTracker).call{value: totalEthToSend}(
""
);
if (success) {
emit SendDividends(dividends);
} else {
pendingEthReward = pendingEthReward.add(dividends);
}
}
function availableContractTokenBalance() public view returns (uint256) {
return balanceOf(address(this)).sub(pendingTokensForReward);
}
function getHistory(
address _account,
uint256 _limit,
uint256 _pageNumber
) external view returns (ClaimedEth[] memory) {
require(_limit > 0 && _pageNumber > 0, "Blast: Invalid arguments");
uint256 userClaimedCount = userClaimedIds[_account].length;
uint256 end = _pageNumber * _limit;
uint256 start = end - _limit;
require(start < userClaimedCount, "Blast: Out of range");
uint256 limit = _limit;
if (end > userClaimedCount) {
end = userClaimedCount;
limit = userClaimedCount % _limit;
}
ClaimedEth[] memory myClaimedEth = new ClaimedEth[](limit);
uint256 currentIndex = 0;
for (uint256 i = start; i < end; i++) {
uint256 hId = userClaimedIds[_account][i];
myClaimedEth[currentIndex] = claimedEthMap[hId];
currentIndex += 1;
}
return myClaimedEth;
}
function getHistoryCount(address _account) external view returns (uint256) {
return userClaimedIds[_account].length;
}
function emergencyWithdrawDivs() external onlyOwner {
dividendTracker.emergencyWithdraw(owner());
}
receive() external payable {}
}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_devWalletAddress","internalType":"address"},{"type":"address","name":"_marketingWalletAddress","internalType":"address"}]},{"type":"event","name":"AddLiquidity","inputs":[{"type":"uint256","name":"amountTokens","internalType":"uint256","indexed":false},{"type":"uint256","name":"amountEth","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"AddRewardPool","inputs":[{"type":"uint256","name":"_ethAmount","internalType":"uint256","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":"BuyFees","inputs":[{"type":"address","name":"from","internalType":"address","indexed":false},{"type":"address","name":"to","internalType":"address","indexed":false},{"type":"uint256","name":"amountTokens","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"DistributeFees","inputs":[{"type":"uint256","name":"devEth","internalType":"uint256","indexed":false},{"type":"uint256","name":"remarketingEth","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"DividendClaimed","inputs":[{"type":"uint256","name":"ethAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"tokenAmount","internalType":"uint256","indexed":false},{"type":"address","name":"account","internalType":"address","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":"SellFees","inputs":[{"type":"address","name":"from","internalType":"address","indexed":false},{"type":"address","name":"to","internalType":"address","indexed":false},{"type":"uint256","name":"amountTokens","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SendDividends","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SwapEthForTokens","inputs":[{"type":"uint256","name":"sentEth","internalType":"uint256","indexed":false},{"type":"uint256","name":"receivedTokens","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SwapTokensForEth","inputs":[{"type":"uint256","name":"sentTokens","internalType":"uint256","indexed":false},{"type":"uint256","name":"receivedEth","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":"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":"availableContractTokenBalance","inputs":[]},{"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":"uint256","name":"","internalType":"uint256"}],"name":"baseSellTax","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claim","inputs":[]},{"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":"uint256","name":"","internalType":"uint256"}],"name":"dividendTokenBalanceOf","inputs":[{"type":"address","name":"_account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract BlastDividendTracker"}],"name":"dividendTracker","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"emergencyWithdrawDivs","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"withdrawableDividends","internalType":"uint256"},{"type":"uint256","name":"withdrawnDividends","internalType":"uint256"},{"type":"uint256","name":"balance","internalType":"uint256"}],"name":"getAccount","inputs":[{"type":"address","name":"_account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct Blastar.ClaimedEth[]","components":[{"type":"uint256","name":"ethAmount","internalType":"uint256"},{"type":"uint256","name":"tokenAmount","internalType":"uint256"},{"type":"uint256","name":"timestamp","internalType":"uint256"}]}],"name":"getHistory","inputs":[{"type":"address","name":"_account","internalType":"address"},{"type":"uint256","name":"_limit","internalType":"uint256"},{"type":"uint256","name":"_pageNumber","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getHistoryCount","inputs":[{"type":"address","name":"_account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getNumberOfDividendTokenHolders","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTax","inputs":[{"type":"address","name":"_ad","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTotalDividendsDistributed","inputs":[]},{"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":"uint256","name":"","internalType":"uint256"}],"name":"initialBuyTimestamp","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isBot","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludeFromFee","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExludeFromWalletLimit","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lastTransfer","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"manualSend","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"manualSwap","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"maxIndexMinutesRange","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minContractTokensToSwap","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minRewardTokensToSwap","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"from","internalType":"uint256"},{"type":"uint256","name":"to","internalType":"uint256"},{"type":"uint256","name":"tax","internalType":"uint256"}],"name":"minutesRangeTaxes","inputs":[{"type":"uint8","name":"","internalType":"uint8"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"openTrading","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"pendingEthReward","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"pendingTokensForReward","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"reinvest","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBots","inputs":[{"type":"address[]","name":"_bots","internalType":"address[]"},{"type":"bool","name":"value","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExcludeFromFee","inputs":[{"type":"address","name":"_address","internalType":"address"},{"type":"bool","name":"_isExludeFromFee","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExludeFromDividends","inputs":[{"type":"address","name":"_address","internalType":"address"},{"type":"bool","name":"_isExludeFromDividends","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExludeFromWalletLimit","inputs":[{"type":"address","name":"_address","internalType":"address"},{"type":"bool","name":"_isExludeFromWalletLimit","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxIndexMinutesRange","inputs":[{"type":"uint8","name":"_maxIndex","internalType":"uint8"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMinContractTokensToSwap","inputs":[{"type":"uint256","name":"_numToken","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMinRewardTokensToSwap","inputs":[{"type":"uint256","name":"_numToken","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMinutesRangeTax","inputs":[{"type":"uint8","name":"_index","internalType":"uint8"},{"type":"uint256","name":"_from","internalType":"uint256"},{"type":"uint256","name":"_to","internalType":"uint256"},{"type":"uint256","name":"_tax","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapAll","inputs":[{"type":"bool","name":"_isWapAll","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTaxes","inputs":[{"type":"uint256","name":"_baseBuyTax","internalType":"uint256"},{"type":"uint256","name":"_baseSellTax","internalType":"uint256"},{"type":"uint256","name":"_autoLP","internalType":"uint256"},{"type":"uint256","name":"_devFee","internalType":"uint256"},{"type":"uint256","name":"_marketingFee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setWalletAddress","inputs":[{"type":"address","name":"_devWallet","internalType":"address"},{"type":"address","name":"_marketingWallet","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setWalletLimitPercentage","inputs":[{"type":"uint256","name":"_percentage","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"swapAll","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":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"withdrawableDividendOf","inputs":[{"type":"address","name":"_account","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x6080604052600780546001600160a81b0319167398bf93ebf5c380c0e6ae8e192a7e2ae08edacc021790556064600c556005600e819055600f55600060105560326011819055601255671bc16d674ec800006013556014805460ff191690556509184e72a000601a819055601d553480156200007a57600080fd5b50604051620059d5380380620059d58339810160408190526200009d91620007a8565b60405180604001604052806007815260200166213630b9ba30b960c91b8152506040518060400160405280600581526020016410931054d560da1b8152508160039081620000ec919062000884565b506004620000fb828262000884565b5050600580546001600160a01b031916339081179091556040519091506000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a360178054610100600160a81b0319166101006001600160a01b038581169190910291909117909155601880546001600160a01b0319168383161790556005805482166000908152600a60209081526040808320805460ff199081166001908117909255308086528386208054831684179055955487168552600d909352818420805484168217905593835280832080548316851790556007549094168252908390208054909116909117905551620001f8906200077d565b604051809103906000f08015801562000215573d6000803e3d6000fd5b50601980546001600160a01b0319166001600160a01b0392909216918217905560405163031e79db60e41b8152600481018290526331e79db090602401600060405180830381600087803b1580156200026d57600080fd5b505af115801562000282573d6000803e3d6000fd5b505060195460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620002cc57600080fd5b505af1158015620002e1573d6000803e3d6000fd5b50506019546001600160a01b031691506331e79db090506200030b6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156200034d57600080fd5b505af115801562000362573d6000803e3d6000fd5b505060195460075460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b158015620003b057600080fd5b505af1158015620003c5573d6000803e3d6000fd5b505060195460405163031e79db60e41b815261036960048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200041157600080fd5b505af115801562000426573d6000803e3d6000fd5b50506016602052505060007f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf49819055620697807f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf4a819055601e7f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf4b557fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab288564855620d2f007fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab288564981905560197fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab288564a557ff06d282f967055cb1eee17e04aa005b9682a620f4bbcfaee55ba78607a3d87ae556213c6807ff06d282f967055cb1eee17e04aa005b9682a620f4bbcfaee55ba78607a3d87af81905560147ff06d282f967055cb1eee17e04aa005b9682a620f4bbcfaee55ba78607a3d87b0557fec061709de2491458f4c981032059d7d19b0e55f45018bac6b3e660bdc959a5955621a5e007fec061709de2491458f4c981032059d7d19b0e55f45018bac6b3e660bdc959a5a819055600f7fec061709de2491458f4c981032059d7d19b0e55f45018bac6b3e660bdc959a5b556005918290527f5696377e725b42a372ecc45f0fbdab5e9555865aef54619ad9381892f667bbf0556220f5807f5696377e725b42a372ecc45f0fbdab5e9555865aef54619ad9381892f667bbf155600a7f5696377e725b42a372ecc45f0fbdab5e9555865aef54619ad9381892f667bbf2556017805460ff1916821790555462000688906001600160a01b0316683635c9adc5dea0000062000690565b505062000978565b6001600160a01b038216620006eb5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620006ff919062000950565b90915550506001600160a01b038216600090815260208190526040812080548392906200072e90849062000950565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b611aef8062003ee683390190565b80516001600160a01b0381168114620007a357600080fd5b919050565b60008060408385031215620007bc57600080fd5b620007c7836200078b565b9150620007d7602084016200078b565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200080b57607f821691505b6020821081036200082c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200077857600081815260208120601f850160051c810160208610156200085b5750805b601f850160051c820191505b818110156200087c5782815560010162000867565b505050505050565b81516001600160401b03811115620008a057620008a0620007e0565b620008b881620008b18454620007f6565b8462000832565b602080601f831160018114620008f05760008415620008d75750858301515b600019600386901b1c1916600185901b1785556200087c565b600085815260208120601f198616915b82811015620009215788860151825594840194600190910190840162000900565b5085821015620009405787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200097257634e487b7160e01b600052601160045260246000fd5b92915050565b61355e80620009886000396000f3fe6080604052600436106103395760003560e01c80638aaa9389116101ab578063b485430b116100f7578063de30aad111610095578063ec29f4e91161006f578063ec29f4e9146109d5578063f429389014610a02578063fbcbc0f114610a17578063fdb5a03e14610a3757600080fd5b8063de30aad11461097f578063e3402c671461099f578063e5fc10ed146109b557600080fd5b8063c9567bf9116100d1578063c9567bf9146108ee578063d297105914610903578063d539be5f14610919578063dd62ed3e1461093957600080fd5b8063b485430b1461089f578063b652ef3b146108b9578063ba762ddd146108d957600080fd5b80639c0db5f311610164578063a8b9d2401161013e578063a8b9d24014610809578063a9059cbb14610829578063af9549e014610849578063b1fdb11b1461086957600080fd5b80639c0db5f3146107a9578063a2923a0f146107c9578063a457c2d7146107e957600080fd5b80638aaa9389146106a25780638da5cb5b146106c25780638e5916b2146106e0578063906778331461071057806395d89b411461073d578063963bafa01461075257600080fd5b80634297a7ca116102855780636843cd8411610223578063715018a6116101fd578063715018a6146106415780637c4b492e146106565780638954fb4a1461066c57806389a5c6911461068c57600080fd5b80636843cd84146105e15780636973cd091461060157806370a082311461062157600080fd5b80635b6612ad1161025f5780635b6612ad146105695780635b683e66146105965780635fcefa42146105ac57806364b0f653146105cc57600080fd5b80634297a7ca1461050f5780634e71d92d1461053f57806351bc3c851461055457600080fd5b806323b872dd116102f2578063313ce567116102cc578063313ce5671461048357806339509351146104a55780633bbac579146104c55780633e9ffbea146104f557600080fd5b806323b872dd146104165780632c1f52161461043657806330bb4cff1461046e57600080fd5b806306fdde0314610345578063095ea7b31461037057806312dfbd33146103a057806318160ddd146103c25780631930f66b146103e15780631c08bc5d146103f657600080fd5b3661034057005b600080fd5b34801561035157600080fd5b5061035a610a4c565b6040516103679190612f16565b60405180910390f35b34801561037c57600080fd5b5061039061038b366004612f7c565b610ade565b6040519015158152602001610367565b3480156103ac57600080fd5b506103c06103bb366004612fa8565b610af8565b005b3480156103ce57600080fd5b506002545b604051908152602001610367565b3480156103ed57600080fd5b506103c0610b30565b34801561040257600080fd5b506103c0610411366004612fa8565b610bd8565b34801561042257600080fd5b50610390610431366004612fc1565b610c07565b34801561044257600080fd5b50601954610456906001600160a01b031681565b6040516001600160a01b039091168152602001610367565b34801561047a57600080fd5b506103d3610c2b565b34801561048f57600080fd5b5060095b60405160ff9091168152602001610367565b3480156104b157600080fd5b506103906104c0366004612f7c565b610c9e565b3480156104d157600080fd5b506103906104e0366004613002565b600b6020526000908152604090205460ff1681565b34801561050157600080fd5b506014546103909060ff1681565b34801561051b57600080fd5b5061039061052a366004613002565b600d6020526000908152604090205460ff1681565b34801561054b57600080fd5b506103c0610cdd565b34801561056057600080fd5b506103c0610cea565b34801561057557600080fd5b506103d3610584366004613002565b601b6020526000908152604090205481565b3480156105a257600080fd5b506103d3600f5481565b3480156105b857600080fd5b506103c06105c736600461301f565b610d3a565b3480156105d857600080fd5b506103d3610d98565b3480156105ed57600080fd5b506103d36105fc366004613002565b610de2565b34801561060d57600080fd5b506103c061061c36600461305a565b610e52565b34801561062d57600080fd5b506103d361063c366004613002565b610eb4565b34801561064d57600080fd5b506103c0610ecf565b34801561066257600080fd5b506103d3601c5481565b34801561067857600080fd5b506103c06106873660046130a1565b610f43565b34801561069857600080fd5b506103d360135481565b3480156106ae57600080fd5b506103c06106bd366004612fa8565b611023565b3480156106ce57600080fd5b506005546001600160a01b0316610456565b3480156106ec57600080fd5b506103906106fb366004613002565b600a6020526000908152604090205460ff1681565b34801561071c57600080fd5b506103d361072b366004613002565b60156020526000908152604090205481565b34801561074957600080fd5b5061035a611052565b34801561075e57600080fd5b5061078e61076d3660046130e5565b60166020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610367565b3480156107b557600080fd5b506103c06107c4366004613100565b611061565b3480156107d557600080fd5b506103c06107e4366004613186565b611186565b3480156107f557600080fd5b50610390610804366004612f7c565b611201565b34801561081557600080fd5b506103d3610824366004613002565b611293565b34801561083557600080fd5b50610390610844366004612f7c565b6112c6565b34801561085557600080fd5b506103c06108643660046130a1565b6112d4565b34801561087557600080fd5b506103d3610884366004613002565b6001600160a01b031660009081526021602052604090205490565b3480156108ab57600080fd5b506017546104939060ff1681565b3480156108c557600080fd5b506103d36108d4366004613002565b611329565b3480156108e557600080fd5b506103d36113f7565b3480156108fa57600080fd5b506103c0611408565b34801561090f57600080fd5b506103d3601e5481565b34801561092557600080fd5b506103c06109343660046130e5565b61172c565b34801561094557600080fd5b506103d361095436600461305a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561098b57600080fd5b506103c061099a3660046131bf565b61176c565b3480156109ab57600080fd5b506103d3601d5481565b3480156109c157600080fd5b506103c06109d03660046130a1565b6117a9565b3480156109e157600080fd5b506109f56109f03660046131dc565b6117fe565b6040516103679190613211565b348015610a0e57600080fd5b506103c0611a2d565b348015610a2357600080fd5b5061078e610a32366004613002565b611af4565b348015610a4357600080fd5b506103c0611b85565b606060038054610a5b9061326a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a879061326a565b8015610ad45780601f10610aa957610100808354040283529160200191610ad4565b820191906000526020600020905b815481529060010190602001808311610ab757829003601f168201915b5050505050905090565b600033610aec818585611b90565b60019150505b92915050565b6005546001600160a01b03163314610b2b5760405162461bcd60e51b8152600401610b22906132a4565b60405180910390fd5b601355565b6005546001600160a01b03163314610b5a5760405162461bcd60e51b8152600401610b22906132a4565b6019546001600160a01b0316636ff1c9bc610b7d6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015610bbe57600080fd5b505af1158015610bd2573d6000803e3d6000fd5b50505050565b6005546001600160a01b03163314610c025760405162461bcd60e51b8152600401610b22906132a4565b601d55565b600033610c15858285611cb4565b610c20858585611d40565b506001949350505050565b601954604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610c75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9991906132d9565b905090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190610aec9082908690610cd8908790613308565b611b90565b610ce8336000612131565b565b6005546001600160a01b03163314610d145760405162461bcd60e51b8152600401610b22906132a4565b6000610d2b601c54610d2530610eb4565b906123c8565b9050610d36816123db565b5050565b6005546001600160a01b03163314610d645760405162461bcd60e51b8152600401610b22906132a4565b600a8511158015610d7857506005600f5411155b610d8157600080fd5b600e94909455600f92909255601055601155601255565b601954604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610c75573d6000803e3d6000fd5b6019546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015610e2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af291906132d9565b6005546001600160a01b03163314610e7c5760405162461bcd60e51b8152600401610b22906132a4565b60178054610100600160a81b0319166101006001600160a01b0394851602179055601880546001600160a01b03191691909216179055565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314610ef95760405162461bcd60e51b8152600401610b22906132a4565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610f6d5760405162461bcd60e51b8152600401610b22906132a4565b8015610fd75760195460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db0906024015b600060405180830381600087803b158015610fbb57600080fd5b505af1158015610fcf573d6000803e3d6000fd5b505050505050565b6019546001600160a01b03166318c18adb83610ff281610eb4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401610fa1565b6005546001600160a01b0316331461104d5760405162461bcd60e51b8152600401610b22906132a4565b600c55565b606060048054610a5b9061326a565b6005546001600160a01b0316331461108b5760405162461bcd60e51b8152600401610b22906132a4565b60005b82811015610bd2576008546001600160a01b03168484838181106110b4576110b461331b565b90506020020160208101906110c99190613002565b6001600160a01b03161415801561111a57506007546001600160a01b03168484838181106110f9576110f961331b565b905060200201602081019061110e9190613002565b6001600160a01b031614155b156111745781600b60008686858181106111365761113661331b565b905060200201602081019061114b9190613002565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b8061117e81613331565b91505061108e565b6005546001600160a01b031633146111b05760405162461bcd60e51b8152600401610b22906132a4565b6111bb83603c612590565b60ff85166000908152601660205260409020556111d982603c612590565b60ff909416600090815260166020526040902060018101949094556002909301929092555050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156112865760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610b22565b610c208286868403611b90565b6019546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401610e11565b600033610aec818585611d40565b6005546001600160a01b031633146112fe5760405162461bcd60e51b8152600401610b22906132a4565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b600f5460009060015b60175460ff908116908216116113f05760ff81166000908152601660209081526040808320546001600160a01b0388168452601590925290912054429161137891613308565b111580156113bd575060ff81166000908152601660209081526040808320600101546001600160a01b038816845260159092529091205442916113ba91613308565b10155b156113de5760ff166000908152601660205260409020600201549392505050565b806113e88161334a565b915050611332565b5092915050565b6000610c99601c54610d2530610eb4565b6005546001600160a01b031633146114325760405162461bcd60e51b8152600401610b22906132a4565b600754600160a01b900460ff161561148c5760405162461bcd60e51b815260206004820152601e60248201527f426c6173743a2054726164696e6720697320616c7265616479206f70656e00006044820152606401610b22565b600760009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115039190613369565b6001600160a01b031663c9c6539630600760009054906101000a90046001600160a01b03166001600160a01b031663ef8ef56f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611565573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115899190613369565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156115d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115fa9190613369565b600880546001600160a01b0319166001600160a01b03928316908117825560009081526009602052604090819020805460ff191660011790556019549154905163031e79db60e41b815290831660048201529116906331e79db090602401600060405180830381600087803b15801561167257600080fd5b505af1158015611686573d6000803e3d6000fd5b5050505061169c61169630610eb4565b4761259c565b60085460075460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af11580156116f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117169190613386565b506007805460ff60a01b1916600160a01b179055565b6005546001600160a01b031633146117565760405162461bcd60e51b8152600401610b22906132a4565b6017805460ff191660ff92909216919091179055565b6005546001600160a01b031633146117965760405162461bcd60e51b8152600401610b22906132a4565b6014805460ff1916911515919091179055565b6005546001600160a01b031633146117d35760405162461bcd60e51b8152600401610b22906132a4565b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b60606000831180156118105750600082115b61185c5760405162461bcd60e51b815260206004820152601860248201527f426c6173743a20496e76616c696420617267756d656e747300000000000000006044820152606401610b22565b6001600160a01b0384166000908152602160205260408120549061188085856133a3565b9050600061188e86836133ba565b90508281106118d55760405162461bcd60e51b8152602060048201526013602482015272426c6173743a204f7574206f662072616e676560681b6044820152606401610b22565b85838311156118ee578392506118eb87846133e3565b90505b60008167ffffffffffffffff811115611909576119096133f7565b60405190808252806020026020018201604052801561195e57816020015b61194b60405180606001604052806000815260200160008152602001600081525090565b8152602001906001900390816119275790505b5090506000835b85811015611a1e576001600160a01b038b1660009081526021602052604081208054839081106119975761199761331b565b906000526020600020015490506020600082815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820154815250508484815181106119f2576119f261331b565b6020908102919091010152611a08600184613308565b9250508080611a1690613331565b915050611965565b50909998505050505050505050565b6005546001600160a01b03163314611a575760405162461bcd60e51b8152600401610b22906132a4565b6000611a6e601e54476123c890919063ffffffff16565b90506000611a9f611a8b60105460646123c890919063ffffffff16565b601154611a99908590612590565b906126ab565b90506000611aca611abc60105460646123c890919063ffffffff16565b601254611a99908690612590565b90506000611adc82610d2586866123c8565b9050611ae883826126b7565b9250610bd283836126c3565b60195460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283929091169063fbcbc0f1906024016040805180830381865afa158015611b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b68919061340d565b90935091508282611b7886610eb4565b9250925092509193909250565b610ce8336001612131565b6001600160a01b038316611bf25760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b22565b6001600160a01b038216611c535760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b22565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610bd25781811015611d335760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610b22565b610bd28484848403611b90565b6001600160a01b0383166000908152600b602052604090205460ff16158015611d8257506001600160a01b0382166000908152600b602052604090205460ff16155b611d8b57600080fd5b600c54600754829190600160a01b900460ff168015611de457506001600160a01b03851660009081526009602052604090205460ff1680611de457506001600160a01b03841660009081526009602052604090205460ff165b8015611e0957506001600160a01b0385166000908152600a602052604090205460ff16155b8015611e2e57506001600160a01b0384166000908152600a602052604090205460ff16155b15611e4157611e3e858585612781565b91505b6001600160a01b0384166000908152601560205260408120549003611e7c576001600160a01b03841660009081526015602052604090204290555b6001600160a01b03841660009081526009602052604090205460ff16158015611ebe57506001600160a01b0384166000908152600d602052604090205460ff16155b15611f52576000611ed883611ed287610eb4565b906126b7565b9050611ef5612710611a99600c54611eef60025490565b90612590565b811115611f505760405162461bcd60e51b815260206004820152602360248201527f426c6173743a2057616c6c65742062616c616e6365206c696d697420726561636044820152621a195960ea1b6064820152608401610b22565b505b611f5d8585846129c2565b600c819055601954604051631b4a89ab60e11b81526001600160a01b03878116600483015290911690633695135690602401602060405180830381865afa158015611fac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd09190613386565b612048576019546001600160a01b031663e30443bc86611fef81610eb4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561203557600080fd5b505af1925050508015612046575060015b505b601954604051631b4a89ab60e11b81526001600160a01b03868116600483015290911690633695135690602401602060405180830381865afa158015612092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b69190613386565b61212a576019546001600160a01b031663e30443bc856120d581610eb4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561211b57600080fd5b505af1925050508015610fcf57505b5050505050565b6019546040516302a2e74960e61b81526001600160a01b038481166004830152600092169063a8b9d24090602401602060405180830381865afa15801561217c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a091906132d9565b9050600081116122065760405162461bcd60e51b815260206004820152602b60248201527f426c6173743a20436c61696d657220686173206e6f207769746864726177616260448201526a1b1948191a5d9a59195b9960aa1b6064820152608401610b22565b6000808361228c576019546040516352b5f81d60e01b81526001600160a01b03878116600483018190526024830152909116906352b5f81d906044016020604051808303816000875af1158015612261573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228591906132d9565b9150612317565b6019546040516352b5f81d60e01b81526001600160a01b038781166004830152306024830152909116906352b5f81d906044016020604051808303816000875af11580156122de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230291906132d9565b91508115612317576123148286612b90565b90505b811561212a5761232b601f80546001019055565b6000612336601f5490565b6000818152602080805260408083208781556001808201889055426002909201919091556001600160a01b038b1680855260218452828520805492830181558552938390200184905580518781529182018690528101919091529091507f67dd3d116bf53e0ddda53bb148a5fdc129854e1c507c0eeda9190049a9bbc84f9060600160405180910390a1505050505050565b60006123d482846133ba565b9392505050565b60408051600280825260608201835260009247928492909160208301908036833701905050905030816000815181106124165761241661331b565b6001600160a01b039283166020918202929092018101919091526007546040805163ef8ef56f60e01b81529051919093169263ef8ef56f9260048083019391928290030181865afa15801561246f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124939190613369565b816001815181106124a6576124a661331b565b6001600160a01b0392831660209182029290920101526007546124cc9130911686611b90565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac94790612505908790600090869030904290600401613475565b600060405180830381600087803b15801561251f57600080fd5b505af1158015612533573d6000803e3d6000fd5b50505050600061254c83476123c890919063ffffffff16565b60408051878152602081018390529192507f4a6c12eb4e479a4ea28c8acad8efde466ef9bf69cf473501dd76865234496273910160405180910390a1949350505050565b60006123d482846133a3565b6007546125b49030906001600160a01b031684611b90565b6007546001600160a01b031663f305d7198230856000806125dd6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612645573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061266a91906134b1565b505060408051848152602081018490527fcb1652de9aeec38545fc281847b3dbfc89aab56dfa907b1ab68466f602c36fb49250015b60405180910390a15050565b60006123d482846134df565b60006123d48284613308565b8115612709576017546040516101009091046001600160a01b0316906108fc8415029084906000818181858888f19350505050158015612707573d6000803e3d6000fd5b505b801561274b576018546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612749573d6000803e3d6000fd5b505b60408051838152602081018390527f916ad8171ef8c567c7790377a142f0200f9565940680c06e30dd105cfd924968910161269f565b6001600160a01b0383166000908152600960205260408120548190819060ff16806127c457506001600160a01b03851660009081526009602052604090205460ff165b6128105760405162461bcd60e51b815260206004820152601d60248201527f426c6173743a204e6f206d61726b6574206d616b65727320666f756e640000006044820152606401610b22565b6001600160a01b03861660009081526009602052604090205460ff16156128b25761284b6064611a99600e548761259090919063ffffffff16565b915061285784836123c8565b90506128648630846129c2565b604080516001600160a01b03881681523060208201529081018390527f6b0b46d0273ce53f1de696d2100b35dd3a405dcecbcbeede66215d858d5c401d9060600160405180910390a16129b9565b60006128bd87611329565b90506128ce6064611a998784612590565b925060006128f66064611a996128ef600f54866123c890919063ffffffff16565b8990612590565b601c5490915061290690826126b7565b601c5561291386856123c8565b92506129208830866129c2565b6000612931601c54610d2530610eb4565b90506013548111156129555760145460ff1661294c57506013545b61295581612d42565b601d54601c54111561296c5761296c601c54612e38565b604080516001600160a01b038b1681523060208201529081018690527f4ab5e0df8ff1605133dbdd1b8e3f52edb9539abe64595f6f70b30d2fea7f204a9060600160405180910390a15050505b95945050505050565b6001600160a01b038316612a265760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b22565b6001600160a01b038216612a885760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b22565b6001600160a01b03831660009081526020819052604090205481811015612b005760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610b22565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612b37908490613308565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b8391815260200190565b60405180910390a3610bd2565b600080612b9c30610eb4565b604080516002808252606082018352929350600092909160208301908036833750506007546040805163ef8ef56f60e01b815290519394506001600160a01b039091169263ef8ef56f925060048083019260209291908290030181865afa158015612c0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2f9190613369565b81600081518110612c4257612c4261331b565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612c7657612c7661331b565b6001600160a01b03928316602091820292909201015260075460405163b6f9de9560e01b815291169063b6f9de95908790612cbc9060009086908a9042906004016134f3565b6000604051808303818588803b158015612cd557600080fd5b505af1158015612ce9573d6000803e3d6000fd5b50505050506000612cfd83610d2530610eb4565b60408051888152602081018390529192507f2d5c8efb676a77fc04b6b50a19f6ccbf08ee66df0202de33576485f1f77b4b69910160405180910390a195945050505050565b6000612d5e6064611a996010548561259090919063ffffffff16565b90506000612d6d8260026126ab565b90506000612d7b84836123c8565b90506000612d88826123db565b90506000612da66064611a996010548561259090919063ffffffff16565b90506000612dc46064611a996011548661259090919063ffffffff16565b90506000612de26064611a996012548761259090919063ffffffff16565b90506000612df682610d25858189896123c8565b9050612e0283826126b7565b9250612e0e83836126c3565b600087118015612e1e5750600084115b15612e2d57612e2d878561259c565b505050505050505050565b6000612e43826123db565b601c54909150612e5390836123c8565b601c55601e54600090612e679083906126b7565b6019546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114612eb9576040519150601f19603f3d011682016040523d82523d6000602084013e612ebe565b606091505b505090508015612f00576040518381527fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b19060200160405180910390a1610bd2565b601e54612f0d90846126b7565b601e5550505050565b600060208083528351808285015260005b81811015612f4357858101830151858201604001528201612f27565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114612f7957600080fd5b50565b60008060408385031215612f8f57600080fd5b8235612f9a81612f64565b946020939093013593505050565b600060208284031215612fba57600080fd5b5035919050565b600080600060608486031215612fd657600080fd5b8335612fe181612f64565b92506020840135612ff181612f64565b929592945050506040919091013590565b60006020828403121561301457600080fd5b81356123d481612f64565b600080600080600060a0868803121561303757600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806040838503121561306d57600080fd5b823561307881612f64565b9150602083013561308881612f64565b809150509250929050565b8015158114612f7957600080fd5b600080604083850312156130b457600080fd5b82356130bf81612f64565b9150602083013561308881613093565b803560ff811681146130e057600080fd5b919050565b6000602082840312156130f757600080fd5b6123d4826130cf565b60008060006040848603121561311557600080fd5b833567ffffffffffffffff8082111561312d57600080fd5b818601915086601f83011261314157600080fd5b81358181111561315057600080fd5b8760208260051b850101111561316557600080fd5b6020928301955093505084013561317b81613093565b809150509250925092565b6000806000806080858703121561319c57600080fd5b6131a5856130cf565b966020860135965060408601359560600135945092505050565b6000602082840312156131d157600080fd5b81356123d481613093565b6000806000606084860312156131f157600080fd5b83356131fc81612f64565b95602085013595506040909401359392505050565b602080825282518282018190526000919060409081850190868401855b8281101561325d578151805185528681015187860152850151858501526060909301929085019060010161322e565b5091979650505050505050565b600181811c9082168061327e57607f821691505b60208210810361329e57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156132eb57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610af257610af26132f2565b634e487b7160e01b600052603260045260246000fd5b600060018201613343576133436132f2565b5060010190565b600060ff821660ff8103613360576133606132f2565b60010192915050565b60006020828403121561337b57600080fd5b81516123d481612f64565b60006020828403121561339857600080fd5b81516123d481613093565b8082028115828204841417610af257610af26132f2565b81810381811115610af257610af26132f2565b634e487b7160e01b600052601260045260246000fd5b6000826133f2576133f26133cd565b500690565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561342057600080fd5b505080516020909101519092909150565b600081518084526020808501945080840160005b8381101561346a5781516001600160a01b031687529582019590820190600101613445565b509495945050505050565b85815284602082015260a06040820152600061349460a0830186613431565b6001600160a01b0394909416606083015250608001529392505050565b6000806000606084860312156134c657600080fd5b8351925060208401519150604084015190509250925092565b6000826134ee576134ee6133cd565b500490565b84815260806020820152600061350c6080830186613431565b6001600160a01b0394909416604083015250606001529291505056fea26469706673582212207edfe6ad1d4a91987f19479846e3601e0b7e145cf801a32a69666f8ebe66be9a64736f6c6343000812003360a06040523480156200001157600080fd5b5060408051808201825260168082527f426c6173745f4469766964656e645f547261636b6572000000000000000000006020808401829052845180860190955291845290830152908181600362000069838262000174565b50600462000078828262000174565b5050600980546001600160a01b03191633908117909155604051909350600092507f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091508290a36509184e72a00060805262000240565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620000fa57607f821691505b6020821081036200011b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200016f57600081815260208120601f850160051c810160208610156200014a5750805b601f850160051c820191505b818110156200016b5782815560010162000156565b5050505b505050565b81516001600160401b03811115620001905762000190620000cf565b620001a881620001a18454620000e5565b8462000121565b602080601f831160018114620001e05760008415620001c75750858301515b600019600386901b1c1916600185901b1785556200016b565b600085815260208120601f198616915b828110156200021157888601518255948401946001909101908401620001f0565b5085821015620002305787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6080516118856200026a60003960008181610547015281816107a80152610dba01526118856000f3fe6080604052600436106101d15760003560e01c80636ff1c9bc116100f7578063a457c2d711610095578063be10b61411610064578063be10b61414610535578063dd62ed3e14610569578063e30443bc146105af578063fbcbc0f1146105cf57600080fd5b8063a457c2d71461049f578063a8b9d240146104bf578063a9059cbb146104df578063aafd847a146104ff57600080fd5b806385a6b3ae116100d157806385a6b3ae1461042c5780638da5cb5b1461044257806391b89fba1461046a57806395d89b411461048a57600080fd5b80636ff1c9bc146103c157806370a08231146103e1578063715018a61461041757600080fd5b806327ce01471161016f578063395093511161013e578063395093511461033c5780634e7b827f1461035c57806352b5f81d1461038c5780636a474002146103ac57600080fd5b806327ce0147146102c0578063313ce567146102e057806331e79db0146102fc578063369513561461031c57600080fd5b806309bbedde116101ab57806309bbedde1461024857806318160ddd1461026b57806318c18adb1461028057806323b872dd146102a057600080fd5b806303c83302146101e557806306fdde03146101ed578063095ea7b31461021857600080fd5b366101e0576101de610604565b005b600080fd5b6101de610604565b3480156101f957600080fd5b50610202610697565b60405161020f91906115f3565b60405180910390f35b34801561022457600080fd5b50610238610233366004611659565b610729565b604051901515815260200161020f565b34801561025457600080fd5b5061025d610743565b60405190815260200161020f565b34801561027757600080fd5b5060025461025d565b34801561028c57600080fd5b506101de61029b366004611659565b610753565b3480156102ac57600080fd5b506102386102bb366004611685565b610864565b3480156102cc57600080fd5b5061025d6102db3660046116c6565b610888565b3480156102ec57600080fd5b506040516009815260200161020f565b34801561030857600080fd5b506101de6103173660046116c6565b6108e4565b34801561032857600080fd5b506102386103373660046116c6565b6109c2565b34801561034857600080fd5b50610238610357366004611659565b610a0e565b34801561036857600080fd5b506102386103773660046116c6565b600d6020526000908152604090205460ff1681565b34801561039857600080fd5b5061025d6103a73660046116e3565b610a4d565b3480156103b857600080fd5b506101de610a8e565b3480156103cd57600080fd5b506101de6103dc3660046116c6565b610b32565b3480156103ed57600080fd5b5061025d6103fc3660046116c6565b6001600160a01b031660009081526020819052604090205490565b34801561042357600080fd5b506101de610c01565b34801561043857600080fd5b5061025d60085481565b34801561044e57600080fd5b506009546040516001600160a01b03909116815260200161020f565b34801561047657600080fd5b5061025d6104853660046116c6565b610c75565b34801561049657600080fd5b50610202610c80565b3480156104ab57600080fd5b506102386104ba366004611659565b610c8f565b3480156104cb57600080fd5b5061025d6104da3660046116c6565b610d21565b3480156104eb57600080fd5b506102386104fa366004611659565b610d60565b34801561050b57600080fd5b5061025d61051a3660046116c6565b6001600160a01b031660009081526007602052604090205490565b34801561054157600080fd5b5061025d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561057557600080fd5b5061025d6105843660046116e3565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156105bb57600080fd5b506101de6105ca366004611659565b610d6e565b3480156105db57600080fd5b506105ef6105ea3660046116c6565b610e9c565b6040805192835260208301919091520161020f565b600061060f60025490565b1161061957600080fd5b34156106955761064c61062b60025490565b61063934600160801b610ec9565b6106439190611732565b60055490610edc565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a26008546106919034610edc565b6008555b565b6060600380546106a690611754565b80601f01602080910402602001604051908101604052809291908181526020018280546106d290611754565b801561071f5780601f106106f45761010080835404028352916020019161071f565b820191906000526020600020905b81548152906001019060200180831161070257829003601f168201915b5050505050905090565b600033610737818585610ee8565b60019150505b92915050565b600061074e600b5490565b905090565b6009546001600160a01b031633146107865760405162461bcd60e51b815260040161077d9061178e565b60405180910390fd5b6001600160a01b0382166000908152600d60205260409020805460ff191690557f0000000000000000000000000000000000000000000000000000000000000000811061082c576107d78282610f45565b6001600160a01b0382166000908152600c602052604081205460ff161515900361082c576001600160a01b0382166000908152600c60205260409020805460ff1916600117905561082c600b80546001019055565b6040516001600160a01b038316907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a25050565b600033610872858285610fa4565b61087d858585611030565b506001949350505050565b6001600160a01b03811660009081526006602090815260408083205491839052822054600554600160801b926108da926108d5926108cf916108ca9190610ec9565b61108d565b906110fb565b611107565b61073d9190611732565b6009546001600160a01b0316331461090e5760405162461bcd60e51b815260040161077d9061178e565b6001600160a01b0381166000908152600d60205260408120805460ff1916600117905561093c908290610f45565b6001600160a01b0381166000908152600c602052604090205460ff16151560010361098b576001600160a01b0381166000908152600c60205260409020805460ff1916905561098b600b611159565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6009546000906001600160a01b031633146109ef5760405162461bcd60e51b815260040161077d9061178e565b506001600160a01b03166000908152600d602052604090205460ff1690565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906107379082908690610a489087906117c3565b610ee8565b6009546000906001600160a01b03163314610a7a5760405162461bcd60e51b815260040161077d9061178e565b6000610a8684846111b0565b949350505050565b60405162461bcd60e51b815260206004820152606760248201527f426c6173745f4469766964656e645f547261636b65723a20776974686472617760448201527f4469766964656e642064697361626c65642e20557365207468652027636c616960648201527f6d272066756e6374696f6e206f6e20746865206d61696e20426c61737420636f608482015266373a3930b1ba1760c91b60a482015260c40161077d565b6009546001600160a01b03163314610b5c5760405162461bcd60e51b815260040161077d9061178e565b60006005554780610b9c5760405162461bcd60e51b815260206004820152600a6024820152696e6f2062616c616e636560b01b604482015260640161077d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610be9576040519150601f19603f3d011682016040523d82523d6000602084013e610bee565b606091505b5050905080610bfc57600080fd5b505050565b6009546001600160a01b03163314610c2b5760405162461bcd60e51b815260040161077d9061178e565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b600061073d82610d21565b6060600480546106a690611754565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610d145760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161077d565b61087d8286868403610ee8565b60055460009015610d58576001600160a01b03821660009081526007602052604090205461073d90610d5284610888565b90611306565b506000919050565b600033610737818585611030565b6009546001600160a01b03163314610d985760405162461bcd60e51b815260040161077d9061178e565b6001600160a01b0382166000908152600d602052604090205460ff16610e3e577f00000000000000000000000000000000000000000000000000000000000000008110610e4257610de98282610f45565b6001600160a01b0382166000908152600c602052604081205460ff1615159003610e3e576001600160a01b0382166000908152600c60205260409020805460ff19166001179055610e3e600b80546001019055565b5050565b610e4d826000610f45565b6001600160a01b0382166000908152600c602052604090205460ff161515600103610e3e576001600160a01b0382166000908152600c60205260409020805460ff19169055610e3e600b611159565b600080610ea883610d21565b6001600160a01b039093166000908152600760205260409020549293915050565b6000610ed582846117d6565b9392505050565b6000610ed582846117c3565b60405162461bcd60e51b815260206004820152602c60248201527f426c6173745f4469766964656e645f547261636b65723a204e6f20617070726f60448201526b1d985b1cc8185b1b1bddd95960a21b606482015260840161077d565b6001600160a01b03821660009081526020819052604090205480821115610f84576000610f728383611306565b9050610f7e8482611312565b50505050565b80821015610bfc576000610f988284611306565b9050610f7e8482611376565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610f7e57818110156110235760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161077d565b610f7e8484848403610ee8565b60405162461bcd60e51b815260206004820152602c60248201527f426c6173745f4469766964656e645f547261636b65723a204e6f207472616e7360448201526b19995c9cc8185b1b1bddd95960a21b606482015260840161077d565b60006001600160ff1b038211156110f75760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b606482015260840161077d565b5090565b6000610ed582846117ed565b6000808212156110f75760405162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f736974697665604482015260640161077d565b8054806111a85760405162461bcd60e51b815260206004820152601b60248201527f436f756e7465723a2064656372656d656e74206f766572666c6f770000000000604482015260640161077d565b600019019055565b6000806111bc84610d21565b905080156112fc576001600160a01b0384166000908152600760205260409020546111e79082610edc565b6001600160a01b038516600081815260076020526040908190209290925590517feb063efb53b3790d2bc15284b59af7544466c8787c2883321ee27095647911b69061124890849087909182526001600160a01b0316602082015260400190565b60405180910390a26000836001600160a01b03168260405160006040518083038185875af1925050503d806000811461129d576040519150601f19603f3d011682016040523d82523d6000602084013e6112a2565b606091505b50509050806112f4576001600160a01b0385166000908152600760205260409020546112ce9083611306565b6001600160a01b038616600090815260076020526040812091909155925061073d915050565b50905061073d565b5060009392505050565b6000610ed58284611815565b61131c82826113ba565b6113566113376108ca83600554610ec990919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611499565b6001600160a01b0390921660009081526006602052604090209190915550565b61138082826114a5565b61135661139b6108ca83600554610ec990919063ffffffff16565b6001600160a01b038416600090815260066020526040902054906110fb565b6001600160a01b0382166114105760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161077d565b806002600082825461142291906117c3565b90915550506001600160a01b0382166000908152602081905260408120805483929061144f9084906117c3565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000610ed58284611828565b6001600160a01b0382166115055760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161077d565b6001600160a01b038216600090815260208190526040902054818110156115795760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161077d565b6001600160a01b03831660009081526020819052604081208383039055600280548492906115a8908490611815565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600060208083528351808285015260005b8181101561162057858101830151858201604001528201611604565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461165657600080fd5b50565b6000806040838503121561166c57600080fd5b823561167781611641565b946020939093013593505050565b60008060006060848603121561169a57600080fd5b83356116a581611641565b925060208401356116b581611641565b929592945050506040919091013590565b6000602082840312156116d857600080fd5b8135610ed581611641565b600080604083850312156116f657600080fd5b823561170181611641565b9150602083013561171181611641565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b60008261174f57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061176857607f821691505b60208210810361178857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8082018082111561073d5761073d61171c565b808202811582820484141761073d5761073d61171c565b808201828112600083128015821682158216171561180d5761180d61171c565b505092915050565b8181038181111561073d5761073d61171c565b81810360008312801583831316838312821617156118485761184861171c565b509291505056fea2646970667358221220ca573b3014c7215a856958f6dcf7183e1e2277afce31b9617206dc7db48919de64736f6c634300081200330000000000000000000000008bda04d2c7b67ce96116eb21cf9cfea41db7ce8100000000000000000000000047bb3c2349f2050d5bac06494b54c6c3e896b4bc
Deployed ByteCode
0x6080604052600436106103395760003560e01c80638aaa9389116101ab578063b485430b116100f7578063de30aad111610095578063ec29f4e91161006f578063ec29f4e9146109d5578063f429389014610a02578063fbcbc0f114610a17578063fdb5a03e14610a3757600080fd5b8063de30aad11461097f578063e3402c671461099f578063e5fc10ed146109b557600080fd5b8063c9567bf9116100d1578063c9567bf9146108ee578063d297105914610903578063d539be5f14610919578063dd62ed3e1461093957600080fd5b8063b485430b1461089f578063b652ef3b146108b9578063ba762ddd146108d957600080fd5b80639c0db5f311610164578063a8b9d2401161013e578063a8b9d24014610809578063a9059cbb14610829578063af9549e014610849578063b1fdb11b1461086957600080fd5b80639c0db5f3146107a9578063a2923a0f146107c9578063a457c2d7146107e957600080fd5b80638aaa9389146106a25780638da5cb5b146106c25780638e5916b2146106e0578063906778331461071057806395d89b411461073d578063963bafa01461075257600080fd5b80634297a7ca116102855780636843cd8411610223578063715018a6116101fd578063715018a6146106415780637c4b492e146106565780638954fb4a1461066c57806389a5c6911461068c57600080fd5b80636843cd84146105e15780636973cd091461060157806370a082311461062157600080fd5b80635b6612ad1161025f5780635b6612ad146105695780635b683e66146105965780635fcefa42146105ac57806364b0f653146105cc57600080fd5b80634297a7ca1461050f5780634e71d92d1461053f57806351bc3c851461055457600080fd5b806323b872dd116102f2578063313ce567116102cc578063313ce5671461048357806339509351146104a55780633bbac579146104c55780633e9ffbea146104f557600080fd5b806323b872dd146104165780632c1f52161461043657806330bb4cff1461046e57600080fd5b806306fdde0314610345578063095ea7b31461037057806312dfbd33146103a057806318160ddd146103c25780631930f66b146103e15780631c08bc5d146103f657600080fd5b3661034057005b600080fd5b34801561035157600080fd5b5061035a610a4c565b6040516103679190612f16565b60405180910390f35b34801561037c57600080fd5b5061039061038b366004612f7c565b610ade565b6040519015158152602001610367565b3480156103ac57600080fd5b506103c06103bb366004612fa8565b610af8565b005b3480156103ce57600080fd5b506002545b604051908152602001610367565b3480156103ed57600080fd5b506103c0610b30565b34801561040257600080fd5b506103c0610411366004612fa8565b610bd8565b34801561042257600080fd5b50610390610431366004612fc1565b610c07565b34801561044257600080fd5b50601954610456906001600160a01b031681565b6040516001600160a01b039091168152602001610367565b34801561047a57600080fd5b506103d3610c2b565b34801561048f57600080fd5b5060095b60405160ff9091168152602001610367565b3480156104b157600080fd5b506103906104c0366004612f7c565b610c9e565b3480156104d157600080fd5b506103906104e0366004613002565b600b6020526000908152604090205460ff1681565b34801561050157600080fd5b506014546103909060ff1681565b34801561051b57600080fd5b5061039061052a366004613002565b600d6020526000908152604090205460ff1681565b34801561054b57600080fd5b506103c0610cdd565b34801561056057600080fd5b506103c0610cea565b34801561057557600080fd5b506103d3610584366004613002565b601b6020526000908152604090205481565b3480156105a257600080fd5b506103d3600f5481565b3480156105b857600080fd5b506103c06105c736600461301f565b610d3a565b3480156105d857600080fd5b506103d3610d98565b3480156105ed57600080fd5b506103d36105fc366004613002565b610de2565b34801561060d57600080fd5b506103c061061c36600461305a565b610e52565b34801561062d57600080fd5b506103d361063c366004613002565b610eb4565b34801561064d57600080fd5b506103c0610ecf565b34801561066257600080fd5b506103d3601c5481565b34801561067857600080fd5b506103c06106873660046130a1565b610f43565b34801561069857600080fd5b506103d360135481565b3480156106ae57600080fd5b506103c06106bd366004612fa8565b611023565b3480156106ce57600080fd5b506005546001600160a01b0316610456565b3480156106ec57600080fd5b506103906106fb366004613002565b600a6020526000908152604090205460ff1681565b34801561071c57600080fd5b506103d361072b366004613002565b60156020526000908152604090205481565b34801561074957600080fd5b5061035a611052565b34801561075e57600080fd5b5061078e61076d3660046130e5565b60166020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610367565b3480156107b557600080fd5b506103c06107c4366004613100565b611061565b3480156107d557600080fd5b506103c06107e4366004613186565b611186565b3480156107f557600080fd5b50610390610804366004612f7c565b611201565b34801561081557600080fd5b506103d3610824366004613002565b611293565b34801561083557600080fd5b50610390610844366004612f7c565b6112c6565b34801561085557600080fd5b506103c06108643660046130a1565b6112d4565b34801561087557600080fd5b506103d3610884366004613002565b6001600160a01b031660009081526021602052604090205490565b3480156108ab57600080fd5b506017546104939060ff1681565b3480156108c557600080fd5b506103d36108d4366004613002565b611329565b3480156108e557600080fd5b506103d36113f7565b3480156108fa57600080fd5b506103c0611408565b34801561090f57600080fd5b506103d3601e5481565b34801561092557600080fd5b506103c06109343660046130e5565b61172c565b34801561094557600080fd5b506103d361095436600461305a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561098b57600080fd5b506103c061099a3660046131bf565b61176c565b3480156109ab57600080fd5b506103d3601d5481565b3480156109c157600080fd5b506103c06109d03660046130a1565b6117a9565b3480156109e157600080fd5b506109f56109f03660046131dc565b6117fe565b6040516103679190613211565b348015610a0e57600080fd5b506103c0611a2d565b348015610a2357600080fd5b5061078e610a32366004613002565b611af4565b348015610a4357600080fd5b506103c0611b85565b606060038054610a5b9061326a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a879061326a565b8015610ad45780601f10610aa957610100808354040283529160200191610ad4565b820191906000526020600020905b815481529060010190602001808311610ab757829003601f168201915b5050505050905090565b600033610aec818585611b90565b60019150505b92915050565b6005546001600160a01b03163314610b2b5760405162461bcd60e51b8152600401610b22906132a4565b60405180910390fd5b601355565b6005546001600160a01b03163314610b5a5760405162461bcd60e51b8152600401610b22906132a4565b6019546001600160a01b0316636ff1c9bc610b7d6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015610bbe57600080fd5b505af1158015610bd2573d6000803e3d6000fd5b50505050565b6005546001600160a01b03163314610c025760405162461bcd60e51b8152600401610b22906132a4565b601d55565b600033610c15858285611cb4565b610c20858585611d40565b506001949350505050565b601954604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610c75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9991906132d9565b905090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190610aec9082908690610cd8908790613308565b611b90565b610ce8336000612131565b565b6005546001600160a01b03163314610d145760405162461bcd60e51b8152600401610b22906132a4565b6000610d2b601c54610d2530610eb4565b906123c8565b9050610d36816123db565b5050565b6005546001600160a01b03163314610d645760405162461bcd60e51b8152600401610b22906132a4565b600a8511158015610d7857506005600f5411155b610d8157600080fd5b600e94909455600f92909255601055601155601255565b601954604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610c75573d6000803e3d6000fd5b6019546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015610e2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af291906132d9565b6005546001600160a01b03163314610e7c5760405162461bcd60e51b8152600401610b22906132a4565b60178054610100600160a81b0319166101006001600160a01b0394851602179055601880546001600160a01b03191691909216179055565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314610ef95760405162461bcd60e51b8152600401610b22906132a4565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610f6d5760405162461bcd60e51b8152600401610b22906132a4565b8015610fd75760195460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db0906024015b600060405180830381600087803b158015610fbb57600080fd5b505af1158015610fcf573d6000803e3d6000fd5b505050505050565b6019546001600160a01b03166318c18adb83610ff281610eb4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401610fa1565b6005546001600160a01b0316331461104d5760405162461bcd60e51b8152600401610b22906132a4565b600c55565b606060048054610a5b9061326a565b6005546001600160a01b0316331461108b5760405162461bcd60e51b8152600401610b22906132a4565b60005b82811015610bd2576008546001600160a01b03168484838181106110b4576110b461331b565b90506020020160208101906110c99190613002565b6001600160a01b03161415801561111a57506007546001600160a01b03168484838181106110f9576110f961331b565b905060200201602081019061110e9190613002565b6001600160a01b031614155b156111745781600b60008686858181106111365761113661331b565b905060200201602081019061114b9190613002565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b8061117e81613331565b91505061108e565b6005546001600160a01b031633146111b05760405162461bcd60e51b8152600401610b22906132a4565b6111bb83603c612590565b60ff85166000908152601660205260409020556111d982603c612590565b60ff909416600090815260166020526040902060018101949094556002909301929092555050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156112865760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610b22565b610c208286868403611b90565b6019546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401610e11565b600033610aec818585611d40565b6005546001600160a01b031633146112fe5760405162461bcd60e51b8152600401610b22906132a4565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b600f5460009060015b60175460ff908116908216116113f05760ff81166000908152601660209081526040808320546001600160a01b0388168452601590925290912054429161137891613308565b111580156113bd575060ff81166000908152601660209081526040808320600101546001600160a01b038816845260159092529091205442916113ba91613308565b10155b156113de5760ff166000908152601660205260409020600201549392505050565b806113e88161334a565b915050611332565b5092915050565b6000610c99601c54610d2530610eb4565b6005546001600160a01b031633146114325760405162461bcd60e51b8152600401610b22906132a4565b600754600160a01b900460ff161561148c5760405162461bcd60e51b815260206004820152601e60248201527f426c6173743a2054726164696e6720697320616c7265616479206f70656e00006044820152606401610b22565b600760009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115039190613369565b6001600160a01b031663c9c6539630600760009054906101000a90046001600160a01b03166001600160a01b031663ef8ef56f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611565573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115899190613369565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156115d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115fa9190613369565b600880546001600160a01b0319166001600160a01b03928316908117825560009081526009602052604090819020805460ff191660011790556019549154905163031e79db60e41b815290831660048201529116906331e79db090602401600060405180830381600087803b15801561167257600080fd5b505af1158015611686573d6000803e3d6000fd5b5050505061169c61169630610eb4565b4761259c565b60085460075460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af11580156116f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117169190613386565b506007805460ff60a01b1916600160a01b179055565b6005546001600160a01b031633146117565760405162461bcd60e51b8152600401610b22906132a4565b6017805460ff191660ff92909216919091179055565b6005546001600160a01b031633146117965760405162461bcd60e51b8152600401610b22906132a4565b6014805460ff1916911515919091179055565b6005546001600160a01b031633146117d35760405162461bcd60e51b8152600401610b22906132a4565b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b60606000831180156118105750600082115b61185c5760405162461bcd60e51b815260206004820152601860248201527f426c6173743a20496e76616c696420617267756d656e747300000000000000006044820152606401610b22565b6001600160a01b0384166000908152602160205260408120549061188085856133a3565b9050600061188e86836133ba565b90508281106118d55760405162461bcd60e51b8152602060048201526013602482015272426c6173743a204f7574206f662072616e676560681b6044820152606401610b22565b85838311156118ee578392506118eb87846133e3565b90505b60008167ffffffffffffffff811115611909576119096133f7565b60405190808252806020026020018201604052801561195e57816020015b61194b60405180606001604052806000815260200160008152602001600081525090565b8152602001906001900390816119275790505b5090506000835b85811015611a1e576001600160a01b038b1660009081526021602052604081208054839081106119975761199761331b565b906000526020600020015490506020600082815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820154815250508484815181106119f2576119f261331b565b6020908102919091010152611a08600184613308565b9250508080611a1690613331565b915050611965565b50909998505050505050505050565b6005546001600160a01b03163314611a575760405162461bcd60e51b8152600401610b22906132a4565b6000611a6e601e54476123c890919063ffffffff16565b90506000611a9f611a8b60105460646123c890919063ffffffff16565b601154611a99908590612590565b906126ab565b90506000611aca611abc60105460646123c890919063ffffffff16565b601254611a99908690612590565b90506000611adc82610d2586866123c8565b9050611ae883826126b7565b9250610bd283836126c3565b60195460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283929091169063fbcbc0f1906024016040805180830381865afa158015611b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b68919061340d565b90935091508282611b7886610eb4565b9250925092509193909250565b610ce8336001612131565b6001600160a01b038316611bf25760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b22565b6001600160a01b038216611c535760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b22565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610bd25781811015611d335760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610b22565b610bd28484848403611b90565b6001600160a01b0383166000908152600b602052604090205460ff16158015611d8257506001600160a01b0382166000908152600b602052604090205460ff16155b611d8b57600080fd5b600c54600754829190600160a01b900460ff168015611de457506001600160a01b03851660009081526009602052604090205460ff1680611de457506001600160a01b03841660009081526009602052604090205460ff165b8015611e0957506001600160a01b0385166000908152600a602052604090205460ff16155b8015611e2e57506001600160a01b0384166000908152600a602052604090205460ff16155b15611e4157611e3e858585612781565b91505b6001600160a01b0384166000908152601560205260408120549003611e7c576001600160a01b03841660009081526015602052604090204290555b6001600160a01b03841660009081526009602052604090205460ff16158015611ebe57506001600160a01b0384166000908152600d602052604090205460ff16155b15611f52576000611ed883611ed287610eb4565b906126b7565b9050611ef5612710611a99600c54611eef60025490565b90612590565b811115611f505760405162461bcd60e51b815260206004820152602360248201527f426c6173743a2057616c6c65742062616c616e6365206c696d697420726561636044820152621a195960ea1b6064820152608401610b22565b505b611f5d8585846129c2565b600c819055601954604051631b4a89ab60e11b81526001600160a01b03878116600483015290911690633695135690602401602060405180830381865afa158015611fac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd09190613386565b612048576019546001600160a01b031663e30443bc86611fef81610eb4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561203557600080fd5b505af1925050508015612046575060015b505b601954604051631b4a89ab60e11b81526001600160a01b03868116600483015290911690633695135690602401602060405180830381865afa158015612092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b69190613386565b61212a576019546001600160a01b031663e30443bc856120d581610eb4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561211b57600080fd5b505af1925050508015610fcf57505b5050505050565b6019546040516302a2e74960e61b81526001600160a01b038481166004830152600092169063a8b9d24090602401602060405180830381865afa15801561217c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a091906132d9565b9050600081116122065760405162461bcd60e51b815260206004820152602b60248201527f426c6173743a20436c61696d657220686173206e6f207769746864726177616260448201526a1b1948191a5d9a59195b9960aa1b6064820152608401610b22565b6000808361228c576019546040516352b5f81d60e01b81526001600160a01b03878116600483018190526024830152909116906352b5f81d906044016020604051808303816000875af1158015612261573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228591906132d9565b9150612317565b6019546040516352b5f81d60e01b81526001600160a01b038781166004830152306024830152909116906352b5f81d906044016020604051808303816000875af11580156122de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230291906132d9565b91508115612317576123148286612b90565b90505b811561212a5761232b601f80546001019055565b6000612336601f5490565b6000818152602080805260408083208781556001808201889055426002909201919091556001600160a01b038b1680855260218452828520805492830181558552938390200184905580518781529182018690528101919091529091507f67dd3d116bf53e0ddda53bb148a5fdc129854e1c507c0eeda9190049a9bbc84f9060600160405180910390a1505050505050565b60006123d482846133ba565b9392505050565b60408051600280825260608201835260009247928492909160208301908036833701905050905030816000815181106124165761241661331b565b6001600160a01b039283166020918202929092018101919091526007546040805163ef8ef56f60e01b81529051919093169263ef8ef56f9260048083019391928290030181865afa15801561246f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124939190613369565b816001815181106124a6576124a661331b565b6001600160a01b0392831660209182029290920101526007546124cc9130911686611b90565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac94790612505908790600090869030904290600401613475565b600060405180830381600087803b15801561251f57600080fd5b505af1158015612533573d6000803e3d6000fd5b50505050600061254c83476123c890919063ffffffff16565b60408051878152602081018390529192507f4a6c12eb4e479a4ea28c8acad8efde466ef9bf69cf473501dd76865234496273910160405180910390a1949350505050565b60006123d482846133a3565b6007546125b49030906001600160a01b031684611b90565b6007546001600160a01b031663f305d7198230856000806125dd6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612645573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061266a91906134b1565b505060408051848152602081018490527fcb1652de9aeec38545fc281847b3dbfc89aab56dfa907b1ab68466f602c36fb49250015b60405180910390a15050565b60006123d482846134df565b60006123d48284613308565b8115612709576017546040516101009091046001600160a01b0316906108fc8415029084906000818181858888f19350505050158015612707573d6000803e3d6000fd5b505b801561274b576018546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612749573d6000803e3d6000fd5b505b60408051838152602081018390527f916ad8171ef8c567c7790377a142f0200f9565940680c06e30dd105cfd924968910161269f565b6001600160a01b0383166000908152600960205260408120548190819060ff16806127c457506001600160a01b03851660009081526009602052604090205460ff165b6128105760405162461bcd60e51b815260206004820152601d60248201527f426c6173743a204e6f206d61726b6574206d616b65727320666f756e640000006044820152606401610b22565b6001600160a01b03861660009081526009602052604090205460ff16156128b25761284b6064611a99600e548761259090919063ffffffff16565b915061285784836123c8565b90506128648630846129c2565b604080516001600160a01b03881681523060208201529081018390527f6b0b46d0273ce53f1de696d2100b35dd3a405dcecbcbeede66215d858d5c401d9060600160405180910390a16129b9565b60006128bd87611329565b90506128ce6064611a998784612590565b925060006128f66064611a996128ef600f54866123c890919063ffffffff16565b8990612590565b601c5490915061290690826126b7565b601c5561291386856123c8565b92506129208830866129c2565b6000612931601c54610d2530610eb4565b90506013548111156129555760145460ff1661294c57506013545b61295581612d42565b601d54601c54111561296c5761296c601c54612e38565b604080516001600160a01b038b1681523060208201529081018690527f4ab5e0df8ff1605133dbdd1b8e3f52edb9539abe64595f6f70b30d2fea7f204a9060600160405180910390a15050505b95945050505050565b6001600160a01b038316612a265760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b22565b6001600160a01b038216612a885760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b22565b6001600160a01b03831660009081526020819052604090205481811015612b005760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610b22565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612b37908490613308565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b8391815260200190565b60405180910390a3610bd2565b600080612b9c30610eb4565b604080516002808252606082018352929350600092909160208301908036833750506007546040805163ef8ef56f60e01b815290519394506001600160a01b039091169263ef8ef56f925060048083019260209291908290030181865afa158015612c0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2f9190613369565b81600081518110612c4257612c4261331b565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612c7657612c7661331b565b6001600160a01b03928316602091820292909201015260075460405163b6f9de9560e01b815291169063b6f9de95908790612cbc9060009086908a9042906004016134f3565b6000604051808303818588803b158015612cd557600080fd5b505af1158015612ce9573d6000803e3d6000fd5b50505050506000612cfd83610d2530610eb4565b60408051888152602081018390529192507f2d5c8efb676a77fc04b6b50a19f6ccbf08ee66df0202de33576485f1f77b4b69910160405180910390a195945050505050565b6000612d5e6064611a996010548561259090919063ffffffff16565b90506000612d6d8260026126ab565b90506000612d7b84836123c8565b90506000612d88826123db565b90506000612da66064611a996010548561259090919063ffffffff16565b90506000612dc46064611a996011548661259090919063ffffffff16565b90506000612de26064611a996012548761259090919063ffffffff16565b90506000612df682610d25858189896123c8565b9050612e0283826126b7565b9250612e0e83836126c3565b600087118015612e1e5750600084115b15612e2d57612e2d878561259c565b505050505050505050565b6000612e43826123db565b601c54909150612e5390836123c8565b601c55601e54600090612e679083906126b7565b6019546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114612eb9576040519150601f19603f3d011682016040523d82523d6000602084013e612ebe565b606091505b505090508015612f00576040518381527fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b19060200160405180910390a1610bd2565b601e54612f0d90846126b7565b601e5550505050565b600060208083528351808285015260005b81811015612f4357858101830151858201604001528201612f27565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114612f7957600080fd5b50565b60008060408385031215612f8f57600080fd5b8235612f9a81612f64565b946020939093013593505050565b600060208284031215612fba57600080fd5b5035919050565b600080600060608486031215612fd657600080fd5b8335612fe181612f64565b92506020840135612ff181612f64565b929592945050506040919091013590565b60006020828403121561301457600080fd5b81356123d481612f64565b600080600080600060a0868803121561303757600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806040838503121561306d57600080fd5b823561307881612f64565b9150602083013561308881612f64565b809150509250929050565b8015158114612f7957600080fd5b600080604083850312156130b457600080fd5b82356130bf81612f64565b9150602083013561308881613093565b803560ff811681146130e057600080fd5b919050565b6000602082840312156130f757600080fd5b6123d4826130cf565b60008060006040848603121561311557600080fd5b833567ffffffffffffffff8082111561312d57600080fd5b818601915086601f83011261314157600080fd5b81358181111561315057600080fd5b8760208260051b850101111561316557600080fd5b6020928301955093505084013561317b81613093565b809150509250925092565b6000806000806080858703121561319c57600080fd5b6131a5856130cf565b966020860135965060408601359560600135945092505050565b6000602082840312156131d157600080fd5b81356123d481613093565b6000806000606084860312156131f157600080fd5b83356131fc81612f64565b95602085013595506040909401359392505050565b602080825282518282018190526000919060409081850190868401855b8281101561325d578151805185528681015187860152850151858501526060909301929085019060010161322e565b5091979650505050505050565b600181811c9082168061327e57607f821691505b60208210810361329e57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156132eb57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610af257610af26132f2565b634e487b7160e01b600052603260045260246000fd5b600060018201613343576133436132f2565b5060010190565b600060ff821660ff8103613360576133606132f2565b60010192915050565b60006020828403121561337b57600080fd5b81516123d481612f64565b60006020828403121561339857600080fd5b81516123d481613093565b8082028115828204841417610af257610af26132f2565b81810381811115610af257610af26132f2565b634e487b7160e01b600052601260045260246000fd5b6000826133f2576133f26133cd565b500690565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561342057600080fd5b505080516020909101519092909150565b600081518084526020808501945080840160005b8381101561346a5781516001600160a01b031687529582019590820190600101613445565b509495945050505050565b85815284602082015260a06040820152600061349460a0830186613431565b6001600160a01b0394909416606083015250608001529392505050565b6000806000606084860312156134c657600080fd5b8351925060208401519150604084015190509250925092565b6000826134ee576134ee6133cd565b500490565b84815260806020820152600061350c6080830186613431565b6001600160a01b0394909416604083015250606001529291505056fea26469706673582212207edfe6ad1d4a91987f19479846e3601e0b7e145cf801a32a69666f8ebe66be9a64736f6c63430008120033