ERC-20
Overview
Max Total Supply
1,000,000,000 QUDEFI
Holders
57
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
6,987,320.056552217418412611 QUDEFIValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
QuDefi
Compiler Version
v0.8.25+commit.b61c2a91
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-10-17 */ // SPDX-License-Identifier: MIT /* // Telegram: https://t.me/QuDefi_QuLabs // X: https://x.com/Qudefiai // Web: https://www.qulabs.io/ */ pragma solidity 0.8.25; // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 ); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 value ) external returns (bool); } // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol) /** * @dev Interface for the optional metadata functions from the ERC20 standard. */ 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); } // OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol) /** * @dev Standard ERC20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens. */ interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance( address sender, uint256 balance, uint256 needed ); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance( address spender, uint256 allowance, uint256 needed ); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender); } /** * @dev Standard ERC721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. */ interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator); } /** * @dev Standard ERC1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. */ interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance( address sender, uint256 balance, uint256 needed, uint256 tokenId ); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); } // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol) /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. */ abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors { 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 returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual 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 returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual 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 `value`. */ function transfer(address to, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _transfer(owner, to, value); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `value` 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 value) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, value); 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 `value`. * - the caller must have allowance for ``from``'s tokens of at least * `value`. */ function transferFrom( address from, address to, uint256 value ) public virtual returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, value); _transfer(from, to, value); return true; } /** * @dev Moves a `value` 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. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _transfer( address from, address to, uint256 value ) internal { if (from == address(0)) { revert ERC20InvalidSender(address(0)); } if (to == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(from, to, value); } /** * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding * this function. * * Emits a {Transfer} event. */ function _update( address from, address to, uint256 value ) internal virtual { if (from == address(0)) { // Overflow check required: The rest of the code assumes that totalSupply never overflows _totalSupply += value; } else { uint256 fromBalance = _balances[from]; if (fromBalance < value) { revert ERC20InsufficientBalance(from, fromBalance, value); } unchecked { // Overflow not possible: value <= fromBalance <= totalSupply. _balances[from] = fromBalance - value; } } if (to == address(0)) { unchecked { // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply. _totalSupply -= value; } } else { unchecked { // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256. _balances[to] += value; } } emit Transfer(from, to, value); } /** * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0). * Relies on the `_update` mechanism * * Emits a {Transfer} event with `from` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _mint(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(address(0), account, value); } /** * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply. * Relies on the `_update` mechanism. * * Emits a {Transfer} event with `to` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead */ function _burn(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidSender(address(0)); } _update(account, address(0), value); } /** * @dev Sets `value` 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. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve( address owner, address spender, uint256 value ) internal { _approve(owner, spender, value, true); } /** * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event. * * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any * `Approval` event during `transferFrom` operations. * * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to * true using the following override: * ``` * function _approve(address owner, address spender, uint256 value, bool) internal virtual override { * super._approve(owner, spender, value, true); * } * ``` * * Requirements are the same as {_approve}. */ function _approve( address owner, address spender, uint256 value, bool emitEvent ) internal virtual { if (owner == address(0)) { revert ERC20InvalidApprover(address(0)); } if (spender == address(0)) { revert ERC20InvalidSpender(address(0)); } _allowances[owner][spender] = value; if (emitEvent) { emit Approval(owner, spender, value); } } /** * @dev Updates `owner` s allowance for `spender` based on spent `value`. * * Does not update the allowance value in case of infinite allowance. * Revert if not enough allowance is available. * * Does not emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 value ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { if (currentAllowance < value) { revert ERC20InsufficientAllowance( spender, currentAllowance, value ); } unchecked { _approve(owner, spender, currentAllowance - value, false); } } } } // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } interface IUniswapV2Factory { function createPair(address tokenA, address tokenB) external returns (address pair); } interface IUniswapV2Router { function factory() external pure returns (address); function WETH() external pure returns (address); function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } contract QuDefi is Ownable, ERC20 { IUniswapV2Router public immutable uniswapV2Router; address public constant ZERO_ADDRESS = address(0); address public constant DEAD_ADDRESS = address(0xdEaD); address public immutable uniswapV2Pair; address public operationsWallet; address public developmentWallet; bool public isLimitsEnabled; bool public isCooldownEnabled; bool public isTaxEnabled; bool private inSwapBack; bool public isLaunched; uint256 public launchBlock; uint256 public launchTime; uint256 private lastSwapBackExecutionBlock; uint256 public constant MAX_FEE = 99; uint256 public maxBuy; uint256 public maxSell; uint256 public maxWallet; uint256 public swapTokensAtAmount; uint256 public buyFee; uint256 public sellFee; uint256 public transferFee; mapping(address => bool) public isBot; mapping(address => bool) public isExcludedFromFees; mapping(address => bool) public isExcludedFromLimits; mapping(address => bool) public automatedMarketMakerPairs; mapping(address => uint256) private _holderLastTransferTimestamp; event Launch(); event SetOperationsWallet(address newWallet, address oldWallet); event SetDevelopmentWallet(address newWallet, address oldWallet); event SetLimitsEnabled(bool status); event SetCooldownEnabled(bool status); event SetTaxesEnabled(bool status); event SetMaxBuy(uint256 amount); event SetMaxSell(uint256 amount); event SetMaxWallet(uint256 amount); event SetSwapTokensAtAmount(uint256 newValue, uint256 oldValue); event SetBuyFees(uint256 newValue, uint256 oldValue); event SetSellFees(uint256 newValue, uint256 oldValue); event SetTransferFees(uint256 newValue, uint256 oldValue); event ExcludeFromFees(address account, bool isExcluded); event ExcludeFromLimits(address account, bool isExcluded); event SetBots(address account, bool isExcluded); event SetAutomatedMarketMakerPair(address pair, bool value); event WithdrawStuckTokens(address token, uint256 amount); modifier lockSwapBack() { inSwapBack = true; _; inSwapBack = false; } constructor() Ownable(msg.sender) ERC20("QuDefi", "QUDEFI") { address sender = msg.sender; _mint(sender, 1_000_000_000 ether); uint256 totalSupply = totalSupply(); operationsWallet = 0xb96B4c36d6Fc350BD038762aabAd1bFb8AB691d8; developmentWallet = 0xb96B4c36d6Fc350BD038762aabAd1bFb8AB691d8; maxBuy = (totalSupply * 20) / 1000; maxSell = (totalSupply * 20) / 1000; maxWallet = (totalSupply * 20) / 1000; swapTokensAtAmount = (totalSupply * 5) / 10000; isLimitsEnabled = true; isCooldownEnabled = true; isTaxEnabled = true; buyFee = 25; sellFee = 40; transferFee = 25; uniswapV2Router = IUniswapV2Router( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair( address(this), uniswapV2Router.WETH() ); _setAutomatedMarketMakerPair(uniswapV2Pair, true); _approve(address(this), address(uniswapV2Router), type(uint256).max); _excludeFromFees(address(this), true); _excludeFromFees(DEAD_ADDRESS, true); _excludeFromFees(sender, true); _excludeFromFees(operationsWallet, true); _excludeFromFees(developmentWallet, true); _excludeFromLimits(address(this), true); _excludeFromLimits(DEAD_ADDRESS, true); _excludeFromLimits(sender, true); _excludeFromLimits(operationsWallet, true); _excludeFromLimits(developmentWallet, true); } receive() external payable {} fallback() external payable {} function _transferOwnership(address newOwner) internal override { address oldOwner = owner(); if (oldOwner != address(0)) { _excludeFromFees(oldOwner, false); _excludeFromLimits(oldOwner, false); } _excludeFromFees(newOwner, true); _excludeFromLimits(newOwner, true); super._transferOwnership(newOwner); } function permitTrading() external onlyOwner { require(!isLaunched, "Already Launched"); isLaunched = true; launchBlock = block.number; launchTime = block.timestamp; emit Launch(); } function setOperationsWallet(address _operationsWallet) external onlyOwner { require(_operationsWallet != address(0), "Address Zero"); address oldWallet = operationsWallet; operationsWallet = _operationsWallet; emit SetOperationsWallet(operationsWallet, oldWallet); } function setDevelopmentWallet(address _developmentWallet) external onlyOwner { require(_developmentWallet != address(0), "Address Zero"); address oldWallet = developmentWallet; developmentWallet = _developmentWallet; emit SetDevelopmentWallet(developmentWallet, oldWallet); } function setLimitsEnabled(bool value) external onlyOwner { isLimitsEnabled = value; emit SetLimitsEnabled(value); } function setCooldownEnabled(bool value) external onlyOwner { isCooldownEnabled = value; emit SetCooldownEnabled(value); } function setTaxesEnabled(bool value) external onlyOwner { isTaxEnabled = value; emit SetTaxesEnabled(value); } function setMaxBuy(uint256 amount) external onlyOwner { require(amount >= ((totalSupply() * 2) / 1000), "AmountTooLow"); maxBuy = amount; emit SetMaxBuy(maxBuy); } function setMaxSell(uint256 amount) external onlyOwner { require(amount >= ((totalSupply() * 2) / 1000), "AmountTooLow"); maxSell = amount; emit SetMaxSell(maxSell); } function setMaxWallet(uint256 amount) external onlyOwner { require(amount >= ((totalSupply() * 3) / 1000), "AmountTooLow"); maxWallet = amount; emit SetMaxWallet(maxWallet); } function setSwapTokensAtAmount(uint256 amount) external onlyOwner { uint256 _totalSupply = totalSupply(); require(amount >= (_totalSupply * 1) / 1000000, "AmountTooLow"); require(amount <= (_totalSupply * 5) / 1000, "AmountTooHigh"); uint256 oldValue = swapTokensAtAmount; swapTokensAtAmount = amount; emit SetSwapTokensAtAmount(amount, oldValue); } function setBuyFees(uint256 _buyFee) external onlyOwner { require(_buyFee <= 50, "FeeTooHigh"); uint256 oldValue = buyFee; buyFee = _buyFee; emit SetBuyFees(_buyFee, oldValue); } function setSellFees(uint256 _sellFee) external onlyOwner { require(_sellFee <= 99, "FeeTooHigh"); uint256 oldValue = sellFee; sellFee = _sellFee; emit SetSellFees(_sellFee, oldValue); } function setTransferFees(uint256 _transferFee) external onlyOwner { require(_transferFee <= 50, "FeeTooHigh"); uint256 oldValue = transferFee; transferFee = _transferFee; emit SetTransferFees(_transferFee, oldValue); } function excludeFromFees(address[] calldata accounts, bool value) external onlyOwner { for (uint256 i = 0; i < accounts.length; i++) { _excludeFromFees(accounts[i], value); } } function excludeFromLimits(address[] calldata accounts, bool value) external onlyOwner { for (uint256 i = 0; i < accounts.length; i++) { _excludeFromLimits(accounts[i], value); } } function setBots(address[] calldata accounts, bool value) external onlyOwner { for (uint256 i = 0; i < accounts.length; i++) { if ( (!automatedMarketMakerPairs[accounts[i]]) && (accounts[i] != address(uniswapV2Router)) && (accounts[i] != address(this)) && (accounts[i] != ZERO_ADDRESS) && (!isExcludedFromFees[accounts[i]] && !isExcludedFromLimits[accounts[i]]) ) _setBots(accounts[i], value); } } function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner { require(!automatedMarketMakerPairs[pair], "AMMAlreadySet"); _setAutomatedMarketMakerPair(pair, value); } function withdrawStuckTokens(address _token) external onlyOwner { address sender = msg.sender; uint256 amount; if (_token == ZERO_ADDRESS) { bool success; amount = address(this).balance; require(amount > 0, "NoNativeTokens"); (success, ) = address(sender).call{value: amount}(""); require(success, "FailedToWithdrawNativeTokens"); } else { amount = IERC20(_token).balanceOf(address(this)); require(amount > 0, "NoTokens"); IERC20(_token).transfer(msg.sender, amount); } emit WithdrawStuckTokens(_token, amount); } function _update( address from, address to, uint256 amount ) internal virtual override { address sender = msg.sender; address origin = tx.origin; uint256 blockNumber = block.number; require(!isBot[from], "BotDetected"); require(sender == from || !isBot[sender], "BotDetected"); require( origin == from || origin == sender || !isBot[origin], "BotDetected" ); require( isLaunched || isExcludedFromLimits[from] || isExcludedFromLimits[to], "NotLaunched" ); bool limits = isLimitsEnabled && !inSwapBack && !(isExcludedFromLimits[from] || isExcludedFromLimits[to]); if (limits) { if ( from != owner() && to != owner() && to != ZERO_ADDRESS && to != DEAD_ADDRESS ) { if (isCooldownEnabled) { if (to != address(uniswapV2Router) && to != uniswapV2Pair) { require( _holderLastTransferTimestamp[origin] < blockNumber - 3 && _holderLastTransferTimestamp[to] < blockNumber - 3, "TransferDelay" ); _holderLastTransferTimestamp[origin] = blockNumber; _holderLastTransferTimestamp[to] = blockNumber; } } if ( automatedMarketMakerPairs[from] && !isExcludedFromLimits[to] ) { require(amount <= maxBuy, "MaxBuyAmountExceed"); require( amount + balanceOf(to) <= maxWallet, "MaxWalletAmountExceed" ); } else if ( automatedMarketMakerPairs[to] && !isExcludedFromLimits[from] ) { require(amount <= maxSell, "MaxSellAmountExceed"); } else if (!isExcludedFromLimits[to]) { require( amount + balanceOf(to) <= maxWallet, "MaxWalletAmountExceed" ); } } } bool takeFee = isTaxEnabled && !inSwapBack && !(isExcludedFromFees[from] || isExcludedFromFees[to]); if (takeFee) { uint256 fees = 0; if (automatedMarketMakerPairs[to] && sellFee > 0) { fees = (amount * sellFee) / 100; } else if (automatedMarketMakerPairs[from] && buyFee > 0) { fees = (amount * buyFee) / 100; } else if ( !automatedMarketMakerPairs[to] && !automatedMarketMakerPairs[from] && transferFee > 0 ) { fees = (amount * transferFee) / 100; } if (fees > 0) { amount -= fees; super._update(from, address(this), fees); } } uint256 balance = balanceOf(address(this)); bool shouldSwap = balance >= swapTokensAtAmount; if (takeFee && !automatedMarketMakerPairs[from] && shouldSwap) { if (blockNumber > lastSwapBackExecutionBlock) { _swapBack(balance); lastSwapBackExecutionBlock = blockNumber; } } super._update(from, to, amount); } function _swapBack(uint256 balance) internal virtual lockSwapBack { bool success; address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); uint256 maxSwapAmount = swapTokensAtAmount * 20; if (balance > maxSwapAmount) { balance = maxSwapAmount; } uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( balance, 0, path, address(this), block.timestamp ); uint256 ethBalance = address(this).balance; uint256 ethForDevelopment = ethBalance / 5; uint256 ethForOperations = ethBalance - ethForDevelopment; (success, ) = address(operationsWallet).call{value: ethForOperations}( "" ); (success, ) = address(developmentWallet).call{value: ethForDevelopment}( "" ); } function _excludeFromFees(address account, bool value) internal virtual { isExcludedFromFees[account] = value; emit ExcludeFromFees(account, value); } function _excludeFromLimits(address account, bool value) internal virtual { isExcludedFromLimits[account] = value; emit ExcludeFromLimits(account, value); } function _setBots(address account, bool value) internal virtual { isBot[account] = value; emit SetBots(account, value); } function _setAutomatedMarketMakerPair(address pair, bool value) internal virtual { automatedMarketMakerPairs[pair] = value; emit SetAutomatedMarketMakerPair(pair, value); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromLimits","type":"event"},{"anonymous":false,"inputs":[],"name":"Launch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"SetBots","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"SetBuyFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"SetCooldownEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newWallet","type":"address"},{"indexed":false,"internalType":"address","name":"oldWallet","type":"address"}],"name":"SetDevelopmentWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"SetLimitsEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SetMaxBuy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SetMaxSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SetMaxWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newWallet","type":"address"},{"indexed":false,"internalType":"address","name":"oldWallet","type":"address"}],"name":"SetOperationsWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"SetSellFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"SetSwapTokensAtAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"SetTaxesEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"SetTransferFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawStuckTokens","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DEAD_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZERO_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developmentWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isCooldownEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLimitsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTaxEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"permitTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyFee","type":"uint256"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_developmentWallet","type":"address"}],"name":"setDevelopmentWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setLimitsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operationsWallet","type":"address"}],"name":"setOperationsWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellFee","type":"uint256"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setTaxesEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_transferFee","type":"uint256"}],"name":"setTransferFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c060405234801561000f575f80fd5b506040518060400160405280600681526020017f51754465666900000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f5155444546490000000000000000000000000000000000000000000000000000815250335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100ed575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100e49190611f3d565b60405180910390fd5b6100fc8161063260201b60201c565b50816004908161010c9190612190565b50806005908161011c9190612190565b5050505f33905061013f816b033b2e3c9fd0803ce80000006106cc60201b60201c565b5f61014e61075160201b60201c565b905073b96b4c36d6fc350bd038762aabad1bfb8ab691d860065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b96b4c36d6fc350bd038762aabad1bfb8ab691d860075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103e8601482610208919061228c565b61021291906122fa565b600b819055506103e8601482610228919061228c565b61023291906122fa565b600c819055506103e8601482610248919061228c565b61025291906122fa565b600d81905550612710600582610268919061228c565b61027291906122fa565b600e819055506001600760146101000a81548160ff0219169083151502179055506001600760156101000a81548160ff0219169083151502179055506001600760166101000a81548160ff0219169083151502179055506019600f8190555060286010819055506019601181905550737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610374573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103989190612358565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104239190612358565b6040518363ffffffff1660e01b8152600401610440929190612383565b6020604051808303815f875af115801561045c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104809190612358565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506104c660a051600161075a60201b60201c565b6104f9306080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6107eb60201b60201c565b61050a30600161080360201b60201c565b61051d61dead600161080360201b60201c565b61052e82600161080360201b60201c565b61056060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600161080360201b60201c565b61059260075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600161080360201b60201c565b6105a330600161089460201b60201c565b6105b661dead600161089460201b60201c565b6105c782600161089460201b60201c565b6105f960065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600161089460201b60201c565b61062b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600161089460201b60201c565b50506128e4565b5f61064161092560201b60201c565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461069757610686815f61080360201b60201c565b610696815f61089460201b60201c565b5b6106a882600161080360201b60201c565b6106b982600161089460201b60201c565b6106c88261094c60201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361073c575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016107339190611f3d565b60405180910390fd5b61074d5f8383610a0d60201b60201c565b5050565b5f600354905090565b8060155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab82826040516107df9291906123c4565b60405180910390a15050565b6107fe838383600161177160201b60201c565b505050565b8060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782826040516108889291906123c4565b60405180910390a15050565b8060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc9282826040516109199291906123c4565b60405180910390a15050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f3390505f3290505f43905060125f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615610aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9a90612445565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610b24575060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b610b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5a90612445565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480610bc857508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80610c1a575060125f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b610c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5090612445565b60405180910390fd5b600760189054906101000a900460ff1680610cba575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b80610d0b575060145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b610d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d41906124ad565b60405180910390fd5b5f600760149054906101000a900460ff168015610d745750600760179054906101000a900460ff16155b8015610e18575060145f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680610e16575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b905080156113eb57610e2e61092560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614158015610ea25750610e7261092560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015610eda57505f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015610f14575061dead73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b156113ea57600760159054906101000a900460ff16156111045760805173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015610f9a575060a05173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b1561110357600382610fac91906124cb565b60165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410801561103f5750600382610fff91906124cb565b60165f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054105b61107e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107590612548565b60405180910390fd5b8160165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160165f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b5b60155f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156111a1575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561124e57600b548511156111eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e2906125b0565b60405180910390fd5b600d546111fd8761194060201b60201c565b8661120891906125ce565b1115611249576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112409061264b565b60405180910390fd5b6113e9565b60155f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156112eb575060145f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561133a57600c54851115611335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132c906126b3565b60405180910390fd5b6113e8565b60145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166113e757600d5461139a8761194060201b60201c565b866113a591906125ce565b11156113e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dd9061264b565b60405180910390fd5b5b5b5b5b5b5f600760169054906101000a900460ff1680156114155750600760179054906101000a900460ff16155b80156114b9575060135f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806114b7575060135f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b905080156116b5575f60155f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561151957505f601054115b1561153f5760646010548861152e919061228c565b61153891906122fa565b905061168b565b60155f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561159657505f600f54115b156115bc576064600f54886115ab919061228c565b6115b591906122fa565b905061168a565b60155f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615801561165a575060155f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561166757505f601154115b156116895760646011548861167c919061228c565b61168691906122fa565b90505b5b5b5f8111156116b357808761169f91906124cb565b96506116b289308361198660201b60201c565b5b505b5f6116c53061194060201b60201c565b90505f600e548210159050828015611724575060155f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561172d5750805b1561175457600a548511156117535761174b82611ba260201b60201c565b84600a819055505b5b6117658a8a8a61198660201b60201c565b50505050505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036117e1575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016117d89190611f3d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611851575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016118489190611f3d565b60405180910390fd5b8160025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550801561193a578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161193191906126e0565b60405180910390a35b50505050565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036119d6578060035f8282546119ca91906125ce565b92505081905550611aa6565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611a60578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611a57939291906126f9565b60405180910390fd5b81810360015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611aed578060035f8282540392505081905550611b38565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b9591906126e0565b60405180910390a3505050565b6001600760176101000a81548160ff0219169083151502179055505f80600267ffffffffffffffff811115611bda57611bd9611f60565b5b604051908082528060200260200182016040528015611c085781602001602082028036833780820191505090505b50905030815f81518110611c1f57611c1e61272e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ca4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cc89190612358565b81600181518110611cdc57611cdb61272e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f6014600e54611d26919061228c565b905080841115611d34578093505b60805173ffffffffffffffffffffffffffffffffffffffff1663791ac947855f8530426040518663ffffffff1660e01b8152600401611d7795949392919061284b565b5f604051808303815f87803b158015611d8e575f80fd5b505af1158015611da0573d5f803e3d5ffd5b505050505f4790505f600582611db691906122fa565b90505f8183611dc591906124cb565b905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051611e0c906128d0565b5f6040518083038185875af1925050503d805f8114611e46576040519150601f19603f3d011682016040523d82523d5f602084013e611e4b565b606091505b50508096505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611e96906128d0565b5f6040518083038185875af1925050503d805f8114611ed0576040519150601f19603f3d011682016040523d82523d5f602084013e611ed5565b606091505b5050809650505050505050505f600760176101000a81548160ff02191690831515021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611f2782611efe565b9050919050565b611f3781611f1d565b82525050565b5f602082019050611f505f830184611f2e565b92915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611fd157607f821691505b602082108103611fe457611fe3611f8d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026120467fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261200b565b612050868361200b565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61209461208f61208a84612068565b612071565b612068565b9050919050565b5f819050919050565b6120ad8361207a565b6120c16120b98261209b565b848454612017565b825550505050565b5f90565b6120d56120c9565b6120e08184846120a4565b505050565b5b81811015612103576120f85f826120cd565b6001810190506120e6565b5050565b601f8211156121485761211981611fea565b61212284611ffc565b81016020851015612131578190505b61214561213d85611ffc565b8301826120e5565b50505b505050565b5f82821c905092915050565b5f6121685f198460080261214d565b1980831691505092915050565b5f6121808383612159565b9150826002028217905092915050565b61219982611f56565b67ffffffffffffffff8111156121b2576121b1611f60565b5b6121bc8254611fba565b6121c7828285612107565b5f60209050601f8311600181146121f8575f84156121e6578287015190505b6121f08582612175565b865550612257565b601f19841661220686611fea565b5f5b8281101561222d57848901518255600182019150602085019450602081019050612208565b8683101561224a5784890151612246601f891682612159565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61229682612068565b91506122a183612068565b92508282026122af81612068565b915082820484148315176122c6576122c561225f565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61230482612068565b915061230f83612068565b92508261231f5761231e6122cd565b5b828204905092915050565b5f80fd5b61233781611f1d565b8114612341575f80fd5b50565b5f815190506123528161232e565b92915050565b5f6020828403121561236d5761236c61232a565b5b5f61237a84828501612344565b91505092915050565b5f6040820190506123965f830185611f2e565b6123a36020830184611f2e565b9392505050565b5f8115159050919050565b6123be816123aa565b82525050565b5f6040820190506123d75f830185611f2e565b6123e460208301846123b5565b9392505050565b5f82825260208201905092915050565b7f426f7444657465637465640000000000000000000000000000000000000000005f82015250565b5f61242f600b836123eb565b915061243a826123fb565b602082019050919050565b5f6020820190508181035f83015261245c81612423565b9050919050565b7f4e6f744c61756e636865640000000000000000000000000000000000000000005f82015250565b5f612497600b836123eb565b91506124a282612463565b602082019050919050565b5f6020820190508181035f8301526124c48161248b565b9050919050565b5f6124d582612068565b91506124e083612068565b92508282039050818111156124f8576124f761225f565b5b92915050565b7f5472616e7366657244656c6179000000000000000000000000000000000000005f82015250565b5f612532600d836123eb565b915061253d826124fe565b602082019050919050565b5f6020820190508181035f83015261255f81612526565b9050919050565b7f4d6178427579416d6f756e7445786365656400000000000000000000000000005f82015250565b5f61259a6012836123eb565b91506125a582612566565b602082019050919050565b5f6020820190508181035f8301526125c78161258e565b9050919050565b5f6125d882612068565b91506125e383612068565b92508282019050808211156125fb576125fa61225f565b5b92915050565b7f4d617857616c6c6574416d6f756e7445786365656400000000000000000000005f82015250565b5f6126356015836123eb565b915061264082612601565b602082019050919050565b5f6020820190508181035f83015261266281612629565b9050919050565b7f4d617853656c6c416d6f756e74457863656564000000000000000000000000005f82015250565b5f61269d6013836123eb565b91506126a882612669565b602082019050919050565b5f6020820190508181035f8301526126ca81612691565b9050919050565b6126da81612068565b82525050565b5f6020820190506126f35f8301846126d1565b92915050565b5f60608201905061270c5f830186611f2e565b61271960208301856126d1565b61272660408301846126d1565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b5f61277e6127796127748461275b565b612071565b612068565b9050919050565b61278e81612764565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6127c681611f1d565b82525050565b5f6127d783836127bd565b60208301905092915050565b5f602082019050919050565b5f6127f982612794565b612803818561279e565b935061280e836127ae565b805f5b8381101561283e57815161282588826127cc565b9750612830836127e3565b925050600181019050612811565b5085935050505092915050565b5f60a08201905061285e5f8301886126d1565b61286b6020830187612785565b818103604083015261287d81866127ef565b905061288c6060830185611f2e565b61289960808301846126d1565b9695505050505050565b5f81905092915050565b50565b5f6128bb5f836128a3565b91506128c6826128ad565b5f82019050919050565b5f6128da826128b0565b9150819050919050565b60805160a051614beb6129285f395f8181610e7b0152612d6401525f8181610d800152818161147501528181612d0d015281816138fc01526139f50152614beb5ff3fe608060405260043610610338575f3560e01c806395927c25116101aa578063d00efb2f116100f6578063ec3ef93711610094578063f2fde38b1161006e578063f2fde38b14610bcf578063f53bc83514610bf7578063f8b45b0514610c1f578063fd72e22a14610c495761033f565b8063ec3ef93714610b69578063ee5ecc8914610b7f578063ef998cf014610ba75761033f565b8063dcf7aef3116100d0578063dcf7aef314610ab1578063dd62ed3e14610ad9578063e2f4560514610b15578063e6c1909b14610b3f5761033f565b8063d00efb2f14610a35578063d26ed3e314610a5f578063d5759ba314610a875761033f565b8063ad29ffde11610163578063b8eb35461161013d578063b8eb35461461098f578063bc063e1a146109b9578063c04a5414146109e3578063cb96372814610a0d5761033f565b8063ad29ffde14610903578063afa4f3b21461092b578063b62496f5146109535761033f565b806395927c25146107fb57806395d89b41146108235780639a7a23d61461084d5780639c0db5f314610875578063a9059cbb1461089d578063acb2ad6f146108d95761033f565b80634e6fd6c4116102845780636ca541e511610222578063715018a6116101fc578063715018a61461076957806372ac24861461077f578063790ca413146107a75780638da5cb5b146107d15761033f565b80636ca541e5146106d957806370a082311461070357806370db69d61461073f5761033f565b80635932ead11161025e5780635932ead11461062557806359512ab01461064d5780635cce86cd146106755780635d0044ca146106b15761033f565b80634e6fd6c4146105955780634fbee193146105bf578063538ba4f9146105fb5761033f565b80632b14ca56116102f15780633bbac579116102cb5780633bbac579146104dd57806341aea9de14610519578063470624021461054157806349bd5a5e1461056b5761033f565b80632b14ca561461045f578063307aebc914610489578063313ce567146104b35761033f565b806306fdde0314610341578063095ea7b31461036b578063106a5a8f146103a75780631694505e146103cf57806318160ddd146103f957806323b872dd146104235761033f565b3661033f57005b005b34801561034c575f80fd5b50610355610c73565b6040516103629190613c4b565b60405180910390f35b348015610376575f80fd5b50610391600480360381019061038c9190613d00565b610d03565b60405161039e9190613d58565b60405180910390f35b3480156103b2575f80fd5b506103cd60048036038101906103c89190613dfc565b610d25565b005b3480156103da575f80fd5b506103e3610d7e565b6040516103f09190613eb4565b60405180910390f35b348015610404575f80fd5b5061040d610da2565b60405161041a9190613edc565b60405180910390f35b34801561042e575f80fd5b5061044960048036038101906104449190613ef5565b610dab565b6040516104569190613d58565b60405180910390f35b34801561046a575f80fd5b50610473610dd9565b6040516104809190613edc565b60405180910390f35b348015610494575f80fd5b5061049d610ddf565b6040516104aa9190613d58565b60405180910390f35b3480156104be575f80fd5b506104c7610df2565b6040516104d49190613f60565b60405180910390f35b3480156104e8575f80fd5b5061050360048036038101906104fe9190613f79565b610dfa565b6040516105109190613d58565b60405180910390f35b348015610524575f80fd5b5061053f600480360381019061053a9190613fa4565b610e17565b005b34801561054c575f80fd5b50610555610e73565b6040516105629190613edc565b60405180910390f35b348015610576575f80fd5b5061057f610e79565b60405161058c9190613fde565b60405180910390f35b3480156105a0575f80fd5b506105a9610e9d565b6040516105b69190613fde565b60405180910390f35b3480156105ca575f80fd5b506105e560048036038101906105e09190613f79565b610ea3565b6040516105f29190613d58565b60405180910390f35b348015610606575f80fd5b5061060f610ec0565b60405161061c9190613fde565b60405180910390f35b348015610630575f80fd5b5061064b60048036038101906106469190613fa4565b610ec4565b005b348015610658575f80fd5b50610673600480360381019061066e9190613fa4565b610f20565b005b348015610680575f80fd5b5061069b60048036038101906106969190613f79565b610f7c565b6040516106a89190613d58565b60405180910390f35b3480156106bc575f80fd5b506106d760048036038101906106d29190613ff7565b610f99565b005b3480156106e4575f80fd5b506106ed611047565b6040516106fa9190613d58565b60405180910390f35b34801561070e575f80fd5b5061072960048036038101906107249190613f79565b61105a565b6040516107369190613edc565b60405180910390f35b34801561074a575f80fd5b506107536110a0565b6040516107609190613edc565b60405180910390f35b348015610774575f80fd5b5061077d6110a6565b005b34801561078a575f80fd5b506107a560048036038101906107a09190613f79565b6110b9565b005b3480156107b2575f80fd5b506107bb6111f2565b6040516107c89190613edc565b60405180910390f35b3480156107dc575f80fd5b506107e56111f8565b6040516107f29190613fde565b60405180910390f35b348015610806575f80fd5b50610821600480360381019061081c9190613ff7565b61121f565b005b34801561082e575f80fd5b506108376112b5565b6040516108449190613c4b565b60405180910390f35b348015610858575f80fd5b50610873600480360381019061086e9190614022565b611345565b005b348015610880575f80fd5b5061089b60048036038101906108969190613dfc565b6113e5565b005b3480156108a8575f80fd5b506108c360048036038101906108be9190613d00565b6116e7565b6040516108d09190613d58565b60405180910390f35b3480156108e4575f80fd5b506108ed611709565b6040516108fa9190613edc565b60405180910390f35b34801561090e575f80fd5b5061092960048036038101906109249190613dfc565b61170f565b005b348015610936575f80fd5b50610951600480360381019061094c9190613ff7565b611768565b005b34801561095e575f80fd5b5061097960048036038101906109749190613f79565b61187f565b6040516109869190613d58565b60405180910390f35b34801561099a575f80fd5b506109a361189c565b6040516109b09190613edc565b60405180910390f35b3480156109c4575f80fd5b506109cd6118a2565b6040516109da9190613edc565b60405180910390f35b3480156109ee575f80fd5b506109f76118a7565b604051610a049190613fde565b60405180910390f35b348015610a18575f80fd5b50610a336004803603810190610a2e9190613f79565b6118cc565b005b348015610a40575f80fd5b50610a49611b78565b604051610a569190613edc565b60405180910390f35b348015610a6a575f80fd5b50610a856004803603810190610a809190613ff7565b611b7e565b005b348015610a92575f80fd5b50610a9b611c14565b604051610aa89190613d58565b60405180910390f35b348015610abc575f80fd5b50610ad76004803603810190610ad29190613ff7565b611c27565b005b348015610ae4575f80fd5b50610aff6004803603810190610afa9190614060565b611cbd565b604051610b0c9190613edc565b60405180910390f35b348015610b20575f80fd5b50610b29611d3f565b604051610b369190613edc565b60405180910390f35b348015610b4a575f80fd5b50610b53611d45565b604051610b609190613d58565b60405180910390f35b348015610b74575f80fd5b50610b7d611d58565b005b348015610b8a575f80fd5b50610ba56004803603810190610ba09190613f79565b611e07565b005b348015610bb2575f80fd5b50610bcd6004803603810190610bc89190613ff7565b611f40565b005b348015610bda575f80fd5b50610bf56004803603810190610bf09190613f79565b611fee565b005b348015610c02575f80fd5b50610c1d6004803603810190610c189190613ff7565b612072565b005b348015610c2a575f80fd5b50610c33612120565b604051610c409190613edc565b60405180910390f35b348015610c54575f80fd5b50610c5d612126565b604051610c6a9190613fde565b60405180910390f35b606060048054610c82906140cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610cae906140cb565b8015610cf95780601f10610cd057610100808354040283529160200191610cf9565b820191905f5260205f20905b815481529060010190602001808311610cdc57829003601f168201915b5050505050905090565b5f80610d0d61214b565b9050610d1a818585612152565b600191505092915050565b610d2d612164565b5f5b83839050811015610d7857610d6b848483818110610d5057610d4f6140fb565b5b9050602002016020810190610d659190613f79565b836121eb565b8080600101915050610d2f565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f600354905090565b5f80610db561214b565b9050610dc285828561227c565b610dcd85858561230e565b60019150509392505050565b60105481565b600760189054906101000a900460ff1681565b5f6012905090565b6012602052805f5260405f205f915054906101000a900460ff1681565b610e1f612164565b80600760146101000a81548160ff0219169083151502179055507ff771b1e218dc92494b39e21852f9c24c3b448d6697c2b485cc1f0cff3c9ec78181604051610e689190613d58565b60405180910390a150565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b61dead81565b6013602052805f5260405f205f915054906101000a900460ff1681565b5f81565b610ecc612164565b80600760156101000a81548160ff0219169083151502179055507f381fb4c4aa72df83c60e7e567b9b6faf3fc2b05a6da932da9f071d63442c828f81604051610f159190613d58565b60405180910390a150565b610f28612164565b80600760166101000a81548160ff0219169083151502179055507f06cf69227e5c2b5a71319bc3784f6a5355ea0ba2a69bc4c39d64413dfa5a012b81604051610f719190613d58565b60405180910390a150565b6014602052805f5260405f205f915054906101000a900460ff1681565b610fa1612164565b6103e86003610fae610da2565b610fb89190614155565b610fc291906141c3565b811015611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffb9061423d565b60405180910390fd5b80600d819055507fa2c87c3e7a3048198ae94e814f6a27e12a4e2a7476e33a0db4d97ffeaf636186600d5460405161103c9190613edc565b60405180910390a150565b600760159054906101000a900460ff1681565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b600b5481565b6110ae612164565b6110b75f6123fe565b565b6110c1612164565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361112f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611126906142a5565b60405180910390fd5b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f2b355c7f17401d9755d704a4cf6149a26deb56a381bb5d06c87b608183dbe09c60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516111e69291906142c3565b60405180910390a15050565b60095481565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611227612164565b606381111561126b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126290614334565b60405180910390fd5b5f6010549050816010819055507f125b37650f21d088600cef1223439f6a8bd70800debfd486c503a8a2d19d4b0182826040516112a9929190614352565b60405180910390a15050565b6060600580546112c4906140cb565b80601f01602080910402602001604051908101604052809291908181526020018280546112f0906140cb565b801561133b5780601f106113125761010080835404028352916020019161133b565b820191905f5260205f20905b81548152906001019060200180831161131e57829003601f168201915b5050505050905090565b61134d612164565b60155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156113d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ce906143c3565b60405180910390fd5b6113e18282612474565b5050565b6113ed612164565b5f5b838390508110156116e15760155f8585848181106114105761140f6140fb565b5b90506020020160208101906114259190613f79565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156114eb57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168484838181106114bd576114bc6140fb565b5b90506020020160208101906114d29190613f79565b73ffffffffffffffffffffffffffffffffffffffff1614155b801561154a57503073ffffffffffffffffffffffffffffffffffffffff1684848381811061151c5761151b6140fb565b5b90506020020160208101906115319190613f79565b73ffffffffffffffffffffffffffffffffffffffff1614155b80156115a957505f73ffffffffffffffffffffffffffffffffffffffff1684848381811061157b5761157a6140fb565b5b90506020020160208101906115909190613f79565b73ffffffffffffffffffffffffffffffffffffffff1614155b801561169d575060135f8585848181106115c6576115c56140fb565b5b90506020020160208101906115db9190613f79565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615801561169c575060145f85858481811061163f5761163e6140fb565b5b90506020020160208101906116549190613f79565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b5b156116d4576116d38484838181106116b8576116b76140fb565b5b90506020020160208101906116cd9190613f79565b83612505565b5b80806001019150506113ef565b50505050565b5f806116f161214b565b90506116fe81858561230e565b600191505092915050565b60115481565b611717612164565b5f5b838390508110156117625761175584848381811061173a576117396140fb565b5b905060200201602081019061174f9190613f79565b83612596565b8080600101915050611719565b50505050565b611770612164565b5f611779610da2565b9050620f424060018261178c9190614155565b61179691906141c3565b8210156117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf9061423d565b60405180910390fd5b6103e86005826117e89190614155565b6117f291906141c3565b821115611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b9061442b565b60405180910390fd5b5f600e54905082600e819055507f190dc7c30bc62ef30e35c5f5512ad715a1bd03230f2d89c965249246c8d8ecca8382604051611872929190614352565b60405180910390a1505050565b6015602052805f5260405f205f915054906101000a900460ff1681565b600c5481565b606381565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6118d4612164565b5f3390505f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a01575f4791505f8211611952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194990614493565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1682604051611976906144de565b5f6040518083038185875af1925050503d805f81146119b0576040519150601f19603f3d011682016040523d82523d5f602084013e6119b5565b606091505b505080915050806119fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f29061453c565b60405180910390fd5b50611b3a565b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a3a9190613fde565b602060405180830381865afa158015611a55573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a79919061456e565b90505f8111611abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab4906145e3565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611af8929190614601565b6020604051808303815f875af1158015611b14573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b38919061463c565b505b7f07c81a5e6d155913a9ed2ce53630058179c89fc94bb5de130620b0245c9f6a0b8382604051611b6b929190614601565b60405180910390a1505050565b60085481565b611b86612164565b6032811115611bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc190614334565b60405180910390fd5b5f6011549050816011819055507f8fd531ce6f3cbc5b8cc01a0413b630e3f11569780ee5cf8d0c78e03bca30bc258282604051611c08929190614352565b60405180910390a15050565b600760149054906101000a900460ff1681565b611c2f612164565b6032811115611c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6a90614334565b60405180910390fd5b5f600f54905081600f819055507f5fcc0eea159d45a3b8d481be746c9beed251431a542a5fed4484be37ab783e8d8282604051611cb1929190614352565b60405180910390a15050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b600e5481565b600760169054906101000a900460ff1681565b611d60612164565b600760189054906101000a900460ff1615611db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da7906146b1565b60405180910390fd5b6001600760186101000a81548160ff02191690831515021790555043600881905550426009819055507f02ac8168caf2f254b394bd39e19417c5c28124ab89c9bc2d44921b19808e266960405160405180910390a1565b611e0f612164565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e74906142a5565b60405180910390fd5b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fe20a721838fcbbb3840bd5d97dde1ffeb479fe73d75736fa6fdfc0f220aae00560065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051611f349291906142c3565b60405180910390a15050565b611f48612164565b6103e86002611f55610da2565b611f5f9190614155565b611f6991906141c3565b811015611fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa29061423d565b60405180910390fd5b80600c819055507f3c0ac525ebd597ae4e1201e687d8a7424b740a53b775b1527eb1c1936c1bd3b7600c54604051611fe39190613edc565b60405180910390a150565b611ff6612164565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612066575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161205d9190613fde565b60405180910390fd5b61206f816123fe565b50565b61207a612164565b6103e86002612087610da2565b6120919190614155565b61209b91906141c3565b8110156120dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d49061423d565b60405180910390fd5b80600b819055507f16fd9174d80e7089ed0c10c47c8079476be2ec28b97c4b40846cffd8a7aa9e9f600b546040516121159190613edc565b60405180910390a150565b600d5481565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f33905090565b61215f8383836001612627565b505050565b61216c61214b565b73ffffffffffffffffffffffffffffffffffffffff1661218a6111f8565b73ffffffffffffffffffffffffffffffffffffffff16146121e9576121ad61214b565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016121e09190613fde565b60405180910390fd5b565b8060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc9282826040516122709291906146cf565b60405180910390a15050565b5f6122878484611cbd565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461230857818110156122f9578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016122f0939291906146f6565b60405180910390fd5b61230784848484035f612627565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361237e575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016123759190613fde565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123ee575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016123e59190613fde565b60405180910390fd5b6123f98383836127f6565b505050565b5f6124076111f8565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461245157612446815f612596565b612450815f6121eb565b5b61245c826001612596565b6124678260016121eb565b61247082613566565b5050565b8060155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab82826040516124f99291906146cf565b60405180910390a15050565b8060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507ff7f8b40d08076851dfb7cfd6c584ae9a829a570f264abee45e0d7ca342ae8dc8828260405161258a9291906146cf565b60405180910390a15050565b8060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7828260405161261b9291906146cf565b60405180910390a15050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612697575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161268e9190613fde565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612707575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016126fe9190613fde565b60405180910390fd5b8160025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156127f0578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516127e79190613edc565b60405180910390a35b50505050565b5f3390505f3290505f43905060125f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561288c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288390614775565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061290d575060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b61294c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294390614775565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806129b157508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80612a03575060125f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b612a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3990614775565b60405180910390fd5b600760189054906101000a900460ff1680612aa3575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b80612af4575060145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b612b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2a906147dd565b60405180910390fd5b5f600760149054906101000a900460ff168015612b5d5750600760179054906101000a900460ff16155b8015612c01575060145f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612bff575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b905080156131f857612c116111f8565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614158015612c7f5750612c4f6111f8565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015612cb757505f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015612cf1575061dead73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b156131f757600760159054906101000a900460ff1615612f1d577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015612db357507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b15612f1c57600382612dc591906147fb565b60165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054108015612e585750600382612e1891906147fb565b60165f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054105b612e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8e90614878565b60405180910390fd5b8160165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160165f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b5b60155f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612fba575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561306157600b54851115613004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ffb906148e0565b60405180910390fd5b600d546130108761105a565b8661301b91906148fe565b111561305c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130539061497b565b60405180910390fd5b6131f6565b60155f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156130fe575060145f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561314d57600c54851115613148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313f906149e3565b60405180910390fd5b6131f5565b60145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166131f457600d546131a78761105a565b866131b291906148fe565b11156131f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ea9061497b565b60405180910390fd5b5b5b5b5b5b5f600760169054906101000a900460ff1680156132225750600760179054906101000a900460ff16155b80156132c6575060135f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806132c4575060135f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b905080156134bc575f60155f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561332657505f601054115b1561334c5760646010548861333b9190614155565b61334591906141c3565b9050613498565b60155f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156133a357505f600f54115b156133c9576064600f54886133b89190614155565b6133c291906141c3565b9050613497565b60155f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015613467575060155f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561347457505f601154115b15613496576064601154886134899190614155565b61349391906141c3565b90505b5b5b5f8111156134ba5780876134ac91906147fb565b96506134b9893083613627565b5b505b5f6134c63061105a565b90505f600e548210159050828015613525575060155f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561352e5750805b1561354f57600a5485111561354e5761354682613843565b84600a819055505b5b61355a8a8a8a613627565b50505050505050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613677578060035f82825461366b91906148fe565b92505081905550613747565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613701578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016136f8939291906146f6565b60405180910390fd5b81810360015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361378e578060035f82825403925050819055506137d9565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516138369190613edc565b60405180910390a3505050565b6001600760176101000a81548160ff0219169083151502179055505f80600267ffffffffffffffff81111561387b5761387a614a01565b5b6040519080825280602002602001820160405280156138a95781602001602082028036833780820191505090505b50905030815f815181106138c0576138bf6140fb565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613963573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139879190614a42565b8160018151811061399b5761399a6140fb565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f6014600e546139e59190614155565b9050808411156139f3578093505b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac947855f8530426040518663ffffffff1660e01b8152600401613a54959493929190614b5d565b5f604051808303815f87803b158015613a6b575f80fd5b505af1158015613a7d573d5f803e3d5ffd5b505050505f4790505f600582613a9391906141c3565b90505f8183613aa291906147fb565b905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051613ae9906144de565b5f6040518083038185875af1925050503d805f8114613b23576040519150601f19603f3d011682016040523d82523d5f602084013e613b28565b606091505b50508096505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051613b73906144de565b5f6040518083038185875af1925050503d805f8114613bad576040519150601f19603f3d011682016040523d82523d5f602084013e613bb2565b606091505b5050809650505050505050505f600760176101000a81548160ff02191690831515021790555050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f613c1d82613bdb565b613c278185613be5565b9350613c37818560208601613bf5565b613c4081613c03565b840191505092915050565b5f6020820190508181035f830152613c638184613c13565b905092915050565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613c9c82613c73565b9050919050565b613cac81613c92565b8114613cb6575f80fd5b50565b5f81359050613cc781613ca3565b92915050565b5f819050919050565b613cdf81613ccd565b8114613ce9575f80fd5b50565b5f81359050613cfa81613cd6565b92915050565b5f8060408385031215613d1657613d15613c6b565b5b5f613d2385828601613cb9565b9250506020613d3485828601613cec565b9150509250929050565b5f8115159050919050565b613d5281613d3e565b82525050565b5f602082019050613d6b5f830184613d49565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112613d9257613d91613d71565b5b8235905067ffffffffffffffff811115613daf57613dae613d75565b5b602083019150836020820283011115613dcb57613dca613d79565b5b9250929050565b613ddb81613d3e565b8114613de5575f80fd5b50565b5f81359050613df681613dd2565b92915050565b5f805f60408486031215613e1357613e12613c6b565b5b5f84013567ffffffffffffffff811115613e3057613e2f613c6f565b5b613e3c86828701613d7d565b93509350506020613e4f86828701613de8565b9150509250925092565b5f819050919050565b5f613e7c613e77613e7284613c73565b613e59565b613c73565b9050919050565b5f613e8d82613e62565b9050919050565b5f613e9e82613e83565b9050919050565b613eae81613e94565b82525050565b5f602082019050613ec75f830184613ea5565b92915050565b613ed681613ccd565b82525050565b5f602082019050613eef5f830184613ecd565b92915050565b5f805f60608486031215613f0c57613f0b613c6b565b5b5f613f1986828701613cb9565b9350506020613f2a86828701613cb9565b9250506040613f3b86828701613cec565b9150509250925092565b5f60ff82169050919050565b613f5a81613f45565b82525050565b5f602082019050613f735f830184613f51565b92915050565b5f60208284031215613f8e57613f8d613c6b565b5b5f613f9b84828501613cb9565b91505092915050565b5f60208284031215613fb957613fb8613c6b565b5b5f613fc684828501613de8565b91505092915050565b613fd881613c92565b82525050565b5f602082019050613ff15f830184613fcf565b92915050565b5f6020828403121561400c5761400b613c6b565b5b5f61401984828501613cec565b91505092915050565b5f806040838503121561403857614037613c6b565b5b5f61404585828601613cb9565b925050602061405685828601613de8565b9150509250929050565b5f806040838503121561407657614075613c6b565b5b5f61408385828601613cb9565b925050602061409485828601613cb9565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806140e257607f821691505b6020821081036140f5576140f461409e565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61415f82613ccd565b915061416a83613ccd565b925082820261417881613ccd565b9150828204841483151761418f5761418e614128565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6141cd82613ccd565b91506141d883613ccd565b9250826141e8576141e7614196565b5b828204905092915050565b7f416d6f756e74546f6f4c6f7700000000000000000000000000000000000000005f82015250565b5f614227600c83613be5565b9150614232826141f3565b602082019050919050565b5f6020820190508181035f8301526142548161421b565b9050919050565b7f41646472657373205a65726f00000000000000000000000000000000000000005f82015250565b5f61428f600c83613be5565b915061429a8261425b565b602082019050919050565b5f6020820190508181035f8301526142bc81614283565b9050919050565b5f6040820190506142d65f830185613fcf565b6142e36020830184613fcf565b9392505050565b7f466565546f6f48696768000000000000000000000000000000000000000000005f82015250565b5f61431e600a83613be5565b9150614329826142ea565b602082019050919050565b5f6020820190508181035f83015261434b81614312565b9050919050565b5f6040820190506143655f830185613ecd565b6143726020830184613ecd565b9392505050565b7f414d4d416c7265616479536574000000000000000000000000000000000000005f82015250565b5f6143ad600d83613be5565b91506143b882614379565b602082019050919050565b5f6020820190508181035f8301526143da816143a1565b9050919050565b7f416d6f756e74546f6f48696768000000000000000000000000000000000000005f82015250565b5f614415600d83613be5565b9150614420826143e1565b602082019050919050565b5f6020820190508181035f83015261444281614409565b9050919050565b7f4e6f4e6174697665546f6b656e730000000000000000000000000000000000005f82015250565b5f61447d600e83613be5565b915061448882614449565b602082019050919050565b5f6020820190508181035f8301526144aa81614471565b9050919050565b5f81905092915050565b50565b5f6144c95f836144b1565b91506144d4826144bb565b5f82019050919050565b5f6144e8826144be565b9150819050919050565b7f4661696c6564546f57697468647261774e6174697665546f6b656e73000000005f82015250565b5f614526601c83613be5565b9150614531826144f2565b602082019050919050565b5f6020820190508181035f8301526145538161451a565b9050919050565b5f8151905061456881613cd6565b92915050565b5f6020828403121561458357614582613c6b565b5b5f6145908482850161455a565b91505092915050565b7f4e6f546f6b656e730000000000000000000000000000000000000000000000005f82015250565b5f6145cd600883613be5565b91506145d882614599565b602082019050919050565b5f6020820190508181035f8301526145fa816145c1565b9050919050565b5f6040820190506146145f830185613fcf565b6146216020830184613ecd565b9392505050565b5f8151905061463681613dd2565b92915050565b5f6020828403121561465157614650613c6b565b5b5f61465e84828501614628565b91505092915050565b7f416c7265616479204c61756e63686564000000000000000000000000000000005f82015250565b5f61469b601083613be5565b91506146a682614667565b602082019050919050565b5f6020820190508181035f8301526146c88161468f565b9050919050565b5f6040820190506146e25f830185613fcf565b6146ef6020830184613d49565b9392505050565b5f6060820190506147095f830186613fcf565b6147166020830185613ecd565b6147236040830184613ecd565b949350505050565b7f426f7444657465637465640000000000000000000000000000000000000000005f82015250565b5f61475f600b83613be5565b915061476a8261472b565b602082019050919050565b5f6020820190508181035f83015261478c81614753565b9050919050565b7f4e6f744c61756e636865640000000000000000000000000000000000000000005f82015250565b5f6147c7600b83613be5565b91506147d282614793565b602082019050919050565b5f6020820190508181035f8301526147f4816147bb565b9050919050565b5f61480582613ccd565b915061481083613ccd565b925082820390508181111561482857614827614128565b5b92915050565b7f5472616e7366657244656c6179000000000000000000000000000000000000005f82015250565b5f614862600d83613be5565b915061486d8261482e565b602082019050919050565b5f6020820190508181035f83015261488f81614856565b9050919050565b7f4d6178427579416d6f756e7445786365656400000000000000000000000000005f82015250565b5f6148ca601283613be5565b91506148d582614896565b602082019050919050565b5f6020820190508181035f8301526148f7816148be565b9050919050565b5f61490882613ccd565b915061491383613ccd565b925082820190508082111561492b5761492a614128565b5b92915050565b7f4d617857616c6c6574416d6f756e7445786365656400000000000000000000005f82015250565b5f614965601583613be5565b915061497082614931565b602082019050919050565b5f6020820190508181035f83015261499281614959565b9050919050565b7f4d617853656c6c416d6f756e74457863656564000000000000000000000000005f82015250565b5f6149cd601383613be5565b91506149d882614999565b602082019050919050565b5f6020820190508181035f8301526149fa816149c1565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f81519050614a3c81613ca3565b92915050565b5f60208284031215614a5757614a56613c6b565b5b5f614a6484828501614a2e565b91505092915050565b5f819050919050565b5f614a90614a8b614a8684614a6d565b613e59565b613ccd565b9050919050565b614aa081614a76565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614ad881613c92565b82525050565b5f614ae98383614acf565b60208301905092915050565b5f602082019050919050565b5f614b0b82614aa6565b614b158185614ab0565b9350614b2083614ac0565b805f5b83811015614b50578151614b378882614ade565b9750614b4283614af5565b925050600181019050614b23565b5085935050505092915050565b5f60a082019050614b705f830188613ecd565b614b7d6020830187614a97565b8181036040830152614b8f8186614b01565b9050614b9e6060830185613fcf565b614bab6080830184613ecd565b969550505050505056fea2646970667358221220a038e8869df2517e8cbad2f3446525d2a6a2fc32d395188f28690e91f2b1c47a64736f6c63430008190033
Deployed Bytecode
0x608060405260043610610338575f3560e01c806395927c25116101aa578063d00efb2f116100f6578063ec3ef93711610094578063f2fde38b1161006e578063f2fde38b14610bcf578063f53bc83514610bf7578063f8b45b0514610c1f578063fd72e22a14610c495761033f565b8063ec3ef93714610b69578063ee5ecc8914610b7f578063ef998cf014610ba75761033f565b8063dcf7aef3116100d0578063dcf7aef314610ab1578063dd62ed3e14610ad9578063e2f4560514610b15578063e6c1909b14610b3f5761033f565b8063d00efb2f14610a35578063d26ed3e314610a5f578063d5759ba314610a875761033f565b8063ad29ffde11610163578063b8eb35461161013d578063b8eb35461461098f578063bc063e1a146109b9578063c04a5414146109e3578063cb96372814610a0d5761033f565b8063ad29ffde14610903578063afa4f3b21461092b578063b62496f5146109535761033f565b806395927c25146107fb57806395d89b41146108235780639a7a23d61461084d5780639c0db5f314610875578063a9059cbb1461089d578063acb2ad6f146108d95761033f565b80634e6fd6c4116102845780636ca541e511610222578063715018a6116101fc578063715018a61461076957806372ac24861461077f578063790ca413146107a75780638da5cb5b146107d15761033f565b80636ca541e5146106d957806370a082311461070357806370db69d61461073f5761033f565b80635932ead11161025e5780635932ead11461062557806359512ab01461064d5780635cce86cd146106755780635d0044ca146106b15761033f565b80634e6fd6c4146105955780634fbee193146105bf578063538ba4f9146105fb5761033f565b80632b14ca56116102f15780633bbac579116102cb5780633bbac579146104dd57806341aea9de14610519578063470624021461054157806349bd5a5e1461056b5761033f565b80632b14ca561461045f578063307aebc914610489578063313ce567146104b35761033f565b806306fdde0314610341578063095ea7b31461036b578063106a5a8f146103a75780631694505e146103cf57806318160ddd146103f957806323b872dd146104235761033f565b3661033f57005b005b34801561034c575f80fd5b50610355610c73565b6040516103629190613c4b565b60405180910390f35b348015610376575f80fd5b50610391600480360381019061038c9190613d00565b610d03565b60405161039e9190613d58565b60405180910390f35b3480156103b2575f80fd5b506103cd60048036038101906103c89190613dfc565b610d25565b005b3480156103da575f80fd5b506103e3610d7e565b6040516103f09190613eb4565b60405180910390f35b348015610404575f80fd5b5061040d610da2565b60405161041a9190613edc565b60405180910390f35b34801561042e575f80fd5b5061044960048036038101906104449190613ef5565b610dab565b6040516104569190613d58565b60405180910390f35b34801561046a575f80fd5b50610473610dd9565b6040516104809190613edc565b60405180910390f35b348015610494575f80fd5b5061049d610ddf565b6040516104aa9190613d58565b60405180910390f35b3480156104be575f80fd5b506104c7610df2565b6040516104d49190613f60565b60405180910390f35b3480156104e8575f80fd5b5061050360048036038101906104fe9190613f79565b610dfa565b6040516105109190613d58565b60405180910390f35b348015610524575f80fd5b5061053f600480360381019061053a9190613fa4565b610e17565b005b34801561054c575f80fd5b50610555610e73565b6040516105629190613edc565b60405180910390f35b348015610576575f80fd5b5061057f610e79565b60405161058c9190613fde565b60405180910390f35b3480156105a0575f80fd5b506105a9610e9d565b6040516105b69190613fde565b60405180910390f35b3480156105ca575f80fd5b506105e560048036038101906105e09190613f79565b610ea3565b6040516105f29190613d58565b60405180910390f35b348015610606575f80fd5b5061060f610ec0565b60405161061c9190613fde565b60405180910390f35b348015610630575f80fd5b5061064b60048036038101906106469190613fa4565b610ec4565b005b348015610658575f80fd5b50610673600480360381019061066e9190613fa4565b610f20565b005b348015610680575f80fd5b5061069b60048036038101906106969190613f79565b610f7c565b6040516106a89190613d58565b60405180910390f35b3480156106bc575f80fd5b506106d760048036038101906106d29190613ff7565b610f99565b005b3480156106e4575f80fd5b506106ed611047565b6040516106fa9190613d58565b60405180910390f35b34801561070e575f80fd5b5061072960048036038101906107249190613f79565b61105a565b6040516107369190613edc565b60405180910390f35b34801561074a575f80fd5b506107536110a0565b6040516107609190613edc565b60405180910390f35b348015610774575f80fd5b5061077d6110a6565b005b34801561078a575f80fd5b506107a560048036038101906107a09190613f79565b6110b9565b005b3480156107b2575f80fd5b506107bb6111f2565b6040516107c89190613edc565b60405180910390f35b3480156107dc575f80fd5b506107e56111f8565b6040516107f29190613fde565b60405180910390f35b348015610806575f80fd5b50610821600480360381019061081c9190613ff7565b61121f565b005b34801561082e575f80fd5b506108376112b5565b6040516108449190613c4b565b60405180910390f35b348015610858575f80fd5b50610873600480360381019061086e9190614022565b611345565b005b348015610880575f80fd5b5061089b60048036038101906108969190613dfc565b6113e5565b005b3480156108a8575f80fd5b506108c360048036038101906108be9190613d00565b6116e7565b6040516108d09190613d58565b60405180910390f35b3480156108e4575f80fd5b506108ed611709565b6040516108fa9190613edc565b60405180910390f35b34801561090e575f80fd5b5061092960048036038101906109249190613dfc565b61170f565b005b348015610936575f80fd5b50610951600480360381019061094c9190613ff7565b611768565b005b34801561095e575f80fd5b5061097960048036038101906109749190613f79565b61187f565b6040516109869190613d58565b60405180910390f35b34801561099a575f80fd5b506109a361189c565b6040516109b09190613edc565b60405180910390f35b3480156109c4575f80fd5b506109cd6118a2565b6040516109da9190613edc565b60405180910390f35b3480156109ee575f80fd5b506109f76118a7565b604051610a049190613fde565b60405180910390f35b348015610a18575f80fd5b50610a336004803603810190610a2e9190613f79565b6118cc565b005b348015610a40575f80fd5b50610a49611b78565b604051610a569190613edc565b60405180910390f35b348015610a6a575f80fd5b50610a856004803603810190610a809190613ff7565b611b7e565b005b348015610a92575f80fd5b50610a9b611c14565b604051610aa89190613d58565b60405180910390f35b348015610abc575f80fd5b50610ad76004803603810190610ad29190613ff7565b611c27565b005b348015610ae4575f80fd5b50610aff6004803603810190610afa9190614060565b611cbd565b604051610b0c9190613edc565b60405180910390f35b348015610b20575f80fd5b50610b29611d3f565b604051610b369190613edc565b60405180910390f35b348015610b4a575f80fd5b50610b53611d45565b604051610b609190613d58565b60405180910390f35b348015610b74575f80fd5b50610b7d611d58565b005b348015610b8a575f80fd5b50610ba56004803603810190610ba09190613f79565b611e07565b005b348015610bb2575f80fd5b50610bcd6004803603810190610bc89190613ff7565b611f40565b005b348015610bda575f80fd5b50610bf56004803603810190610bf09190613f79565b611fee565b005b348015610c02575f80fd5b50610c1d6004803603810190610c189190613ff7565b612072565b005b348015610c2a575f80fd5b50610c33612120565b604051610c409190613edc565b60405180910390f35b348015610c54575f80fd5b50610c5d612126565b604051610c6a9190613fde565b60405180910390f35b606060048054610c82906140cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610cae906140cb565b8015610cf95780601f10610cd057610100808354040283529160200191610cf9565b820191905f5260205f20905b815481529060010190602001808311610cdc57829003601f168201915b5050505050905090565b5f80610d0d61214b565b9050610d1a818585612152565b600191505092915050565b610d2d612164565b5f5b83839050811015610d7857610d6b848483818110610d5057610d4f6140fb565b5b9050602002016020810190610d659190613f79565b836121eb565b8080600101915050610d2f565b50505050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b5f600354905090565b5f80610db561214b565b9050610dc285828561227c565b610dcd85858561230e565b60019150509392505050565b60105481565b600760189054906101000a900460ff1681565b5f6012905090565b6012602052805f5260405f205f915054906101000a900460ff1681565b610e1f612164565b80600760146101000a81548160ff0219169083151502179055507ff771b1e218dc92494b39e21852f9c24c3b448d6697c2b485cc1f0cff3c9ec78181604051610e689190613d58565b60405180910390a150565b600f5481565b7f000000000000000000000000513c958143abd5d2ddb2bdda58e849efdf6f0d2f81565b61dead81565b6013602052805f5260405f205f915054906101000a900460ff1681565b5f81565b610ecc612164565b80600760156101000a81548160ff0219169083151502179055507f381fb4c4aa72df83c60e7e567b9b6faf3fc2b05a6da932da9f071d63442c828f81604051610f159190613d58565b60405180910390a150565b610f28612164565b80600760166101000a81548160ff0219169083151502179055507f06cf69227e5c2b5a71319bc3784f6a5355ea0ba2a69bc4c39d64413dfa5a012b81604051610f719190613d58565b60405180910390a150565b6014602052805f5260405f205f915054906101000a900460ff1681565b610fa1612164565b6103e86003610fae610da2565b610fb89190614155565b610fc291906141c3565b811015611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffb9061423d565b60405180910390fd5b80600d819055507fa2c87c3e7a3048198ae94e814f6a27e12a4e2a7476e33a0db4d97ffeaf636186600d5460405161103c9190613edc565b60405180910390a150565b600760159054906101000a900460ff1681565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b600b5481565b6110ae612164565b6110b75f6123fe565b565b6110c1612164565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361112f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611126906142a5565b60405180910390fd5b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f2b355c7f17401d9755d704a4cf6149a26deb56a381bb5d06c87b608183dbe09c60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516111e69291906142c3565b60405180910390a15050565b60095481565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611227612164565b606381111561126b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126290614334565b60405180910390fd5b5f6010549050816010819055507f125b37650f21d088600cef1223439f6a8bd70800debfd486c503a8a2d19d4b0182826040516112a9929190614352565b60405180910390a15050565b6060600580546112c4906140cb565b80601f01602080910402602001604051908101604052809291908181526020018280546112f0906140cb565b801561133b5780601f106113125761010080835404028352916020019161133b565b820191905f5260205f20905b81548152906001019060200180831161131e57829003601f168201915b5050505050905090565b61134d612164565b60155f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156113d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ce906143c3565b60405180910390fd5b6113e18282612474565b5050565b6113ed612164565b5f5b838390508110156116e15760155f8585848181106114105761140f6140fb565b5b90506020020160208101906114259190613f79565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156114eb57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168484838181106114bd576114bc6140fb565b5b90506020020160208101906114d29190613f79565b73ffffffffffffffffffffffffffffffffffffffff1614155b801561154a57503073ffffffffffffffffffffffffffffffffffffffff1684848381811061151c5761151b6140fb565b5b90506020020160208101906115319190613f79565b73ffffffffffffffffffffffffffffffffffffffff1614155b80156115a957505f73ffffffffffffffffffffffffffffffffffffffff1684848381811061157b5761157a6140fb565b5b90506020020160208101906115909190613f79565b73ffffffffffffffffffffffffffffffffffffffff1614155b801561169d575060135f8585848181106115c6576115c56140fb565b5b90506020020160208101906115db9190613f79565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615801561169c575060145f85858481811061163f5761163e6140fb565b5b90506020020160208101906116549190613f79565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b5b156116d4576116d38484838181106116b8576116b76140fb565b5b90506020020160208101906116cd9190613f79565b83612505565b5b80806001019150506113ef565b50505050565b5f806116f161214b565b90506116fe81858561230e565b600191505092915050565b60115481565b611717612164565b5f5b838390508110156117625761175584848381811061173a576117396140fb565b5b905060200201602081019061174f9190613f79565b83612596565b8080600101915050611719565b50505050565b611770612164565b5f611779610da2565b9050620f424060018261178c9190614155565b61179691906141c3565b8210156117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf9061423d565b60405180910390fd5b6103e86005826117e89190614155565b6117f291906141c3565b821115611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b9061442b565b60405180910390fd5b5f600e54905082600e819055507f190dc7c30bc62ef30e35c5f5512ad715a1bd03230f2d89c965249246c8d8ecca8382604051611872929190614352565b60405180910390a1505050565b6015602052805f5260405f205f915054906101000a900460ff1681565b600c5481565b606381565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6118d4612164565b5f3390505f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a01575f4791505f8211611952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194990614493565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1682604051611976906144de565b5f6040518083038185875af1925050503d805f81146119b0576040519150601f19603f3d011682016040523d82523d5f602084013e6119b5565b606091505b505080915050806119fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f29061453c565b60405180910390fd5b50611b3a565b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a3a9190613fde565b602060405180830381865afa158015611a55573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a79919061456e565b90505f8111611abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab4906145e3565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611af8929190614601565b6020604051808303815f875af1158015611b14573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b38919061463c565b505b7f07c81a5e6d155913a9ed2ce53630058179c89fc94bb5de130620b0245c9f6a0b8382604051611b6b929190614601565b60405180910390a1505050565b60085481565b611b86612164565b6032811115611bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc190614334565b60405180910390fd5b5f6011549050816011819055507f8fd531ce6f3cbc5b8cc01a0413b630e3f11569780ee5cf8d0c78e03bca30bc258282604051611c08929190614352565b60405180910390a15050565b600760149054906101000a900460ff1681565b611c2f612164565b6032811115611c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6a90614334565b60405180910390fd5b5f600f54905081600f819055507f5fcc0eea159d45a3b8d481be746c9beed251431a542a5fed4484be37ab783e8d8282604051611cb1929190614352565b60405180910390a15050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b600e5481565b600760169054906101000a900460ff1681565b611d60612164565b600760189054906101000a900460ff1615611db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da7906146b1565b60405180910390fd5b6001600760186101000a81548160ff02191690831515021790555043600881905550426009819055507f02ac8168caf2f254b394bd39e19417c5c28124ab89c9bc2d44921b19808e266960405160405180910390a1565b611e0f612164565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e74906142a5565b60405180910390fd5b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fe20a721838fcbbb3840bd5d97dde1ffeb479fe73d75736fa6fdfc0f220aae00560065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051611f349291906142c3565b60405180910390a15050565b611f48612164565b6103e86002611f55610da2565b611f5f9190614155565b611f6991906141c3565b811015611fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa29061423d565b60405180910390fd5b80600c819055507f3c0ac525ebd597ae4e1201e687d8a7424b740a53b775b1527eb1c1936c1bd3b7600c54604051611fe39190613edc565b60405180910390a150565b611ff6612164565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612066575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161205d9190613fde565b60405180910390fd5b61206f816123fe565b50565b61207a612164565b6103e86002612087610da2565b6120919190614155565b61209b91906141c3565b8110156120dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d49061423d565b60405180910390fd5b80600b819055507f16fd9174d80e7089ed0c10c47c8079476be2ec28b97c4b40846cffd8a7aa9e9f600b546040516121159190613edc565b60405180910390a150565b600d5481565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f33905090565b61215f8383836001612627565b505050565b61216c61214b565b73ffffffffffffffffffffffffffffffffffffffff1661218a6111f8565b73ffffffffffffffffffffffffffffffffffffffff16146121e9576121ad61214b565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016121e09190613fde565b60405180910390fd5b565b8060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc9282826040516122709291906146cf565b60405180910390a15050565b5f6122878484611cbd565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461230857818110156122f9578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016122f0939291906146f6565b60405180910390fd5b61230784848484035f612627565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361237e575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016123759190613fde565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123ee575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016123e59190613fde565b60405180910390fd5b6123f98383836127f6565b505050565b5f6124076111f8565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461245157612446815f612596565b612450815f6121eb565b5b61245c826001612596565b6124678260016121eb565b61247082613566565b5050565b8060155f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab82826040516124f99291906146cf565b60405180910390a15050565b8060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507ff7f8b40d08076851dfb7cfd6c584ae9a829a570f264abee45e0d7ca342ae8dc8828260405161258a9291906146cf565b60405180910390a15050565b8060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7828260405161261b9291906146cf565b60405180910390a15050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612697575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161268e9190613fde565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612707575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016126fe9190613fde565b60405180910390fd5b8160025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156127f0578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516127e79190613edc565b60405180910390a35b50505050565b5f3390505f3290505f43905060125f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561288c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288390614775565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061290d575060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b61294c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294390614775565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806129b157508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80612a03575060125f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b612a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3990614775565b60405180910390fd5b600760189054906101000a900460ff1680612aa3575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b80612af4575060145f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b612b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2a906147dd565b60405180910390fd5b5f600760149054906101000a900460ff168015612b5d5750600760179054906101000a900460ff16155b8015612c01575060145f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612bff575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b905080156131f857612c116111f8565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614158015612c7f5750612c4f6111f8565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015612cb757505f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015612cf1575061dead73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b156131f757600760159054906101000a900460ff1615612f1d577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015612db357507f000000000000000000000000513c958143abd5d2ddb2bdda58e849efdf6f0d2f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b15612f1c57600382612dc591906147fb565b60165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054108015612e585750600382612e1891906147fb565b60165f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054105b612e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8e90614878565b60405180910390fd5b8160165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160165f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b5b60155f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612fba575060145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561306157600b54851115613004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ffb906148e0565b60405180910390fd5b600d546130108761105a565b8661301b91906148fe565b111561305c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130539061497b565b60405180910390fd5b6131f6565b60155f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156130fe575060145f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561314d57600c54851115613148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313f906149e3565b60405180910390fd5b6131f5565b60145f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166131f457600d546131a78761105a565b866131b291906148fe565b11156131f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ea9061497b565b60405180910390fd5b5b5b5b5b5b5f600760169054906101000a900460ff1680156132225750600760179054906101000a900460ff16155b80156132c6575060135f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806132c4575060135f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b155b905080156134bc575f60155f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561332657505f601054115b1561334c5760646010548861333b9190614155565b61334591906141c3565b9050613498565b60155f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156133a357505f600f54115b156133c9576064600f54886133b89190614155565b6133c291906141c3565b9050613497565b60155f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015613467575060155f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561347457505f601154115b15613496576064601154886134899190614155565b61349391906141c3565b90505b5b5b5f8111156134ba5780876134ac91906147fb565b96506134b9893083613627565b5b505b5f6134c63061105a565b90505f600e548210159050828015613525575060155f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561352e5750805b1561354f57600a5485111561354e5761354682613843565b84600a819055505b5b61355a8a8a8a613627565b50505050505050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613677578060035f82825461366b91906148fe565b92505081905550613747565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613701578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016136f8939291906146f6565b60405180910390fd5b81810360015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361378e578060035f82825403925050819055506137d9565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516138369190613edc565b60405180910390a3505050565b6001600760176101000a81548160ff0219169083151502179055505f80600267ffffffffffffffff81111561387b5761387a614a01565b5b6040519080825280602002602001820160405280156138a95781602001602082028036833780820191505090505b50905030815f815181106138c0576138bf6140fb565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613963573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139879190614a42565b8160018151811061399b5761399a6140fb565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f6014600e546139e59190614155565b9050808411156139f3578093505b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac947855f8530426040518663ffffffff1660e01b8152600401613a54959493929190614b5d565b5f604051808303815f87803b158015613a6b575f80fd5b505af1158015613a7d573d5f803e3d5ffd5b505050505f4790505f600582613a9391906141c3565b90505f8183613aa291906147fb565b905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051613ae9906144de565b5f6040518083038185875af1925050503d805f8114613b23576040519150601f19603f3d011682016040523d82523d5f602084013e613b28565b606091505b50508096505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051613b73906144de565b5f6040518083038185875af1925050503d805f8114613bad576040519150601f19603f3d011682016040523d82523d5f602084013e613bb2565b606091505b5050809650505050505050505f600760176101000a81548160ff02191690831515021790555050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f613c1d82613bdb565b613c278185613be5565b9350613c37818560208601613bf5565b613c4081613c03565b840191505092915050565b5f6020820190508181035f830152613c638184613c13565b905092915050565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613c9c82613c73565b9050919050565b613cac81613c92565b8114613cb6575f80fd5b50565b5f81359050613cc781613ca3565b92915050565b5f819050919050565b613cdf81613ccd565b8114613ce9575f80fd5b50565b5f81359050613cfa81613cd6565b92915050565b5f8060408385031215613d1657613d15613c6b565b5b5f613d2385828601613cb9565b9250506020613d3485828601613cec565b9150509250929050565b5f8115159050919050565b613d5281613d3e565b82525050565b5f602082019050613d6b5f830184613d49565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112613d9257613d91613d71565b5b8235905067ffffffffffffffff811115613daf57613dae613d75565b5b602083019150836020820283011115613dcb57613dca613d79565b5b9250929050565b613ddb81613d3e565b8114613de5575f80fd5b50565b5f81359050613df681613dd2565b92915050565b5f805f60408486031215613e1357613e12613c6b565b5b5f84013567ffffffffffffffff811115613e3057613e2f613c6f565b5b613e3c86828701613d7d565b93509350506020613e4f86828701613de8565b9150509250925092565b5f819050919050565b5f613e7c613e77613e7284613c73565b613e59565b613c73565b9050919050565b5f613e8d82613e62565b9050919050565b5f613e9e82613e83565b9050919050565b613eae81613e94565b82525050565b5f602082019050613ec75f830184613ea5565b92915050565b613ed681613ccd565b82525050565b5f602082019050613eef5f830184613ecd565b92915050565b5f805f60608486031215613f0c57613f0b613c6b565b5b5f613f1986828701613cb9565b9350506020613f2a86828701613cb9565b9250506040613f3b86828701613cec565b9150509250925092565b5f60ff82169050919050565b613f5a81613f45565b82525050565b5f602082019050613f735f830184613f51565b92915050565b5f60208284031215613f8e57613f8d613c6b565b5b5f613f9b84828501613cb9565b91505092915050565b5f60208284031215613fb957613fb8613c6b565b5b5f613fc684828501613de8565b91505092915050565b613fd881613c92565b82525050565b5f602082019050613ff15f830184613fcf565b92915050565b5f6020828403121561400c5761400b613c6b565b5b5f61401984828501613cec565b91505092915050565b5f806040838503121561403857614037613c6b565b5b5f61404585828601613cb9565b925050602061405685828601613de8565b9150509250929050565b5f806040838503121561407657614075613c6b565b5b5f61408385828601613cb9565b925050602061409485828601613cb9565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806140e257607f821691505b6020821081036140f5576140f461409e565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61415f82613ccd565b915061416a83613ccd565b925082820261417881613ccd565b9150828204841483151761418f5761418e614128565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6141cd82613ccd565b91506141d883613ccd565b9250826141e8576141e7614196565b5b828204905092915050565b7f416d6f756e74546f6f4c6f7700000000000000000000000000000000000000005f82015250565b5f614227600c83613be5565b9150614232826141f3565b602082019050919050565b5f6020820190508181035f8301526142548161421b565b9050919050565b7f41646472657373205a65726f00000000000000000000000000000000000000005f82015250565b5f61428f600c83613be5565b915061429a8261425b565b602082019050919050565b5f6020820190508181035f8301526142bc81614283565b9050919050565b5f6040820190506142d65f830185613fcf565b6142e36020830184613fcf565b9392505050565b7f466565546f6f48696768000000000000000000000000000000000000000000005f82015250565b5f61431e600a83613be5565b9150614329826142ea565b602082019050919050565b5f6020820190508181035f83015261434b81614312565b9050919050565b5f6040820190506143655f830185613ecd565b6143726020830184613ecd565b9392505050565b7f414d4d416c7265616479536574000000000000000000000000000000000000005f82015250565b5f6143ad600d83613be5565b91506143b882614379565b602082019050919050565b5f6020820190508181035f8301526143da816143a1565b9050919050565b7f416d6f756e74546f6f48696768000000000000000000000000000000000000005f82015250565b5f614415600d83613be5565b9150614420826143e1565b602082019050919050565b5f6020820190508181035f83015261444281614409565b9050919050565b7f4e6f4e6174697665546f6b656e730000000000000000000000000000000000005f82015250565b5f61447d600e83613be5565b915061448882614449565b602082019050919050565b5f6020820190508181035f8301526144aa81614471565b9050919050565b5f81905092915050565b50565b5f6144c95f836144b1565b91506144d4826144bb565b5f82019050919050565b5f6144e8826144be565b9150819050919050565b7f4661696c6564546f57697468647261774e6174697665546f6b656e73000000005f82015250565b5f614526601c83613be5565b9150614531826144f2565b602082019050919050565b5f6020820190508181035f8301526145538161451a565b9050919050565b5f8151905061456881613cd6565b92915050565b5f6020828403121561458357614582613c6b565b5b5f6145908482850161455a565b91505092915050565b7f4e6f546f6b656e730000000000000000000000000000000000000000000000005f82015250565b5f6145cd600883613be5565b91506145d882614599565b602082019050919050565b5f6020820190508181035f8301526145fa816145c1565b9050919050565b5f6040820190506146145f830185613fcf565b6146216020830184613ecd565b9392505050565b5f8151905061463681613dd2565b92915050565b5f6020828403121561465157614650613c6b565b5b5f61465e84828501614628565b91505092915050565b7f416c7265616479204c61756e63686564000000000000000000000000000000005f82015250565b5f61469b601083613be5565b91506146a682614667565b602082019050919050565b5f6020820190508181035f8301526146c88161468f565b9050919050565b5f6040820190506146e25f830185613fcf565b6146ef6020830184613d49565b9392505050565b5f6060820190506147095f830186613fcf565b6147166020830185613ecd565b6147236040830184613ecd565b949350505050565b7f426f7444657465637465640000000000000000000000000000000000000000005f82015250565b5f61475f600b83613be5565b915061476a8261472b565b602082019050919050565b5f6020820190508181035f83015261478c81614753565b9050919050565b7f4e6f744c61756e636865640000000000000000000000000000000000000000005f82015250565b5f6147c7600b83613be5565b91506147d282614793565b602082019050919050565b5f6020820190508181035f8301526147f4816147bb565b9050919050565b5f61480582613ccd565b915061481083613ccd565b925082820390508181111561482857614827614128565b5b92915050565b7f5472616e7366657244656c6179000000000000000000000000000000000000005f82015250565b5f614862600d83613be5565b915061486d8261482e565b602082019050919050565b5f6020820190508181035f83015261488f81614856565b9050919050565b7f4d6178427579416d6f756e7445786365656400000000000000000000000000005f82015250565b5f6148ca601283613be5565b91506148d582614896565b602082019050919050565b5f6020820190508181035f8301526148f7816148be565b9050919050565b5f61490882613ccd565b915061491383613ccd565b925082820190508082111561492b5761492a614128565b5b92915050565b7f4d617857616c6c6574416d6f756e7445786365656400000000000000000000005f82015250565b5f614965601583613be5565b915061497082614931565b602082019050919050565b5f6020820190508181035f83015261499281614959565b9050919050565b7f4d617853656c6c416d6f756e74457863656564000000000000000000000000005f82015250565b5f6149cd601383613be5565b91506149d882614999565b602082019050919050565b5f6020820190508181035f8301526149fa816149c1565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f81519050614a3c81613ca3565b92915050565b5f60208284031215614a5757614a56613c6b565b5b5f614a6484828501614a2e565b91505092915050565b5f819050919050565b5f614a90614a8b614a8684614a6d565b613e59565b613ccd565b9050919050565b614aa081614a76565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614ad881613c92565b82525050565b5f614ae98383614acf565b60208301905092915050565b5f602082019050919050565b5f614b0b82614aa6565b614b158185614ab0565b9350614b2083614ac0565b805f5b83811015614b50578151614b378882614ade565b9750614b4283614af5565b925050600181019050614b23565b5085935050505092915050565b5f60a082019050614b705f830188613ecd565b614b7d6020830187614a97565b8181036040830152614b8f8186614b01565b9050614b9e6060830185613fcf565b614bab6080830184613ecd565b969550505050505056fea2646970667358221220a038e8869df2517e8cbad2f3446525d2a6a2fc32d395188f28690e91f2b1c47a64736f6c63430008190033
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.