Transactions
Token Transfers
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
- Contract name:
- HocusPocusFinance
- Optimization enabled
- true
- Compiler version
- v0.8.7+commit.e28d00a7
- Optimization runs
- 200
- EVM Version
- london
- Verified at
- 2022-07-07 17:07:41.504278Z
Contract source code
// File: contracts/HocusPocusFinance.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.7;
abstract contract Context {
function _msgSender() internal view returns (address payable) {
return payable(msg.sender);
}
function _msgData() internal view returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the token decimals.
*/
function decimals() external view returns (uint8);
/**
* @dev Returns the token symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the token name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the bep token owner.
*/
function getOwner() external view returns (address);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount)
external
returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address _owner, address spender)
external
view
returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
}
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(
address(this).balance >= amount,
"Address: insufficient balance"
);
(bool success, ) = recipient.call{value: amount}("");
require(
success,
"Address: unable to send value, recipient may have reverted"
);
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data)
internal
returns (bytes memory)
{
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return
functionCallWithValue(
target,
data,
value,
"Address: low-level call with value failed"
);
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(
address(this).balance >= value,
"Address: insufficient balance for call"
);
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(
data
);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data)
internal
view
returns (bytes memory)
{
return
functionStaticCall(
target,
data,
"Address: low-level static call failed"
);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data)
internal
returns (bytes memory)
{
return
functionDelegateCall(
target,
data,
"Address: low-level delegate call failed"
);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}
/////////////////////////////////////////////////
////////////////PULSEX//INTERFACE////////////////
/////////////////////////////////////////////////
interface IUniswapV2Factory {
event PairCreated(
address indexed token0,
address indexed token1,
address lpPair,
uint256
);
function getPair(address tokenA, address tokenB)
external
view
returns (address lpPair);
function createPair(address tokenA, address tokenB)
external
returns (address lpPair);
}
interface IUniswapV2Pair {
function factory() external view returns (address);
function getReserves()
external
view
returns (
uint112 reserve0,
uint112 reserve1,
uint32 blockTimestampLast
);
}
interface IUniswapV2Router01 {
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
);
function addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
)
external
returns (
uint256 amountA,
uint256 amountB,
uint256 liquidity
);
function getAmountsOut(uint256 amountIn, address[] calldata path)
external
view
returns (uint256[] memory amounts);
function getAmountsIn(uint256 amountOut, address[] calldata path)
external
view
returns (uint256[] memory amounts);
}
interface IUniswapV2Router02 is IUniswapV2Router01 {
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 swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
function swapExactTokensForTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
}
///////////////////////////////////////////////////////////////
////////////////////CONTRACT//IMPLEMENTATION///////////////////
///////////////////////////////////////////////////////////////
contract HocusPocusFinance is Context, IERC20, ReentrancyGuard {
// Ownership moved to in-contract for customizability.
using Address for address;
address private _owner;
mapping(address => uint256) private _rOwned;
mapping(address => uint256) private _tOwned;
mapping(address => bool) lpPairs;
uint256 private timeSinceLastPair = 0;
mapping(address => mapping(address => uint256)) private _allowances;
mapping(address => bool) private _isExcludedFromFees;
mapping(address => bool) private _isExcludedFromLimits;
mapping(address => bool) private _isExcluded;
address[] private _excluded;
string private constant _name = "Hocus Pocus Finance";
string private constant _symbol = "HOC";
uint8 private constant _decimals = 4;
uint256 constant _totalSupply = 5_555_000_000_000 * (10**_decimals);
uint256 private constant _tTotal = _totalSupply;
uint256 private constant MAX = ~uint256(0);
uint256 private _rTotal = (MAX - (MAX % _tTotal));
struct Fees {
uint16 reflect;
uint16 burn;
uint16 liquidity;
uint16 treasury;
uint16 team;
uint16 charity;
uint16 totalSwap;
}
struct Ratios {
uint16 liquidity;
uint16 total;
}
Fees public _buyTaxes =
Fees({
reflect: 0,
burn: 0,
liquidity: 0,
treasury: 0,
charity: 100,
team: 0,
totalSwap: 0
});
Fees public _sellTaxes =
Fees({
reflect: 200,
burn: 50,
liquidity: 200,
treasury: 350,
charity: 0,
team: 200,
totalSwap: 200
});
Ratios public _ratios = Ratios({liquidity: 200, total: 200});
uint256 constant masterTaxDivisor = 10000;
IUniswapV2Router02 public dexRouter;
address public lpPair;
address public constant DEAD = 0x000000000000000000000000000000000000dEaD;
address public constant charityWallet =
0x4bdA64c2e135E9c4F813a7CF6241821a0e8a7d8D;
address public constant teamWallet =
0xDc6085035e331d7289126fDD27bAFD84feC5DC67;
address public constant treasuryWallet =
0x4CA0483A4234bcad8fa64010B71086B344001aF3;
bool inSwap;
uint256 public contractSwapTimer = 0 seconds;
uint256 private lastSwap;
uint256 public constant swapThreshold = (_tTotal * 5) / 10000;
uint256 public constant swapAmount = (_tTotal * 10) / 10000;
uint256 private _maxTxAmount = (_tTotal * 100) / 100;
uint256 private _maxWalletSize = (_tTotal * 100) / 100;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
event AutoLiquify(uint256 amountCurrency, uint256 amountTokens);
modifier lockTheSwap() {
inSwap = true;
_;
inSwap = false;
}
modifier onlyOwner() {
require(_owner == _msgSender(), "Caller =/= owner.");
_;
}
constructor() payable {
_rOwned[msg.sender] = _rTotal;
// Set the owner.
_owner = msg.sender;
if (block.chainid == 56) {
dexRouter = IUniswapV2Router02(
0x10ED43C718714eb63d5aA57B78B54704E256024E
);
contractSwapTimer = 3 seconds;
} else if (block.chainid == 97) {
dexRouter = IUniswapV2Router02(
0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3
);
contractSwapTimer = 3 seconds;
} else if (block.chainid == 941) {
dexRouter = IUniswapV2Router02(
0xb4A7633D8932de086c9264D5eb39a8399d7C0E3A
);
contractSwapTimer = 10 seconds;
} else {
revert();
}
lpPair = IUniswapV2Factory(dexRouter.factory()).createPair(
dexRouter.WPLS(),
address(this)
);
lpPairs[lpPair] = true;
_approve(msg.sender, address(dexRouter), type(uint256).max);
_approve(address(this), address(dexRouter), type(uint256).max);
_isExcludedFromFees[owner()] = true;
_isExcludedFromFees[address(this)] = true;
_isExcludedFromFees[DEAD] = true;
emit Transfer(address(0), _msgSender(), _tTotal);
}
receive() external payable {}
// Ownable removed as a lib and added here to allow for custom transfers and renouncements.
// This allows for removal of ownership privileges from the owner once renounced or transferred.
function owner() public view returns (address) {
return _owner;
}
function transferOwner(address newOwner) external nonReentrant onlyOwner {
require(
newOwner != address(0),
"Call renounceOwnership to transfer owner to the zero address."
);
require(
newOwner != DEAD,
"Call renounceOwnership to transfer owner to the zero address."
);
setExcludedFromFees(_owner, false);
setExcludedFromFees(newOwner, true);
if (balanceOf(_owner) > 0) {
_transfer(_owner, newOwner, balanceOf(_owner));
}
_owner = newOwner;
emit OwnershipTransferred(_owner, newOwner);
}
function renounceOwnership() external virtual onlyOwner {
setExcludedFromFees(_owner, false);
_owner = address(0);
emit OwnershipTransferred(_owner, address(0));
}
function totalSupply() external pure override returns (uint256) {
if (_tTotal == 0) {
revert();
}
return _tTotal;
}
function decimals() external pure override returns (uint8) {
return _decimals;
}
function symbol() external pure override returns (string memory) {
return _symbol;
}
function name() external pure override returns (string memory) {
return _name;
}
function getOwner() external view override returns (address) {
return owner();
}
function allowance(address holder, address spender)
external
view
override
returns (uint256)
{
return _allowances[holder][spender];
}
function balanceOf(address account) public view override returns (uint256) {
if (_isExcluded[account]) return _tOwned[account];
return tokenFromReflection(_rOwned[account]);
}
function transfer(address recipient, uint256 amount)
external
override
returns (bool)
{
_transfer(_msgSender(), recipient, amount);
return true;
}
function approve(address spender, uint256 amount)
external
override
returns (bool)
{
_approve(_msgSender(), spender, amount);
return true;
}
function _approve(
address sender,
address spender,
uint256 amount
) private {
require(sender != address(0), "ERC20: Sender is not zero Address");
require(spender != address(0), "ERC20: Spender is not zero Address");
_allowances[sender][spender] = amount;
emit Approval(sender, spender, amount);
}
function transferFrom(
address sender,
address recipient,
uint256 amount
) external override returns (bool) {
if (_allowances[sender][msg.sender] != type(uint256).max) {
_allowances[sender][msg.sender] -= amount;
}
return _transfer(sender, recipient, amount);
}
function setNewRouter(address newRouter) external nonReentrant onlyOwner {
IUniswapV2Router02 _newRouter = IUniswapV2Router02(newRouter);
address get_pair = IUniswapV2Factory(_newRouter.factory()).getPair(
address(this),
_newRouter.WPLS()
);
if (get_pair == address(0)) {
lpPair = IUniswapV2Factory(_newRouter.factory()).createPair(
address(this),
_newRouter.WPLS()
);
} else {
lpPair = get_pair;
}
dexRouter = _newRouter;
_approve(address(this), address(dexRouter), type(uint256).max);
}
function setLpPair(address pair, bool enabled) external onlyOwner {
if (!enabled) {
lpPairs[pair] = false;
} else {
if (timeSinceLastPair != 0)
lpPairs[pair] = true;
timeSinceLastPair = block.timestamp;
}
}
function getCirculatingSupply() external view returns (uint256) {
return (_tTotal - (balanceOf(DEAD) + balanceOf(address(0))));
}
function isExcludedFromReward(address account) external view returns (bool) {
return _isExcluded[account];
}
function setExcludedFromReward(address account, bool enabled)
external
onlyOwner
{
if (enabled) {
require(!_isExcluded[account], "Account is already excluded.");
if (_rOwned[account] > 0) {
_tOwned[account] = tokenFromReflection(_rOwned[account]);
}
_isExcluded[account] = true;
if (account != lpPair) {
_excluded.push(account);
}
} else if (!enabled) {
require(_isExcluded[account], "Account is already included.");
if (account == lpPair) {
_rOwned[account] = _tOwned[account] * _getRate();
_tOwned[account] = 0;
_isExcluded[account] = false;
} else if (_excluded.length == 1) {
_rOwned[account] = _tOwned[account] * _getRate();
_tOwned[account] = 0;
_isExcluded[account] = false;
_excluded.pop();
} else {
for (uint256 i = 0; i < _excluded.length; i++) {
if (_excluded[i] == account) {
_excluded[i] = _excluded[_excluded.length - 1];
_rOwned[account] = _tOwned[account] * _getRate();
_tOwned[account] = 0;
_isExcluded[account] = false;
_excluded.pop();
break;
}
}
}
}
}
function tokenFromReflection(uint256 rAmount)
public
view
returns (uint256)
{
require(
rAmount <= _rTotal,
"Amount must be less than total reflections"
);
uint256 currentRate = _getRate();
return rAmount / currentRate;
}
function setMaxTxPercent(uint256 percent, uint256 divisor)
external
onlyOwner
{
require(
(_tTotal * percent) / divisor >= (_tTotal / 1000),
"Max Transaction amt must be above 0.1% of total supply."
);
_maxTxAmount = (_tTotal * percent) / divisor;
}
function setMaxWalletSize(uint256 percent, uint256 divisor)
external
onlyOwner
{
require(
(_tTotal * percent) / divisor >= (_tTotal / 1000),
"Max Wallet amt must be above 0.1% of total supply."
);
_maxWalletSize = (_tTotal * percent) / divisor;
}
function setExcludedFromLimits(address account, bool enabled)
external
onlyOwner
{
_isExcludedFromLimits[account] = enabled;
}
function isExcludedFromLimits(address account) external view returns (bool) {
return _isExcludedFromLimits[account];
}
function isExcludedFromFees(address account) external view returns (bool) {
return _isExcludedFromFees[account];
}
function setExcludedFromFees(address account, bool enabled)
public
onlyOwner
{
_isExcludedFromFees[account] = enabled;
}
function getMaxTX() external view returns (uint256) {
return _maxTxAmount / (10**_decimals);
}
function getMaxWallet() external view returns (uint256) {
return _maxWalletSize / (10**_decimals);
}
function _transfer(
address from,
address to,
uint256 amount
) internal returns (bool) {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
require(amount > 0, "Transfer amount must be greater than zero");
if (lpPairs[from] || lpPairs[to]) {
if (!_isExcludedFromLimits[from] && !_isExcludedFromLimits[to]) {
require(
amount <= _maxTxAmount,
"Transfer amount exceeds the maxTxAmount."
);
}
}
if (to != address(dexRouter) && !lpPairs[to]) {
if (!_isExcludedFromLimits[to]) {
require(
balanceOf(to) + amount <= _maxWalletSize,
"Transfer amount exceeds the maxWalletSize."
);
}
}
bool takeFee = true;
if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
takeFee = false;
}
if (lpPairs[to]) {
if (!inSwap) {
if (lastSwap + contractSwapTimer < block.timestamp) {
uint256 contractTokenBalance = balanceOf(address(this));
if (contractTokenBalance >= swapThreshold) {
if (contractTokenBalance >= swapAmount) {
contractTokenBalance = swapAmount;
}
contractSwap(contractTokenBalance);
lastSwap = block.timestamp;
}
}
}
}
return _finalizeTransfer(from, to, amount, takeFee);
}
function contractSwap(uint256 contractTokenBalance) private lockTheSwap {
Ratios memory ratios = _ratios;
if (ratios.total == 0) {
return;
}
if (
_allowances[address(this)][address(dexRouter)] != type(uint256).max
) {
_allowances[address(this)][address(dexRouter)] = type(uint256).max;
}
uint256 toLiquify = ((contractTokenBalance * ratios.liquidity) /
ratios.total) / 2;
uint256 swapAmt = contractTokenBalance - toLiquify;
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = dexRouter.WPLS();
dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
swapAmt,
0,
path,
address(this),
block.timestamp
);
uint256 amtBalance = address(this).balance;
uint256 liquidityBalance = (amtBalance * toLiquify) / swapAmt;
if (toLiquify > 0) {
dexRouter.addLiquidityETH{value: liquidityBalance}(
address(this),
toLiquify,
0,
0,
DEAD,
block.timestamp
);
emit AutoLiquify(liquidityBalance, toLiquify);
}
}
struct ExtraValues {
uint256 tTransferAmount;
uint256 tFee;
uint256 tSwap;
uint256 tBurn;
uint256 tCharity;
uint256 tTeam;
uint256 tTreasury;
uint256 rTransferAmount;
uint256 rAmount;
uint256 rFee;
uint256 currentRate;
}
function _finalizeTransfer(
address from,
address to,
uint256 tAmount,
bool takeFee
) private returns (bool) {
ExtraValues memory values = _getValues(from, to, tAmount, takeFee);
_rOwned[from] = _rOwned[from] - values.rAmount;
_rOwned[to] = _rOwned[to] + values.rTransferAmount;
if (_isExcluded[from]) {
_tOwned[from] = _tOwned[from] - tAmount;
}
if (_isExcluded[to]) {
_tOwned[to] = _tOwned[to] + values.tTransferAmount;
}
if (values.rFee > 0 || values.tFee > 0) {
_rTotal -= values.rFee;
}
emit Transfer(from, to, values.tTransferAmount);
return true;
}
function _getValues(
address from,
address to,
uint256 tAmount,
bool takeFee
) private returns (ExtraValues memory) {
ExtraValues memory values;
values.currentRate = _getRate();
values.rAmount = tAmount * values.currentRate;
if (takeFee) {
uint256 currentReflect;
uint256 currentSwap;
uint256 currentBurn;
uint256 currentCharity;
uint256 currentTeam;
uint256 currentTreasury;
uint256 divisor = masterTaxDivisor;
if (lpPairs[to]) {
currentReflect = _sellTaxes.reflect;
currentBurn = _sellTaxes.burn;
currentCharity = _sellTaxes.charity;
currentTeam = _sellTaxes.team;
currentTreasury = _sellTaxes.treasury;
currentSwap = _sellTaxes.totalSwap;
} else if (lpPairs[from]) {
currentReflect = _buyTaxes.reflect;
currentBurn = _buyTaxes.burn;
currentCharity = _buyTaxes.charity;
currentTeam = _buyTaxes.team;
currentTreasury = _buyTaxes.treasury;
currentSwap = _buyTaxes.totalSwap;
}
values.tFee = (tAmount * currentReflect) / divisor;
values.tSwap = (tAmount * currentSwap) / divisor;
values.tBurn = (tAmount * currentBurn) / divisor;
values.tCharity = (tAmount * currentCharity) / divisor;
values.tTeam = (tAmount * currentTeam) / divisor;
values.tTreasury = (tAmount * currentTreasury) / divisor;
values.tTransferAmount =
tAmount -
(values.tFee +
values.tSwap +
values.tBurn +
values.tCharity +
values.tTeam +
values.tTreasury);
values.rFee = values.tFee * values.currentRate;
} else {
values.tFee = 0;
values.tSwap = 0;
values.tBurn = 0;
values.tCharity = 0;
values.tTeam = 0;
values.tTreasury = 0;
values.tTransferAmount = tAmount;
values.rFee = 0;
}
if (values.tSwap > 0) {
_rOwned[address(this)] += values.tSwap * values.currentRate;
if (_isExcluded[address(this)]) {
_tOwned[address(this)] += values.tSwap;
}
emit Transfer(from, address(this), values.tSwap);
}
if (values.tBurn > 0) {
_rOwned[DEAD] += values.tBurn * values.currentRate;
if (_isExcluded[DEAD]) {
_tOwned[DEAD] += values.tBurn;
}
emit Transfer(from, DEAD, values.tBurn);
}
if (values.tCharity > 0) {
_rOwned[charityWallet] += values.tCharity * values.currentRate;
if (_isExcluded[charityWallet]) {
_tOwned[charityWallet] += values.tCharity;
}
emit Transfer(from, charityWallet, values.tCharity);
}
if (values.tTeam > 0) {
_rOwned[teamWallet] += values.tTeam * values.currentRate;
if (_isExcluded[teamWallet]) {
_tOwned[teamWallet] += values.tTeam;
}
emit Transfer(from, teamWallet, values.tTeam);
}
if (values.tTreasury > 0) {
_rOwned[treasuryWallet] += values.tTreasury * values.currentRate;
if (_isExcluded[treasuryWallet]) {
_tOwned[treasuryWallet] += values.tTreasury;
}
emit Transfer(from, treasuryWallet, values.tTreasury);
}
values.rTransferAmount =
values.rAmount -
(values.rFee +
(values.tSwap * values.currentRate) +
(values.tBurn * values.currentRate) +
(values.tCharity * values.currentRate) +
(values.tTeam * values.currentRate) +
(values.tTreasury * values.currentRate));
return values;
}
function _getRate() internal view returns (uint256) {
uint256 rSupply = _rTotal;
uint256 tSupply = _tTotal;
if (_isExcluded[lpPair]) {
if (_rOwned[lpPair] > rSupply || _tOwned[lpPair] > tSupply)
return _rTotal / _tTotal;
rSupply -= _rOwned[lpPair];
tSupply -= _tOwned[lpPair];
}
if (_excluded.length > 0) {
for (uint8 i = 0; i < _excluded.length; i++) {
if (
_rOwned[_excluded[i]] > rSupply ||
_tOwned[_excluded[i]] > tSupply
) return _rTotal / _tTotal;
rSupply = rSupply - _rOwned[_excluded[i]];
tSupply = tSupply - _tOwned[_excluded[i]];
}
}
if (rSupply < _rTotal / _tTotal) return _rTotal / _tTotal;
return rSupply / tSupply;
}
}
Contract ABI
[{"type":"constructor","stateMutability":"payable","inputs":[]},{"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":"AutoLiquify","inputs":[{"type":"uint256","name":"amountCurrency","internalType":"uint256","indexed":false},{"type":"uint256","name":"amountTokens","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"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":"address","name":"","internalType":"address"}],"name":"DEAD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"reflect","internalType":"uint16"},{"type":"uint16","name":"burn","internalType":"uint16"},{"type":"uint16","name":"liquidity","internalType":"uint16"},{"type":"uint16","name":"treasury","internalType":"uint16"},{"type":"uint16","name":"team","internalType":"uint16"},{"type":"uint16","name":"charity","internalType":"uint16"},{"type":"uint16","name":"totalSwap","internalType":"uint16"}],"name":"_buyTaxes","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"liquidity","internalType":"uint16"},{"type":"uint16","name":"total","internalType":"uint16"}],"name":"_ratios","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"reflect","internalType":"uint16"},{"type":"uint16","name":"burn","internalType":"uint16"},{"type":"uint16","name":"liquidity","internalType":"uint16"},{"type":"uint16","name":"treasury","internalType":"uint16"},{"type":"uint16","name":"team","internalType":"uint16"},{"type":"uint16","name":"charity","internalType":"uint16"},{"type":"uint16","name":"totalSwap","internalType":"uint16"}],"name":"_sellTaxes","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"charityWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"contractSwapTimer","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IUniswapV2Router02"}],"name":"dexRouter","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getCirculatingSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getMaxTX","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getMaxWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromFees","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromLimits","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromReward","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"lpPair","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExcludedFromFees","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"enabled","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExcludedFromLimits","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"enabled","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExcludedFromReward","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"enabled","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLpPair","inputs":[{"type":"address","name":"pair","internalType":"address"},{"type":"bool","name":"enabled","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxTxPercent","inputs":[{"type":"uint256","name":"percent","internalType":"uint256"},{"type":"uint256","name":"divisor","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxWalletSize","inputs":[{"type":"uint256","name":"percent","internalType":"uint256"},{"type":"uint256","name":"divisor","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNewRouter","inputs":[{"type":"address","name":"newRouter","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapThreshold","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"teamWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenFromReflection","inputs":[{"type":"uint256","name":"rAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","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":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwner","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"treasuryWallet","inputs":[]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x60806040526000600555620000176004600a62000737565b620000299065050d5fcd3e00620007f8565b620000379060001962000834565b62000045906000196200081a565b600b556040805160e080820183526000808352602080840182905283850182905260608085018390526080808601849052606460a080880182905260c0978801869052600c80546a64000000000000000000006001600160701b03199182161790915589519788018a5260c8808952603289880152888b0181905261015e95890195909552928701849052860185905294909501819052600d80549095166cc8000000c8015e00c8003200c81790945584518086019095528385529390930191909152600e805463ffffffff191662c800c81790556011919091556200012e6004600a62000737565b620001409065050d5fcd3e00620007f8565b6200014d906064620007f8565b620001599190620006d7565b60135560646200016c6004600a62000737565b6200017e9065050d5fcd3e00620007f8565b6200018b906064620007f8565b620001979190620006d7565b60145560016000818155600b5433808352600260205260409092205581546001600160a01b0319161790556038461415620001fd57600f80546001600160a01b0319167310ed43c718714eb63d5aa57b78b54704e256024e179055600360115562000279565b46606114156200023857600f80546001600160a01b031916739ac64cc6e4415144c455bd8e4837fea55603e5c3179055600360115562000279565b466103ad14156200027457600f80546001600160a01b03191673b4a7633d8932de086c9264d5eb39a8399d7c0e3a179055600a60115562000279565b600080fd5b600f60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620002c857600080fd5b505afa158015620002dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003039190620006a5565b6001600160a01b031663c9c65396600f60009054906101000a90046001600160a01b03166001600160a01b031663ef8ef56f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200036057600080fd5b505afa15801562000375573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200039b9190620006a5565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381600087803b158015620003e357600080fd5b505af1158015620003f8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200041e9190620006a5565b601080546001600160a01b0319166001600160a01b039283169081179091556000908152600460205260409020805460ff19166001179055600f546200046a913391166000196200057b565b600f54620004869030906001600160a01b03166000196200057b565b6001600760006200049f6001546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526007909252812080548316600190811790915561dead9091527fb0c2646e02af70b79e3fe9277b98373379f54150e4e26b2b5650139f7a75a65d8054909216179055620005183390565b6001600160a01b031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620005526004600a62000737565b620005649065050d5fcd3e00620007f8565b60405190815260200160405180910390a362000877565b6001600160a01b038316620005e15760405162461bcd60e51b815260206004820152602160248201527f45524332303a2053656e646572206973206e6f74207a65726f204164647265736044820152607360f81b60648201526084015b60405180910390fd5b6001600160a01b038216620006445760405162461bcd60e51b815260206004820152602260248201527f45524332303a205370656e646572206973206e6f74207a65726f204164647265604482015261737360f01b6064820152608401620005d8565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600060208284031215620006b857600080fd5b81516001600160a01b0381168114620006d057600080fd5b9392505050565b600082620006e957620006e962000861565b500490565b600181815b808511156200072f5781600019048211156200071357620007136200084b565b808516156200072157918102915b93841c9390800290620006f3565b509250929050565b6000620006d060ff8416836000826200075357506001620007f2565b816200076257506000620007f2565b81600181146200077b57600281146200078657620007a6565b6001915050620007f2565b60ff8411156200079a576200079a6200084b565b50506001821b620007f2565b5060208310610133831016604e8410600b8410161715620007cb575081810a620007f2565b620007d78383620006ee565b8060001904821115620007ee57620007ee6200084b565b0290505b92915050565b60008160001904831182151516156200081557620008156200084b565b500290565b6000828210156200082f576200082f6200084b565b500390565b60008262000846576200084662000861565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b61354780620008876000396000f3fe6080604052600436106102345760003560e01c80634fbee1931161012e57806388f82020116100ab578063c6831cd81161006f578063c6831cd814610766578063cf847706146107bf578063dd62ed3e146107ff578063e4fcfd1814610845578063eafb5a3c1461085b57600080fd5b806388f82020146106ae578063893d20e8146106e75780638da5cb5b146106fc57806395d89b411461071a578063a9059cbb1461074657600080fd5b806370a08231116100f257806370a0823114610594578063715018a6146105b45780637b208769146105c95780637b45d431146105f157806380c581d11461068e57600080fd5b80634fbee193146104c5578063590ffdce146104fe578063599270441461051e5780635cce86cd146105465780636ebd00781461057f57600080fd5b806326003957116101bc57806336fddb041161018057806336fddb041461041d5780633f3cf56c1461043d578063452ed4f11461045d5780634626402b1461047d5780634fb2e45d146104a557600080fd5b806326003957146103975780632b112e49146103b75780632d838119146103cc5780632e8fa821146103ec578063313ce5671461040157600080fd5b8063095ea7b311610203578063095ea7b3146102fb5780630fa604e41461032b57806313e461921461034057806318160ddd1461036257806323b872dd1461037757600080fd5b806303fd2a45146102405780630445b6671461027357806306fdde03146102965780630758d924146102db57600080fd5b3661023b57005b600080fd5b34801561024c57600080fd5b5061025661dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561027f57600080fd5b5061028861087b565b60405190815260200161026a565b3480156102a257600080fd5b50604080518082019091526013815272486f63757320506f6375732046696e616e636560681b60208201525b60405161026a91906131b0565b3480156102e757600080fd5b50600f54610256906001600160a01b031681565b34801561030757600080fd5b5061031b61031636600461311b565b6108b2565b604051901515815260200161026a565b34801561033757600080fd5b506102886108c9565b34801561034c57600080fd5b5061036061035b3660046130e8565b6108e9565b005b34801561036e57600080fd5b50610288610d5e565b34801561038357600080fd5b5061031b6103923660046130a7565b610da1565b3480156103a357600080fd5b506103606103b2366004613160565b610e19565b3480156103c357600080fd5b50610288610f40565b3480156103d857600080fd5b506102886103e7366004613147565b610f87565b3480156103f857600080fd5b5061028861100b565b34801561040d57600080fd5b506040516004815260200161026a565b34801561042957600080fd5b506103606104383660046130e8565b611035565b34801561044957600080fd5b50610360610458366004613160565b61108a565b34801561046957600080fd5b50601054610256906001600160a01b031681565b34801561048957600080fd5b50610256734ca0483a4234bcad8fa64010b71086b344001af381565b3480156104b157600080fd5b506103606104c0366004613034565b6111bc565b3480156104d157600080fd5b5061031b6104e0366004613034565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561050a57600080fd5b506103606105193660046130e8565b611341565b34801561052a57600080fd5b5061025673dc6085035e331d7289126fdd27bafd84fec5dc6781565b34801561055257600080fd5b5061031b610561366004613034565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561058b57600080fd5b50610288611396565b3480156105a057600080fd5b506102886105af366004613034565b6113b1565b3480156105c057600080fd5b50610360611410565b3480156105d557600080fd5b50610256734bda64c2e135e9c4f813a7cf6241821a0e8a7d8d81565b3480156105fd57600080fd5b50600c5461064a9061ffff808216916201000081048216916401000000008204811691600160301b8104821691600160401b8204811691600160501b8104821691600160601b9091041687565b6040805161ffff9889168152968816602088015294871694860194909452918516606085015284166080840152831660a083015290911660c082015260e00161026a565b34801561069a57600080fd5b506103606106a93660046130e8565b611490565b3480156106ba57600080fd5b5061031b6106c9366004613034565b6001600160a01b031660009081526009602052604090205460ff1690565b3480156106f357600080fd5b50610256611515565b34801561070857600080fd5b506001546001600160a01b0316610256565b34801561072657600080fd5b50604080518082019091526003815262484f4360e81b60208201526102ce565b34801561075257600080fd5b5061031b61076136600461311b565b611529565b34801561077257600080fd5b50600d5461064a9061ffff808216916201000081048216916401000000008204811691600160301b8104821691600160401b8204811691600160501b8104821691600160601b9091041687565b3480156107cb57600080fd5b50600e546107e49061ffff808216916201000090041682565b6040805161ffff93841681529290911660208301520161026a565b34801561080b57600080fd5b5061028861081a36600461306e565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b34801561085157600080fd5b5061028860115481565b34801561086757600080fd5b50610360610876366004613034565b611540565b61271061088a6004600a61337b565b61089a9065050d5fcd3e00613426565b6108a5906005613426565b6108af9190613316565b81565b60006108bf338484611930565b5060015b92915050565b60006108d76004600a61337b565b6014546108e49190613316565b905090565b6001546001600160a01b0316331461091c5760405162461bcd60e51b815260040161091390613205565b60405180910390fd5b8015610a64576001600160a01b03821660009081526009602052604090205460ff161561098b5760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c7265616479206578636c756465642e000000006044820152606401610913565b6001600160a01b038216600090815260026020526040902054156109e5576001600160a01b0382166000908152600260205260409020546109cb90610f87565b6001600160a01b0383166000908152600360205260409020555b6001600160a01b038083166000818152600960205260409020805460ff1916600117905560105490911614610a6057600a80546001810182556000919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b0384161790555b5050565b80610a60576001600160a01b03821660009081526009602052604090205460ff16610ad15760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c726561647920696e636c756465642e000000006044820152606401610913565b6010546001600160a01b0383811691161415610b4c57610aef611a52565b6001600160a01b038316600090815260036020526040902054610b129190613426565b6001600160a01b038316600090815260026020908152604080832093909355600381528282208290556009905220805460ff191690555050565b600a5460011415610bef57610b5f611a52565b6001600160a01b038316600090815260036020526040902054610b829190613426565b6001600160a01b038316600090815260026020908152604080832093909355600381528282208290556009905220805460ff19169055600a805480610bc957610bc96134ad565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b60005b600a54811015610d5957826001600160a01b0316600a8281548110610c1957610c196134c3565b6000918252602090912001546001600160a01b03161415610d4757600a8054610c4490600190613445565b81548110610c5457610c546134c3565b600091825260209091200154600a80546001600160a01b039092169183908110610c8057610c806134c3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610cb6611a52565b6001600160a01b038416600090815260036020526040902054610cd99190613426565b6001600160a01b038416600090815260026020908152604080832093909355600381528282208290556009905220805460ff19169055600a805480610d2057610d206134ad565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b80610d518161345c565b915050610bf2565b505050565b6000610d6c6004600a61337b565b610d7c9065050d5fcd3e00613426565b610d8557600080fd5b610d916004600a61337b565b6108e49065050d5fcd3e00613426565b6001600160a01b038316600090815260066020908152604080832033845290915281205460001914610e06576001600160a01b038416600090815260066020908152604080832033845290915281208054849290610e00908490613445565b90915550505b610e11848484611d28565b949350505050565b6001546001600160a01b03163314610e435760405162461bcd60e51b815260040161091390613205565b6103e8610e526004600a61337b565b610e629065050d5fcd3e00613426565b610e6c9190613316565b8183610e7a6004600a61337b565b610e8a9065050d5fcd3e00613426565b610e949190613426565b610e9e9190613316565b1015610f075760405162461bcd60e51b815260206004820152603260248201527f4d61782057616c6c657420616d74206d7573742062652061626f766520302e31604482015271129037b3103a37ba30b61039bab838363c9760711b6064820152608401610913565b8082610f156004600a61337b565b610f259065050d5fcd3e00613426565b610f2f9190613426565b610f399190613316565b6014555050565b6000610f4c60006113b1565b610f5761dead6113b1565b610f6191906132fe565b610f6d6004600a61337b565b610f7d9065050d5fcd3e00613426565b6108e49190613445565b6000600b54821115610fee5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610913565b6000610ff8611a52565b90506110048184613316565b9392505050565b61271061101a6004600a61337b565b61102a9065050d5fcd3e00613426565b6108a590600a613426565b6001546001600160a01b0316331461105f5760405162461bcd60e51b815260040161091390613205565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6001546001600160a01b031633146110b45760405162461bcd60e51b815260040161091390613205565b6103e86110c36004600a61337b565b6110d39065050d5fcd3e00613426565b6110dd9190613316565b81836110eb6004600a61337b565b6110fb9065050d5fcd3e00613426565b6111059190613426565b61110f9190613316565b10156111835760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3125206f6620746f74616c20737570706c792e0000000000000000006064820152608401610913565b80826111916004600a61337b565b6111a19065050d5fcd3e00613426565b6111ab9190613426565b6111b59190613316565b6013555050565b6002600054141561120f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610913565b60026000556001546001600160a01b0316331461123e5760405162461bcd60e51b815260040161091390613205565b6001600160a01b0381166112645760405162461bcd60e51b815260040161091390613230565b6001600160a01b03811661dead141561128f5760405162461bcd60e51b815260040161091390613230565b6001546112a6906001600160a01b03166000611341565b6112b1816001611341565b6001546000906112c9906001600160a01b03166113b1565b11156112f0576001546112ee906001600160a01b0316826112e9826113b1565b611d28565b505b600180546001600160a01b0319166001600160a01b03831690811790915560405181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3506001600055565b6001546001600160a01b0316331461136b5760405162461bcd60e51b815260040161091390613205565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b60006113a46004600a61337b565b6013546108e49190613316565b6001600160a01b03811660009081526009602052604081205460ff16156113ee57506001600160a01b031660009081526003602052604090205490565b6001600160a01b0382166000908152600260205260409020546108c390610f87565b6001546001600160a01b0316331461143a5760405162461bcd60e51b815260040161091390613205565b600154611451906001600160a01b03166000611341565b600180546001600160a01b031916905560405160009081907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b6001546001600160a01b031633146114ba5760405162461bcd60e51b815260040161091390613205565b806114e157506001600160a01b03166000908152600460205260409020805460ff19169055565b6005541561150d576001600160a01b0382166000908152600460205260409020805460ff191660011790555b426005555050565b60006108e46001546001600160a01b031690565b6000611536338484611d28565b5060019392505050565b600260005414156115935760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610913565b60026000556001546001600160a01b031633146115c25760405162461bcd60e51b815260040161091390613205565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561160257600080fd5b505afa158015611616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163a9190613051565b6001600160a01b031663e6a4390530846001600160a01b031663ef8ef56f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561168257600080fd5b505afa158015611696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ba9190613051565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b15801561170057600080fd5b505afa158015611714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117389190613051565b90506001600160a01b0381166118de57816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561178157600080fd5b505afa158015611795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b99190613051565b6001600160a01b031663c9c6539630846001600160a01b031663ef8ef56f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561180157600080fd5b505afa158015611815573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118399190613051565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561188157600080fd5b505af1158015611895573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b99190613051565b601080546001600160a01b0319166001600160a01b03929092169190911790556118fa565b601080546001600160a01b0319166001600160a01b0383161790555b600f80546001600160a01b0319166001600160a01b038416908117909155611926903090600019611930565b5050600160005550565b6001600160a01b0383166119905760405162461bcd60e51b815260206004820152602160248201527f45524332303a2053656e646572206973206e6f74207a65726f204164647265736044820152607360f81b6064820152608401610913565b6001600160a01b0382166119f15760405162461bcd60e51b815260206004820152602260248201527f45524332303a205370656e646572206973206e6f74207a65726f204164647265604482015261737360f01b6064820152608401610913565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600b5460009081611a656004600a61337b565b611a759065050d5fcd3e00613426565b6010546001600160a01b031660009081526009602052604090205490915060ff1615611b61576010546001600160a01b0316600090815260026020526040902054821080611adc57506010546001600160a01b031660009081526003602052604090205481105b15611b1157611aed6004600a61337b565b611afd9065050d5fcd3e00613426565b600b54611b0a9190613316565b9250505090565b6010546001600160a01b0316600090815260026020526040902054611b369083613445565b6010546001600160a01b0316600090815260036020526040902054909250611b5e9082613445565b90505b600a5415611ce25760005b600a5460ff82161015611ce0578260026000600a8460ff1681548110611b9457611b946134c3565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180611c0257508160036000600a8460ff1681548110611bdb57611bdb6134c3565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15611c3857611c136004600a61337b565b611c239065050d5fcd3e00613426565b600b54611c309190613316565b935050505090565b60026000600a8360ff1681548110611c5257611c526134c3565b60009182526020808320909101546001600160a01b03168352820192909252604001902054611c819084613445565b925060036000600a8360ff1681548110611c9d57611c9d6134c3565b60009182526020808320909101546001600160a01b03168352820192909252604001902054611ccc9083613445565b915080611cd881613477565b915050611b6c565b505b611cee6004600a61337b565b611cfe9065050d5fcd3e00613426565b600b54611d0b9190613316565b821015611d1e57611aed6004600a61337b565b611b0a8183613316565b60006001600160a01b038416611d8e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610913565b6001600160a01b038316611df05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610913565b60008211611e525760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610913565b6001600160a01b03841660009081526004602052604090205460ff1680611e9157506001600160a01b03831660009081526004602052604090205460ff165b15611f40576001600160a01b03841660009081526008602052604090205460ff16158015611ed857506001600160a01b03831660009081526008602052604090205460ff16155b15611f4057601354821115611f405760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610913565b600f546001600160a01b03848116911614801590611f7757506001600160a01b03831660009081526004602052604090205460ff16155b15612014576001600160a01b03831660009081526008602052604090205460ff166120145760145482611fa9856113b1565b611fb391906132fe565b11156120145760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201526930b63632ba29b4bd329760b11b6064820152608401610913565b6001600160a01b03841660009081526007602052604090205460019060ff168061205657506001600160a01b03841660009081526007602052604090205460ff165b1561205f575060005b6001600160a01b03841660009081526004602052604090205460ff161561217057601054600160a01b900460ff1661217057426011546012546120a291906132fe565b10156121705760006120b3306113b1565b90506127106120c46004600a61337b565b6120d49065050d5fcd3e00613426565b6120df906005613426565b6120e99190613316565b811061216e576127106120fe6004600a61337b565b61210e9065050d5fcd3e00613426565b61211990600a613426565b6121239190613316565b8110612160576127106121386004600a61337b565b6121489065050d5fcd3e00613426565b61215390600a613426565b61215d9190613316565b90505b61216981612185565b426012555b505b61217c858585846124cc565b95945050505050565b6010805460ff60a01b1916600160a01b17905560408051808201909152600e5461ffff80821683526201000090910416602082018190526121c657506124bc565b306000908152600660209081526040808320600f546001600160a01b031684529091529020546000191461221f57306000908152600660209081526040808320600f546001600160a01b03168452909152902060001990555b60006002826020015161ffff16836000015161ffff16856122409190613426565b61224a9190613316565b6122549190613316565b905060006122628285613445565b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811061229c5761229c6134c3565b6001600160a01b03928316602091820292909201810191909152600f546040805163ef8ef56f60e01b81529051919093169263ef8ef56f926004808301939192829003018186803b1580156122f057600080fd5b505afa158015612304573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123289190613051565b8160018151811061233b5761233b6134c3565b6001600160a01b039283166020918202929092010152600f5460405163791ac94760e01b815291169063791ac9479061238190859060009086903090429060040161328d565b600060405180830381600087803b15801561239b57600080fd5b505af11580156123af573d6000803e3d6000fd5b50479250600091508490506123c48684613426565b6123ce9190613316565b905084156124b557600f5460405163f305d71960e01b815230600482015260248101879052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b15801561243f57600080fd5b505af1158015612453573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906124789190613182565b505060408051838152602081018890527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b5050505050505b506010805460ff60a01b19169055565b6000806124db86868686612694565b6101008101516001600160a01b03881660009081526002602052604090205491925061250691613445565b6001600160a01b038088166000908152600260205260408082209390935560e08401519188168152919091205461253d91906132fe565b6001600160a01b0380871660009081526002602090815260408083209490945591891681526009909152205460ff16156125af576001600160a01b038616600090815260036020526040902054612595908590613445565b6001600160a01b0387166000908152600360205260409020555b6001600160a01b03851660009081526009602052604090205460ff161561260f5780516001600160a01b0386166000908152600360205260409020546125f591906132fe565b6001600160a01b0386166000908152600360205260409020555b60008161012001511180612627575060008160200151115b1561264957806101200151600b60008282546126439190613445565b90915550505b846001600160a01b0316866001600160a01b03166000805160206134f2833981519152836000015160405161268091815260200190565b60405180910390a350600195945050505050565b61269c612fda565b6126a4612fda565b6126ac611a52565b61014082018190526126be9085613426565b61010082015282156128bf576001600160a01b038516600090815260046020526040812054819081908190819081906127109060ff161561273f57600d5461ffff8082169850600160601b82048116975062010000820481169650600160501b820481169550600160401b820481169450600160301b9091041691506127a2565b6001600160a01b038d1660009081526004602052604090205460ff16156127a257600c5461ffff8082169850600160601b82048116975062010000820481169650600160501b820481169550600160401b820481169450600160301b9091041691505b806127ad888d613426565b6127b79190613316565b6020890152806127c7878d613426565b6127d19190613316565b6040890152806127e1868d613426565b6127eb9190613316565b6060890152806127fb858d613426565b6128059190613316565b608089015280612815848d613426565b61281f9190613316565b60a08901528061282f838d613426565b6128399190613316565b60c0890181905260a089015160808a015160608b015160408c015160208d015161286391906132fe565b61286d91906132fe565b61287791906132fe565b61288191906132fe565b61288b91906132fe565b612895908c613445565b885261014088015160208901516128ac9190613426565b610120890152506128f595505050505050565b60006020820181905260408201819052606082018190526080820181905260a0820181905260c082018190528482526101208201525b6040810151156129bb5780610140015181604001516129149190613426565b30600090815260026020526040812080549091906129339084906132fe565b90915550503060009081526009602052604090205460ff161561297b5760408082015130600090815260036020529182208054919290916129759084906132fe565b90915550505b306001600160a01b0316866001600160a01b03166000805160206134f283398151915283604001516040516129b291815260200190565b60405180910390a35b606081015115612add5780610140015181606001516129da9190613426565b61dead600090815260026020527f6a9609baa168169acaea398c4407efea4be641bb08e21e88806d9836fd9333cc8054909190612a189084906132fe565b909155505061dead60005260096020527f960b1051749987b45b5679007fff577a1c2f763ec21c15a6c5eb1930750037855460ff1615612a9b57606081015161dead600090815260036020527f262bb27bbdd95c1cdc8e16957e36e38579ea44f7f6413dd7a9c75939def06b2c8054909190612a959084906132fe565b90915550505b61dead6001600160a01b0316866001600160a01b03166000805160206134f28339815191528360600151604051612ad491815260200190565b60405180910390a35b608081015115612c47578061014001518160800151612afc9190613426565b734bda64c2e135e9c4f813a7cf6241821a0e8a7d8d600090815260026020527f035efbc49353aa9b8275872809e5537c505d6445bddcf80c1be03bedae7611958054909190612b4c9084906132fe565b9091555050734bda64c2e135e9c4f813a7cf6241821a0e8a7d8d60005260096020527fbbb9bc52f5838f275668f5beed93de5b188f196811b4eb46cc77d16b964fbbeb5460ff1615612bf3576080810151734bda64c2e135e9c4f813a7cf6241821a0e8a7d8d600090815260036020527f3d3355907503cb5dc26d01fcd0e9b9493621f76e439b600d5bc4acd5d4ce926f8054909190612bed9084906132fe565b90915550505b734bda64c2e135e9c4f813a7cf6241821a0e8a7d8d6001600160a01b0316866001600160a01b03166000805160206134f28339815191528360800151604051612c3e91815260200190565b60405180910390a35b60a081015115612db1578061014001518160a00151612c669190613426565b73dc6085035e331d7289126fdd27bafd84fec5dc67600090815260026020527faf3a5efe1f609b365be3c90e641a5715720ddbd893616f246652fa95e12a7f398054909190612cb69084906132fe565b909155505073dc6085035e331d7289126fdd27bafd84fec5dc6760005260096020527f990176404abe1c08901812f6523b19faab11cd3381778760248d118f7a9df0045460ff1615612d5d5760a081015173dc6085035e331d7289126fdd27bafd84fec5dc67600090815260036020527f06dafbc17a28e81956ea5e0d01050bd95ea93a5bfb51278297b7292efda453e08054909190612d579084906132fe565b90915550505b73dc6085035e331d7289126fdd27bafd84fec5dc676001600160a01b0316866001600160a01b03166000805160206134f28339815191528360a00151604051612da891815260200190565b60405180910390a35b60c081015115612f1b578061014001518160c00151612dd09190613426565b734ca0483a4234bcad8fa64010b71086b344001af3600090815260026020527fe96908a746f5856fb47ccb5f7f71fc1f474b1b09e42bd4095e8abc757a216d1a8054909190612e209084906132fe565b9091555050734ca0483a4234bcad8fa64010b71086b344001af360005260096020527faf997d58437ee002a6762cb0fea08242edcb6067c6c8d2b89ed35665ef3d0c195460ff1615612ec75760c0810151734ca0483a4234bcad8fa64010b71086b344001af3600090815260036020527f260af121988c50a655cb7a7ae4cf4a018dbfdc4f6f1104fa862eef0fd4d4ff508054909190612ec19084906132fe565b90915550505b734ca0483a4234bcad8fa64010b71086b344001af36001600160a01b0316866001600160a01b03166000805160206134f28339815191528360c00151604051612f1291815260200190565b60405180910390a35b8061014001518160c00151612f309190613426565b8161014001518260a00151612f459190613426565b8261014001518360800151612f5a9190613426565b8361014001518460600151612f6f9190613426565b8461014001518560400151612f849190613426565b856101200151612f9491906132fe565b612f9e91906132fe565b612fa891906132fe565b612fb291906132fe565b612fbc91906132fe565b816101000151612fcc9190613445565b60e082015295945050505050565b60405180610160016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60006020828403121561304657600080fd5b8135611004816134d9565b60006020828403121561306357600080fd5b8151611004816134d9565b6000806040838503121561308157600080fd5b823561308c816134d9565b9150602083013561309c816134d9565b809150509250929050565b6000806000606084860312156130bc57600080fd5b83356130c7816134d9565b925060208401356130d7816134d9565b929592945050506040919091013590565b600080604083850312156130fb57600080fd5b8235613106816134d9565b91506020830135801515811461309c57600080fd5b6000806040838503121561312e57600080fd5b8235613139816134d9565b946020939093013593505050565b60006020828403121561315957600080fd5b5035919050565b6000806040838503121561317357600080fd5b50508035926020909101359150565b60008060006060848603121561319757600080fd5b8351925060208401519150604084015190509250925092565b600060208083528351808285015260005b818110156131dd578581018301518582016040015282016131c1565b818111156131ef576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526011908201527021b0b63632b9101e979e9037bbb732b91760791b604082015260600190565b6020808252603d908201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660408201527f6572206f776e657220746f20746865207a65726f20616464726573732e000000606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156132dd5784516001600160a01b0316835293830193918301916001016132b8565b50506001600160a01b03969096166060850152505050608001529392505050565b6000821982111561331157613311613497565b500190565b60008261333357634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561337357816000190482111561335957613359613497565b8085161561336657918102915b93841c939080029061333d565b509250929050565b600061100460ff841683600082613394575060016108c3565b816133a1575060006108c3565b81600181146133b757600281146133c1576133dd565b60019150506108c3565b60ff8411156133d2576133d2613497565b50506001821b6108c3565b5060208310610133831016604e8410600b8410161715613400575081810a6108c3565b61340a8383613338565b806000190482111561341e5761341e613497565b029392505050565b600081600019048311821515161561344057613440613497565b500290565b60008282101561345757613457613497565b500390565b600060001982141561347057613470613497565b5060010190565b600060ff821660ff81141561348e5761348e613497565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146134ee57600080fd5b5056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122069376a041cf38084bbf01e0fa12a35ee74540beddc33bf6100777cc65f56cb7b64736f6c63430008070033
Deployed ByteCode
0x6080604052600436106102345760003560e01c80634fbee1931161012e57806388f82020116100ab578063c6831cd81161006f578063c6831cd814610766578063cf847706146107bf578063dd62ed3e146107ff578063e4fcfd1814610845578063eafb5a3c1461085b57600080fd5b806388f82020146106ae578063893d20e8146106e75780638da5cb5b146106fc57806395d89b411461071a578063a9059cbb1461074657600080fd5b806370a08231116100f257806370a0823114610594578063715018a6146105b45780637b208769146105c95780637b45d431146105f157806380c581d11461068e57600080fd5b80634fbee193146104c5578063590ffdce146104fe578063599270441461051e5780635cce86cd146105465780636ebd00781461057f57600080fd5b806326003957116101bc57806336fddb041161018057806336fddb041461041d5780633f3cf56c1461043d578063452ed4f11461045d5780634626402b1461047d5780634fb2e45d146104a557600080fd5b806326003957146103975780632b112e49146103b75780632d838119146103cc5780632e8fa821146103ec578063313ce5671461040157600080fd5b8063095ea7b311610203578063095ea7b3146102fb5780630fa604e41461032b57806313e461921461034057806318160ddd1461036257806323b872dd1461037757600080fd5b806303fd2a45146102405780630445b6671461027357806306fdde03146102965780630758d924146102db57600080fd5b3661023b57005b600080fd5b34801561024c57600080fd5b5061025661dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561027f57600080fd5b5061028861087b565b60405190815260200161026a565b3480156102a257600080fd5b50604080518082019091526013815272486f63757320506f6375732046696e616e636560681b60208201525b60405161026a91906131b0565b3480156102e757600080fd5b50600f54610256906001600160a01b031681565b34801561030757600080fd5b5061031b61031636600461311b565b6108b2565b604051901515815260200161026a565b34801561033757600080fd5b506102886108c9565b34801561034c57600080fd5b5061036061035b3660046130e8565b6108e9565b005b34801561036e57600080fd5b50610288610d5e565b34801561038357600080fd5b5061031b6103923660046130a7565b610da1565b3480156103a357600080fd5b506103606103b2366004613160565b610e19565b3480156103c357600080fd5b50610288610f40565b3480156103d857600080fd5b506102886103e7366004613147565b610f87565b3480156103f857600080fd5b5061028861100b565b34801561040d57600080fd5b506040516004815260200161026a565b34801561042957600080fd5b506103606104383660046130e8565b611035565b34801561044957600080fd5b50610360610458366004613160565b61108a565b34801561046957600080fd5b50601054610256906001600160a01b031681565b34801561048957600080fd5b50610256734ca0483a4234bcad8fa64010b71086b344001af381565b3480156104b157600080fd5b506103606104c0366004613034565b6111bc565b3480156104d157600080fd5b5061031b6104e0366004613034565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561050a57600080fd5b506103606105193660046130e8565b611341565b34801561052a57600080fd5b5061025673dc6085035e331d7289126fdd27bafd84fec5dc6781565b34801561055257600080fd5b5061031b610561366004613034565b6001600160a01b031660009081526008602052604090205460ff1690565b34801561058b57600080fd5b50610288611396565b3480156105a057600080fd5b506102886105af366004613034565b6113b1565b3480156105c057600080fd5b50610360611410565b3480156105d557600080fd5b50610256734bda64c2e135e9c4f813a7cf6241821a0e8a7d8d81565b3480156105fd57600080fd5b50600c5461064a9061ffff808216916201000081048216916401000000008204811691600160301b8104821691600160401b8204811691600160501b8104821691600160601b9091041687565b6040805161ffff9889168152968816602088015294871694860194909452918516606085015284166080840152831660a083015290911660c082015260e00161026a565b34801561069a57600080fd5b506103606106a93660046130e8565b611490565b3480156106ba57600080fd5b5061031b6106c9366004613034565b6001600160a01b031660009081526009602052604090205460ff1690565b3480156106f357600080fd5b50610256611515565b34801561070857600080fd5b506001546001600160a01b0316610256565b34801561072657600080fd5b50604080518082019091526003815262484f4360e81b60208201526102ce565b34801561075257600080fd5b5061031b61076136600461311b565b611529565b34801561077257600080fd5b50600d5461064a9061ffff808216916201000081048216916401000000008204811691600160301b8104821691600160401b8204811691600160501b8104821691600160601b9091041687565b3480156107cb57600080fd5b50600e546107e49061ffff808216916201000090041682565b6040805161ffff93841681529290911660208301520161026a565b34801561080b57600080fd5b5061028861081a36600461306e565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b34801561085157600080fd5b5061028860115481565b34801561086757600080fd5b50610360610876366004613034565b611540565b61271061088a6004600a61337b565b61089a9065050d5fcd3e00613426565b6108a5906005613426565b6108af9190613316565b81565b60006108bf338484611930565b5060015b92915050565b60006108d76004600a61337b565b6014546108e49190613316565b905090565b6001546001600160a01b0316331461091c5760405162461bcd60e51b815260040161091390613205565b60405180910390fd5b8015610a64576001600160a01b03821660009081526009602052604090205460ff161561098b5760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c7265616479206578636c756465642e000000006044820152606401610913565b6001600160a01b038216600090815260026020526040902054156109e5576001600160a01b0382166000908152600260205260409020546109cb90610f87565b6001600160a01b0383166000908152600360205260409020555b6001600160a01b038083166000818152600960205260409020805460ff1916600117905560105490911614610a6057600a80546001810182556000919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b0384161790555b5050565b80610a60576001600160a01b03821660009081526009602052604090205460ff16610ad15760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c726561647920696e636c756465642e000000006044820152606401610913565b6010546001600160a01b0383811691161415610b4c57610aef611a52565b6001600160a01b038316600090815260036020526040902054610b129190613426565b6001600160a01b038316600090815260026020908152604080832093909355600381528282208290556009905220805460ff191690555050565b600a5460011415610bef57610b5f611a52565b6001600160a01b038316600090815260036020526040902054610b829190613426565b6001600160a01b038316600090815260026020908152604080832093909355600381528282208290556009905220805460ff19169055600a805480610bc957610bc96134ad565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b60005b600a54811015610d5957826001600160a01b0316600a8281548110610c1957610c196134c3565b6000918252602090912001546001600160a01b03161415610d4757600a8054610c4490600190613445565b81548110610c5457610c546134c3565b600091825260209091200154600a80546001600160a01b039092169183908110610c8057610c806134c3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610cb6611a52565b6001600160a01b038416600090815260036020526040902054610cd99190613426565b6001600160a01b038416600090815260026020908152604080832093909355600381528282208290556009905220805460ff19169055600a805480610d2057610d206134ad565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b80610d518161345c565b915050610bf2565b505050565b6000610d6c6004600a61337b565b610d7c9065050d5fcd3e00613426565b610d8557600080fd5b610d916004600a61337b565b6108e49065050d5fcd3e00613426565b6001600160a01b038316600090815260066020908152604080832033845290915281205460001914610e06576001600160a01b038416600090815260066020908152604080832033845290915281208054849290610e00908490613445565b90915550505b610e11848484611d28565b949350505050565b6001546001600160a01b03163314610e435760405162461bcd60e51b815260040161091390613205565b6103e8610e526004600a61337b565b610e629065050d5fcd3e00613426565b610e6c9190613316565b8183610e7a6004600a61337b565b610e8a9065050d5fcd3e00613426565b610e949190613426565b610e9e9190613316565b1015610f075760405162461bcd60e51b815260206004820152603260248201527f4d61782057616c6c657420616d74206d7573742062652061626f766520302e31604482015271129037b3103a37ba30b61039bab838363c9760711b6064820152608401610913565b8082610f156004600a61337b565b610f259065050d5fcd3e00613426565b610f2f9190613426565b610f399190613316565b6014555050565b6000610f4c60006113b1565b610f5761dead6113b1565b610f6191906132fe565b610f6d6004600a61337b565b610f7d9065050d5fcd3e00613426565b6108e49190613445565b6000600b54821115610fee5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610913565b6000610ff8611a52565b90506110048184613316565b9392505050565b61271061101a6004600a61337b565b61102a9065050d5fcd3e00613426565b6108a590600a613426565b6001546001600160a01b0316331461105f5760405162461bcd60e51b815260040161091390613205565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6001546001600160a01b031633146110b45760405162461bcd60e51b815260040161091390613205565b6103e86110c36004600a61337b565b6110d39065050d5fcd3e00613426565b6110dd9190613316565b81836110eb6004600a61337b565b6110fb9065050d5fcd3e00613426565b6111059190613426565b61110f9190613316565b10156111835760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3125206f6620746f74616c20737570706c792e0000000000000000006064820152608401610913565b80826111916004600a61337b565b6111a19065050d5fcd3e00613426565b6111ab9190613426565b6111b59190613316565b6013555050565b6002600054141561120f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610913565b60026000556001546001600160a01b0316331461123e5760405162461bcd60e51b815260040161091390613205565b6001600160a01b0381166112645760405162461bcd60e51b815260040161091390613230565b6001600160a01b03811661dead141561128f5760405162461bcd60e51b815260040161091390613230565b6001546112a6906001600160a01b03166000611341565b6112b1816001611341565b6001546000906112c9906001600160a01b03166113b1565b11156112f0576001546112ee906001600160a01b0316826112e9826113b1565b611d28565b505b600180546001600160a01b0319166001600160a01b03831690811790915560405181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3506001600055565b6001546001600160a01b0316331461136b5760405162461bcd60e51b815260040161091390613205565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b60006113a46004600a61337b565b6013546108e49190613316565b6001600160a01b03811660009081526009602052604081205460ff16156113ee57506001600160a01b031660009081526003602052604090205490565b6001600160a01b0382166000908152600260205260409020546108c390610f87565b6001546001600160a01b0316331461143a5760405162461bcd60e51b815260040161091390613205565b600154611451906001600160a01b03166000611341565b600180546001600160a01b031916905560405160009081907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b6001546001600160a01b031633146114ba5760405162461bcd60e51b815260040161091390613205565b806114e157506001600160a01b03166000908152600460205260409020805460ff19169055565b6005541561150d576001600160a01b0382166000908152600460205260409020805460ff191660011790555b426005555050565b60006108e46001546001600160a01b031690565b6000611536338484611d28565b5060019392505050565b600260005414156115935760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610913565b60026000556001546001600160a01b031633146115c25760405162461bcd60e51b815260040161091390613205565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561160257600080fd5b505afa158015611616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163a9190613051565b6001600160a01b031663e6a4390530846001600160a01b031663ef8ef56f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561168257600080fd5b505afa158015611696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ba9190613051565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260440160206040518083038186803b15801561170057600080fd5b505afa158015611714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117389190613051565b90506001600160a01b0381166118de57816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561178157600080fd5b505afa158015611795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b99190613051565b6001600160a01b031663c9c6539630846001600160a01b031663ef8ef56f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561180157600080fd5b505afa158015611815573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118399190613051565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561188157600080fd5b505af1158015611895573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b99190613051565b601080546001600160a01b0319166001600160a01b03929092169190911790556118fa565b601080546001600160a01b0319166001600160a01b0383161790555b600f80546001600160a01b0319166001600160a01b038416908117909155611926903090600019611930565b5050600160005550565b6001600160a01b0383166119905760405162461bcd60e51b815260206004820152602160248201527f45524332303a2053656e646572206973206e6f74207a65726f204164647265736044820152607360f81b6064820152608401610913565b6001600160a01b0382166119f15760405162461bcd60e51b815260206004820152602260248201527f45524332303a205370656e646572206973206e6f74207a65726f204164647265604482015261737360f01b6064820152608401610913565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600b5460009081611a656004600a61337b565b611a759065050d5fcd3e00613426565b6010546001600160a01b031660009081526009602052604090205490915060ff1615611b61576010546001600160a01b0316600090815260026020526040902054821080611adc57506010546001600160a01b031660009081526003602052604090205481105b15611b1157611aed6004600a61337b565b611afd9065050d5fcd3e00613426565b600b54611b0a9190613316565b9250505090565b6010546001600160a01b0316600090815260026020526040902054611b369083613445565b6010546001600160a01b0316600090815260036020526040902054909250611b5e9082613445565b90505b600a5415611ce25760005b600a5460ff82161015611ce0578260026000600a8460ff1681548110611b9457611b946134c3565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180611c0257508160036000600a8460ff1681548110611bdb57611bdb6134c3565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15611c3857611c136004600a61337b565b611c239065050d5fcd3e00613426565b600b54611c309190613316565b935050505090565b60026000600a8360ff1681548110611c5257611c526134c3565b60009182526020808320909101546001600160a01b03168352820192909252604001902054611c819084613445565b925060036000600a8360ff1681548110611c9d57611c9d6134c3565b60009182526020808320909101546001600160a01b03168352820192909252604001902054611ccc9083613445565b915080611cd881613477565b915050611b6c565b505b611cee6004600a61337b565b611cfe9065050d5fcd3e00613426565b600b54611d0b9190613316565b821015611d1e57611aed6004600a61337b565b611b0a8183613316565b60006001600160a01b038416611d8e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610913565b6001600160a01b038316611df05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610913565b60008211611e525760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610913565b6001600160a01b03841660009081526004602052604090205460ff1680611e9157506001600160a01b03831660009081526004602052604090205460ff165b15611f40576001600160a01b03841660009081526008602052604090205460ff16158015611ed857506001600160a01b03831660009081526008602052604090205460ff16155b15611f4057601354821115611f405760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610913565b600f546001600160a01b03848116911614801590611f7757506001600160a01b03831660009081526004602052604090205460ff16155b15612014576001600160a01b03831660009081526008602052604090205460ff166120145760145482611fa9856113b1565b611fb391906132fe565b11156120145760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201526930b63632ba29b4bd329760b11b6064820152608401610913565b6001600160a01b03841660009081526007602052604090205460019060ff168061205657506001600160a01b03841660009081526007602052604090205460ff165b1561205f575060005b6001600160a01b03841660009081526004602052604090205460ff161561217057601054600160a01b900460ff1661217057426011546012546120a291906132fe565b10156121705760006120b3306113b1565b90506127106120c46004600a61337b565b6120d49065050d5fcd3e00613426565b6120df906005613426565b6120e99190613316565b811061216e576127106120fe6004600a61337b565b61210e9065050d5fcd3e00613426565b61211990600a613426565b6121239190613316565b8110612160576127106121386004600a61337b565b6121489065050d5fcd3e00613426565b61215390600a613426565b61215d9190613316565b90505b61216981612185565b426012555b505b61217c858585846124cc565b95945050505050565b6010805460ff60a01b1916600160a01b17905560408051808201909152600e5461ffff80821683526201000090910416602082018190526121c657506124bc565b306000908152600660209081526040808320600f546001600160a01b031684529091529020546000191461221f57306000908152600660209081526040808320600f546001600160a01b03168452909152902060001990555b60006002826020015161ffff16836000015161ffff16856122409190613426565b61224a9190613316565b6122549190613316565b905060006122628285613445565b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811061229c5761229c6134c3565b6001600160a01b03928316602091820292909201810191909152600f546040805163ef8ef56f60e01b81529051919093169263ef8ef56f926004808301939192829003018186803b1580156122f057600080fd5b505afa158015612304573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123289190613051565b8160018151811061233b5761233b6134c3565b6001600160a01b039283166020918202929092010152600f5460405163791ac94760e01b815291169063791ac9479061238190859060009086903090429060040161328d565b600060405180830381600087803b15801561239b57600080fd5b505af11580156123af573d6000803e3d6000fd5b50479250600091508490506123c48684613426565b6123ce9190613316565b905084156124b557600f5460405163f305d71960e01b815230600482015260248101879052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b15801561243f57600080fd5b505af1158015612453573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906124789190613182565b505060408051838152602081018890527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b5050505050505b506010805460ff60a01b19169055565b6000806124db86868686612694565b6101008101516001600160a01b03881660009081526002602052604090205491925061250691613445565b6001600160a01b038088166000908152600260205260408082209390935560e08401519188168152919091205461253d91906132fe565b6001600160a01b0380871660009081526002602090815260408083209490945591891681526009909152205460ff16156125af576001600160a01b038616600090815260036020526040902054612595908590613445565b6001600160a01b0387166000908152600360205260409020555b6001600160a01b03851660009081526009602052604090205460ff161561260f5780516001600160a01b0386166000908152600360205260409020546125f591906132fe565b6001600160a01b0386166000908152600360205260409020555b60008161012001511180612627575060008160200151115b1561264957806101200151600b60008282546126439190613445565b90915550505b846001600160a01b0316866001600160a01b03166000805160206134f2833981519152836000015160405161268091815260200190565b60405180910390a350600195945050505050565b61269c612fda565b6126a4612fda565b6126ac611a52565b61014082018190526126be9085613426565b61010082015282156128bf576001600160a01b038516600090815260046020526040812054819081908190819081906127109060ff161561273f57600d5461ffff8082169850600160601b82048116975062010000820481169650600160501b820481169550600160401b820481169450600160301b9091041691506127a2565b6001600160a01b038d1660009081526004602052604090205460ff16156127a257600c5461ffff8082169850600160601b82048116975062010000820481169650600160501b820481169550600160401b820481169450600160301b9091041691505b806127ad888d613426565b6127b79190613316565b6020890152806127c7878d613426565b6127d19190613316565b6040890152806127e1868d613426565b6127eb9190613316565b6060890152806127fb858d613426565b6128059190613316565b608089015280612815848d613426565b61281f9190613316565b60a08901528061282f838d613426565b6128399190613316565b60c0890181905260a089015160808a015160608b015160408c015160208d015161286391906132fe565b61286d91906132fe565b61287791906132fe565b61288191906132fe565b61288b91906132fe565b612895908c613445565b885261014088015160208901516128ac9190613426565b610120890152506128f595505050505050565b60006020820181905260408201819052606082018190526080820181905260a0820181905260c082018190528482526101208201525b6040810151156129bb5780610140015181604001516129149190613426565b30600090815260026020526040812080549091906129339084906132fe565b90915550503060009081526009602052604090205460ff161561297b5760408082015130600090815260036020529182208054919290916129759084906132fe565b90915550505b306001600160a01b0316866001600160a01b03166000805160206134f283398151915283604001516040516129b291815260200190565b60405180910390a35b606081015115612add5780610140015181606001516129da9190613426565b61dead600090815260026020527f6a9609baa168169acaea398c4407efea4be641bb08e21e88806d9836fd9333cc8054909190612a189084906132fe565b909155505061dead60005260096020527f960b1051749987b45b5679007fff577a1c2f763ec21c15a6c5eb1930750037855460ff1615612a9b57606081015161dead600090815260036020527f262bb27bbdd95c1cdc8e16957e36e38579ea44f7f6413dd7a9c75939def06b2c8054909190612a959084906132fe565b90915550505b61dead6001600160a01b0316866001600160a01b03166000805160206134f28339815191528360600151604051612ad491815260200190565b60405180910390a35b608081015115612c47578061014001518160800151612afc9190613426565b734bda64c2e135e9c4f813a7cf6241821a0e8a7d8d600090815260026020527f035efbc49353aa9b8275872809e5537c505d6445bddcf80c1be03bedae7611958054909190612b4c9084906132fe565b9091555050734bda64c2e135e9c4f813a7cf6241821a0e8a7d8d60005260096020527fbbb9bc52f5838f275668f5beed93de5b188f196811b4eb46cc77d16b964fbbeb5460ff1615612bf3576080810151734bda64c2e135e9c4f813a7cf6241821a0e8a7d8d600090815260036020527f3d3355907503cb5dc26d01fcd0e9b9493621f76e439b600d5bc4acd5d4ce926f8054909190612bed9084906132fe565b90915550505b734bda64c2e135e9c4f813a7cf6241821a0e8a7d8d6001600160a01b0316866001600160a01b03166000805160206134f28339815191528360800151604051612c3e91815260200190565b60405180910390a35b60a081015115612db1578061014001518160a00151612c669190613426565b73dc6085035e331d7289126fdd27bafd84fec5dc67600090815260026020527faf3a5efe1f609b365be3c90e641a5715720ddbd893616f246652fa95e12a7f398054909190612cb69084906132fe565b909155505073dc6085035e331d7289126fdd27bafd84fec5dc6760005260096020527f990176404abe1c08901812f6523b19faab11cd3381778760248d118f7a9df0045460ff1615612d5d5760a081015173dc6085035e331d7289126fdd27bafd84fec5dc67600090815260036020527f06dafbc17a28e81956ea5e0d01050bd95ea93a5bfb51278297b7292efda453e08054909190612d579084906132fe565b90915550505b73dc6085035e331d7289126fdd27bafd84fec5dc676001600160a01b0316866001600160a01b03166000805160206134f28339815191528360a00151604051612da891815260200190565b60405180910390a35b60c081015115612f1b578061014001518160c00151612dd09190613426565b734ca0483a4234bcad8fa64010b71086b344001af3600090815260026020527fe96908a746f5856fb47ccb5f7f71fc1f474b1b09e42bd4095e8abc757a216d1a8054909190612e209084906132fe565b9091555050734ca0483a4234bcad8fa64010b71086b344001af360005260096020527faf997d58437ee002a6762cb0fea08242edcb6067c6c8d2b89ed35665ef3d0c195460ff1615612ec75760c0810151734ca0483a4234bcad8fa64010b71086b344001af3600090815260036020527f260af121988c50a655cb7a7ae4cf4a018dbfdc4f6f1104fa862eef0fd4d4ff508054909190612ec19084906132fe565b90915550505b734ca0483a4234bcad8fa64010b71086b344001af36001600160a01b0316866001600160a01b03166000805160206134f28339815191528360c00151604051612f1291815260200190565b60405180910390a35b8061014001518160c00151612f309190613426565b8161014001518260a00151612f459190613426565b8261014001518360800151612f5a9190613426565b8361014001518460600151612f6f9190613426565b8461014001518560400151612f849190613426565b856101200151612f9491906132fe565b612f9e91906132fe565b612fa891906132fe565b612fb291906132fe565b612fbc91906132fe565b816101000151612fcc9190613445565b60e082015295945050505050565b60405180610160016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60006020828403121561304657600080fd5b8135611004816134d9565b60006020828403121561306357600080fd5b8151611004816134d9565b6000806040838503121561308157600080fd5b823561308c816134d9565b9150602083013561309c816134d9565b809150509250929050565b6000806000606084860312156130bc57600080fd5b83356130c7816134d9565b925060208401356130d7816134d9565b929592945050506040919091013590565b600080604083850312156130fb57600080fd5b8235613106816134d9565b91506020830135801515811461309c57600080fd5b6000806040838503121561312e57600080fd5b8235613139816134d9565b946020939093013593505050565b60006020828403121561315957600080fd5b5035919050565b6000806040838503121561317357600080fd5b50508035926020909101359150565b60008060006060848603121561319757600080fd5b8351925060208401519150604084015190509250925092565b600060208083528351808285015260005b818110156131dd578581018301518582016040015282016131c1565b818111156131ef576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526011908201527021b0b63632b9101e979e9037bbb732b91760791b604082015260600190565b6020808252603d908201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660408201527f6572206f776e657220746f20746865207a65726f20616464726573732e000000606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156132dd5784516001600160a01b0316835293830193918301916001016132b8565b50506001600160a01b03969096166060850152505050608001529392505050565b6000821982111561331157613311613497565b500190565b60008261333357634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561337357816000190482111561335957613359613497565b8085161561336657918102915b93841c939080029061333d565b509250929050565b600061100460ff841683600082613394575060016108c3565b816133a1575060006108c3565b81600181146133b757600281146133c1576133dd565b60019150506108c3565b60ff8411156133d2576133d2613497565b50506001821b6108c3565b5060208310610133831016604e8410600b8410161715613400575081810a6108c3565b61340a8383613338565b806000190482111561341e5761341e613497565b029392505050565b600081600019048311821515161561344057613440613497565b500290565b60008282101561345757613457613497565b500390565b600060001982141561347057613470613497565b5060010190565b600060ff821660ff81141561348e5761348e613497565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146134ee57600080fd5b5056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122069376a041cf38084bbf01e0fa12a35ee74540beddc33bf6100777cc65f56cb7b64736f6c63430008070033