Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- LobsterSwap
- Optimization enabled
- false
- Compiler version
- v0.8.12+commit.f00d7308
- Verified at
- 2026-03-04T04:52:56.466207Z
contracts/Ozone/LobsterSwap.sol
pragma solidity 0.8.12;
// SPDX-License-Identifier: MIT
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
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 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
);
}
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(
address account
) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(
address to,
uint256 amount
) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(
address owner,
address spender
) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(
address spender,
uint256 amount
) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
* - the caller must have allowance for ``from``'s tokens of at least
* `amount`.
*/
function transferFrom(
address from,
address to,
uint256 amount
) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(
address spender,
uint256 addedValue
) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(
address spender,
uint256 subtractedValue
) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(
currentAllowance >= subtractedValue,
"ERC20: decreased allowance below zero"
);
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
/**
* @dev Moves `amount` of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
*/
function _transfer(
address from,
address to,
uint256 amount
) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(
fromBalance >= amount,
"ERC20: transfer amount exceeds balance"
);
unchecked {
_balances[from] = fromBalance - amount;
// Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
// decrementing then incrementing.
_balances[to] += amount;
}
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
unchecked {
// Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
_balances[account] += amount;
}
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
// Overflow not possible: amount <= accountBalance <= totalSupply.
_totalSupply -= amount;
}
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `amount`.
*
* Does not update the allowance amount in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Might emit an {Approval} event.
*/
function _spendAllowance(
address owner,
address spender,
uint256 amount
) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(
currentAllowance >= amount,
"ERC20: insufficient allowance"
);
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* has been transferred to `to`.
* - when `from` is zero, `amount` tokens have been minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens have been burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}
contract Ownable is Context {
address private _owner;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
constructor() {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() external virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(
newOwner != address(0),
"Ownable: new owner is the zero address"
);
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
library Address {
function isContract(address account) internal view returns (bool) {
return account.code.length > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(
address(this).balance >= amount,
"Address: insufficient balance"
);
(bool success, ) = recipient.call{value: amount}("");
require(
success,
"Address: unable to send value, recipient may have reverted"
);
}
function functionCall(
address target,
bytes memory data
) internal returns (bytes memory) {
return
functionCallWithValue(
target,
data,
0,
"Address: low-level call failed"
);
}
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @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"
);
(bool success, bytes memory returndata) = target.call{value: value}(
data
);
return
verifyCallResultFromTarget(
target,
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) {
(bool success, bytes memory returndata) = target.staticcall(data);
return
verifyCallResultFromTarget(
target,
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) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return
verifyCallResultFromTarget(
target,
success,
returndata,
errorMessage
);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or 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 {
_revert(returndata, errorMessage);
}
}
function _revert(
bytes memory returndata,
string memory errorMessage
) private pure {
// 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
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
library SafeERC20 {
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(
token,
abi.encodeWithSelector(token.transfer.selector, to, value)
);
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(
token,
abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
);
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(
data,
"SafeERC20: low-level call failed"
);
if (returndata.length > 0) {
require(
abi.decode(returndata, (bool)),
"SafeERC20: ERC20 operation did not succeed"
);
}
}
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(
token,
abi.encodeWithSelector(token.approve.selector, spender, value)
);
}
}
interface IDexRouter {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapETHForExactTokens(
uint amountOut,
address[] calldata path,
address to,
uint deadline
) external payable returns (uint[] memory amounts);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
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,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function getAmountsOut(
uint amountIn,
address[] calldata path
) external view returns (uint[] memory amounts);
}
interface IDexFactory {
function createPair(
address tokenA,
address tokenB
) external returns (address pair);
}
contract LobsterSwap is ERC20, Ownable {
mapping(address => bool) public exemptFromFees;
mapping(address => bool) public exemptFromLimits;
bool public tradingActive;
mapping(address => bool) public isAMMPair;
uint256 public maxTransaction;
uint256 public maxWallet;
address public taxReceiverAddress;
uint256 public buyTotalTax;
uint256 public sellTotalTax;
bool public limitsInEffect = true;
bool public swapEnabled = true;
bool private swapping;
uint256 public swapTokensAtAmt;
address public lpPair;
IDexRouter public dexRouter;
uint256 public constant FEE_DIVISOR = 10000;
// events
event UpdatedMaxTransaction(uint256 newMax);
event UpdatedMaxWallet(uint256 newMax);
event SetExemptFromFees(address _address, bool _isExempt);
event SetExemptFromLimits(address _address, bool _isExempt);
event RemovedLimits();
event UpdatedBuyTax(uint256 newAmt);
event UpdatedSellTax(uint256 newAmt);
modifier lockSwap() {
swapping = true;
_;
swapping = false;
}
// constructor
constructor() ERC20("Lobster Swap", "LOB") {
address newOwner = 0x62a82947C089dA2b5b7cC481172f94c26e667c13;
uint256 _totalSupplyInTokens = 1 * 10 ** 9; // 1 billion
_mint(newOwner, _totalSupplyInTokens * (10 ** decimals()));
address _v2Router = 0x9f0E8A353968D748c1b7FA02356d5A2e0Ab15ceC;
dexRouter = IDexRouter(_v2Router);
maxTransaction = (totalSupply() * 20) / 1000; // 2%
maxWallet = (totalSupply() * 20) / 1000; // 2%
swapTokensAtAmt = (totalSupply() * 25) / 100000; // 0.025%
taxReceiverAddress = 0x503228BA569e4e50fa803eb5f56BD9f3Df3Bb8cF;
buyTotalTax = 300; //3 % Buy Tax
sellTotalTax = 500; // 5 % Sell Tax
lpPair = IDexFactory(dexRouter.factory()).createPair(
address(this),
dexRouter.WETH()
);
isAMMPair[lpPair] = true;
exemptFromLimits[lpPair] = true;
exemptFromLimits[msg.sender] = true;
exemptFromLimits[address(this)] = true;
exemptFromLimits[_v2Router] = true;
exemptFromLimits[taxReceiverAddress] = true;
exemptFromLimits[newOwner] = true;
exemptFromFees[newOwner] = true;
exemptFromFees[msg.sender] = true;
exemptFromFees[address(this)] = true;
exemptFromFees[_v2Router] = true;
exemptFromLimits[taxReceiverAddress] = true;
_approve(address(this), address(dexRouter), type(uint256).max);
_approve(address(msg.sender), address(dexRouter), totalSupply());
}
function _transfer(
address from,
address to,
uint256 amount
) internal virtual override {
if (exemptFromFees[from] || exemptFromFees[to]) {
super._transfer(from, to, amount);
return;
}
checkLimits(from, to, amount);
amount -= handleTax(from, to, amount);
super._transfer(from, to, amount);
}
function checkLimits(
address from,
address to,
uint256 amount
) internal view {
if (!tradingActive) {
require(
exemptFromFees[from] || exemptFromFees[to],
"Trading not active"
);
}
if (limitsInEffect) {
// buy
if (isAMMPair[from] && !exemptFromLimits[to]) {
require(
amount <= maxTransaction,
"Buy transfer amount exceeded."
);
require(
amount + balanceOf(to) <= maxWallet,
"Unable to exceed Max Wallet"
);
}
// sell
else if (isAMMPair[to] && !exemptFromLimits[from]) {
require(
amount <= maxTransaction,
"Sell transfer amount exceeds the maxTransactionAmt."
);
} else if (!exemptFromLimits[to]) {
require(
amount + balanceOf(to) <= maxWallet,
"Unable to exceed Max Wallet"
);
}
}
}
function handleTax(
address from,
address to,
uint256 amount
) internal returns (uint256) {
if (
balanceOf(address(this)) >= swapTokensAtAmt &&
swapEnabled &&
!swapping &&
isAMMPair[to]
) {
swapping = true;
swapBack();
swapping = false;
}
uint256 tax = 0;
// on sell
if (isAMMPair[to] && sellTotalTax > 0) {
tax = (amount * sellTotalTax) / FEE_DIVISOR;
}
// on buy
else if (isAMMPair[from] && buyTotalTax > 0) {
tax = (amount * buyTotalTax) / FEE_DIVISOR;
}
if (tax > 0) {
super._transfer(from, address(this), tax);
}
return tax;
}
function swapTokensForETH(uint256 tokenAmt) private {
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = address(dexRouter.WETH());
dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmt,
0,
path,
address(taxReceiverAddress),
block.timestamp
);
}
function swapBack() private lockSwap {
uint256 contractBalance = balanceOf(address(this));
if (contractBalance > swapTokensAtAmt * 40) {
contractBalance = swapTokensAtAmt * 40;
}
swapTokensForETH(contractBalance);
}
// owner functions
function setExemptFromFees(
address _address,
bool _isExempt
) external onlyOwner {
require(_address != address(0), "Zero Address");
exemptFromFees[_address] = _isExempt;
emit SetExemptFromFees(_address, _isExempt);
}
function setExemptFromLimits(
address _address,
bool _isExempt
) external onlyOwner {
require(_address != address(0), "Zero Address");
if (!_isExempt) {
require(_address != lpPair, "Cannot remove pair");
}
exemptFromLimits[_address] = _isExempt;
emit SetExemptFromLimits(_address, _isExempt);
}
function updateMaxTransaction(uint256 newNumInTokens) external onlyOwner {
require(
newNumInTokens >= ((totalSupply() * 5) / 1000) / (10 ** decimals()),
"Too low"
);
maxTransaction = newNumInTokens * (10 ** decimals());
emit UpdatedMaxTransaction(maxTransaction);
}
function updateMaxWallet(uint256 newNumInTokens) external onlyOwner {
require(
newNumInTokens >=
((totalSupply() * 15) / 1000) / (10 ** decimals()),
"Too low"
);
maxWallet = newNumInTokens * (10 ** decimals());
emit UpdatedMaxWallet(maxWallet);
}
function updateBuyTax(uint256 _taxWithTwoDecimals) external onlyOwner {
buyTotalTax = _taxWithTwoDecimals;
require(buyTotalTax <= 1000, "Keep tax below 10%");
emit UpdatedBuyTax(buyTotalTax);
}
function updateSellTax(uint256 _taxWithTwoDecimals) external onlyOwner {
sellTotalTax = _taxWithTwoDecimals;
require(sellTotalTax <= 1000, "Keep tax below 10%");
emit UpdatedSellTax(sellTotalTax);
}
function enableTrading() external onlyOwner {
tradingActive = true;
}
function removeLimits() external onlyOwner {
limitsInEffect = false;
maxTransaction = totalSupply();
maxWallet = totalSupply();
emit RemovedLimits();
}
function airdropToWallets(
address[] calldata wallets,
uint256[] calldata amountsInWei
) external onlyOwner {
require(
wallets.length == amountsInWei.length,
"arrays length mismatch"
);
for (uint256 i = 0; i < wallets.length; i++) {
super._transfer(msg.sender, wallets[i], amountsInWei[i]);
}
}
function rescueTokens(address _token, address _to) external onlyOwner {
require(_token != address(0), "_token address cannot be 0");
uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
SafeERC20.safeTransfer(IERC20(_token), _to, _contractBalance);
}
function updateTaxAddress(address _address) external onlyOwner {
require(_address != address(0), "zero address");
taxReceiverAddress = _address;
}
}
Compiler Settings
{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}},"optimizer":{"runs":200,"enabled":false},"libraries":{}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","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":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RemovedLimits","inputs":[],"anonymous":false},{"type":"event","name":"SetExemptFromFees","inputs":[{"type":"address","name":"_address","internalType":"address","indexed":false},{"type":"bool","name":"_isExempt","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"SetExemptFromLimits","inputs":[{"type":"address","name":"_address","internalType":"address","indexed":false},{"type":"bool","name":"_isExempt","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UpdatedBuyTax","inputs":[{"type":"uint256","name":"newAmt","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UpdatedMaxTransaction","inputs":[{"type":"uint256","name":"newMax","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UpdatedMaxWallet","inputs":[{"type":"uint256","name":"newMax","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UpdatedSellTax","inputs":[{"type":"uint256","name":"newAmt","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"FEE_DIVISOR","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"airdropToWallets","inputs":[{"type":"address[]","name":"wallets","internalType":"address[]"},{"type":"uint256[]","name":"amountsInWei","internalType":"uint256[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"buyTotalTax","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDexRouter"}],"name":"dexRouter","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"enableTrading","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"exemptFromFees","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"exemptFromLimits","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isAMMPair","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"limitsInEffect","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"lpPair","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxTransaction","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeLimits","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rescueTokens","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_to","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"sellTotalTax","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExemptFromFees","inputs":[{"type":"address","name":"_address","internalType":"address"},{"type":"bool","name":"_isExempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExemptFromLimits","inputs":[{"type":"address","name":"_address","internalType":"address"},{"type":"bool","name":"_isExempt","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"swapEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapTokensAtAmt","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"taxReceiverAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"tradingActive","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateBuyTax","inputs":[{"type":"uint256","name":"_taxWithTwoDecimals","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateMaxTransaction","inputs":[{"type":"uint256","name":"newNumInTokens","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateMaxWallet","inputs":[{"type":"uint256","name":"newNumInTokens","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateSellTax","inputs":[{"type":"uint256","name":"_taxWithTwoDecimals","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateTaxAddress","inputs":[{"type":"address","name":"_address","internalType":"address"}]}]
Contract Creation Code
0x60806040526001600f60006101000a81548160ff0219169083151502179055506001600f60016101000a81548160ff0219169083151502179055503480156200004757600080fd5b506040518060400160405280600c81526020017f4c6f6273746572205377617000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4c4f4200000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000cc92919062000deb565b508060049080519060200190620000e592919062000deb565b5050506000620000fa62000a8560201b60201c565b905080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35060007362a82947c089da2b5b7cc481172f94c26e667c1390506000633b9aca009050620001f782620001d062000a8d60201b60201c565b600a620001de919062001035565b83620001eb919062001086565b62000a9660201b60201c565b6000739f0e8a353968d748c1b7fa02356d5a2e0ab15cec905080601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103e860146200026662000c0460201b60201c565b62000272919062001086565b6200027e919062001116565b600a819055506103e860146200029962000c0460201b60201c565b620002a5919062001086565b620002b1919062001116565b600b81905550620186a06019620002cd62000c0460201b60201c565b620002d9919062001086565b620002e5919062001116565b60108190555073503228ba569e4e50fa803eb5f56bd9f3df3bb8cf600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061012c600d819055506101f4600e81905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003c0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003e69190620011b8565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000470573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004969190620011b8565b6040518363ffffffff1660e01b8152600401620004b5929190620011fb565b6020604051808303816000875af1158015620004d5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004fb9190620011b8565b601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160096000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000a3830601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62000c0e60201b60201c565b62000a7c33601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000a7062000c0460201b60201c565b62000c0e60201b60201c565b505050620014cb565b600033905090565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000b09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b009062001289565b60405180910390fd5b62000b1d6000838362000de160201b60201c565b806002600082825462000b319190620012ab565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000be4919062001319565b60405180910390a362000c006000838362000de660201b60201c565b5050565b6000600254905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000c81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c7890620013ac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000cf4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000ceb9062001444565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405162000dd4919062001319565b60405180910390a3505050565b505050565b505050565b82805462000df99062001495565b90600052602060002090601f01602090048101928262000e1d576000855562000e69565b82601f1062000e3857805160ff191683800117855562000e69565b8280016001018555821562000e69579182015b8281111562000e6857825182559160200191906001019062000e4b565b5b50905062000e78919062000e7c565b5090565b5b8082111562000e9757600081600090555060010162000e7d565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000f295780860481111562000f015762000f0062000e9b565b5b600185161562000f115780820291505b808102905062000f218562000eca565b945062000ee1565b94509492505050565b60008262000f44576001905062001017565b8162000f54576000905062001017565b816001811462000f6d576002811462000f785762000fae565b600191505062001017565b60ff84111562000f8d5762000f8c62000e9b565b5b8360020a91508482111562000fa75762000fa662000e9b565b5b5062001017565b5060208310610133831016604e8410600b841016171562000fe85782820a90508381111562000fe25762000fe162000e9b565b5b62001017565b62000ff7848484600162000ed7565b9250905081840481111562001011576200101062000e9b565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b600062001042826200101e565b91506200104f8362001028565b92506200107e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000f32565b905092915050565b600062001093826200101e565b9150620010a0836200101e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620010dc57620010db62000e9b565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062001123826200101e565b915062001130836200101e565b925082620011435762001142620010e7565b5b828204905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620011808262001153565b9050919050565b620011928162001173565b81146200119e57600080fd5b50565b600081519050620011b28162001187565b92915050565b600060208284031215620011d157620011d06200114e565b5b6000620011e184828501620011a1565b91505092915050565b620011f58162001173565b82525050565b6000604082019050620012126000830185620011ea565b620012216020830184620011ea565b9392505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062001271601f8362001228565b91506200127e8262001239565b602082019050919050565b60006020820190508181036000830152620012a48162001262565b9050919050565b6000620012b8826200101e565b9150620012c5836200101e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620012fd57620012fc62000e9b565b5b828201905092915050565b62001313816200101e565b82525050565b600060208201905062001330600083018462001308565b92915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006200139460248362001228565b9150620013a18262001336565b604082019050919050565b60006020820190508181036000830152620013c78162001385565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006200142c60228362001228565b91506200143982620013ce565b604082019050919050565b600060208201905081810360008301526200145f816200141d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620014ae57607f821691505b60208210811415620014c557620014c462001466565b5b50919050565b61470080620014db6000396000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c806370a082311161013b578063a457c2d7116100b8578063c78d0fa01161007c578063c78d0fa0146106bb578063dd62ed3e146106d9578063e27a55fe14610709578063f2fde38b14610727578063f8b45b051461074357610248565b8063a457c2d7146105ef578063a9059cbb1461061f578063b0249cc61461064f578063bbc0c7421461067f578063c3f70b521461069d57610248565b80638d3e6e40116100ff5780638d3e6e40146105495780638da5cb5b1461057957806395d89b41146105975780639e93ad8e146105b5578063a13d1a2b146105d357610248565b806370a08231146104df578063715018a61461050f578063751039fc1461051957806377b27d1f146105235780638a8c523c1461053f57610248565b8063313ce567116101c95780635431c94e1161018d5780635431c94e1461043b5780635a90a49e146104575780635adf655a146104875780635df6e68e146104a35780636ddd1713146104c157610248565b8063313ce5671461039557806339509351146103b3578063436d3340146103e3578063452ed4f1146103ff5780634a62bb651461041d57610248565b806312185a391161021057806312185a39146102f357806318160ddd1461030f5780631c499ab01461032d5780632307b4411461034957806323b872dd1461036557610248565b80630517d13d1461024d57806306fdde03146102695780630758d92414610287578063095ea7b3146102a5578063114ca2ed146102d5575b600080fd5b61026760048036038101906102629190612faf565b610761565b005b6102716108da565b60405161027e9190613075565b60405180910390f35b61028f61096c565b60405161029c9190613116565b60405180910390f35b6102bf60048036038101906102ba919061316f565b610992565b6040516102cc91906131ca565b60405180910390f35b6102dd6109b5565b6040516102ea91906131f4565b60405180910390f35b61030d60048036038101906103089190612faf565b6109db565b005b610317610afc565b604051610324919061321e565b60405180910390f35b61034760048036038101906103429190612faf565b610b06565b005b610363600480360381019061035e91906132f4565b610c7f565b005b61037f600480360381019061037a9190613375565b610dd1565b60405161038c91906131ca565b60405180910390f35b61039d610e00565b6040516103aa91906133e4565b60405180910390f35b6103cd60048036038101906103c8919061316f565b610e09565b6040516103da91906131ca565b60405180910390f35b6103fd60048036038101906103f89190612faf565b610e40565b005b610407610f61565b60405161041491906131f4565b60405180910390f35b610425610f87565b60405161043291906131ca565b60405180910390f35b610455600480360381019061045091906133ff565b610f9a565b005b610471600480360381019061046c919061343f565b61112f565b60405161047e91906131ca565b60405180910390f35b6104a1600480360381019061049c919061343f565b61114f565b005b6104ab61129a565b6040516104b8919061321e565b60405180910390f35b6104c96112a0565b6040516104d691906131ca565b60405180910390f35b6104f960048036038101906104f4919061343f565b6112b3565b604051610506919061321e565b60405180910390f35b6105176112fb565b005b610521611453565b005b61053d60048036038101906105389190613498565b61154f565b005b6105476116ea565b005b610563600480360381019061055e919061343f565b61179e565b60405161057091906131ca565b60405180910390f35b6105816117be565b60405161058e91906131f4565b60405180910390f35b61059f6117e8565b6040516105ac9190613075565b60405180910390f35b6105bd61187a565b6040516105ca919061321e565b60405180910390f35b6105ed60048036038101906105e89190613498565b611880565b005b6106096004803603810190610604919061316f565b611ab2565b60405161061691906131ca565b60405180910390f35b6106396004803603810190610634919061316f565b611b29565b60405161064691906131ca565b60405180910390f35b6106696004803603810190610664919061343f565b611b4c565b60405161067691906131ca565b60405180910390f35b610687611b6c565b60405161069491906131ca565b60405180910390f35b6106a5611b7f565b6040516106b2919061321e565b60405180910390f35b6106c3611b85565b6040516106d0919061321e565b60405180910390f35b6106f360048036038101906106ee91906133ff565b611b8b565b604051610700919061321e565b60405180910390f35b610711611c12565b60405161071e919061321e565b60405180910390f35b610741600480360381019061073c919061343f565b611c18565b005b61074b611ddf565b604051610758919061321e565b60405180910390f35b610769611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146107f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ef90613524565b60405180910390fd5b610800610e00565b600a61080c91906136a6565b6103e86005610819610afc565b61082391906136f1565b61082d919061377a565b610837919061377a565b811015610879576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610870906137f7565b60405180910390fd5b610881610e00565b600a61088d91906136a6565b8161089891906136f1565b600a819055507f76a9278644b7300961aa0e7e86f10934585987f1daf1c6ecc971c18376691574600a546040516108cf919061321e565b60405180910390a150565b6060600380546108e990613846565b80601f016020809104026020016040519081016040528092919081815260200182805461091590613846565b80156109625780601f1061093757610100808354040283529160200191610962565b820191906000526020600020905b81548152906001019060200180831161094557829003601f168201915b5050505050905090565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008061099d611de5565b90506109aa818585611ded565b600191505092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6109e3611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6990613524565b60405180910390fd5b80600e819055506103e8600e541115610ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab7906138c4565b60405180910390fd5b7fa02824f65350567bc405e202b741e7ca6274004a9feeb44149df72b8bd599c97600e54604051610af1919061321e565b60405180910390a150565b6000600254905090565b610b0e611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9490613524565b60405180910390fd5b610ba5610e00565b600a610bb191906136a6565b6103e8600f610bbe610afc565b610bc891906136f1565b610bd2919061377a565b610bdc919061377a565b811015610c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c15906137f7565b60405180910390fd5b610c26610e00565b600a610c3291906136a6565b81610c3d91906136f1565b600b819055507f3046ad62de8b70d396246aaed19ff2559ff20df8706520cbde58320766c42762600b54604051610c74919061321e565b60405180910390a150565b610c87611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d90613524565b60405180910390fd5b818190508484905014610d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5590613930565b60405180910390fd5b60005b84849050811015610dca57610db733868684818110610d8357610d82613950565b5b9050602002016020810190610d98919061343f565b858585818110610dab57610daa613950565b5b90506020020135611fb8565b8080610dc29061397f565b915050610d61565b5050505050565b600080610ddc611de5565b9050610de9858285612230565b610df48585856122bc565b60019150509392505050565b60006012905090565b600080610e14611de5565b9050610e35818585610e268589611b8b565b610e3091906139c8565b611ded565b600191505092915050565b610e48611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ece90613524565b60405180910390fd5b80600d819055506103e8600d541115610f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c906138c4565b60405180910390fd5b7f5380a61520019ce8270d583f62f1b2b9f4f4372e1acaaf708f4865cecece0508600d54604051610f56919061321e565b60405180910390a150565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f60009054906101000a900460ff1681565b610fa2611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102890613524565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109890613a6a565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110dc91906131f4565b602060405180830381865afa1580156110f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111d9190613a9f565b905061112a8383836123a6565b505050565b60066020528060005260406000206000915054906101000a900460ff1681565b611157611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd90613524565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124d90613b18565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d5481565b600f60019054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611303611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138990613524565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61145b611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190613524565b60405180910390fd5b6000600f60006101000a81548160ff02191690831515021790555061150d610afc565b600a8190555061151b610afc565b600b819055507fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c60405160405180910390a1565b611557611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dd90613524565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164d90613b84565b60405180910390fd5b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f998cce27cbf44405c67eb636a634d5e2f2e6ff248b3d71fbbbb022f3c4c6dd2d82826040516116de929190613ba4565b60405180910390a15050565b6116f2611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177890613524565b60405180910390fd5b6001600860006101000a81548160ff021916908315150217905550565b60076020528060005260406000206000915054906101000a900460ff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546117f790613846565b80601f016020809104026020016040519081016040528092919081815260200182805461182390613846565b80156118705780601f1061184557610100808354040283529160200191611870565b820191906000526020600020905b81548152906001019060200180831161185357829003601f168201915b5050505050905090565b61271081565b611888611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190e90613524565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197e90613b84565b60405180910390fd5b80611a1e57601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1490613c19565b60405180910390fd5b5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f8f9f40630a1d139e6cf69b4f447ca47a36f10a017524efaa38252e516fa227ce8282604051611aa6929190613ba4565b60405180910390a15050565b600080611abd611de5565b90506000611acb8286611b8b565b905083811015611b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0790613cab565b60405180910390fd5b611b1d8286868403611ded565b60019250505092915050565b600080611b34611de5565b9050611b418185856122bc565b600191505092915050565b60096020528060005260406000206000915054906101000a900460ff1681565b600860009054906101000a900460ff1681565b600a5481565b60105481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600e5481565b611c20611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca690613524565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1690613d3d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b5481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5490613dcf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec490613e61565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611fab919061321e565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201f90613ef3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208f90613f85565b60405180910390fd5b6120a383838361242c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612129576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212090614017565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612217919061321e565b60405180910390a361222a848484612431565b50505050565b600061223c8484611b8b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146122b657818110156122a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229f90614083565b60405180910390fd5b6122b58484848403611ded565b5b50505050565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061235d5750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156123725761236d838383611fb8565b6123a1565b61237d838383612436565b61238883838361282e565b8161239391906140a3565b90506123a0838383611fb8565b5b505050565b6124278363a9059cbb60e01b84846040516024016123c59291906140d7565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612a2b565b505050565b505050565b505050565b600860009054906101000a900460ff1661252b57600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806124eb5750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61252a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125219061414c565b60405180910390fd5b5b600f60009054906101000a900460ff161561282957600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156125e35750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561268a57600a5481111561262d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612624906141b8565b60405180910390fd5b600b54612639836112b3565b8261264491906139c8565b1115612685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267c90614224565b60405180910390fd5b612828565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561272d5750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561277c57600a54811115612777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276e906142b6565b60405180910390fd5b612827565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661282657600b546127d9836112b3565b826127e491906139c8565b1115612825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281c90614224565b60405180910390fd5b5b5b5b5b505050565b600060105461283c306112b3565b101580156128565750600f60019054906101000a900460ff165b801561286f5750600f60029054906101000a900460ff16155b80156128c45750600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612908576001600f60026101000a81548160ff0219169083151502179055506128ec612af2565b6000600f60026101000a81548160ff0219169083151502179055505b6000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561296557506000600e54115b1561298c57612710600e548461297b91906136f1565b612985919061377a565b9050612a0b565b600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156129e757506000600d54115b15612a0a57612710600d54846129fd91906136f1565b612a07919061377a565b90505b5b6000811115612a2057612a1f853083611fb8565b5b809150509392505050565b6000612a8d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612b699092919063ffffffff16565b9050600081511115612aed5780806020019051810190612aad91906142eb565b612aec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae39061438a565b60405180910390fd5b5b505050565b6001600f60026101000a81548160ff0219169083151502179055506000612b18306112b3565b90506028601054612b2991906136f1565b811115612b42576028601054612b3f91906136f1565b90505b612b4b81612b81565b506000600f60026101000a81548160ff021916908315150217905550565b6060612b788484600085612db9565b90509392505050565b6000600267ffffffffffffffff811115612b9e57612b9d6143aa565b5b604051908082528060200260200182016040528015612bcc5781602001602082028036833780820191505090505b5090503081600081518110612be457612be3613950565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612caf91906143ee565b81600181518110612cc357612cc2613950565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac94783600084600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401612d83959493929190614514565b600060405180830381600087803b158015612d9d57600080fd5b505af1158015612db1573d6000803e3d6000fd5b505050505050565b606082471015612dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df5906145e0565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612e279190614647565b60006040518083038185875af1925050503d8060008114612e64576040519150601f19603f3d011682016040523d82523d6000602084013e612e69565b606091505b5091509150612e7a87838387612e86565b92505050949350505050565b60608315612ee957600083511415612ee157612ea185612efc565b612ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed7906146aa565b60405180910390fd5b5b829050612ef4565b612ef38383612f1f565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115612f325781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f669190613075565b60405180910390fd5b600080fd5b600080fd5b6000819050919050565b612f8c81612f79565b8114612f9757600080fd5b50565b600081359050612fa981612f83565b92915050565b600060208284031215612fc557612fc4612f6f565b5b6000612fd384828501612f9a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613016578082015181840152602081019050612ffb565b83811115613025576000848401525b50505050565b6000601f19601f8301169050919050565b600061304782612fdc565b6130518185612fe7565b9350613061818560208601612ff8565b61306a8161302b565b840191505092915050565b6000602082019050818103600083015261308f818461303c565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006130dc6130d76130d284613097565b6130b7565b613097565b9050919050565b60006130ee826130c1565b9050919050565b6000613100826130e3565b9050919050565b613110816130f5565b82525050565b600060208201905061312b6000830184613107565b92915050565b600061313c82613097565b9050919050565b61314c81613131565b811461315757600080fd5b50565b60008135905061316981613143565b92915050565b6000806040838503121561318657613185612f6f565b5b60006131948582860161315a565b92505060206131a585828601612f9a565b9150509250929050565b60008115159050919050565b6131c4816131af565b82525050565b60006020820190506131df60008301846131bb565b92915050565b6131ee81613131565b82525050565b600060208201905061320960008301846131e5565b92915050565b61321881612f79565b82525050565b6000602082019050613233600083018461320f565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261325e5761325d613239565b5b8235905067ffffffffffffffff81111561327b5761327a61323e565b5b60208301915083602082028301111561329757613296613243565b5b9250929050565b60008083601f8401126132b4576132b3613239565b5b8235905067ffffffffffffffff8111156132d1576132d061323e565b5b6020830191508360208202830111156132ed576132ec613243565b5b9250929050565b6000806000806040858703121561330e5761330d612f6f565b5b600085013567ffffffffffffffff81111561332c5761332b612f74565b5b61333887828801613248565b9450945050602085013567ffffffffffffffff81111561335b5761335a612f74565b5b6133678782880161329e565b925092505092959194509250565b60008060006060848603121561338e5761338d612f6f565b5b600061339c8682870161315a565b93505060206133ad8682870161315a565b92505060406133be86828701612f9a565b9150509250925092565b600060ff82169050919050565b6133de816133c8565b82525050565b60006020820190506133f960008301846133d5565b92915050565b6000806040838503121561341657613415612f6f565b5b60006134248582860161315a565b92505060206134358582860161315a565b9150509250929050565b60006020828403121561345557613454612f6f565b5b60006134638482850161315a565b91505092915050565b613475816131af565b811461348057600080fd5b50565b6000813590506134928161346c565b92915050565b600080604083850312156134af576134ae612f6f565b5b60006134bd8582860161315a565b92505060206134ce85828601613483565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061350e602083612fe7565b9150613519826134d8565b602082019050919050565b6000602082019050818103600083015261353d81613501565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156135ca578086048111156135a6576135a5613544565b5b60018516156135b55780820291505b80810290506135c385613573565b945061358a565b94509492505050565b6000826135e3576001905061369f565b816135f1576000905061369f565b8160018114613607576002811461361157613640565b600191505061369f565b60ff84111561362357613622613544565b5b8360020a91508482111561363a57613639613544565b5b5061369f565b5060208310610133831016604e8410600b84101617156136755782820a9050838111156136705761366f613544565b5b61369f565b6136828484846001613580565b9250905081840481111561369957613698613544565b5b81810290505b9392505050565b60006136b182612f79565b91506136bc836133c8565b92506136e97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846135d3565b905092915050565b60006136fc82612f79565b915061370783612f79565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156137405761373f613544565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061378582612f79565b915061379083612f79565b9250826137a05761379f61374b565b5b828204905092915050565b7f546f6f206c6f7700000000000000000000000000000000000000000000000000600082015250565b60006137e1600783612fe7565b91506137ec826137ab565b602082019050919050565b60006020820190508181036000830152613810816137d4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061385e57607f821691505b6020821081141561387257613871613817565b5b50919050565b7f4b656570207461782062656c6f77203130250000000000000000000000000000600082015250565b60006138ae601283612fe7565b91506138b982613878565b602082019050919050565b600060208201905081810360008301526138dd816138a1565b9050919050565b7f617272617973206c656e677468206d69736d6174636800000000000000000000600082015250565b600061391a601683612fe7565b9150613925826138e4565b602082019050919050565b600060208201905081810360008301526139498161390d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061398a82612f79565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156139bd576139bc613544565b5b600182019050919050565b60006139d382612f79565b91506139de83612f79565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a1357613a12613544565b5b828201905092915050565b7f5f746f6b656e20616464726573732063616e6e6f742062652030000000000000600082015250565b6000613a54601a83612fe7565b9150613a5f82613a1e565b602082019050919050565b60006020820190508181036000830152613a8381613a47565b9050919050565b600081519050613a9981612f83565b92915050565b600060208284031215613ab557613ab4612f6f565b5b6000613ac384828501613a8a565b91505092915050565b7f7a65726f20616464726573730000000000000000000000000000000000000000600082015250565b6000613b02600c83612fe7565b9150613b0d82613acc565b602082019050919050565b60006020820190508181036000830152613b3181613af5565b9050919050565b7f5a65726f20416464726573730000000000000000000000000000000000000000600082015250565b6000613b6e600c83612fe7565b9150613b7982613b38565b602082019050919050565b60006020820190508181036000830152613b9d81613b61565b9050919050565b6000604082019050613bb960008301856131e5565b613bc660208301846131bb565b9392505050565b7f43616e6e6f742072656d6f766520706169720000000000000000000000000000600082015250565b6000613c03601283612fe7565b9150613c0e82613bcd565b602082019050919050565b60006020820190508181036000830152613c3281613bf6565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613c95602583612fe7565b9150613ca082613c39565b604082019050919050565b60006020820190508181036000830152613cc481613c88565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613d27602683612fe7565b9150613d3282613ccb565b604082019050919050565b60006020820190508181036000830152613d5681613d1a565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613db9602483612fe7565b9150613dc482613d5d565b604082019050919050565b60006020820190508181036000830152613de881613dac565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e4b602283612fe7565b9150613e5682613def565b604082019050919050565b60006020820190508181036000830152613e7a81613e3e565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613edd602583612fe7565b9150613ee882613e81565b604082019050919050565b60006020820190508181036000830152613f0c81613ed0565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613f6f602383612fe7565b9150613f7a82613f13565b604082019050919050565b60006020820190508181036000830152613f9e81613f62565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614001602683612fe7565b915061400c82613fa5565b604082019050919050565b6000602082019050818103600083015261403081613ff4565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061406d601d83612fe7565b915061407882614037565b602082019050919050565b6000602082019050818103600083015261409c81614060565b9050919050565b60006140ae82612f79565b91506140b983612f79565b9250828210156140cc576140cb613544565b5b828203905092915050565b60006040820190506140ec60008301856131e5565b6140f9602083018461320f565b9392505050565b7f54726164696e67206e6f74206163746976650000000000000000000000000000600082015250565b6000614136601283612fe7565b915061414182614100565b602082019050919050565b6000602082019050818103600083015261416581614129565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656465642e000000600082015250565b60006141a2601d83612fe7565b91506141ad8261416c565b602082019050919050565b600060208201905081810360008301526141d181614195565b9050919050565b7f556e61626c6520746f20657863656564204d61782057616c6c65740000000000600082015250565b600061420e601b83612fe7565b9150614219826141d8565b602082019050919050565b6000602082019050818103600083015261423d81614201565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d742e00000000000000000000000000602082015250565b60006142a0603383612fe7565b91506142ab82614244565b604082019050919050565b600060208201905081810360008301526142cf81614293565b9050919050565b6000815190506142e58161346c565b92915050565b60006020828403121561430157614300612f6f565b5b600061430f848285016142d6565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614374602a83612fe7565b915061437f82614318565b604082019050919050565b600060208201905081810360008301526143a381614367565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000815190506143e881613143565b92915050565b60006020828403121561440457614403612f6f565b5b6000614412848285016143d9565b91505092915050565b6000819050919050565b600061444061443b6144368461441b565b6130b7565b612f79565b9050919050565b61445081614425565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61448b81613131565b82525050565b600061449d8383614482565b60208301905092915050565b6000602082019050919050565b60006144c182614456565b6144cb8185614461565b93506144d683614472565b8060005b838110156145075781516144ee8882614491565b97506144f9836144a9565b9250506001810190506144da565b5085935050505092915050565b600060a082019050614529600083018861320f565b6145366020830187614447565b818103604083015261454881866144b6565b905061455760608301856131e5565b614564608083018461320f565b9695505050505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006145ca602683612fe7565b91506145d58261456e565b604082019050919050565b600060208201905081810360008301526145f9816145bd565b9050919050565b600081519050919050565b600081905092915050565b600061462182614600565b61462b818561460b565b935061463b818560208601612ff8565b80840191505092915050565b60006146538284614616565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614694601d83612fe7565b915061469f8261465e565b602082019050919050565b600060208201905081810360008301526146c381614687565b905091905056fea26469706673582212204e1a47ae950dd0318f05728d4042acc0cb6ba18e35404e772608563b4a90749d64736f6c634300080c0033
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106102485760003560e01c806370a082311161013b578063a457c2d7116100b8578063c78d0fa01161007c578063c78d0fa0146106bb578063dd62ed3e146106d9578063e27a55fe14610709578063f2fde38b14610727578063f8b45b051461074357610248565b8063a457c2d7146105ef578063a9059cbb1461061f578063b0249cc61461064f578063bbc0c7421461067f578063c3f70b521461069d57610248565b80638d3e6e40116100ff5780638d3e6e40146105495780638da5cb5b1461057957806395d89b41146105975780639e93ad8e146105b5578063a13d1a2b146105d357610248565b806370a08231146104df578063715018a61461050f578063751039fc1461051957806377b27d1f146105235780638a8c523c1461053f57610248565b8063313ce567116101c95780635431c94e1161018d5780635431c94e1461043b5780635a90a49e146104575780635adf655a146104875780635df6e68e146104a35780636ddd1713146104c157610248565b8063313ce5671461039557806339509351146103b3578063436d3340146103e3578063452ed4f1146103ff5780634a62bb651461041d57610248565b806312185a391161021057806312185a39146102f357806318160ddd1461030f5780631c499ab01461032d5780632307b4411461034957806323b872dd1461036557610248565b80630517d13d1461024d57806306fdde03146102695780630758d92414610287578063095ea7b3146102a5578063114ca2ed146102d5575b600080fd5b61026760048036038101906102629190612faf565b610761565b005b6102716108da565b60405161027e9190613075565b60405180910390f35b61028f61096c565b60405161029c9190613116565b60405180910390f35b6102bf60048036038101906102ba919061316f565b610992565b6040516102cc91906131ca565b60405180910390f35b6102dd6109b5565b6040516102ea91906131f4565b60405180910390f35b61030d60048036038101906103089190612faf565b6109db565b005b610317610afc565b604051610324919061321e565b60405180910390f35b61034760048036038101906103429190612faf565b610b06565b005b610363600480360381019061035e91906132f4565b610c7f565b005b61037f600480360381019061037a9190613375565b610dd1565b60405161038c91906131ca565b60405180910390f35b61039d610e00565b6040516103aa91906133e4565b60405180910390f35b6103cd60048036038101906103c8919061316f565b610e09565b6040516103da91906131ca565b60405180910390f35b6103fd60048036038101906103f89190612faf565b610e40565b005b610407610f61565b60405161041491906131f4565b60405180910390f35b610425610f87565b60405161043291906131ca565b60405180910390f35b610455600480360381019061045091906133ff565b610f9a565b005b610471600480360381019061046c919061343f565b61112f565b60405161047e91906131ca565b60405180910390f35b6104a1600480360381019061049c919061343f565b61114f565b005b6104ab61129a565b6040516104b8919061321e565b60405180910390f35b6104c96112a0565b6040516104d691906131ca565b60405180910390f35b6104f960048036038101906104f4919061343f565b6112b3565b604051610506919061321e565b60405180910390f35b6105176112fb565b005b610521611453565b005b61053d60048036038101906105389190613498565b61154f565b005b6105476116ea565b005b610563600480360381019061055e919061343f565b61179e565b60405161057091906131ca565b60405180910390f35b6105816117be565b60405161058e91906131f4565b60405180910390f35b61059f6117e8565b6040516105ac9190613075565b60405180910390f35b6105bd61187a565b6040516105ca919061321e565b60405180910390f35b6105ed60048036038101906105e89190613498565b611880565b005b6106096004803603810190610604919061316f565b611ab2565b60405161061691906131ca565b60405180910390f35b6106396004803603810190610634919061316f565b611b29565b60405161064691906131ca565b60405180910390f35b6106696004803603810190610664919061343f565b611b4c565b60405161067691906131ca565b60405180910390f35b610687611b6c565b60405161069491906131ca565b60405180910390f35b6106a5611b7f565b6040516106b2919061321e565b60405180910390f35b6106c3611b85565b6040516106d0919061321e565b60405180910390f35b6106f360048036038101906106ee91906133ff565b611b8b565b604051610700919061321e565b60405180910390f35b610711611c12565b60405161071e919061321e565b60405180910390f35b610741600480360381019061073c919061343f565b611c18565b005b61074b611ddf565b604051610758919061321e565b60405180910390f35b610769611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146107f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ef90613524565b60405180910390fd5b610800610e00565b600a61080c91906136a6565b6103e86005610819610afc565b61082391906136f1565b61082d919061377a565b610837919061377a565b811015610879576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610870906137f7565b60405180910390fd5b610881610e00565b600a61088d91906136a6565b8161089891906136f1565b600a819055507f76a9278644b7300961aa0e7e86f10934585987f1daf1c6ecc971c18376691574600a546040516108cf919061321e565b60405180910390a150565b6060600380546108e990613846565b80601f016020809104026020016040519081016040528092919081815260200182805461091590613846565b80156109625780601f1061093757610100808354040283529160200191610962565b820191906000526020600020905b81548152906001019060200180831161094557829003601f168201915b5050505050905090565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008061099d611de5565b90506109aa818585611ded565b600191505092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6109e3611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6990613524565b60405180910390fd5b80600e819055506103e8600e541115610ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab7906138c4565b60405180910390fd5b7fa02824f65350567bc405e202b741e7ca6274004a9feeb44149df72b8bd599c97600e54604051610af1919061321e565b60405180910390a150565b6000600254905090565b610b0e611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9490613524565b60405180910390fd5b610ba5610e00565b600a610bb191906136a6565b6103e8600f610bbe610afc565b610bc891906136f1565b610bd2919061377a565b610bdc919061377a565b811015610c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c15906137f7565b60405180910390fd5b610c26610e00565b600a610c3291906136a6565b81610c3d91906136f1565b600b819055507f3046ad62de8b70d396246aaed19ff2559ff20df8706520cbde58320766c42762600b54604051610c74919061321e565b60405180910390a150565b610c87611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d90613524565b60405180910390fd5b818190508484905014610d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5590613930565b60405180910390fd5b60005b84849050811015610dca57610db733868684818110610d8357610d82613950565b5b9050602002016020810190610d98919061343f565b858585818110610dab57610daa613950565b5b90506020020135611fb8565b8080610dc29061397f565b915050610d61565b5050505050565b600080610ddc611de5565b9050610de9858285612230565b610df48585856122bc565b60019150509392505050565b60006012905090565b600080610e14611de5565b9050610e35818585610e268589611b8b565b610e3091906139c8565b611ded565b600191505092915050565b610e48611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ece90613524565b60405180910390fd5b80600d819055506103e8600d541115610f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1c906138c4565b60405180910390fd5b7f5380a61520019ce8270d583f62f1b2b9f4f4372e1acaaf708f4865cecece0508600d54604051610f56919061321e565b60405180910390a150565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600f60009054906101000a900460ff1681565b610fa2611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102890613524565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109890613a6a565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110dc91906131f4565b602060405180830381865afa1580156110f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111d9190613a9f565b905061112a8383836123a6565b505050565b60066020528060005260406000206000915054906101000a900460ff1681565b611157611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111dd90613524565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124d90613b18565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d5481565b600f60019054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611303611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138990613524565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61145b611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190613524565b60405180910390fd5b6000600f60006101000a81548160ff02191690831515021790555061150d610afc565b600a8190555061151b610afc565b600b819055507fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c60405160405180910390a1565b611557611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dd90613524565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164d90613b84565b60405180910390fd5b80600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f998cce27cbf44405c67eb636a634d5e2f2e6ff248b3d71fbbbb022f3c4c6dd2d82826040516116de929190613ba4565b60405180910390a15050565b6116f2611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611781576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177890613524565b60405180910390fd5b6001600860006101000a81548160ff021916908315150217905550565b60076020528060005260406000206000915054906101000a900460ff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546117f790613846565b80601f016020809104026020016040519081016040528092919081815260200182805461182390613846565b80156118705780601f1061184557610100808354040283529160200191611870565b820191906000526020600020905b81548152906001019060200180831161185357829003601f168201915b5050505050905090565b61271081565b611888611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190e90613524565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197e90613b84565b60405180910390fd5b80611a1e57601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1490613c19565b60405180910390fd5b5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f8f9f40630a1d139e6cf69b4f447ca47a36f10a017524efaa38252e516fa227ce8282604051611aa6929190613ba4565b60405180910390a15050565b600080611abd611de5565b90506000611acb8286611b8b565b905083811015611b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0790613cab565b60405180910390fd5b611b1d8286868403611ded565b60019250505092915050565b600080611b34611de5565b9050611b418185856122bc565b600191505092915050565b60096020528060005260406000206000915054906101000a900460ff1681565b600860009054906101000a900460ff1681565b600a5481565b60105481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600e5481565b611c20611de5565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca690613524565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1690613d3d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b5481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5490613dcf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec490613e61565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611fab919061321e565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201f90613ef3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208f90613f85565b60405180910390fd5b6120a383838361242c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612129576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212090614017565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612217919061321e565b60405180910390a361222a848484612431565b50505050565b600061223c8484611b8b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146122b657818110156122a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229f90614083565b60405180910390fd5b6122b58484848403611ded565b5b50505050565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061235d5750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156123725761236d838383611fb8565b6123a1565b61237d838383612436565b61238883838361282e565b8161239391906140a3565b90506123a0838383611fb8565b5b505050565b6124278363a9059cbb60e01b84846040516024016123c59291906140d7565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612a2b565b505050565b505050565b505050565b600860009054906101000a900460ff1661252b57600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806124eb5750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61252a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125219061414c565b60405180910390fd5b5b600f60009054906101000a900460ff161561282957600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156125e35750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561268a57600a5481111561262d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612624906141b8565b60405180910390fd5b600b54612639836112b3565b8261264491906139c8565b1115612685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267c90614224565b60405180910390fd5b612828565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561272d5750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561277c57600a54811115612777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276e906142b6565b60405180910390fd5b612827565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661282657600b546127d9836112b3565b826127e491906139c8565b1115612825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281c90614224565b60405180910390fd5b5b5b5b5b505050565b600060105461283c306112b3565b101580156128565750600f60019054906101000a900460ff165b801561286f5750600f60029054906101000a900460ff16155b80156128c45750600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612908576001600f60026101000a81548160ff0219169083151502179055506128ec612af2565b6000600f60026101000a81548160ff0219169083151502179055505b6000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561296557506000600e54115b1561298c57612710600e548461297b91906136f1565b612985919061377a565b9050612a0b565b600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156129e757506000600d54115b15612a0a57612710600d54846129fd91906136f1565b612a07919061377a565b90505b5b6000811115612a2057612a1f853083611fb8565b5b809150509392505050565b6000612a8d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612b699092919063ffffffff16565b9050600081511115612aed5780806020019051810190612aad91906142eb565b612aec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae39061438a565b60405180910390fd5b5b505050565b6001600f60026101000a81548160ff0219169083151502179055506000612b18306112b3565b90506028601054612b2991906136f1565b811115612b42576028601054612b3f91906136f1565b90505b612b4b81612b81565b506000600f60026101000a81548160ff021916908315150217905550565b6060612b788484600085612db9565b90509392505050565b6000600267ffffffffffffffff811115612b9e57612b9d6143aa565b5b604051908082528060200260200182016040528015612bcc5781602001602082028036833780820191505090505b5090503081600081518110612be457612be3613950565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612caf91906143ee565b81600181518110612cc357612cc2613950565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac94783600084600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401612d83959493929190614514565b600060405180830381600087803b158015612d9d57600080fd5b505af1158015612db1573d6000803e3d6000fd5b505050505050565b606082471015612dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df5906145e0565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612e279190614647565b60006040518083038185875af1925050503d8060008114612e64576040519150601f19603f3d011682016040523d82523d6000602084013e612e69565b606091505b5091509150612e7a87838387612e86565b92505050949350505050565b60608315612ee957600083511415612ee157612ea185612efc565b612ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed7906146aa565b60405180910390fd5b5b829050612ef4565b612ef38383612f1f565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115612f325781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f669190613075565b60405180910390fd5b600080fd5b600080fd5b6000819050919050565b612f8c81612f79565b8114612f9757600080fd5b50565b600081359050612fa981612f83565b92915050565b600060208284031215612fc557612fc4612f6f565b5b6000612fd384828501612f9a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613016578082015181840152602081019050612ffb565b83811115613025576000848401525b50505050565b6000601f19601f8301169050919050565b600061304782612fdc565b6130518185612fe7565b9350613061818560208601612ff8565b61306a8161302b565b840191505092915050565b6000602082019050818103600083015261308f818461303c565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006130dc6130d76130d284613097565b6130b7565b613097565b9050919050565b60006130ee826130c1565b9050919050565b6000613100826130e3565b9050919050565b613110816130f5565b82525050565b600060208201905061312b6000830184613107565b92915050565b600061313c82613097565b9050919050565b61314c81613131565b811461315757600080fd5b50565b60008135905061316981613143565b92915050565b6000806040838503121561318657613185612f6f565b5b60006131948582860161315a565b92505060206131a585828601612f9a565b9150509250929050565b60008115159050919050565b6131c4816131af565b82525050565b60006020820190506131df60008301846131bb565b92915050565b6131ee81613131565b82525050565b600060208201905061320960008301846131e5565b92915050565b61321881612f79565b82525050565b6000602082019050613233600083018461320f565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261325e5761325d613239565b5b8235905067ffffffffffffffff81111561327b5761327a61323e565b5b60208301915083602082028301111561329757613296613243565b5b9250929050565b60008083601f8401126132b4576132b3613239565b5b8235905067ffffffffffffffff8111156132d1576132d061323e565b5b6020830191508360208202830111156132ed576132ec613243565b5b9250929050565b6000806000806040858703121561330e5761330d612f6f565b5b600085013567ffffffffffffffff81111561332c5761332b612f74565b5b61333887828801613248565b9450945050602085013567ffffffffffffffff81111561335b5761335a612f74565b5b6133678782880161329e565b925092505092959194509250565b60008060006060848603121561338e5761338d612f6f565b5b600061339c8682870161315a565b93505060206133ad8682870161315a565b92505060406133be86828701612f9a565b9150509250925092565b600060ff82169050919050565b6133de816133c8565b82525050565b60006020820190506133f960008301846133d5565b92915050565b6000806040838503121561341657613415612f6f565b5b60006134248582860161315a565b92505060206134358582860161315a565b9150509250929050565b60006020828403121561345557613454612f6f565b5b60006134638482850161315a565b91505092915050565b613475816131af565b811461348057600080fd5b50565b6000813590506134928161346c565b92915050565b600080604083850312156134af576134ae612f6f565b5b60006134bd8582860161315a565b92505060206134ce85828601613483565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061350e602083612fe7565b9150613519826134d8565b602082019050919050565b6000602082019050818103600083015261353d81613501565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156135ca578086048111156135a6576135a5613544565b5b60018516156135b55780820291505b80810290506135c385613573565b945061358a565b94509492505050565b6000826135e3576001905061369f565b816135f1576000905061369f565b8160018114613607576002811461361157613640565b600191505061369f565b60ff84111561362357613622613544565b5b8360020a91508482111561363a57613639613544565b5b5061369f565b5060208310610133831016604e8410600b84101617156136755782820a9050838111156136705761366f613544565b5b61369f565b6136828484846001613580565b9250905081840481111561369957613698613544565b5b81810290505b9392505050565b60006136b182612f79565b91506136bc836133c8565b92506136e97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846135d3565b905092915050565b60006136fc82612f79565b915061370783612f79565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156137405761373f613544565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061378582612f79565b915061379083612f79565b9250826137a05761379f61374b565b5b828204905092915050565b7f546f6f206c6f7700000000000000000000000000000000000000000000000000600082015250565b60006137e1600783612fe7565b91506137ec826137ab565b602082019050919050565b60006020820190508181036000830152613810816137d4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061385e57607f821691505b6020821081141561387257613871613817565b5b50919050565b7f4b656570207461782062656c6f77203130250000000000000000000000000000600082015250565b60006138ae601283612fe7565b91506138b982613878565b602082019050919050565b600060208201905081810360008301526138dd816138a1565b9050919050565b7f617272617973206c656e677468206d69736d6174636800000000000000000000600082015250565b600061391a601683612fe7565b9150613925826138e4565b602082019050919050565b600060208201905081810360008301526139498161390d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061398a82612f79565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156139bd576139bc613544565b5b600182019050919050565b60006139d382612f79565b91506139de83612f79565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a1357613a12613544565b5b828201905092915050565b7f5f746f6b656e20616464726573732063616e6e6f742062652030000000000000600082015250565b6000613a54601a83612fe7565b9150613a5f82613a1e565b602082019050919050565b60006020820190508181036000830152613a8381613a47565b9050919050565b600081519050613a9981612f83565b92915050565b600060208284031215613ab557613ab4612f6f565b5b6000613ac384828501613a8a565b91505092915050565b7f7a65726f20616464726573730000000000000000000000000000000000000000600082015250565b6000613b02600c83612fe7565b9150613b0d82613acc565b602082019050919050565b60006020820190508181036000830152613b3181613af5565b9050919050565b7f5a65726f20416464726573730000000000000000000000000000000000000000600082015250565b6000613b6e600c83612fe7565b9150613b7982613b38565b602082019050919050565b60006020820190508181036000830152613b9d81613b61565b9050919050565b6000604082019050613bb960008301856131e5565b613bc660208301846131bb565b9392505050565b7f43616e6e6f742072656d6f766520706169720000000000000000000000000000600082015250565b6000613c03601283612fe7565b9150613c0e82613bcd565b602082019050919050565b60006020820190508181036000830152613c3281613bf6565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613c95602583612fe7565b9150613ca082613c39565b604082019050919050565b60006020820190508181036000830152613cc481613c88565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613d27602683612fe7565b9150613d3282613ccb565b604082019050919050565b60006020820190508181036000830152613d5681613d1a565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613db9602483612fe7565b9150613dc482613d5d565b604082019050919050565b60006020820190508181036000830152613de881613dac565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e4b602283612fe7565b9150613e5682613def565b604082019050919050565b60006020820190508181036000830152613e7a81613e3e565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613edd602583612fe7565b9150613ee882613e81565b604082019050919050565b60006020820190508181036000830152613f0c81613ed0565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613f6f602383612fe7565b9150613f7a82613f13565b604082019050919050565b60006020820190508181036000830152613f9e81613f62565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614001602683612fe7565b915061400c82613fa5565b604082019050919050565b6000602082019050818103600083015261403081613ff4565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061406d601d83612fe7565b915061407882614037565b602082019050919050565b6000602082019050818103600083015261409c81614060565b9050919050565b60006140ae82612f79565b91506140b983612f79565b9250828210156140cc576140cb613544565b5b828203905092915050565b60006040820190506140ec60008301856131e5565b6140f9602083018461320f565b9392505050565b7f54726164696e67206e6f74206163746976650000000000000000000000000000600082015250565b6000614136601283612fe7565b915061414182614100565b602082019050919050565b6000602082019050818103600083015261416581614129565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656465642e000000600082015250565b60006141a2601d83612fe7565b91506141ad8261416c565b602082019050919050565b600060208201905081810360008301526141d181614195565b9050919050565b7f556e61626c6520746f20657863656564204d61782057616c6c65740000000000600082015250565b600061420e601b83612fe7565b9150614219826141d8565b602082019050919050565b6000602082019050818103600083015261423d81614201565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d742e00000000000000000000000000602082015250565b60006142a0603383612fe7565b91506142ab82614244565b604082019050919050565b600060208201905081810360008301526142cf81614293565b9050919050565b6000815190506142e58161346c565b92915050565b60006020828403121561430157614300612f6f565b5b600061430f848285016142d6565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614374602a83612fe7565b915061437f82614318565b604082019050919050565b600060208201905081810360008301526143a381614367565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000815190506143e881613143565b92915050565b60006020828403121561440457614403612f6f565b5b6000614412848285016143d9565b91505092915050565b6000819050919050565b600061444061443b6144368461441b565b6130b7565b612f79565b9050919050565b61445081614425565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61448b81613131565b82525050565b600061449d8383614482565b60208301905092915050565b6000602082019050919050565b60006144c182614456565b6144cb8185614461565b93506144d683614472565b8060005b838110156145075781516144ee8882614491565b97506144f9836144a9565b9250506001810190506144da565b5085935050505092915050565b600060a082019050614529600083018861320f565b6145366020830187614447565b818103604083015261454881866144b6565b905061455760608301856131e5565b614564608083018461320f565b9695505050505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006145ca602683612fe7565b91506145d58261456e565b604082019050919050565b600060208201905081810360008301526145f9816145bd565b9050919050565b600081519050919050565b600081905092915050565b600061462182614600565b61462b818561460b565b935061463b818560208601612ff8565b80840191505092915050565b60006146538284614616565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614694601d83612fe7565b915061469f8261465e565b602082019050919050565b600060208201905081810360008301526146c381614687565b905091905056fea26469706673582212204e1a47ae950dd0318f05728d4042acc0cb6ba18e35404e772608563b4a90749d64736f6c634300080c0033