ERC-20
Overview
Max Total Supply
500,000,000,000 DMONEY
Holders
38
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
2,796,697,380.622947222 DMONEYValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
DMoney
Compiler Version
v0.8.21+commit.d9974bed
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
/* ▄ ▄ ▄▄▄▄ ▄ ▒█▀▀▄ ░█▀▀█ ▒█▀▀█ ▒█░▄▀ ▒█▀▄▀█ ▒█▀▀▀█ ▒█▄░▒█ ▒█▀▀▀ ▒█░░▒█ ▄ ▄▄▄▄ ▄ ▄ ▀ ▄ ▀▄█▀▄██ ▒█░▒█ ▒█▄▄█ ▒█▄▄▀ ▒█▀▄░ ▒█▒█▒█ ▒█░░▒█ ▒█▒█▒█ ▒█▀▀▀ ▒█▄▄▄█ ██▀█▄█▀▄▀▄ ▀ ▀ ▀▀ ▀ ▀▀ ▒█▄▄▀ ▒█░▒█ ▒█░▒█ ▒█░▒█ ▒█░░▒█ ▒█▄▄▄█ ▒█░░▀█ ▒█▄▄▄ ░░▒█░░ ▀ ▀▀▀ ▀ ▀ ▀ ▀ ▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀ ▀ DARK MONEY $DMONEY TOTAL SUPPLY 500M TAX 1.0 % ▀ ▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀ ▀ Website: https://www.darkmoney.cash Documentation: https://dmoney.gitbook.io/dark-money Repositories: https://github.com/0xDarkMoney/contracts Twitter: https://twitter.com/0xDARKMONEY Community: https://t.me/dmoney_portal ▀ ▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀ ▀ ┌─────────────────────────────────────────────────────────────────────────────┐ │ ATTENTION: In case of any investigation by federal, state, or local │ │ authorities may the record show that any activity perpetrated by │ │ the entity and/or entities behind this account falls under the │ │ creative umbrella of corporate surrealist performance art │ │ operating on a blanket copyleft license. │ └─────────────────────────────────────────────────────────────────────────────┘ */ pragma solidity ^0.8.21; // SPDX-License-Identifier: Unlicensed interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; int256 private constant MAX_INT256 = ~(int256(1) << 255); function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; // Detect overflow when multiplying MIN_INT256 with -1 require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256)); require((b == 0) || (c / b == a)); return c; } function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing MIN_INT256 by -1 require(b != - 1 || a != MIN_INT256); // Solidity already throws when dividing by 0. return a / b; } function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } function abs(int256 a) internal pure returns (int256) { require(a != MIN_INT256); return a < 0 ? - a : a; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } library Address { function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } interface IUniswapV2Factory { function createPair(address tokenA, address tokenB) external returns (address pair); } interface IUniswapV2Router02 { function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function factory() external pure returns (address); function WETH() external pure returns (address); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); } contract DMoney is Context, IERC20, Ownable { using SafeMath for uint256; using Address for address; event SwapAndLiquifyEnabledUpdated(bool enabled); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); modifier lockTheSwap { inSwapAndLiquify = true; _; inSwapAndLiquify = false; } IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); address public uniswapV2Pair = address(0); mapping(address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; mapping (address => bool) private botWallets; mapping (address => bool) private _isExcludedFromFee; mapping (address => bool) private isExchangeWallet; mapping (address => bool) private _isExcludedFromRewards; string private _name = "Dark Money"; string private _symbol = "DMONEY"; uint8 private _decimals = 9; uint256 private _tTotal = 500000000000 * 10 ** _decimals; bool inSwapAndLiquify; bool public swapAndLiquifyEnabled = true; bool isTaxFreeTransfer = false; uint256 public _maxBuyAmount = 45000000000 * 10** _decimals; // 0.9% TX uint256 public ethPriceToSwap = 50000000000000000; //.05 ETH uint public ethSellAmount = 50000000000000000; //.05 ETH uint256 public _maxWalletAmount = 45000000000 * 10** _decimals; // 0.9% MW address public buyBackAddress = 0x92328fEB128Ac3167d18E5a33bB7d9181f720B18; address public marketingAddress = 0x92328fEB128Ac3167d18E5a33bB7d9181f720B18; address public devAddress = 0x92328fEB128Ac3167d18E5a33bB7d9181f720B18; address public deadWallet = 0x000000000000000000000000000000000000dEaD; uint256 public gasForProcessing = 50000; event ProcessedDividendTracker(uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic,uint256 gas, address indexed processor); event SendDividends(uint256 EthAmount); struct Distribution { uint256 devTeam; uint256 marketing; uint256 dividend; uint256 buyBack; } struct TaxFees { uint256 buyFee; uint256 sellFee; uint256 largeSellFee; } bool private doTakeFees; bool private isSellTxn; TaxFees public taxFees; Distribution public distribution; DMoneyTracker private dividendTracker; constructor () { _balances[_msgSender()] = _tTotal; _isExcludedFromFee[owner()] = true; _isExcludedFromFee[_msgSender()] = true; _isExcludedFromFee[buyBackAddress] = true; _isExcludedFromFee[marketingAddress] = true; _isExcludedFromFee[devAddress] = true; _isExcludedFromRewards[marketingAddress] = true; _isExcludedFromRewards[_msgSender()] = true; _isExcludedFromRewards[owner()] = true; _isExcludedFromRewards[buyBackAddress] = true; _isExcludedFromRewards[devAddress] = true; _isExcludedFromRewards[deadWallet] = true; taxFees = TaxFees(5,10,0); distribution = Distribution(25, 50, 25, 0); emit Transfer(address(0), _msgSender(), _tTotal); } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _tTotal; } function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function setMaxWalletAmount(uint256 maxWalletAmount) external onlyOwner() { _maxWalletAmount = maxWalletAmount * 10**9; } function excludeIncludeFromFee(address[] calldata addresses, bool isExcludeFromFee) public onlyOwner { addRemoveFee(addresses, isExcludeFromFee); } function addRemoveExchange(address[] calldata addresses, bool isAddExchange) public onlyOwner { _addRemoveExchange(addresses, isAddExchange); } function excludeIncludeFromRewards(address[] calldata addresses, bool isExcluded) public onlyOwner { addRemoveRewards(addresses, isExcluded); } function isExcludedFromRewards(address addr) public view returns(bool) { return _isExcludedFromRewards[addr]; } function addRemoveRewards(address[] calldata addresses, bool flag) private { for (uint256 i = 0; i < addresses.length; i++) { address addr = addresses[i]; _isExcludedFromRewards[addr] = flag; } } function setEthSwapSellSettings(uint ethSellAmount_, uint256 ethPriceToSwap_) external onlyOwner { ethSellAmount = ethSellAmount_; ethPriceToSwap = ethPriceToSwap_; } function createV2Pair() external onlyOwner { require(uniswapV2Pair == address(0),"UniswapV2Pair has already been set"); uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH()); _isExcludedFromRewards[uniswapV2Pair] = true; } function _addRemoveExchange(address[] calldata addresses, bool flag) private { for (uint256 i = 0; i < addresses.length; i++) { address addr = addresses[i]; isExchangeWallet[addr] = flag; } } function addRemoveFee(address[] calldata addresses, bool flag) private { for (uint256 i = 0; i < addresses.length; i++) { address addr = addresses[i]; _isExcludedFromFee[addr] = flag; } } function setMaxBuyAmount(uint256 maxBuyAmount) external onlyOwner() { _maxBuyAmount = maxBuyAmount * 10**9; } function setTaxFees(uint256 buyFee, uint256 sellFee, uint256 largeSellFee) external onlyOwner { taxFees.buyFee = buyFee; taxFees.sellFee = sellFee; taxFees.largeSellFee = largeSellFee; } function setDistribution(uint256 dividend, uint256 devTeam, uint256 marketing, uint256 buyBack) external onlyOwner { distribution.dividend = dividend; distribution.devTeam = devTeam; distribution.marketing = marketing; distribution.buyBack = buyBack; } function setWalletAddresses(address devAddr, address buyBack, address marketingAddr) external onlyOwner { devAddress = devAddr; buyBackAddress = buyBack; marketingAddress = marketingAddr; } function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner { swapAndLiquifyEnabled = _enabled; emit SwapAndLiquifyEnabledUpdated(_enabled); } receive() external payable {} function getEthPrice(uint tokenAmount) public view returns (uint) { address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); return uniswapV2Router.getAmountsOut(tokenAmount, path)[1]; } function isExcludedFromFee(address account) public view returns(bool) { return _isExcludedFromFee[account]; } function enableDisableTaxFreeTransfers(bool enableDisable) external onlyOwner { isTaxFreeTransfer = enableDisable; } function _approve(address owner, address spender, uint256 amount) private { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _transfer(address from, address to, uint256 amount) private { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); require(uniswapV2Pair != address(0),"UniswapV2Pair has not been set"); bool isSell = false; bool takeFees = !_isExcludedFromFee[from] && !_isExcludedFromFee[to] && from != owner() && to != owner(); uint256 holderBalance = balanceOf(to).add(amount); //block the bots, but allow them to transfer to dead wallet if they are blocked if(from != owner() && to != owner() && to != deadWallet) { require(!botWallets[from] && !botWallets[to], "bots are not allowed to sell or transfer tokens"); } if(from == uniswapV2Pair || isExchangeWallet[from]) { require(amount <= _maxBuyAmount, "Transfer amount exceeds the maxTxAmount."); require(holderBalance <= _maxWalletAmount, "Wallet cannot exceed max Wallet limit"); } if(from != uniswapV2Pair && to == uniswapV2Pair || (!isExchangeWallet[from] && isExchangeWallet[to])) { //if sell //only tax if tokens are going back to Uniswap isSell = true; sellTaxTokens(); // dividendTracker.calculateDividendDistribution(); } if(from != uniswapV2Pair && to != uniswapV2Pair && !isExchangeWallet[from] && !isExchangeWallet[to]) { takeFees = isTaxFreeTransfer ? false : true; require(holderBalance <= _maxWalletAmount, "Wallet cannot exceed max Wallet limit"); } _tokenTransfer(from, to, amount, takeFees, isSell, true); } function sellTaxTokens() private { uint256 contractTokenBalance = balanceOf(address(this)); if(contractTokenBalance > 0) { uint ethPrice = getEthPrice(contractTokenBalance); if (ethPrice >= ethPriceToSwap && !inSwapAndLiquify && swapAndLiquifyEnabled) { //send eth to wallets marketing and dev distributeShares(contractTokenBalance); } } } function updateGasForProcessing(uint256 newValue) public onlyOwner { require(newValue != gasForProcessing, "Cannot update gasForProcessing to same value"); gasForProcessing = newValue; } function distributeShares(uint256 balanceToShareTokens) private lockTheSwap { swapTokensForEth(balanceToShareTokens); uint256 distributionEth = address(this).balance; uint256 marketingShare = distributionEth.mul(distribution.marketing).div(100); uint256 dividendShare = distributionEth.mul(distribution.dividend).div(100); uint256 devTeamShare = distributionEth.mul(distribution.devTeam).div(100); uint256 buyBackShare = distributionEth.mul(distribution.buyBack).div(100); payable(marketingAddress).transfer(marketingShare); sendEthDividends(dividendShare); payable(devAddress).transfer(devTeamShare); payable(buyBackAddress).transfer(buyBackShare); } function setDividendTracker(address dividendContractAddress) external onlyOwner { dividendTracker = DMoneyTracker(payable(dividendContractAddress)); } function sendEthDividends(uint256 dividends) private { (bool success,) = address(dividendTracker).call{value : dividends}(""); if (success) { emit SendDividends(dividends); } } function swapTokensForEth(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } //this method is responsible for taking all fee, if takeFee is true function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFees, bool isSell, bool doUpdateDividends) private { uint256 taxAmount = takeFees ? amount.mul(taxFees.buyFee).div(100) : 0; if(takeFees && isSell) { taxAmount = amount.mul(taxFees.sellFee).div(100); if(taxFees.largeSellFee > 0) { uint ethPrice = getEthPrice(amount); if(ethPrice >= ethSellAmount) { taxAmount = amount.mul(taxFees.largeSellFee).div(100); } } } uint256 transferAmount = amount.sub(taxAmount); _balances[sender] = _balances[sender].sub(amount); _balances[recipient] = _balances[recipient].add(transferAmount); _balances[address(this)] = _balances[address(this)].add(taxAmount); emit Transfer(sender, recipient, amount); if(doUpdateDividends) { try dividendTracker.setTokenBalance(sender) {} catch{} try dividendTracker.setTokenBalance(recipient) {} catch{} try dividendTracker.process(gasForProcessing) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) { emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gasForProcessing, tx.origin); }catch {} } } } contract IterableMapping { // Iterable mapping from address to uint; struct Map { address[] keys; mapping(address => uint) values; mapping(address => uint) indexOf; mapping(address => bool) inserted; } Map private map; function get(address key) public view returns (uint) { return map.values[key]; } function keyExists(address key) public view returns(bool) { return (getIndexOfKey(key) != -1); } function getIndexOfKey(address key) public view returns (int) { if (!map.inserted[key]) { return - 1; } return int(map.indexOf[key]); } function getKeyAtIndex(uint index) public view returns (address) { return map.keys[index]; } function size() public view returns (uint) { return map.keys.length; } function set(address key, uint val) public { if (map.inserted[key]) { map.values[key] = val; } else { map.inserted[key] = true; map.values[key] = val; map.indexOf[key] = map.keys.length; map.keys.push(key); } } function remove(address key) public { if (!map.inserted[key]) { return; } delete map.inserted[key]; delete map.values[key]; uint index = map.indexOf[key]; uint lastIndex = map.keys.length - 1; address lastKey = map.keys[lastIndex]; map.indexOf[lastKey] = index; delete map.indexOf[key]; map.keys[index] = lastKey; map.keys.pop(); } } contract DMoneyTracker is IERC20, Context, Ownable { using SafeMath for uint256; using SafeMathUint for uint256; using SafeMathInt for int256; uint256 constant internal magnitude = 2 ** 128; uint256 internal magnifiedDividendPerShare; mapping(address => int256) internal magnifiedDividendCorrections; mapping(address => uint256) internal withdrawnDividends; mapping(address => uint256) internal claimedDividends; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name = "DMONEY TRACKER"; string private _symbol = "DMT"; uint8 private _decimals = 9; uint256 public totalDividendsDistributed; IterableMapping private tokenHoldersMap = new IterableMapping(); uint256 public minimumTokenBalanceForDividends = 1500000000 * 10 ** _decimals; // 0.3% DMoney private dmoney; bool public doCalculation = false; event updateBalance(address addr, uint256 amount); event DividendsDistributed(address indexed from,uint256 weiAmount); event DividendWithdrawn(address indexed to,uint256 weiAmount); uint256 public lastProcessedIndex; mapping(address => uint256) public lastClaimTimes; uint256 public claimWait = 3600; event ExcludeFromDividends(address indexed account); event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue); event Claim(address indexed account, uint256 amount, bool indexed automatic); constructor() { emit Transfer(address(0), _msgSender(), 0); } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function transfer(address, uint256) public pure returns (bool) { require(false, "No transfers allowed in dividend tracker"); return true; } function transferFrom(address, address, uint256) public pure override returns (bool) { require(false, "No transfers allowed in dividend tracker"); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function _approve(address owner, address spender, uint256 amount) private { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function setTokenBalance(address account) external { uint256 balance = dmoney.balanceOf(account); if(!dmoney.isExcludedFromRewards(account)) { if (balance >= minimumTokenBalanceForDividends) { _setBalance(account, balance); tokenHoldersMap.set(account, balance); } else { _setBalance(account, 0); tokenHoldersMap.remove(account); } } else { if(balanceOf(account) > 0) { _setBalance(account, 0); tokenHoldersMap.remove(account); } } processAccount(payable(account), true); } function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .sub((magnifiedDividendPerShare.mul(amount)).toInt256Safe()); } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .add((magnifiedDividendPerShare.mul(amount)).toInt256Safe()); } receive() external payable { distributeDividends(); } function setERC20Contract(address contractAddr) external onlyOwner { dmoney = DMoney(payable(contractAddr)); } function totalClaimedDividends(address account) external view returns (uint256){ return withdrawnDividends[account]; } function excludeFromDividends(address account) external onlyOwner { _setBalance(account, 0); tokenHoldersMap.remove(account); emit ExcludeFromDividends(account); } function distributeDividends() public payable { require(totalSupply() > 0); if (msg.value > 0) { magnifiedDividendPerShare = magnifiedDividendPerShare.add( (msg.value).mul(magnitude) / totalSupply() ); emit DividendsDistributed(msg.sender, msg.value); totalDividendsDistributed = totalDividendsDistributed.add(msg.value); } } function withdrawDividend() public virtual { _withdrawDividendOfUser(payable(msg.sender)); } function _withdrawDividendOfUser(address payable user) internal returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user); if (_withdrawableDividend > 0) { withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend); emit DividendWithdrawn(user, _withdrawableDividend); (bool success,) = user.call{value : _withdrawableDividend, gas : 3000}(""); if (!success) { withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend); return 0; } return _withdrawableDividend; } return 0; } function dividendOf(address _owner) public view returns (uint256) { return withdrawableDividendOf(_owner); } function withdrawableDividendOf(address _owner) public view returns (uint256) { return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]); } function withdrawnDividendOf(address _owner) public view returns (uint256) { return withdrawnDividends[_owner]; } function accumulativeDividendOf(address _owner) public view returns (uint256) { return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe() .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude; } function setMinimumTokenBalanceForDividends(uint256 newMinTokenBalForDividends) external onlyOwner { minimumTokenBalanceForDividends = newMinTokenBalForDividends * (10 ** _decimals); } function updateClaimWait(uint256 newClaimWait) external onlyOwner { require(newClaimWait >= 3600 && newClaimWait <= 86400, "ClaimWait must be updated to between 1 and 24 hours"); require(newClaimWait != claimWait, "Cannot update claimWait to same value"); emit ClaimWaitUpdated(newClaimWait, claimWait); claimWait = newClaimWait; } function getLastProcessedIndex() external view returns (uint256) { return lastProcessedIndex; } function minimumTokenLimit() public view returns (uint256) { return minimumTokenBalanceForDividends; } function getNumberOfTokenHolders() external view returns (uint256) { return tokenHoldersMap.size(); } function getAccount(address _account) public view returns (address account, int256 index, int256 iterationsUntilProcessed, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime, uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable) { account = _account; index = tokenHoldersMap.getIndexOfKey(account); iterationsUntilProcessed = - 1; if (index >= 0) { if (uint256(index) > lastProcessedIndex) { iterationsUntilProcessed = index.sub(int256(lastProcessedIndex)); } else { uint256 processesUntilEndOfArray = tokenHoldersMap.size() > lastProcessedIndex ? tokenHoldersMap.size().sub(lastProcessedIndex) : 0; iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray)); } } withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); lastClaimTime = lastClaimTimes[account]; nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0; secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0; } function canAutoClaim(uint256 lastClaimTime) private view returns (bool) { if (lastClaimTime > block.timestamp) { return false; } return block.timestamp.sub(lastClaimTime) >= claimWait; } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = balanceOf(account); if (newBalance > currentBalance) { uint256 mintAmount = newBalance.sub(currentBalance); _mint(account, mintAmount); } else if (newBalance < currentBalance) { uint256 burnAmount = currentBalance.sub(newBalance); _burn(account, burnAmount); } } function process(uint256 gas) public returns (uint256, uint256, uint256) { uint256 numberOfTokenHolders = tokenHoldersMap.size(); if (numberOfTokenHolders == 0) { return (0, 0, lastProcessedIndex); } uint256 _lastProcessedIndex = lastProcessedIndex; uint256 gasUsed = 0; uint256 gasLeft = gasleft(); uint256 iterations = 0; uint256 claims = 0; while (gasUsed < gas && iterations < numberOfTokenHolders) { _lastProcessedIndex++; if (_lastProcessedIndex >= tokenHoldersMap.size()) { _lastProcessedIndex = 0; } address account = tokenHoldersMap.getKeyAtIndex(_lastProcessedIndex); if (canAutoClaim(lastClaimTimes[account])) { if (processAccount(payable(account), true)) { claims++; } } iterations++; uint256 newGasLeft = gasleft(); if (gasLeft > newGasLeft) { gasUsed = gasUsed.add(gasLeft.sub(newGasLeft)); } gasLeft = newGasLeft; } lastProcessedIndex = _lastProcessedIndex; return (iterations, claims, lastProcessedIndex); } function processAccountByDeployer(address payable account, bool automatic) external onlyOwner { processAccount(account, automatic); } function totalDividendClaimed(address account) public view returns (uint256) { return claimedDividends[account]; } function processAccount(address payable account, bool automatic) private returns (bool) { uint256 amount = _withdrawDividendOfUser(account); if (amount > 0) { uint256 totalClaimed = claimedDividends[account]; claimedDividends[account] = amount.add(totalClaimed); lastClaimTimes[account] = block.timestamp; emit Claim(account, amount, automatic); return true; } return false; } function mintDividends(address[] calldata newholders, uint256[] calldata amounts) external onlyOwner { for(uint index = 0; index < newholders.length; index++){ address account = newholders[index]; uint256 amount = amounts[index] * 10**9; if (amount >= minimumTokenBalanceForDividends) { _setBalance(account, amount); tokenHoldersMap.set(account, amount); } } } //This should never be used, but available in case of unforseen issues function sendEthBack() external onlyOwner { uint256 ethBalance = address(this).balance; payable(owner()).transfer(ethBalance); } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":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":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"EthAmount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","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"},{"inputs":[],"name":"_maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"isAddExchange","type":"bool"}],"name":"addRemoveExchange","outputs":[],"stateMutability":"nonpayable","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":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBackAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"createV2Pair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distribution","outputs":[{"internalType":"uint256","name":"devTeam","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"dividend","type":"uint256"},{"internalType":"uint256","name":"buyBack","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enableDisable","type":"bool"}],"name":"enableDisableTaxFreeTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ethPriceToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"isExcludeFromFee","type":"bool"}],"name":"excludeIncludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"excludeIncludeFromRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"getEthPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isExcludedFromRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dividend","type":"uint256"},{"internalType":"uint256","name":"devTeam","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"buyBack","type":"uint256"}],"name":"setDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dividendContractAddress","type":"address"}],"name":"setDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethSellAmount_","type":"uint256"},{"internalType":"uint256","name":"ethPriceToSwap_","type":"uint256"}],"name":"setEthSwapSellSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxBuyAmount","type":"uint256"}],"name":"setMaxBuyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWalletAmount","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyFee","type":"uint256"},{"internalType":"uint256","name":"sellFee","type":"uint256"},{"internalType":"uint256","name":"largeSellFee","type":"uint256"}],"name":"setTaxFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"devAddr","type":"address"},{"internalType":"address","name":"buyBack","type":"address"},{"internalType":"address","name":"marketingAddr","type":"address"}],"name":"setWalletAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxFees","outputs":[{"internalType":"uint256","name":"buyFee","type":"uint256"},{"internalType":"uint256","name":"sellFee","type":"uint256"},{"internalType":"uint256","name":"largeSellFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","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 IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052737a250d5630b4cf539739df2c5dacb4c659f2488d60015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600a81526020017f4461726b204d6f6e65790000000000000000000000000000000000000000000081525060099081620000de919062000cda565b506040518060400160405280600681526020017f444d4f4e45590000000000000000000000000000000000000000000000000000815250600a908162000125919062000cda565b506009600b5f6101000a81548160ff021916908360ff160217905550600b5f9054906101000a900460ff16600a6200015e919062000f47565b64746a52880062000170919062000f97565b600c556001600d60016101000a81548160ff0219169083151502179055505f600d60026101000a81548160ff021916908315150217905550600b5f9054906101000a900460ff16600a620001c5919062000f47565b640a7a358200620001d7919062000f97565b600e5566b1a2bc2ec50000600f5566b1a2bc2ec50000601055600b5f9054906101000a900460ff16600a6200020d919062000f47565b640a7a3582006200021f919062000f97565b6011557392328feb128ac3167d18e5a33bb7d9181f720b1860125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507392328feb128ac3167d18e5a33bb7d9181f720b1860135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507392328feb128ac3167d18e5a33bb7d9181f720b1860145f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061dead60155f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061c35060165534801562000372575f80fd5b505f6200038462000a4860201b60201c565b9050805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600c5460035f6200043662000a4860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600160065f6200048862000a4f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160065f620004ec62000a4860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160065f60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160065f60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160065f60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160085f60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160085f6200072862000a4860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160085f6200078c62000a4f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160085f60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160085f60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160085f60155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550604051806060016040528060058152602001600a81526020015f81525060185f820151815f0155602082015181600101556040820151816002015590505060405180608001604052806019815260200160328152602001601981526020015f815250601b5f820151815f0155602082015181600101556040820151816002015560608201518160030155905050620009da62000a4860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600c5460405162000a3a919062000ff2565b60405180910390a36200100d565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062000af257607f821691505b60208210810362000b085762000b0762000aad565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262000b6c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000b2f565b62000b78868362000b2f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000bc262000bbc62000bb68462000b90565b62000b99565b62000b90565b9050919050565b5f819050919050565b62000bdd8362000ba2565b62000bf562000bec8262000bc9565b84845462000b3b565b825550505050565b5f90565b62000c0b62000bfd565b62000c1881848462000bd2565b505050565b5b8181101562000c3f5762000c335f8262000c01565b60018101905062000c1e565b5050565b601f82111562000c8e5762000c588162000b0e565b62000c638462000b20565b8101602085101562000c73578190505b62000c8b62000c828562000b20565b83018262000c1d565b50505b505050565b5f82821c905092915050565b5f62000cb05f198460080262000c93565b1980831691505092915050565b5f62000cca838362000c9f565b9150826002028217905092915050565b62000ce58262000a76565b67ffffffffffffffff81111562000d015762000d0062000a80565b5b62000d0d825462000ada565b62000d1a82828562000c43565b5f60209050601f83116001811462000d50575f841562000d3b578287015190505b62000d47858262000cbd565b86555062000db6565b601f19841662000d608662000b0e565b5f5b8281101562000d895784890151825560018201915060208501945060208101905062000d62565b8683101562000da9578489015162000da5601f89168262000c9f565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111562000e485780860481111562000e205762000e1f62000dbe565b5b600185161562000e305780820291505b808102905062000e408562000deb565b945062000e00565b94509492505050565b5f8262000e62576001905062000f34565b8162000e71575f905062000f34565b816001811462000e8a576002811462000e955762000ecb565b600191505062000f34565b60ff84111562000eaa5762000ea962000dbe565b5b8360020a91508482111562000ec45762000ec362000dbe565b5b5062000f34565b5060208310610133831016604e8410600b841016171562000f055782820a90508381111562000eff5762000efe62000dbe565b5b62000f34565b62000f14848484600162000df7565b9250905081840481111562000f2e5762000f2d62000dbe565b5b81810290505b9392505050565b5f60ff82169050919050565b5f62000f538262000b90565b915062000f608362000f3b565b925062000f8f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000e51565b905092915050565b5f62000fa38262000b90565b915062000fb08362000b90565b925082820262000fc08162000b90565b9150828204841483151762000fda5762000fd962000dbe565b5b5092915050565b62000fec8162000b90565b82525050565b5f602082019050620010075f83018462000fe1565b92915050565b615203806200101b5f395ff3fe608060405260043610610275575f3560e01c8063715018a61161014e5780639758f61d116100c0578063b6a9987211610079578063b6a9987214610965578063c49b9a801461097b578063dd62ed3e146109a3578063f2fde38b146109df578063f34eb0b814610a07578063fb6287d214610a2f5761027c565b80639758f61d1461084957806398acb5d8146108715780639c1b8af514610899578063a457c2d7146108c3578063a5ece941146108ff578063a9059cbb146109295761027c565b8063870d365d11610112578063870d365d1461073f578063871c128d1461077b5780638da5cb5b146107a357806391142cb3146107cd57806395d89b41146107f757806396848136146108215761027c565b8063715018a61461068557806371cd56af1461069b578063783478ad146106c35780637bde92bc146106ed57806385141a77146107155761027c565b806339509351116101e75780634e781233116101ab5780634e781233146105645780635342acb41461058c57806354a5df1f146105c85780635ee58efc146105f25780636c0a24eb1461061f57806370a08231146106495761027c565b806339509351146104825780633ad10ef6146104be578063441d801f146104e857806349bd5a5e146105105780634a74bb021461053a5761027c565b80630fc709e5116102395780630fc709e5146103785780631694505e146103a057806318160ddd146103ca57806323b872dd146103f457806327a14fc214610430578063313ce567146104585761027c565b80630492f0551461028057806306fdde03146102aa578063095ea7b3146102d45780630ddc0976146103105780630e8322731461033c5761027c565b3661027c57005b5f80fd5b34801561028b575f80fd5b50610294610a57565b6040516102a19190613d54565b60405180910390f35b3480156102b5575f80fd5b506102be610a5d565b6040516102cb9190613df7565b60405180910390f35b3480156102df575f80fd5b506102fa60048036038101906102f59190613eac565b610aed565b6040516103079190613f04565b60405180910390f35b34801561031b575f80fd5b50610324610b0a565b60405161033393929190613f1d565b60405180910390f35b348015610347575f80fd5b50610362600480360381019061035d9190613f52565b610b21565b60405161036f9190613f04565b60405180910390f35b348015610383575f80fd5b5061039e60048036038101906103999190613f7d565b610b73565b005b3480156103ab575f80fd5b506103b4610c34565b6040516103c1919061403c565b60405180910390f35b3480156103d5575f80fd5b506103de610c59565b6040516103eb9190613d54565b60405180910390f35b3480156103ff575f80fd5b5061041a60048036038101906104159190614055565b610c62565b6040516104279190613f04565b60405180910390f35b34801561043b575f80fd5b50610456600480360381019061045191906140a5565b610d36565b005b348015610463575f80fd5b5061046c610de3565b60405161047991906140eb565b60405180910390f35b34801561048d575f80fd5b506104a860048036038101906104a39190613eac565b610df8565b6040516104b59190613f04565b60405180910390f35b3480156104c9575f80fd5b506104d2610ea6565b6040516104df9190614113565b60405180910390f35b3480156104f3575f80fd5b5061050e600480360381019061050991906141b7565b610ecb565b005b34801561051b575f80fd5b50610524610f6f565b6040516105319190614113565b60405180910390f35b348015610545575f80fd5b5061054e610f94565b60405161055b9190613f04565b60405180910390f35b34801561056f575f80fd5b5061058a60048036038101906105859190614214565b610fa7565b005b348015610597575f80fd5b506105b260048036038101906105ad9190613f52565b611058565b6040516105bf9190613f04565b60405180910390f35b3480156105d3575f80fd5b506105dc6110aa565b6040516105e99190613d54565b60405180910390f35b3480156105fd575f80fd5b506106066110b0565b604051610616949392919061423f565b60405180910390f35b34801561062a575f80fd5b506106336110cd565b6040516106409190613d54565b60405180910390f35b348015610654575f80fd5b5061066f600480360381019061066a9190613f52565b6110d3565b60405161067c9190613d54565b60405180910390f35b348015610690575f80fd5b50610699611119565b005b3480156106a6575f80fd5b506106c160048036038101906106bc91906141b7565b611267565b005b3480156106ce575f80fd5b506106d761130b565b6040516106e49190614113565b60405180910390f35b3480156106f8575f80fd5b50610713600480360381019061070e9190614282565b611330565b005b348015610720575f80fd5b506107296113d6565b6040516107369190614113565b60405180910390f35b34801561074a575f80fd5b50610765600480360381019061076091906140a5565b6113fb565b6040516107729190613d54565b60405180910390f35b348015610786575f80fd5b506107a1600480360381019061079c91906140a5565b611634565b005b3480156107ae575f80fd5b506107b7611716565b6040516107c49190614113565b60405180910390f35b3480156107d8575f80fd5b506107e161173d565b6040516107ee9190613d54565b60405180910390f35b348015610802575f80fd5b5061080b611743565b6040516108189190613df7565b60405180910390f35b34801561082c575f80fd5b50610847600480360381019061084291906141b7565b6117d3565b005b348015610854575f80fd5b5061086f600480360381019061086a91906142c0565b611877565b005b34801561087c575f80fd5b5061089760048036038101906108929190613f52565b61192d565b005b3480156108a4575f80fd5b506108ad611a04565b6040516108ba9190613d54565b60405180910390f35b3480156108ce575f80fd5b506108e960048036038101906108e49190613eac565b611a0a565b6040516108f69190613f04565b60405180910390f35b34801561090a575f80fd5b50610913611ad2565b6040516109209190614113565b60405180910390f35b348015610934575f80fd5b5061094f600480360381019061094a9190613eac565b611af7565b60405161095c9190613f04565b60405180910390f35b348015610970575f80fd5b50610979611b14565b005b348015610986575f80fd5b506109a1600480360381019061099c9190614214565b611e83565b005b3480156109ae575f80fd5b506109c960048036038101906109c49190614310565b611f6b565b6040516109d69190613d54565b60405180910390f35b3480156109ea575f80fd5b50610a056004803603810190610a009190613f52565b611fed565b005b348015610a12575f80fd5b50610a2d6004803603810190610a2891906140a5565b6121aa565b005b348015610a3a575f80fd5b50610a556004803603810190610a50919061434e565b612257565b005b600e5481565b606060098054610a6c906143cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610a98906143cb565b8015610ae35780601f10610aba57610100808354040283529160200191610ae3565b820191905f5260205f20905b815481529060010190602001808311610ac657829003601f168201915b5050505050905090565b5f610b00610af96123b0565b84846123b7565b6001905092915050565b6018805f0154908060010154908060020154905083565b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b610b7b6123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfe90614445565b60405180910390fd5b83601b6002018190555082601b5f018190555081601b6001018190555080601b6003018190555050505050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600c54905090565b5f610c6e84848461257a565b610d2b84610c7a6123b0565b610d26856040518060600160405280602881526020016151816028913960045f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610cdd6123b0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612e789092919063ffffffff16565b6123b7565b600190509392505050565b610d3e6123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc190614445565b60405180910390fd5b633b9aca0081610dda9190614490565b60118190555050565b5f600b5f9054906101000a900460ff16905090565b5f610e9c610e046123b0565b84610e978560045f610e146123b0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612eda90919063ffffffff16565b6123b7565b6001905092915050565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ed36123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5690614445565b60405180910390fd5b610f6a838383612f37565b505050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60019054906101000a900460ff1681565b610faf6123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461103b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103290614445565b60405180910390fd5b80600d60026101000a81548160ff02191690831515021790555050565b5f60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b600f5481565b601b805f0154908060010154908060020154908060030154905084565b60115481565b5f60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6111216123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a490614445565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61126f6123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f290614445565b60405180910390fd5b611306838383612fdd565b505050565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6113386123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb90614445565b60405180910390fd5b8160108190555080600f819055505050565b60155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80600267ffffffffffffffff811115611418576114176144d1565b5b6040519080825280602002602001820160405280156114465781602001602082028036833780820191505090505b50905030815f8151811061145d5761145c6144fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611501573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611525919061453f565b81600181518110611539576115386144fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f84836040518363ffffffff1660e01b81526004016115cf929190614621565b5f60405180830381865afa1580156115e9573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611611919061476e565b600181518110611624576116236144fe565b5b6020026020010151915050919050565b61163c6123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bf90614445565b60405180910390fd5b601654810361170c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170390614825565b60405180910390fd5b8060168190555050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60105481565b6060600a8054611752906143cb565b80601f016020809104026020016040519081016040528092919081815260200182805461177e906143cb565b80156117c95780601f106117a0576101008083540402835291602001916117c9565b820191905f5260205f20905b8154815290600101906020018083116117ac57829003601f168201915b5050505050905090565b6117db6123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185e90614445565b60405180910390fd5b611872838383613083565b505050565b61187f6123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461190b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190290614445565b60405180910390fd5b8260185f01819055508160186001018190555080601860020181905550505050565b6119356123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b890614445565b60405180910390fd5b80601f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60165481565b5f611ac8611a166123b0565b84611ac3856040518060600160405280602581526020016151a96025913960045f611a3f6123b0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612e789092919063ffffffff16565b6123b7565b6001905092915050565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f611b0a611b036123b0565b848461257a565b6001905092915050565b611b1c6123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9f90614445565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2e906148b3565b60405180910390fd5b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ca1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cc5919061453f565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d4b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d6f919061453f565b6040518363ffffffff1660e01b8152600401611d8c9291906148d1565b6020604051808303815f875af1158015611da8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dcc919061453f565b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160085f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550565b611e8b6123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0e90614445565b60405180910390fd5b80600d60016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15981604051611f609190613f04565b60405180910390a150565b5f60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611ff56123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207890614445565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e690614968565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6121b26123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461223e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223590614445565b60405180910390fd5b633b9aca008161224e9190614490565b600e8190555050565b61225f6123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e290614445565b60405180910390fd5b8260145f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241c906149f6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248a90614a84565b60405180910390fd5b8060045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161256d9190613d54565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036125e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125df90614b12565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264d90614ba0565b60405180910390fd5b5f8111612698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268f90614c2e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271e90614c96565b60405180910390fd5b5f8060065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156127c7575060065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561280657506127d6611716565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156128455750612815611716565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b90505f61286384612855876110d3565b612eda90919063ffffffff16565b905061286d611716565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141580156128db57506128ab611716565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612934575060155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15612a175760055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156129d7575060055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b612a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0d90614d24565b60405180910390fd5b5b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161480612ab8575060075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15612b4857600e54841115612b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af990614db2565b60405180910390fd5b601154811115612b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3e90614e40565b60405180910390fd5b5b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015612bf1575060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b80612c95575060075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015612c94575060075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b5b15612ca75760019250612ca6613129565b5b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015612d51575060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612da4575060075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612df7575060075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612e6157600d60029054906101000a900460ff16612e17576001612e19565b5f5b9150601154811115612e60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5790614e40565b60405180910390fd5b5b612e7086868685876001613193565b505050505050565b5f838311158290612ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb69190613df7565b60405180910390fd5b505f8385612ecd9190614e5e565b9050809150509392505050565b5f808284612ee89190614e91565b905083811015612f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2490614f0e565b60405180910390fd5b8091505092915050565b5f5b83839050811015612fd7575f848483818110612f5857612f576144fe565b5b9050602002016020810190612f6d9190613f52565b90508260065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550508080612fcf90614f2c565b915050612f39565b50505050565b5f5b8383905081101561307d575f848483818110612ffe57612ffd6144fe565b5b90506020020160208101906130139190613f52565b90508260085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050808061307590614f2c565b915050612fdf565b50505050565b5f5b83839050811015613123575f8484838181106130a4576130a36144fe565b5b90506020020160208101906130b99190613f52565b90508260075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050808061311b90614f2c565b915050613085565b50505050565b5f613133306110d3565b90505f811115613190575f613147826113fb565b9050600f5481101580156131675750600d5f9054906101000a900460ff16155b801561317f5750600d60019054906101000a900460ff165b1561318e5761318d8261369a565b5b505b50565b5f8361319f575f6131ca565b6131c960646131bb60185f0154886138d190919063ffffffff16565b61394890919063ffffffff16565b5b90508380156131d65750825b1561325b5761320660646131f8601860010154886138d190919063ffffffff16565b61394890919063ffffffff16565b90505f601860020154111561325a575f61321f866113fb565b90506010548110613258576132556064613247601860020154896138d190919063ffffffff16565b61394890919063ffffffff16565b91505b505b5b5f61326f828761399190919063ffffffff16565b90506132c18660035f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461399190919063ffffffff16565b60035f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506133528160035f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612eda90919063ffffffff16565b60035f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506133e38260035f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612eda90919063ffffffff16565b60035f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef886040516134819190613d54565b60405180910390a3821561369057601f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b1896040518263ffffffff1660e01b81526004016134e99190614113565b5f604051808303815f87803b158015613500575f80fd5b505af1925050508015613511575060015b50601f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b1886040518263ffffffff1660e01b815260040161356c9190614113565b5f604051808303815f87803b158015613583575f80fd5b505af1925050508015613594575060015b50601f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c4796016546040518263ffffffff1660e01b81526004016135f19190613d54565b6060604051808303815f875af192505050801561362c57506040513d601f19601f820116820180604052508101906136299190614f73565b60015b1561368f573273ffffffffffffffffffffffffffffffffffffffff16600115157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98858585601654604051613683949392919061423f565b60405180910390a35050505b5b5050505050505050565b6001600d5f6101000a81548160ff0219169083151502179055506136bd816139da565b5f4790505f6136ed60646136df601b60010154856138d190919063ffffffff16565b61394890919063ffffffff16565b90505f61371b606461370d601b60020154866138d190919063ffffffff16565b61394890919063ffffffff16565b90505f613748606461373a601b5f0154876138d190919063ffffffff16565b61394890919063ffffffff16565b90505f6137766064613768601b60030154886138d190919063ffffffff16565b61394890919063ffffffff16565b905060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8590811502906040515f60405180830381858888f193505050501580156137dc573d5f803e3d5ffd5b506137e683613c10565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f1935050505015801561384a573d5f803e3d5ffd5b5060125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f193505050501580156138af573d5f803e3d5ffd5b5050505050505f600d5f6101000a81548160ff02191690831515021790555050565b5f8083036138e1575f9050613942565b5f82846138ee9190614490565b90508284826138fd9190614ff0565b1461393d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161393490615090565b60405180910390fd5b809150505b92915050565b5f61398983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613cdb565b905092915050565b5f6139d283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e78565b905092915050565b5f600267ffffffffffffffff8111156139f6576139f56144d1565b5b604051908082528060200260200182016040528015613a245781602001602082028036833780820191505090505b50905030815f81518110613a3b57613a3a6144fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613adf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b03919061453f565b81600181518110613b1757613b166144fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613b7d3060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846123b7565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401613bdf9594939291906150e7565b5f604051808303815f87803b158015613bf6575f80fd5b505af1158015613c08573d5f803e3d5ffd5b505050505050565b5f601f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051613c569061516c565b5f6040518083038185875af1925050503d805f8114613c90576040519150601f19603f3d011682016040523d82523d5f602084013e613c95565b606091505b505090508015613cd7577fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b182604051613cce9190613d54565b60405180910390a15b5050565b5f8083118290613d21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d189190613df7565b60405180910390fd5b505f8385613d2f9190614ff0565b9050809150509392505050565b5f819050919050565b613d4e81613d3c565b82525050565b5f602082019050613d675f830184613d45565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613da4578082015181840152602081019050613d89565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613dc982613d6d565b613dd38185613d77565b9350613de3818560208601613d87565b613dec81613daf565b840191505092915050565b5f6020820190508181035f830152613e0f8184613dbf565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613e5182613e28565b9050919050565b613e6181613e47565b8114613e6b575f80fd5b50565b5f81359050613e7c81613e58565b92915050565b613e8b81613d3c565b8114613e95575f80fd5b50565b5f81359050613ea681613e82565b92915050565b5f8060408385031215613ec257613ec1613e20565b5b5f613ecf85828601613e6e565b9250506020613ee085828601613e98565b9150509250929050565b5f8115159050919050565b613efe81613eea565b82525050565b5f602082019050613f175f830184613ef5565b92915050565b5f606082019050613f305f830186613d45565b613f3d6020830185613d45565b613f4a6040830184613d45565b949350505050565b5f60208284031215613f6757613f66613e20565b5b5f613f7484828501613e6e565b91505092915050565b5f805f8060808587031215613f9557613f94613e20565b5b5f613fa287828801613e98565b9450506020613fb387828801613e98565b9350506040613fc487828801613e98565b9250506060613fd587828801613e98565b91505092959194509250565b5f819050919050565b5f614004613fff613ffa84613e28565b613fe1565b613e28565b9050919050565b5f61401582613fea565b9050919050565b5f6140268261400b565b9050919050565b6140368161401c565b82525050565b5f60208201905061404f5f83018461402d565b92915050565b5f805f6060848603121561406c5761406b613e20565b5b5f61407986828701613e6e565b935050602061408a86828701613e6e565b925050604061409b86828701613e98565b9150509250925092565b5f602082840312156140ba576140b9613e20565b5b5f6140c784828501613e98565b91505092915050565b5f60ff82169050919050565b6140e5816140d0565b82525050565b5f6020820190506140fe5f8301846140dc565b92915050565b61410d81613e47565b82525050565b5f6020820190506141265f830184614104565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261414d5761414c61412c565b5b8235905067ffffffffffffffff81111561416a57614169614130565b5b60208301915083602082028301111561418657614185614134565b5b9250929050565b61419681613eea565b81146141a0575f80fd5b50565b5f813590506141b18161418d565b92915050565b5f805f604084860312156141ce576141cd613e20565b5b5f84013567ffffffffffffffff8111156141eb576141ea613e24565b5b6141f786828701614138565b9350935050602061420a868287016141a3565b9150509250925092565b5f6020828403121561422957614228613e20565b5b5f614236848285016141a3565b91505092915050565b5f6080820190506142525f830187613d45565b61425f6020830186613d45565b61426c6040830185613d45565b6142796060830184613d45565b95945050505050565b5f806040838503121561429857614297613e20565b5b5f6142a585828601613e98565b92505060206142b685828601613e98565b9150509250929050565b5f805f606084860312156142d7576142d6613e20565b5b5f6142e486828701613e98565b93505060206142f586828701613e98565b925050604061430686828701613e98565b9150509250925092565b5f806040838503121561432657614325613e20565b5b5f61433385828601613e6e565b925050602061434485828601613e6e565b9150509250929050565b5f805f6060848603121561436557614364613e20565b5b5f61437286828701613e6e565b935050602061438386828701613e6e565b925050604061439486828701613e6e565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806143e257607f821691505b6020821081036143f5576143f461439e565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f61442f602083613d77565b915061443a826143fb565b602082019050919050565b5f6020820190508181035f83015261445c81614423565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61449a82613d3c565b91506144a583613d3c565b92508282026144b381613d3c565b915082820484148315176144ca576144c9614463565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8151905061453981613e58565b92915050565b5f6020828403121561455457614553613e20565b5b5f6145618482850161452b565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61459c81613e47565b82525050565b5f6145ad8383614593565b60208301905092915050565b5f602082019050919050565b5f6145cf8261456a565b6145d98185614574565b93506145e483614584565b805f5b838110156146145781516145fb88826145a2565b9750614606836145b9565b9250506001810190506145e7565b5085935050505092915050565b5f6040820190506146345f830185613d45565b818103602083015261464681846145c5565b90509392505050565b61465882613daf565b810181811067ffffffffffffffff82111715614677576146766144d1565b5b80604052505050565b5f614689613e17565b9050614695828261464f565b919050565b5f67ffffffffffffffff8211156146b4576146b36144d1565b5b602082029050602081019050919050565b5f815190506146d381613e82565b92915050565b5f6146eb6146e68461469a565b614680565b9050808382526020820190506020840283018581111561470e5761470d614134565b5b835b81811015614737578061472388826146c5565b845260208401935050602081019050614710565b5050509392505050565b5f82601f8301126147555761475461412c565b5b81516147658482602086016146d9565b91505092915050565b5f6020828403121561478357614782613e20565b5b5f82015167ffffffffffffffff8111156147a05761479f613e24565b5b6147ac84828501614741565b91505092915050565b7f43616e6e6f742075706461746520676173466f7250726f63657373696e6720745f8201527f6f2073616d652076616c75650000000000000000000000000000000000000000602082015250565b5f61480f602c83613d77565b915061481a826147b5565b604082019050919050565b5f6020820190508181035f83015261483c81614803565b9050919050565b7f556e69737761705632506169722068617320616c7265616479206265656e20735f8201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b5f61489d602283613d77565b91506148a882614843565b604082019050919050565b5f6020820190508181035f8301526148ca81614891565b9050919050565b5f6040820190506148e45f830185614104565b6148f16020830184614104565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f614952602683613d77565b915061495d826148f8565b604082019050919050565b5f6020820190508181035f83015261497f81614946565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6149e0602483613d77565b91506149eb82614986565b604082019050919050565b5f6020820190508181035f830152614a0d816149d4565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f614a6e602283613d77565b9150614a7982614a14565b604082019050919050565b5f6020820190508181035f830152614a9b81614a62565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f614afc602583613d77565b9150614b0782614aa2565b604082019050919050565b5f6020820190508181035f830152614b2981614af0565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f614b8a602383613d77565b9150614b9582614b30565b604082019050919050565b5f6020820190508181035f830152614bb781614b7e565b9050919050565b7f5472616e7366657220616d6f756e74206d7573742062652067726561746572205f8201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b5f614c18602983613d77565b9150614c2382614bbe565b604082019050919050565b5f6020820190508181035f830152614c4581614c0c565b9050919050565b7f556e697377617056325061697220686173206e6f74206265656e2073657400005f82015250565b5f614c80601e83613d77565b9150614c8b82614c4c565b602082019050919050565b5f6020820190508181035f830152614cad81614c74565b9050919050565b7f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f72205f8201527f7472616e7366657220746f6b656e730000000000000000000000000000000000602082015250565b5f614d0e602f83613d77565b9150614d1982614cb4565b604082019050919050565b5f6020820190508181035f830152614d3b81614d02565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d6178545f8201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b5f614d9c602883613d77565b9150614da782614d42565b604082019050919050565b5f6020820190508181035f830152614dc981614d90565b9050919050565b7f57616c6c65742063616e6e6f7420657863656564206d61782057616c6c6574205f8201527f6c696d6974000000000000000000000000000000000000000000000000000000602082015250565b5f614e2a602583613d77565b9150614e3582614dd0565b604082019050919050565b5f6020820190508181035f830152614e5781614e1e565b9050919050565b5f614e6882613d3c565b9150614e7383613d3c565b9250828203905081811115614e8b57614e8a614463565b5b92915050565b5f614e9b82613d3c565b9150614ea683613d3c565b9250828201905080821115614ebe57614ebd614463565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f614ef8601b83613d77565b9150614f0382614ec4565b602082019050919050565b5f6020820190508181035f830152614f2581614eec565b9050919050565b5f614f3682613d3c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f6857614f67614463565b5b600182019050919050565b5f805f60608486031215614f8a57614f89613e20565b5b5f614f97868287016146c5565b9350506020614fa8868287016146c5565b9250506040614fb9868287016146c5565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614ffa82613d3c565b915061500583613d3c565b92508261501557615014614fc3565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f5f8201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b5f61507a602183613d77565b915061508582615020565b604082019050919050565b5f6020820190508181035f8301526150a78161506e565b9050919050565b5f819050919050565b5f6150d16150cc6150c7846150ae565b613fe1565b613d3c565b9050919050565b6150e1816150b7565b82525050565b5f60a0820190506150fa5f830188613d45565b61510760208301876150d8565b818103604083015261511981866145c5565b90506151286060830185614104565b6151356080830184613d45565b9695505050505050565b5f81905092915050565b50565b5f6151575f8361513f565b915061516282615149565b5f82019050919050565b5f6151768261514c565b915081905091905056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220449b320b33a807446296dd2b3c0d754e50a3a1f491b56c0489be01de9fa7b18064736f6c63430008150033
Deployed Bytecode
0x608060405260043610610275575f3560e01c8063715018a61161014e5780639758f61d116100c0578063b6a9987211610079578063b6a9987214610965578063c49b9a801461097b578063dd62ed3e146109a3578063f2fde38b146109df578063f34eb0b814610a07578063fb6287d214610a2f5761027c565b80639758f61d1461084957806398acb5d8146108715780639c1b8af514610899578063a457c2d7146108c3578063a5ece941146108ff578063a9059cbb146109295761027c565b8063870d365d11610112578063870d365d1461073f578063871c128d1461077b5780638da5cb5b146107a357806391142cb3146107cd57806395d89b41146107f757806396848136146108215761027c565b8063715018a61461068557806371cd56af1461069b578063783478ad146106c35780637bde92bc146106ed57806385141a77146107155761027c565b806339509351116101e75780634e781233116101ab5780634e781233146105645780635342acb41461058c57806354a5df1f146105c85780635ee58efc146105f25780636c0a24eb1461061f57806370a08231146106495761027c565b806339509351146104825780633ad10ef6146104be578063441d801f146104e857806349bd5a5e146105105780634a74bb021461053a5761027c565b80630fc709e5116102395780630fc709e5146103785780631694505e146103a057806318160ddd146103ca57806323b872dd146103f457806327a14fc214610430578063313ce567146104585761027c565b80630492f0551461028057806306fdde03146102aa578063095ea7b3146102d45780630ddc0976146103105780630e8322731461033c5761027c565b3661027c57005b5f80fd5b34801561028b575f80fd5b50610294610a57565b6040516102a19190613d54565b60405180910390f35b3480156102b5575f80fd5b506102be610a5d565b6040516102cb9190613df7565b60405180910390f35b3480156102df575f80fd5b506102fa60048036038101906102f59190613eac565b610aed565b6040516103079190613f04565b60405180910390f35b34801561031b575f80fd5b50610324610b0a565b60405161033393929190613f1d565b60405180910390f35b348015610347575f80fd5b50610362600480360381019061035d9190613f52565b610b21565b60405161036f9190613f04565b60405180910390f35b348015610383575f80fd5b5061039e60048036038101906103999190613f7d565b610b73565b005b3480156103ab575f80fd5b506103b4610c34565b6040516103c1919061403c565b60405180910390f35b3480156103d5575f80fd5b506103de610c59565b6040516103eb9190613d54565b60405180910390f35b3480156103ff575f80fd5b5061041a60048036038101906104159190614055565b610c62565b6040516104279190613f04565b60405180910390f35b34801561043b575f80fd5b50610456600480360381019061045191906140a5565b610d36565b005b348015610463575f80fd5b5061046c610de3565b60405161047991906140eb565b60405180910390f35b34801561048d575f80fd5b506104a860048036038101906104a39190613eac565b610df8565b6040516104b59190613f04565b60405180910390f35b3480156104c9575f80fd5b506104d2610ea6565b6040516104df9190614113565b60405180910390f35b3480156104f3575f80fd5b5061050e600480360381019061050991906141b7565b610ecb565b005b34801561051b575f80fd5b50610524610f6f565b6040516105319190614113565b60405180910390f35b348015610545575f80fd5b5061054e610f94565b60405161055b9190613f04565b60405180910390f35b34801561056f575f80fd5b5061058a60048036038101906105859190614214565b610fa7565b005b348015610597575f80fd5b506105b260048036038101906105ad9190613f52565b611058565b6040516105bf9190613f04565b60405180910390f35b3480156105d3575f80fd5b506105dc6110aa565b6040516105e99190613d54565b60405180910390f35b3480156105fd575f80fd5b506106066110b0565b604051610616949392919061423f565b60405180910390f35b34801561062a575f80fd5b506106336110cd565b6040516106409190613d54565b60405180910390f35b348015610654575f80fd5b5061066f600480360381019061066a9190613f52565b6110d3565b60405161067c9190613d54565b60405180910390f35b348015610690575f80fd5b50610699611119565b005b3480156106a6575f80fd5b506106c160048036038101906106bc91906141b7565b611267565b005b3480156106ce575f80fd5b506106d761130b565b6040516106e49190614113565b60405180910390f35b3480156106f8575f80fd5b50610713600480360381019061070e9190614282565b611330565b005b348015610720575f80fd5b506107296113d6565b6040516107369190614113565b60405180910390f35b34801561074a575f80fd5b50610765600480360381019061076091906140a5565b6113fb565b6040516107729190613d54565b60405180910390f35b348015610786575f80fd5b506107a1600480360381019061079c91906140a5565b611634565b005b3480156107ae575f80fd5b506107b7611716565b6040516107c49190614113565b60405180910390f35b3480156107d8575f80fd5b506107e161173d565b6040516107ee9190613d54565b60405180910390f35b348015610802575f80fd5b5061080b611743565b6040516108189190613df7565b60405180910390f35b34801561082c575f80fd5b50610847600480360381019061084291906141b7565b6117d3565b005b348015610854575f80fd5b5061086f600480360381019061086a91906142c0565b611877565b005b34801561087c575f80fd5b5061089760048036038101906108929190613f52565b61192d565b005b3480156108a4575f80fd5b506108ad611a04565b6040516108ba9190613d54565b60405180910390f35b3480156108ce575f80fd5b506108e960048036038101906108e49190613eac565b611a0a565b6040516108f69190613f04565b60405180910390f35b34801561090a575f80fd5b50610913611ad2565b6040516109209190614113565b60405180910390f35b348015610934575f80fd5b5061094f600480360381019061094a9190613eac565b611af7565b60405161095c9190613f04565b60405180910390f35b348015610970575f80fd5b50610979611b14565b005b348015610986575f80fd5b506109a1600480360381019061099c9190614214565b611e83565b005b3480156109ae575f80fd5b506109c960048036038101906109c49190614310565b611f6b565b6040516109d69190613d54565b60405180910390f35b3480156109ea575f80fd5b50610a056004803603810190610a009190613f52565b611fed565b005b348015610a12575f80fd5b50610a2d6004803603810190610a2891906140a5565b6121aa565b005b348015610a3a575f80fd5b50610a556004803603810190610a50919061434e565b612257565b005b600e5481565b606060098054610a6c906143cb565b80601f0160208091040260200160405190810160405280929190818152602001828054610a98906143cb565b8015610ae35780601f10610aba57610100808354040283529160200191610ae3565b820191905f5260205f20905b815481529060010190602001808311610ac657829003601f168201915b5050505050905090565b5f610b00610af96123b0565b84846123b7565b6001905092915050565b6018805f0154908060010154908060020154905083565b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b610b7b6123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfe90614445565b60405180910390fd5b83601b6002018190555082601b5f018190555081601b6001018190555080601b6003018190555050505050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600c54905090565b5f610c6e84848461257a565b610d2b84610c7a6123b0565b610d26856040518060600160405280602881526020016151816028913960045f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610cdd6123b0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612e789092919063ffffffff16565b6123b7565b600190509392505050565b610d3e6123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc190614445565b60405180910390fd5b633b9aca0081610dda9190614490565b60118190555050565b5f600b5f9054906101000a900460ff16905090565b5f610e9c610e046123b0565b84610e978560045f610e146123b0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612eda90919063ffffffff16565b6123b7565b6001905092915050565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ed36123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5690614445565b60405180910390fd5b610f6a838383612f37565b505050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60019054906101000a900460ff1681565b610faf6123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461103b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103290614445565b60405180910390fd5b80600d60026101000a81548160ff02191690831515021790555050565b5f60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b600f5481565b601b805f0154908060010154908060020154908060030154905084565b60115481565b5f60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6111216123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a490614445565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61126f6123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f290614445565b60405180910390fd5b611306838383612fdd565b505050565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6113386123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bb90614445565b60405180910390fd5b8160108190555080600f819055505050565b60155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80600267ffffffffffffffff811115611418576114176144d1565b5b6040519080825280602002602001820160405280156114465781602001602082028036833780820191505090505b50905030815f8151811061145d5761145c6144fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611501573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611525919061453f565b81600181518110611539576115386144fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d06ca61f84836040518363ffffffff1660e01b81526004016115cf929190614621565b5f60405180830381865afa1580156115e9573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611611919061476e565b600181518110611624576116236144fe565b5b6020026020010151915050919050565b61163c6123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bf90614445565b60405180910390fd5b601654810361170c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170390614825565b60405180910390fd5b8060168190555050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60105481565b6060600a8054611752906143cb565b80601f016020809104026020016040519081016040528092919081815260200182805461177e906143cb565b80156117c95780601f106117a0576101008083540402835291602001916117c9565b820191905f5260205f20905b8154815290600101906020018083116117ac57829003601f168201915b5050505050905090565b6117db6123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185e90614445565b60405180910390fd5b611872838383613083565b505050565b61187f6123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461190b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190290614445565b60405180910390fd5b8260185f01819055508160186001018190555080601860020181905550505050565b6119356123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b890614445565b60405180910390fd5b80601f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60165481565b5f611ac8611a166123b0565b84611ac3856040518060600160405280602581526020016151a96025913960045f611a3f6123b0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612e789092919063ffffffff16565b6123b7565b6001905092915050565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f611b0a611b036123b0565b848461257a565b6001905092915050565b611b1c6123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9f90614445565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2e906148b3565b60405180910390fd5b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ca1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cc5919061453f565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d4b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d6f919061453f565b6040518363ffffffff1660e01b8152600401611d8c9291906148d1565b6020604051808303815f875af1158015611da8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dcc919061453f565b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160085f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550565b611e8b6123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0e90614445565b60405180910390fd5b80600d60016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15981604051611f609190613f04565b60405180910390a150565b5f60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611ff56123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207890614445565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e690614968565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6121b26123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461223e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223590614445565b60405180910390fd5b633b9aca008161224e9190614490565b600e8190555050565b61225f6123b0565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e290614445565b60405180910390fd5b8260145f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241c906149f6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248a90614a84565b60405180910390fd5b8060045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161256d9190613d54565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036125e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125df90614b12565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264d90614ba0565b60405180910390fd5b5f8111612698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268f90614c2e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271e90614c96565b60405180910390fd5b5f8060065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156127c7575060065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561280657506127d6611716565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156128455750612815611716565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b90505f61286384612855876110d3565b612eda90919063ffffffff16565b905061286d611716565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141580156128db57506128ab611716565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612934575060155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15612a175760055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156129d7575060055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b612a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0d90614d24565b60405180910390fd5b5b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161480612ab8575060075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15612b4857600e54841115612b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af990614db2565b60405180910390fd5b601154811115612b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3e90614e40565b60405180910390fd5b5b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015612bf1575060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b80612c95575060075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015612c94575060075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b5b15612ca75760019250612ca6613129565b5b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015612d51575060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612da4575060075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612df7575060075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612e6157600d60029054906101000a900460ff16612e17576001612e19565b5f5b9150601154811115612e60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5790614e40565b60405180910390fd5b5b612e7086868685876001613193565b505050505050565b5f838311158290612ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb69190613df7565b60405180910390fd5b505f8385612ecd9190614e5e565b9050809150509392505050565b5f808284612ee89190614e91565b905083811015612f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2490614f0e565b60405180910390fd5b8091505092915050565b5f5b83839050811015612fd7575f848483818110612f5857612f576144fe565b5b9050602002016020810190612f6d9190613f52565b90508260065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550508080612fcf90614f2c565b915050612f39565b50505050565b5f5b8383905081101561307d575f848483818110612ffe57612ffd6144fe565b5b90506020020160208101906130139190613f52565b90508260085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050808061307590614f2c565b915050612fdf565b50505050565b5f5b83839050811015613123575f8484838181106130a4576130a36144fe565b5b90506020020160208101906130b99190613f52565b90508260075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050808061311b90614f2c565b915050613085565b50505050565b5f613133306110d3565b90505f811115613190575f613147826113fb565b9050600f5481101580156131675750600d5f9054906101000a900460ff16155b801561317f5750600d60019054906101000a900460ff165b1561318e5761318d8261369a565b5b505b50565b5f8361319f575f6131ca565b6131c960646131bb60185f0154886138d190919063ffffffff16565b61394890919063ffffffff16565b5b90508380156131d65750825b1561325b5761320660646131f8601860010154886138d190919063ffffffff16565b61394890919063ffffffff16565b90505f601860020154111561325a575f61321f866113fb565b90506010548110613258576132556064613247601860020154896138d190919063ffffffff16565b61394890919063ffffffff16565b91505b505b5b5f61326f828761399190919063ffffffff16565b90506132c18660035f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461399190919063ffffffff16565b60035f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506133528160035f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612eda90919063ffffffff16565b60035f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506133e38260035f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612eda90919063ffffffff16565b60035f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef886040516134819190613d54565b60405180910390a3821561369057601f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b1896040518263ffffffff1660e01b81526004016134e99190614113565b5f604051808303815f87803b158015613500575f80fd5b505af1925050508015613511575060015b50601f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633974d3b1886040518263ffffffff1660e01b815260040161356c9190614113565b5f604051808303815f87803b158015613583575f80fd5b505af1925050508015613594575060015b50601f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c4796016546040518263ffffffff1660e01b81526004016135f19190613d54565b6060604051808303815f875af192505050801561362c57506040513d601f19601f820116820180604052508101906136299190614f73565b60015b1561368f573273ffffffffffffffffffffffffffffffffffffffff16600115157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98858585601654604051613683949392919061423f565b60405180910390a35050505b5b5050505050505050565b6001600d5f6101000a81548160ff0219169083151502179055506136bd816139da565b5f4790505f6136ed60646136df601b60010154856138d190919063ffffffff16565b61394890919063ffffffff16565b90505f61371b606461370d601b60020154866138d190919063ffffffff16565b61394890919063ffffffff16565b90505f613748606461373a601b5f0154876138d190919063ffffffff16565b61394890919063ffffffff16565b90505f6137766064613768601b60030154886138d190919063ffffffff16565b61394890919063ffffffff16565b905060135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8590811502906040515f60405180830381858888f193505050501580156137dc573d5f803e3d5ffd5b506137e683613c10565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f1935050505015801561384a573d5f803e3d5ffd5b5060125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f193505050501580156138af573d5f803e3d5ffd5b5050505050505f600d5f6101000a81548160ff02191690831515021790555050565b5f8083036138e1575f9050613942565b5f82846138ee9190614490565b90508284826138fd9190614ff0565b1461393d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161393490615090565b60405180910390fd5b809150505b92915050565b5f61398983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613cdb565b905092915050565b5f6139d283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e78565b905092915050565b5f600267ffffffffffffffff8111156139f6576139f56144d1565b5b604051908082528060200260200182016040528015613a245781602001602082028036833780820191505090505b50905030815f81518110613a3b57613a3a6144fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613adf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b03919061453f565b81600181518110613b1757613b166144fe565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613b7d3060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846123b7565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401613bdf9594939291906150e7565b5f604051808303815f87803b158015613bf6575f80fd5b505af1158015613c08573d5f803e3d5ffd5b505050505050565b5f601f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051613c569061516c565b5f6040518083038185875af1925050503d805f8114613c90576040519150601f19603f3d011682016040523d82523d5f602084013e613c95565b606091505b505090508015613cd7577fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b182604051613cce9190613d54565b60405180910390a15b5050565b5f8083118290613d21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d189190613df7565b60405180910390fd5b505f8385613d2f9190614ff0565b9050809150509392505050565b5f819050919050565b613d4e81613d3c565b82525050565b5f602082019050613d675f830184613d45565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613da4578082015181840152602081019050613d89565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613dc982613d6d565b613dd38185613d77565b9350613de3818560208601613d87565b613dec81613daf565b840191505092915050565b5f6020820190508181035f830152613e0f8184613dbf565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613e5182613e28565b9050919050565b613e6181613e47565b8114613e6b575f80fd5b50565b5f81359050613e7c81613e58565b92915050565b613e8b81613d3c565b8114613e95575f80fd5b50565b5f81359050613ea681613e82565b92915050565b5f8060408385031215613ec257613ec1613e20565b5b5f613ecf85828601613e6e565b9250506020613ee085828601613e98565b9150509250929050565b5f8115159050919050565b613efe81613eea565b82525050565b5f602082019050613f175f830184613ef5565b92915050565b5f606082019050613f305f830186613d45565b613f3d6020830185613d45565b613f4a6040830184613d45565b949350505050565b5f60208284031215613f6757613f66613e20565b5b5f613f7484828501613e6e565b91505092915050565b5f805f8060808587031215613f9557613f94613e20565b5b5f613fa287828801613e98565b9450506020613fb387828801613e98565b9350506040613fc487828801613e98565b9250506060613fd587828801613e98565b91505092959194509250565b5f819050919050565b5f614004613fff613ffa84613e28565b613fe1565b613e28565b9050919050565b5f61401582613fea565b9050919050565b5f6140268261400b565b9050919050565b6140368161401c565b82525050565b5f60208201905061404f5f83018461402d565b92915050565b5f805f6060848603121561406c5761406b613e20565b5b5f61407986828701613e6e565b935050602061408a86828701613e6e565b925050604061409b86828701613e98565b9150509250925092565b5f602082840312156140ba576140b9613e20565b5b5f6140c784828501613e98565b91505092915050565b5f60ff82169050919050565b6140e5816140d0565b82525050565b5f6020820190506140fe5f8301846140dc565b92915050565b61410d81613e47565b82525050565b5f6020820190506141265f830184614104565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261414d5761414c61412c565b5b8235905067ffffffffffffffff81111561416a57614169614130565b5b60208301915083602082028301111561418657614185614134565b5b9250929050565b61419681613eea565b81146141a0575f80fd5b50565b5f813590506141b18161418d565b92915050565b5f805f604084860312156141ce576141cd613e20565b5b5f84013567ffffffffffffffff8111156141eb576141ea613e24565b5b6141f786828701614138565b9350935050602061420a868287016141a3565b9150509250925092565b5f6020828403121561422957614228613e20565b5b5f614236848285016141a3565b91505092915050565b5f6080820190506142525f830187613d45565b61425f6020830186613d45565b61426c6040830185613d45565b6142796060830184613d45565b95945050505050565b5f806040838503121561429857614297613e20565b5b5f6142a585828601613e98565b92505060206142b685828601613e98565b9150509250929050565b5f805f606084860312156142d7576142d6613e20565b5b5f6142e486828701613e98565b93505060206142f586828701613e98565b925050604061430686828701613e98565b9150509250925092565b5f806040838503121561432657614325613e20565b5b5f61433385828601613e6e565b925050602061434485828601613e6e565b9150509250929050565b5f805f6060848603121561436557614364613e20565b5b5f61437286828701613e6e565b935050602061438386828701613e6e565b925050604061439486828701613e6e565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806143e257607f821691505b6020821081036143f5576143f461439e565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f61442f602083613d77565b915061443a826143fb565b602082019050919050565b5f6020820190508181035f83015261445c81614423565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61449a82613d3c565b91506144a583613d3c565b92508282026144b381613d3c565b915082820484148315176144ca576144c9614463565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8151905061453981613e58565b92915050565b5f6020828403121561455457614553613e20565b5b5f6145618482850161452b565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61459c81613e47565b82525050565b5f6145ad8383614593565b60208301905092915050565b5f602082019050919050565b5f6145cf8261456a565b6145d98185614574565b93506145e483614584565b805f5b838110156146145781516145fb88826145a2565b9750614606836145b9565b9250506001810190506145e7565b5085935050505092915050565b5f6040820190506146345f830185613d45565b818103602083015261464681846145c5565b90509392505050565b61465882613daf565b810181811067ffffffffffffffff82111715614677576146766144d1565b5b80604052505050565b5f614689613e17565b9050614695828261464f565b919050565b5f67ffffffffffffffff8211156146b4576146b36144d1565b5b602082029050602081019050919050565b5f815190506146d381613e82565b92915050565b5f6146eb6146e68461469a565b614680565b9050808382526020820190506020840283018581111561470e5761470d614134565b5b835b81811015614737578061472388826146c5565b845260208401935050602081019050614710565b5050509392505050565b5f82601f8301126147555761475461412c565b5b81516147658482602086016146d9565b91505092915050565b5f6020828403121561478357614782613e20565b5b5f82015167ffffffffffffffff8111156147a05761479f613e24565b5b6147ac84828501614741565b91505092915050565b7f43616e6e6f742075706461746520676173466f7250726f63657373696e6720745f8201527f6f2073616d652076616c75650000000000000000000000000000000000000000602082015250565b5f61480f602c83613d77565b915061481a826147b5565b604082019050919050565b5f6020820190508181035f83015261483c81614803565b9050919050565b7f556e69737761705632506169722068617320616c7265616479206265656e20735f8201527f6574000000000000000000000000000000000000000000000000000000000000602082015250565b5f61489d602283613d77565b91506148a882614843565b604082019050919050565b5f6020820190508181035f8301526148ca81614891565b9050919050565b5f6040820190506148e45f830185614104565b6148f16020830184614104565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f614952602683613d77565b915061495d826148f8565b604082019050919050565b5f6020820190508181035f83015261497f81614946565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6149e0602483613d77565b91506149eb82614986565b604082019050919050565b5f6020820190508181035f830152614a0d816149d4565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f614a6e602283613d77565b9150614a7982614a14565b604082019050919050565b5f6020820190508181035f830152614a9b81614a62565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f614afc602583613d77565b9150614b0782614aa2565b604082019050919050565b5f6020820190508181035f830152614b2981614af0565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f614b8a602383613d77565b9150614b9582614b30565b604082019050919050565b5f6020820190508181035f830152614bb781614b7e565b9050919050565b7f5472616e7366657220616d6f756e74206d7573742062652067726561746572205f8201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b5f614c18602983613d77565b9150614c2382614bbe565b604082019050919050565b5f6020820190508181035f830152614c4581614c0c565b9050919050565b7f556e697377617056325061697220686173206e6f74206265656e2073657400005f82015250565b5f614c80601e83613d77565b9150614c8b82614c4c565b602082019050919050565b5f6020820190508181035f830152614cad81614c74565b9050919050565b7f626f747320617265206e6f7420616c6c6f77656420746f2073656c6c206f72205f8201527f7472616e7366657220746f6b656e730000000000000000000000000000000000602082015250565b5f614d0e602f83613d77565b9150614d1982614cb4565b604082019050919050565b5f6020820190508181035f830152614d3b81614d02565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d6178545f8201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b5f614d9c602883613d77565b9150614da782614d42565b604082019050919050565b5f6020820190508181035f830152614dc981614d90565b9050919050565b7f57616c6c65742063616e6e6f7420657863656564206d61782057616c6c6574205f8201527f6c696d6974000000000000000000000000000000000000000000000000000000602082015250565b5f614e2a602583613d77565b9150614e3582614dd0565b604082019050919050565b5f6020820190508181035f830152614e5781614e1e565b9050919050565b5f614e6882613d3c565b9150614e7383613d3c565b9250828203905081811115614e8b57614e8a614463565b5b92915050565b5f614e9b82613d3c565b9150614ea683613d3c565b9250828201905080821115614ebe57614ebd614463565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f614ef8601b83613d77565b9150614f0382614ec4565b602082019050919050565b5f6020820190508181035f830152614f2581614eec565b9050919050565b5f614f3682613d3c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f6857614f67614463565b5b600182019050919050565b5f805f60608486031215614f8a57614f89613e20565b5b5f614f97868287016146c5565b9350506020614fa8868287016146c5565b9250506040614fb9868287016146c5565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614ffa82613d3c565b915061500583613d3c565b92508261501557615014614fc3565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f5f8201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b5f61507a602183613d77565b915061508582615020565b604082019050919050565b5f6020820190508181035f8301526150a78161506e565b9050919050565b5f819050919050565b5f6150d16150cc6150c7846150ae565b613fe1565b613d3c565b9050919050565b6150e1816150b7565b82525050565b5f60a0820190506150fa5f830188613d45565b61510760208301876150d8565b818103604083015261511981866145c5565b90506151286060830185614104565b6151356080830184613d45565b9695505050505050565b5f81905092915050565b50565b5f6151575f8361513f565b915061516282615149565b5f82019050919050565b5f6151768261514c565b915081905091905056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220449b320b33a807446296dd2b3c0d754e50a3a1f491b56c0489be01de9fa7b18064736f6c63430008150033
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.