Token MERLIN
Overview ERC20
Price
$0.00 @ 0.000000 ETH
Fully Diluted Market Cap
Total Supply:
1,000,000 MERLIN
Holders:
168 addresses
Transfers:
-
Contract:
Decimals:
18
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Merlin
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; }
pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); }
pragma solidity >=0.6.2; import './IUniswapV2Router01.sol'; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; abstract contract Auth { address internal owner; mapping(address => bool) internal authorizations; constructor(address _owner) { owner = _owner; authorizations[_owner] = true; } /** * Function modifier to require caller to be contract owner */ modifier onlyOwner() { require(isOwner(msg.sender), "!OWNER"); _; } /** * Function modifier to require caller to be authorized */ modifier authorized() { require(isAuthorized(msg.sender), "!AUTHORIZED"); _; } /** * Authorize address. Owner only */ function authorize(address adr) public onlyOwner { authorizations[adr] = true; } /** * Remove address' authorization. Owner only */ function unauthorize(address adr) public onlyOwner { authorizations[adr] = false; } /** * Check if address is owner */ function isOwner(address account) public view returns (bool) { return account == owner; } /** * Return address' authorization status */ function isAuthorized(address adr) public view returns (bool) { return authorizations[adr]; } /** * Transfer ownership to new address. Caller must be owner. Leaves old owner authorized */ function transferOwnership(address payable adr) public onlyOwner { owner = adr; authorizations[adr] = true; emit OwnershipTransferred(adr); } event OwnershipTransferred(address owner); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol"; import {SafeMath} from "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "./IERC20.sol"; interface IDividendDistributor { function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external; function setShare(address shareholder, uint256 amount) external; function deposit() external payable; function process(uint256 gas) external; } contract DividendDistributor is IDividendDistributor { using SafeMath for uint256; address _token; struct Share { uint256 amount; uint256 totalExcluded; // excluded dividend uint256 totalRealised; } IERC20 MAGIC = IERC20(0x539bdE0d7Dbd336b79148AA742883198BBF60342); IUniswapV2Router02 router; address[] shareholders; mapping(address => uint256) shareholderIndexes; mapping(address => uint256) shareholderClaims; mapping(address => Share) public shares; uint256 public totalShares; uint256 public totalDividends; uint256 public totalDistributed; // to be shown in UI uint256 public dividendsPerShare; uint256 public dividendsPerShareAccuracyFactor = 10 ** 36; uint256 public minPeriod = 1 hours; uint256 public minDistribution = 10 * (10 ** 18); uint256 currentIndex; bool initialized; modifier initialization() { require(!initialized); _; initialized = true; } modifier onlyToken() { require(msg.sender == _token); _; } constructor(address _router) { router = _router != address(0) ? IUniswapV2Router02(_router) : IUniswapV2Router02(0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506); _token = msg.sender; } function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external override onlyToken { minPeriod = _minPeriod; minDistribution = _minDistribution; } function setShare(address shareholder, uint256 amount) external override onlyToken { if (shares[shareholder].amount > 0) { distributeDividend(shareholder); } if (amount > 0 && shares[shareholder].amount == 0) { addShareholder(shareholder); } else if (amount == 0 && shares[shareholder].amount > 0) { removeShareholder(shareholder); } totalShares = totalShares.sub(shares[shareholder].amount).add(amount); shares[shareholder].amount = amount; shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount); } function deposit() external payable override onlyToken { uint256 balanceBefore = MAGIC.balanceOf(address(this)); address[] memory path = new address[](2); path[0] = router.WETH(); path[1] = address(MAGIC); router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: msg.value}( 0, path, address(this), block.timestamp ); uint256 amount = MAGIC.balanceOf(address(this)).sub(balanceBefore); totalDividends = totalDividends.add(amount); dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares)); } function process(uint256 gas) external override onlyToken { uint256 shareholderCount = shareholders.length; if (shareholderCount == 0) { return; } uint256 gasUsed = 0; uint256 gasLeft = gasleft(); uint256 iterations = 0; while (gasUsed < gas && iterations < shareholderCount) { if (currentIndex >= shareholderCount) { currentIndex = 0; } if (shouldDistribute(shareholders[currentIndex])) { distributeDividend(shareholders[currentIndex]); } gasUsed = gasUsed.add(gasLeft.sub(gasleft())); gasLeft = gasleft(); currentIndex++; iterations++; } } function shouldDistribute(address shareholder) internal view returns (bool) { return shareholderClaims[shareholder] + minPeriod < block.timestamp && getUnpaidEarnings(shareholder) > minDistribution; } function distributeDividend(address shareholder) internal { if (shares[shareholder].amount == 0) { return; } uint256 amount = getUnpaidEarnings(shareholder); if (amount > 0) { totalDistributed = totalDistributed.add(amount); MAGIC.transfer(shareholder, amount); shareholderClaims[shareholder] = block.timestamp; shares[shareholder].totalRealised = shares[shareholder].totalRealised.add(amount); shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount); } } function claimDividend() external { distributeDividend(msg.sender); } // returns the unpaid earnings function getUnpaidEarnings(address shareholder) public view returns (uint256) { if (shares[shareholder].amount == 0) { return 0; } uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount); uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded; if (shareholderTotalDividends <= shareholderTotalExcluded) { return 0; } return shareholderTotalDividends.sub(shareholderTotalExcluded); } function getCumulativeDividends(uint256 share) internal view returns (uint256) { return share.mul(dividendsPerShare).div(dividendsPerShareAccuracyFactor); } function addShareholder(address shareholder) internal { shareholderIndexes[shareholder] = shareholders.length; shareholders.push(shareholder); } function removeShareholder(address shareholder) internal { shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length - 1]; shareholderIndexes[shareholders[shareholders.length - 1]] = shareholderIndexes[shareholder]; shareholders.pop(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; interface IERC20 { function totalSupply() external view returns (uint256); function decimals() external view returns (uint8); function symbol() external view returns (string memory); function name() external view returns (string memory); function getOwner() external view returns (address); 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); }
// Merlin Token // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "./DividendDistributor.sol"; import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol"; import "./Auth.sol"; contract Merlin is IERC20, Auth { using SafeMath for uint256; address private constant ROUTER = 0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506; address private constant DEAD = 0x000000000000000000000000000000000000dEaD; address private constant ZERO = 0x0000000000000000000000000000000000000000; string private constant _name = "MERLIN"; string private constant _symbol = "MERLIN"; uint8 private constant _decimals = 18; uint256 private _totalSupply = 1_000_000 * (10 ** _decimals); uint256 public _maxTxAmount = _totalSupply.div(400); // 0.25% (2_500) uint256 public _maxWallet = _totalSupply.div(40); // 2.5% (25_000) mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; mapping(address => bool) public isFeeExempt; mapping(address => bool) public isTxLimitExempt; mapping(address => bool) public isDividendExempt; mapping(address => bool) public canAddLiquidityBeforeLaunch; uint256 private liquidityFee; uint256 private buybackFee; uint256 private reflectionFee; uint256 private investmentFee; uint256 private totalFee; uint256 public feeDenominator = 10000; // Buy Fees uint256 public liquidityFeeBuy = 0; uint256 public buybackFeeBuy = 0; uint256 public reflectionFeeBuy = 500; uint256 public investmentFeeBuy = 500; uint256 public totalFeeBuy = 1000; // Sell Fees uint256 public liquidityFeeSell = 0; uint256 public buybackFeeSell = 0; uint256 public reflectionFeeSell = 500; uint256 public investmentFeeSell = 500; uint256 public totalFeeSell = 1000; uint256 public targetLiquidity = 10; uint256 public targetLiquidityDenominator = 100; IUniswapV2Router02 public router; address public pair; uint256 public launchedAt; uint256 public launchedAtTimestamp; // Fees receivers address public autoLiquidityReceiver = 0xF233d122F96fFb3A283E712B4c439cba176C548d; address public investmentFeeReceiver = 0x0C58b6833719033ADBf45615B4eBa144C74cC003; bool public autoBuybackEnabled = false; uint256 public autoBuybackCap; uint256 public autoBuybackAccumulator; uint256 public autoBuybackAmount; uint256 public autoBuybackBlockPeriod; uint256 public autoBuybackBlockLast; DividendDistributor public distributor; address public distributorAddress; uint256 private distributorGas = 500000; bool public swapEnabled = true; uint256 public swapThreshold = _totalSupply / 2000; // 0.05% (500) bool public inSwap; modifier swapping() { inSwap = true; _; inSwap = false; } constructor() Auth(msg.sender) { router = IUniswapV2Router02(ROUTER); pair = IUniswapV2Factory(router.factory()).createPair(router.WETH(), address(this)); _allowances[address(this)][address(router)] = _totalSupply; distributor = new DividendDistributor(address(router)); distributorAddress = address(distributor); isFeeExempt[msg.sender] = true; isTxLimitExempt[msg.sender] = true; canAddLiquidityBeforeLaunch[msg.sender] = true; isDividendExempt[pair] = true; isDividendExempt[address(this)] = true; isDividendExempt[DEAD] = true; approve(address(router), _totalSupply); approve(address(pair), _totalSupply); _balances[msg.sender] = _totalSupply; emit Transfer(address(0), msg.sender, _totalSupply); } receive() external payable {} function totalSupply() external view override returns (uint256) { return _totalSupply; } function decimals() external pure override returns (uint8) { return _decimals; } function symbol() external pure override returns (string memory) { return _symbol; } function name() external pure override returns (string memory) { return _name; } function getOwner() external view override returns (address) { return owner; } function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; } function approve(address spender, uint256 amount) public override returns (bool) { _allowances[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function approveMax(address spender) external returns (bool) { return approve(spender, _totalSupply); } function transfer(address recipient, uint256 amount) external override returns (bool) { return _transferFrom(msg.sender, recipient, amount); } function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) { if (_allowances[sender][msg.sender] != _totalSupply) { _allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount, "Insufficient Allowance"); } return _transferFrom(sender, recipient, amount); } function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) { if (inSwap) { return _basicTransfer(sender, recipient, amount); } // Avoid lauchpad buyers from ADD LP before launch if (!launched() && recipient == pair && sender == pair) { require(canAddLiquidityBeforeLaunch[sender]); } if (!authorizations[sender] && !authorizations[recipient]) { require(launched(), "Trading not open yet"); } // max wallet code if ( !authorizations[sender] && recipient != address(this) && recipient != address(DEAD) && recipient != pair && recipient != investmentFeeReceiver && recipient != autoLiquidityReceiver ) { uint256 heldTokens = balanceOf(recipient); require( (heldTokens + amount) <= _maxWallet, "Total Holding is currently limited, you can not buy that much." ); } checkTxLimit(sender, amount); // Set Fees if (sender == pair) { buyFees(); } if (recipient == pair) { sellFees(); } //Exchange tokens if (shouldSwapBack()) { swapBack(); } if (shouldAutoBuyback()) { triggerAutoBuyback(); } _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance"); uint256 amountReceived = shouldTakeFee(sender) ? takeFee(recipient, amount) : amount; _balances[recipient] = _balances[recipient].add(amountReceived); // Dividend tracker if (!isDividendExempt[sender]) { try distributor.setShare(sender, balanceOf(sender)) {} catch {} } if (!isDividendExempt[recipient]) { try distributor.setShare(recipient, balanceOf(recipient)) {} catch {} } try distributor.process(distributorGas) {} catch {} emit Transfer(sender, recipient, amountReceived); return true; } function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) { _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); return true; } function checkTxLimit(address sender, uint256 amount) internal view { require(amount <= _maxTxAmount || isTxLimitExempt[sender], "TX Limit Exceeded"); } // Internal Functions function buyFees() internal { liquidityFee = liquidityFeeBuy; buybackFee = buybackFeeBuy; reflectionFee = reflectionFeeBuy; investmentFee = investmentFeeBuy; totalFee = totalFeeBuy; } function sellFees() internal { liquidityFee = liquidityFeeSell; buybackFee = buybackFeeSell; reflectionFee = reflectionFeeSell; investmentFee = investmentFeeSell; totalFee = totalFeeSell; } function shouldTakeFee(address sender) internal view returns (bool) { return !isFeeExempt[sender]; } function takeFee(address sender, uint256 amount) internal returns (uint256) { uint256 feeAmount = amount.mul(totalFee).div(feeDenominator); _balances[address(this)] = _balances[address(this)].add(feeAmount); emit Transfer(sender, address(this), feeAmount); return amount.sub(feeAmount); } function shouldSwapBack() internal view returns (bool) { return msg.sender != pair && !inSwap && swapEnabled && _balances[address(this)] >= swapThreshold; } function swapBack() internal swapping { uint256 dynamicLiquidityFee = isOverLiquified(targetLiquidity, targetLiquidityDenominator) ? 0 : liquidityFee; uint256 amountToLiquify = swapThreshold.mul(dynamicLiquidityFee).div(totalFee).div(2); uint256 amountToSwap = swapThreshold.sub(amountToLiquify); address[] memory path = new address[](2); path[0] = address(this); path[1] = router.WETH(); uint256 balanceBefore = address(this).balance; router.swapExactTokensForETHSupportingFeeOnTransferTokens(amountToSwap, 0, path, address(this), block.timestamp); uint256 amountETH = address(this).balance.sub(balanceBefore); uint256 totalETHFee = totalFee.sub(dynamicLiquidityFee.div(2)); uint256 amountETHLiquidity = amountETH.mul(dynamicLiquidityFee).div(totalETHFee).div(2); uint256 amountETHReflection = amountETH.mul(reflectionFee).div(totalETHFee); uint256 amountETHInvestment = amountETH.mul(investmentFee).div(totalETHFee); try distributor.deposit{value: amountETHReflection}() {} catch {} payable(investmentFeeReceiver).transfer(amountETHInvestment); if (amountToLiquify > 0) { router.addLiquidityETH{value: amountETHLiquidity}( address(this), amountToLiquify, 0, 0, autoLiquidityReceiver, block.timestamp ); emit AutoLiquify(amountETHLiquidity, amountToLiquify); } } // BuyBack functions function shouldAutoBuyback() internal view returns (bool) { return msg.sender != pair && !inSwap && autoBuybackEnabled && autoBuybackBlockLast + autoBuybackBlockPeriod <= block.number && // After N blocks from last buyback address(this).balance >= autoBuybackAmount; } function triggerAutoBuyback() internal { buyTokens(autoBuybackAmount, DEAD); autoBuybackBlockLast = block.number; autoBuybackAccumulator = autoBuybackAccumulator.add(autoBuybackAmount); if (autoBuybackAccumulator > autoBuybackCap) { autoBuybackEnabled = false; } } function triggerZeusBuyback(uint256 amount) external onlyOwner { buyTokens(amount, DEAD); autoBuybackBlockLast = block.number; autoBuybackAccumulator = autoBuybackAccumulator.add(autoBuybackAmount); if (autoBuybackAccumulator > autoBuybackCap) { autoBuybackEnabled = false; } } function buyTokens(uint256 amount, address to) internal swapping { address[] memory path = new address[](2); path[0] = router.WETH(); path[1] = address(this); router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(0, path, to, block.timestamp); } function setAutoBuybackSettings(bool _enabled, uint256 _cap, uint256 _amount, uint256 _period) external onlyOwner { autoBuybackEnabled = _enabled; autoBuybackCap = _cap; autoBuybackAccumulator = 0; autoBuybackAmount = _amount; autoBuybackBlockPeriod = _period; autoBuybackBlockLast = block.number; } // Add extra rewards to holders function deposit() external payable onlyOwner { try distributor.deposit{value: msg.value}() {} catch {} } // Process rewards distributions to holders function process() external onlyOwner { try distributor.process(distributorGas) {} catch {} } // Stuck Balances Functions function rescueToken(address tokenAddress, uint256 tokens) public onlyOwner returns (bool success) { return IERC20(tokenAddress).transfer(msg.sender, tokens); } function clearStuckBalance(uint256 amountPercentage) external onlyOwner { uint256 amountETH = address(this).balance; payable(investmentFeeReceiver).transfer((amountETH * amountPercentage) / 100); } function setSellFees( uint256 _liquidityFee, uint256 _buybackFee, uint256 _reflectionFee, uint256 _investmentFee ) external onlyOwner { liquidityFeeSell = _liquidityFee; buybackFeeSell = _buybackFee; reflectionFeeSell = _reflectionFee; investmentFeeSell = _investmentFee; totalFeeSell = _liquidityFee + (_buybackFee) + (_reflectionFee) + (_investmentFee); } function setBuyFees( uint256 _liquidityFee, uint256 _buybackFee, uint256 _reflectionFee, uint256 _investmentFee ) external onlyOwner { liquidityFeeBuy = _liquidityFee; buybackFeeBuy = _buybackFee; reflectionFeeBuy = _reflectionFee; investmentFeeBuy = _investmentFee; totalFeeBuy = _liquidityFee + (_buybackFee) + (_reflectionFee) + (_investmentFee); } function setFeeReceivers(address _autoLiquidityReceiver, address _investmentFeeReceiver) external onlyOwner { autoLiquidityReceiver = _autoLiquidityReceiver; investmentFeeReceiver = _investmentFeeReceiver; } function launched() internal view returns (bool) { return launchedAt != 0; } function launch() public onlyOwner { require(launchedAt == 0, "Already launched boi"); launchedAt = block.number; launchedAtTimestamp = block.timestamp; } function setMaxWallet(uint256 amount) external onlyOwner { require(amount >= _totalSupply / 1000); _maxWallet = amount; } function setTxLimit(uint256 amount) external onlyOwner { require(amount >= _totalSupply / 1000); _maxTxAmount = amount; } function setIsDividendExempt(address holder, bool exempt) external onlyOwner { require(holder != address(this) && holder != pair); isDividendExempt[holder] = exempt; if (exempt) { distributor.setShare(holder, 0); } else { distributor.setShare(holder, _balances[holder]); } } function setIsFeeExempt(address holder, bool exempt) external onlyOwner { isFeeExempt[holder] = exempt; } function setIsTxLimitExempt(address holder, bool exempt) external onlyOwner { isTxLimitExempt[holder] = exempt; } function setSwapBackSettings(bool _enabled, uint256 _amount) external onlyOwner { swapEnabled = _enabled; swapThreshold = _amount; } function setCanTransferBeforeLaunch(address holder, bool exempt) external onlyOwner { canAddLiquidityBeforeLaunch[holder] = exempt; //Presale Address will be added as Exempt isTxLimitExempt[holder] = exempt; isFeeExempt[holder] = exempt; } function setTargetLiquidity(uint256 _target, uint256 _denominator) external onlyOwner { targetLiquidity = _target; targetLiquidityDenominator = _denominator; } function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external onlyOwner { distributor.setDistributionCriteria(_minPeriod, _minDistribution); } function setDistributorSettings(uint256 gas) external onlyOwner { require(gas < 900000); distributorGas = gas; } function getCirculatingSupply() public view returns (uint256) { return _totalSupply.sub(balanceOf(DEAD)).sub(balanceOf(ZERO)); } function getLiquidityBacking(uint256 accuracy) public view returns (uint256) { return accuracy.mul(balanceOf(pair).mul(2)).div(getCirculatingSupply()); } function isOverLiquified(uint256 target, uint256 accuracy) public view returns (bool) { return getLiquidityBacking(accuracy) > target; } event AutoLiquify(uint256 amountETH, uint256 amountMRLN); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
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":false,"internalType":"uint256","name":"amountETH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountMRLN","type":"uint256"}],"name":"AutoLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnershipTransferred","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":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","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":"spender","type":"address"}],"name":"approveMax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"authorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoBuybackAccumulator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoBuybackAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoBuybackBlockLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoBuybackBlockPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoBuybackCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoBuybackEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoLiquidityReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canAddLiquidityBeforeLaunch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountPercentage","type":"uint256"}],"name":"clearStuckBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"distributor","outputs":[{"internalType":"contract DividendDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"accuracy","type":"uint256"}],"name":"getLiquidityBacking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"investmentFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"investmentFeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"investmentFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDividendExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"accuracy","type":"uint256"}],"name":"isOverLiquified","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isTxLimitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchedAtTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"process","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reflectionFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"rescueToken","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_cap","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"setAutoBuybackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_buybackFee","type":"uint256"},{"internalType":"uint256","name":"_reflectionFee","type":"uint256"},{"internalType":"uint256","name":"_investmentFee","type":"uint256"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setCanTransferBeforeLaunch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minPeriod","type":"uint256"},{"internalType":"uint256","name":"_minDistribution","type":"uint256"}],"name":"setDistributionCriteria","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"setDistributorSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_autoLiquidityReceiver","type":"address"},{"internalType":"address","name":"_investmentFeeReceiver","type":"address"}],"name":"setFeeReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsDividendExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsTxLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_buybackFee","type":"uint256"},{"internalType":"uint256","name":"_reflectionFee","type":"uint256"},{"internalType":"uint256","name":"_investmentFee","type":"uint256"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"},{"internalType":"uint256","name":"_denominator","type":"uint256"}],"name":"setTargetLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"targetLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetLiquidityDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeSell","outputs":[{"internalType":"uint256","name":"","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 payable","name":"adr","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"triggerZeusBuyback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"unauthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526012600a62000014919062000c70565b620f424062000024919062000cc1565b60025562000045610190600254620009bc60201b62002b341790919060201c565b600355620000656028600254620009bc60201b62002b341790919060201c565b600455612710601055600060115560006012556101f46013556101f46014556103e8601555600060165560006017556101f46018556101f46019556103e8601a55600a601b556064601c5573f233d122f96ffb3a283e712b4c439cba176c548d602160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550730c58b6833719033adbf45615b4eba144c74cc003602260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000602260146101000a81548160ff0219169083151502179055506207a120602a556001602b60006101000a81548160ff0219169083151502179055506107d0600254620001a9919062000d51565b602c55348015620001b957600080fd5b5033806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050731b02da8cb0d097eb8d57a175b88c7d8b47997506601d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031157600080fd5b505afa15801562000326573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034c919062000df3565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620003d057600080fd5b505afa158015620003e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200040b919062000df3565b306040518363ffffffff1660e01b81526004016200042b92919062000e36565b602060405180830381600087803b1580156200044657600080fd5b505af11580156200045b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000481919062000df3565b601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600254600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051620005979062000ac8565b620005a3919062000e63565b604051809103906000f080158015620005c0573d6000803e3d6000fd5b50602860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16602960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160096000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016009600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620008ce601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600254620009d460201b60201c565b5062000905601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600254620009d460201b60201c565b50600254600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600254604051620009ae919062000e91565b60405180910390a362000eae565b60008183620009cc919062000d51565b905092915050565b600081600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405162000ab6919062000e91565b60405180910390a36001905092915050565b611d3380620060dc83390190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000b645780860481111562000b3c5762000b3b62000ad6565b5b600185161562000b4c5780820291505b808102905062000b5c8562000b05565b945062000b1c565b94509492505050565b60008262000b7f576001905062000c52565b8162000b8f576000905062000c52565b816001811462000ba8576002811462000bb35762000be9565b600191505062000c52565b60ff84111562000bc85762000bc762000ad6565b5b8360020a91508482111562000be25762000be162000ad6565b5b5062000c52565b5060208310610133831016604e8410600b841016171562000c235782820a90508381111562000c1d5762000c1c62000ad6565b5b62000c52565b62000c32848484600162000b12565b9250905081840481111562000c4c5762000c4b62000ad6565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b600062000c7d8262000c59565b915062000c8a8362000c63565b925062000cb97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000b6d565b905092915050565b600062000cce8262000c59565b915062000cdb8362000c59565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000d175762000d1662000ad6565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000d5e8262000c59565b915062000d6b8362000c59565b92508262000d7e5762000d7d62000d22565b5b828204905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000dbb8262000d8e565b9050919050565b62000dcd8162000dae565b811462000dd957600080fd5b50565b60008151905062000ded8162000dc2565b92915050565b60006020828403121562000e0c5762000e0b62000d89565b5b600062000e1c8482850162000ddc565b91505092915050565b62000e308162000dae565b82525050565b600060408201905062000e4d600083018562000e25565b62000e5c602083018462000e25565b9392505050565b600060208201905062000e7a600083018462000e25565b92915050565b62000e8b8162000c59565b82525050565b600060208201905062000ea8600083018462000e80565b92915050565b61521e8062000ebe6000396000f3fe6080604052600436106104405760003560e01c80636e78eb4911610234578063b6a5d7de1161012e578063d8306786116100b6578063f708a64f1161007a578063f708a64f1461109f578063f84ba65d146110c8578063f887ea40146110f1578063fb5f27fb1461111c578063fe9fbb801461114757610447565b8063d830678614610fbc578063dd62ed3e14610fe7578063df20fd4914611024578063f0b37c041461104d578063f2fde38b1461107657610447565b8063c33fb877116100fd578063c33fb87714610f08578063c6d2577d14610f1f578063ca33e64c14610f4a578063d0e30db014610f75578063d51ed1c814610f7f57610447565b8063b6a5d7de14610e5e578063b91854f414610e87578063bf56b37114610eb2578063bfe1092814610edd57610447565b80638b81f868116101bc578063a4b45c0011610180578063a4b45c0014610d77578063a51af4c514610da0578063a8aa1b3114610dcb578063a9059cbb14610df6578063ac45ed1c14610e3357610447565b80638b81f86814610ca2578063920eee6f14610ccd57806392258ec814610cf857806395d89b4114610d235780639d1944f514610d4e57610447565b806382247ec01161020357806382247ec014610bb957806382d2011614610be4578063893d20e814610c0f5780638ab6ffc714610c3a5780638b42507f14610c6557610447565b80636e78eb4914610ae957806370a0823114610b145780637d1db4a514610b515780638072250b14610b7c57610447565b80632f54bf6e1161034557806353148416116102cd5780635d0044ca116102915780635d0044ca14610a1a57806363a9549214610a43578063658d4b7f14610a6c5780636c5b285514610a955780636ddd171314610abe57610447565b80635314841614610933578063571ac8b01461095e578063591cf08d1461099b5780635a53c1fb146109c65780635c85974f146109f157610447565b80633bb8a8d4116103145780633bb8a8d4146108385780633f4218e014610863578063409d0566146108a05780634355855a146108cb5780634896a6321461090857610447565b80632f54bf6e14610768578063313ce567146107a557806333f3d628146107d057806337bc957e1461080d57610447565b806318160ddd116103c8578063215a62d411610397578063215a62d41461068357806323b872dd146106ac5780632b112e49146106e95780632d48e896146107145780632e4a9bd71461073d57610447565b806318160ddd146105db5780631da1db5e146106065780631f619a641461062f578063201e79911461065a57610447565b8063095ea7b31161040f578063095ea7b3146104e25780631107b3a51461051f5780631161ae391461054a578063178d9b8e14610587578063180b0d7e146105b057610447565b806301339c211461044c5780630445b66714610463578063048c7baf1461048e57806306fdde03146104b757610447565b3661044757005b600080fd5b34801561045857600080fd5b50610461611184565b005b34801561046f57600080fd5b50610478611221565b604051610485919061442e565b60405180910390f35b34801561049a57600080fd5b506104b560048036038101906104b091906144b2565b611227565b005b3480156104c357600080fd5b506104cc6112b3565b6040516104d991906145b2565b60405180910390f35b3480156104ee57600080fd5b5061050960048036038101906105049190614632565b6112f0565b6040516105169190614681565b60405180910390f35b34801561052b57600080fd5b506105346113e2565b604051610541919061442e565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c919061469c565b6113e8565b60405161057e9190614681565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a991906146dc565b6113fd565b005b3480156105bc57600080fd5b506105c561148f565b6040516105d2919061442e565b60405180910390f35b3480156105e757600080fd5b506105f0611495565b6040516105fd919061442e565b60405180910390f35b34801561061257600080fd5b5061062d60048036038101906106289190614743565b61149f565b005b34801561063b57600080fd5b50610644611570565b604051610651919061477f565b60405180910390f35b34801561066657600080fd5b50610681600480360381019061067c919061469c565b611596565b005b34801561068f57600080fd5b506106aa60048036038101906106a5919061479a565b6115f0565b005b3480156106b857600080fd5b506106d360048036038101906106ce91906147da565b611741565b6040516106e09190614681565b60405180910390f35b3480156106f557600080fd5b506106fe611923565b60405161070b919061442e565b60405180910390f35b34801561072057600080fd5b5061073b6004803603810190610736919061469c565b611964565b005b34801561074957600080fd5b50610752611a3f565b60405161075f919061442e565b60405180910390f35b34801561077457600080fd5b5061078f600480360381019061078a919061482d565b611a45565b60405161079c9190614681565b60405180910390f35b3480156107b157600080fd5b506107ba611a9e565b6040516107c79190614876565b60405180910390f35b3480156107dc57600080fd5b506107f760048036038101906107f29190614632565b611aa7565b6040516108049190614681565b60405180910390f35b34801561081957600080fd5b50610822611b86565b60405161082f919061442e565b60405180910390f35b34801561084457600080fd5b5061084d611b8c565b60405161085a9190614681565b60405180910390f35b34801561086f57600080fd5b5061088a6004803603810190610885919061482d565b611b9f565b6040516108979190614681565b60405180910390f35b3480156108ac57600080fd5b506108b5611bbf565b6040516108c2919061442e565b60405180910390f35b3480156108d757600080fd5b506108f260048036038101906108ed919061482d565b611bc5565b6040516108ff9190614681565b60405180910390f35b34801561091457600080fd5b5061091d611be5565b60405161092a919061442e565b60405180910390f35b34801561093f57600080fd5b50610948611beb565b604051610955919061442e565b60405180910390f35b34801561096a57600080fd5b506109856004803603810190610980919061482d565b611bf1565b6040516109929190614681565b60405180910390f35b3480156109a757600080fd5b506109b0611c06565b6040516109bd919061442e565b60405180910390f35b3480156109d257600080fd5b506109db611c0c565b6040516109e8919061442e565b60405180910390f35b3480156109fd57600080fd5b50610a186004803603810190610a139190614743565b611c12565b005b348015610a2657600080fd5b50610a416004803603810190610a3c9190614743565b611c80565b005b348015610a4f57600080fd5b50610a6a6004803603810190610a659190614743565b611cee565b005b348015610a7857600080fd5b50610a936004803603810190610a8e919061479a565b611d91565b005b348015610aa157600080fd5b50610abc6004803603810190610ab791906146dc565b611e34565b005b348015610aca57600080fd5b50610ad3611ec6565b604051610ae09190614681565b60405180910390f35b348015610af557600080fd5b50610afe611ed9565b604051610b0b919061442e565b60405180910390f35b348015610b2057600080fd5b50610b3b6004803603810190610b36919061482d565b611edf565b604051610b48919061442e565b60405180910390f35b348015610b5d57600080fd5b50610b66611f28565b604051610b73919061442e565b60405180910390f35b348015610b8857600080fd5b50610ba36004803603810190610b9e919061482d565b611f2e565b604051610bb09190614681565b60405180910390f35b348015610bc557600080fd5b50610bce611f4e565b604051610bdb919061442e565b60405180910390f35b348015610bf057600080fd5b50610bf9611f54565b604051610c06919061442e565b60405180910390f35b348015610c1b57600080fd5b50610c24611f5a565b604051610c31919061477f565b60405180910390f35b348015610c4657600080fd5b50610c4f611f83565b604051610c5c919061442e565b60405180910390f35b348015610c7157600080fd5b50610c8c6004803603810190610c87919061482d565b611f89565b604051610c999190614681565b60405180910390f35b348015610cae57600080fd5b50610cb7611fa9565b604051610cc4919061442e565b60405180910390f35b348015610cd957600080fd5b50610ce2611faf565b604051610cef919061442e565b60405180910390f35b348015610d0457600080fd5b50610d0d611fb5565b604051610d1a919061442e565b60405180910390f35b348015610d2f57600080fd5b50610d38611fbb565b604051610d4591906145b2565b60405180910390f35b348015610d5a57600080fd5b50610d756004803603810190610d709190614743565b611ff8565b005b348015610d8357600080fd5b50610d9e6004803603810190610d999190614891565b612059565b005b348015610dac57600080fd5b50610db5612127565b604051610dc2919061477f565b60405180910390f35b348015610dd757600080fd5b50610de061214d565b604051610ded919061477f565b60405180910390f35b348015610e0257600080fd5b50610e1d6004803603810190610e189190614632565b612173565b604051610e2a9190614681565b60405180910390f35b348015610e3f57600080fd5b50610e48612188565b604051610e55919061442e565b60405180910390f35b348015610e6a57600080fd5b50610e856004803603810190610e80919061482d565b61218e565b005b348015610e9357600080fd5b50610e9c612230565b604051610ea9919061442e565b60405180910390f35b348015610ebe57600080fd5b50610ec7612236565b604051610ed4919061442e565b60405180910390f35b348015610ee957600080fd5b50610ef261223c565b604051610eff9190614930565b60405180910390f35b348015610f1457600080fd5b50610f1d612262565b005b348015610f2b57600080fd5b50610f3461233e565b604051610f41919061442e565b60405180910390f35b348015610f5657600080fd5b50610f5f612344565b604051610f6c919061477f565b60405180910390f35b610f7d61236a565b005b348015610f8b57600080fd5b50610fa66004803603810190610fa19190614743565b61243a565b604051610fb3919061442e565b60405180910390f35b348015610fc857600080fd5b50610fd16124ac565b604051610fde9190614681565b60405180910390f35b348015610ff357600080fd5b5061100e60048036038101906110099190614891565b6124bf565b60405161101b919061442e565b60405180910390f35b34801561103057600080fd5b5061104b6004803603810190611046919061494b565b612546565b005b34801561105957600080fd5b50611074600480360381019061106f919061482d565b6125b3565b005b34801561108257600080fd5b5061109d600480360381019061109891906149c9565b612656565b005b3480156110ab57600080fd5b506110c660048036038101906110c1919061479a565b61276f565b005b3480156110d457600080fd5b506110ef60048036038101906110ea919061479a565b612a0f565b005b3480156110fd57600080fd5b50611106612ab2565b6040516111139190614a17565b60405180910390f35b34801561112857600080fd5b50611131612ad8565b60405161113e919061442e565b60405180910390f35b34801561115357600080fd5b5061116e6004803603810190611169919061482d565b612ade565b60405161117b9190614681565b60405180910390f35b61118d33611a45565b6111cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c390614a7e565b60405180910390fd5b6000601f5414611211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120890614aea565b60405180910390fd5b43601f8190555042602081905550565b602c5481565b61123033611a45565b61126f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126690614a7e565b60405180910390fd5b83602260146101000a81548160ff02191690831515021790555082602381905550600060248190555081602581905550806026819055504360278190555050505050565b60606040518060400160405280600681526020017f4d45524c494e0000000000000000000000000000000000000000000000000000815250905090565b600081600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516113d0919061442e565b60405180910390a36001905092915050565b60165481565b6000826113f48361243a565b11905092915050565b61140633611a45565b611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c90614a7e565b60405180910390fd5b836011819055508260128190555081601381905550806014819055508082848661146f9190614b39565b6114799190614b39565b6114839190614b39565b60158190555050505050565b60105481565b6000600254905090565b6114a833611a45565b6114e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114de90614a7e565b60405180910390fd5b6000479050602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc606484846115369190614b8f565b6115409190614c18565b9081150290604051600060405180830381858888f1935050505015801561156b573d6000803e3d6000fd5b505050565b602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61159f33611a45565b6115de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d590614a7e565b60405180910390fd5b81601b8190555080601c819055505050565b6115f933611a45565b611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162f90614a7e565b60405180910390fd5b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600254600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461190f5761188e826040518060400160405280601681526020017f496e73756666696369656e7420416c6c6f77616e636500000000000000000000815250600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b4a9092919063ffffffff16565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b61191a848484612b9f565b90509392505050565b600061195f6119326000611edf565b61195161194061dead611edf565b60025461355590919063ffffffff16565b61355590919063ffffffff16565b905090565b61196d33611a45565b6119ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a390614a7e565b60405180910390fd5b602860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632d48e89683836040518363ffffffff1660e01b8152600401611a09929190614c49565b600060405180830381600087803b158015611a2357600080fd5b505af1158015611a37573d6000803e3d6000fd5b505050505050565b60125481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b60006012905090565b6000611ab233611a45565b611af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae890614a7e565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401611b2c929190614c72565b602060405180830381600087803b158015611b4657600080fd5b505af1158015611b5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7e9190614cb0565b905092915050565b60175481565b602260149054906101000a900460ff1681565b60076020528060005260406000206000915054906101000a900460ff1681565b60135481565b60096020528060005260406000206000915054906101000a900460ff1681565b60255481565b601a5481565b6000611bff826002546112f0565b9050919050565b60235481565b60265481565b611c1b33611a45565b611c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5190614a7e565b60405180910390fd5b6103e8600254611c6a9190614c18565b811015611c7657600080fd5b8060038190555050565b611c8933611a45565b611cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbf90614a7e565b60405180910390fd5b6103e8600254611cd89190614c18565b811015611ce457600080fd5b8060048190555050565b611cf733611a45565b611d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2d90614a7e565b60405180910390fd5b611d428161dead61356b565b43602781905550611d606025546024546137c690919063ffffffff16565b6024819055506023546024541115611d8e576000602260146101000a81548160ff0219169083151502179055505b50565b611d9a33611a45565b611dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd090614a7e565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611e3d33611a45565b611e7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7390614a7e565b60405180910390fd5b8360168190555082601781905550816018819055508060198190555080828486611ea69190614b39565b611eb09190614b39565b611eba9190614b39565b601a8190555050505050565b602b60009054906101000a900460ff1681565b60245481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60035481565b600a6020528060005260406000206000915054906101000a900460ff1681565b60045481565b60115481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601c5481565b60086020528060005260406000206000915054906101000a900460ff1681565b60145481565b60195481565b601b5481565b60606040518060400160405280600681526020017f4d45524c494e0000000000000000000000000000000000000000000000000000815250905090565b61200133611a45565b612040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203790614a7e565b60405180910390fd5b620dbba0811061204f57600080fd5b80602a8190555050565b61206233611a45565b6120a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209890614a7e565b60405180910390fd5b81602160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080602260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b602960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000612180338484612b9f565b905092915050565b60185481565b61219733611a45565b6121d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cd90614a7e565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60275481565b601f5481565b602860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61226b33611a45565b6122aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a190614a7e565b60405180910390fd5b602860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479602a546040518263ffffffff1660e01b8152600401612307919061442e565b600060405180830381600087803b15801561232157600080fd5b505af1925050508015612332575060015b61233b5761233c565b5b565b60205481565b602160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61237333611a45565b6123b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a990614a7e565b60405180910390fd5b602860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561241c57600080fd5b505af19350505050801561242e575060015b61243757612438565b5b565b60006124a5612447611923565b612497612488600261247a601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611edf565b6137dc90919063ffffffff16565b856137dc90919063ffffffff16565b612b3490919063ffffffff16565b9050919050565b602d60009054906101000a900460ff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61254f33611a45565b61258e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258590614a7e565b60405180910390fd5b81602b60006101000a81548160ff02191690831515021790555080602c819055505050565b6125bc33611a45565b6125fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f290614a7e565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61265f33611a45565b61269e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269590614a7e565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163816040516127649190614cfe565b60405180910390a150565b61277833611a45565b6127b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ae90614a7e565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156128415750601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61284a57600080fd5b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550801561293c57602860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca968360006040518363ffffffff1660e01b8152600401612905929190614d54565b600060405180830381600087803b15801561291f57600080fd5b505af1158015612933573d6000803e3d6000fd5b50505050612a0b565b602860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca9683600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518363ffffffff1660e01b81526004016129d8929190614c72565b600060405180830381600087803b1580156129f257600080fd5b505af1158015612a06573d6000803e3d6000fd5b505050505b5050565b612a1833611a45565b612a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4e90614a7e565b60405180910390fd5b80600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60155481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008183612b429190614c18565b905092915050565b6000838311158290612b92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8991906145b2565b60405180910390fd5b5082840390509392505050565b6000602d60009054906101000a900460ff1615612bc857612bc18484846137f2565b905061354e565b612bd06139c5565b158015612c2a5750601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b8015612c835750601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15612cdf57600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612cde57600080fd5b5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612d835750600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612dd057612d906139c5565b612dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc690614dc9565b60405180910390fd5b5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612e5657503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612e90575061dead73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612eea5750601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612f445750602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612f9e5750602160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15613002576000612fae84611edf565b90506004548382612fbf9190614b39565b1115613000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff790614e5b565b60405180910390fd5b505b61300c84836139d2565b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561306b5761306a613a6f565b5b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130ca576130c9613a9e565b5b6130d2613acd565b156130e0576130df613ba4565b5b6130e861416b565b156130f6576130f561421e565b5b61317f826040518060400160405280601481526020017f496e73756666696369656e742042616c616e6365000000000000000000000000815250600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b4a9092919063ffffffff16565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006131cd8561427a565b6131d757826131e2565b6131e184846142d1565b5b905061323681600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137c690919063ffffffff16565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661336557602860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca968661331288611edf565b6040518363ffffffff1660e01b815260040161332f929190614c72565b600060405180830381600087803b15801561334957600080fd5b505af192505050801561335a575060015b61336357613364565b5b5b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661345157602860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314b6ca96856133fe87611edf565b6040518363ffffffff1660e01b815260040161341b929190614c72565b600060405180830381600087803b15801561343557600080fd5b505af1925050508015613446575060015b61344f57613450565b5b5b602860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479602a546040518263ffffffff1660e01b81526004016134ae919061442e565b600060405180830381600087803b1580156134c857600080fd5b505af19250505080156134d9575060015b6134e2576134e3565b5b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613540919061442e565b60405180910390a360019150505b9392505050565b600081836135639190614e7b565b905092915050565b6001602d60006101000a81548160ff0219169083151502179055506000600267ffffffffffffffff8111156135a3576135a2614eaf565b5b6040519080825280602002602001820160405280156135d15781602001602082028036833780820191505090505b509050601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561363c57600080fd5b505afa158015613650573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136749190614ef3565b8160008151811061368857613687614f20565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505030816001815181106136d7576136d6614f20565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de958460008486426040518663ffffffff1660e01b8152600401613774949392919061500d565b6000604051808303818588803b15801561378d57600080fd5b505af11580156137a1573d6000803e3d6000fd5b5050505050506000602d60006101000a81548160ff0219169083151502179055505050565b600081836137d49190614b39565b905092915050565b600081836137ea9190614b8f565b905092915050565b600061387d826040518060400160405280601481526020017f496e73756666696369656e742042616c616e6365000000000000000000000000815250600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b4a9092919063ffffffff16565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061391282600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137c690919063ffffffff16565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516139b2919061442e565b60405180910390a3600190509392505050565b600080601f541415905090565b60035481111580613a2c5750600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a62906150a5565b60405180910390fd5b5050565b601154600b81905550601254600c81905550601354600d81905550601454600e81905550601554600f81905550565b601654600b81905550601754600c81905550601854600d81905550601954600e81905550601a54600f81905550565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015613b3a5750602d60009054906101000a900460ff16155b8015613b525750602b60009054906101000a900460ff165b8015613b9f5750602c54600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b905090565b6001602d60006101000a81548160ff0219169083151502179055506000613bcf601b54601c546113e8565b613bdb57600b54613bde565b60005b90506000613c1e6002613c10600f54613c0286602c546137dc90919063ffffffff16565b612b3490919063ffffffff16565b612b3490919063ffffffff16565b90506000613c3782602c5461355590919063ffffffff16565b90506000600267ffffffffffffffff811115613c5657613c55614eaf565b5b604051908082528060200260200182016040528015613c845781602001602082028036833780820191505090505b5090503081600081518110613c9c57613c9b614f20565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015613d3e57600080fd5b505afa158015613d52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d769190614ef3565b81600181518110613d8a57613d89614f20565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000479050601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478460008530426040518663ffffffff1660e01b8152600401613e2d9594939291906150c5565b600060405180830381600087803b158015613e4757600080fd5b505af1158015613e5b573d6000803e3d6000fd5b505050506000613e74824761355590919063ffffffff16565b90506000613ea0613e8f600289612b3490919063ffffffff16565b600f5461355590919063ffffffff16565b90506000613edc6002613ece84613ec08c886137dc90919063ffffffff16565b612b3490919063ffffffff16565b612b3490919063ffffffff16565b90506000613f0783613ef9600d54876137dc90919063ffffffff16565b612b3490919063ffffffff16565b90506000613f3284613f24600e54886137dc90919063ffffffff16565b612b3490919063ffffffff16565b9050602860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015613f9e57600080fd5b505af193505050508015613fb0575060015b613fb957613fba565b5b602260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614022573d6000803e3d6000fd5b50600089111561414457601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71984308c600080602160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b81526004016140b59695949392919061511f565b6060604051808303818588803b1580156140ce57600080fd5b505af11580156140e2573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906141079190615195565b5050507f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b4506838a60405161413b929190614c49565b60405180910390a15b505050505050505050506000602d60006101000a81548160ff021916908315150217905550565b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156141d85750602d60009054906101000a900460ff16155b80156141f05750602260149054906101000a900460ff165b801561420b5750436026546027546142089190614b39565b11155b801561421957506025544710155b905090565b61422c60255461dead61356b565b4360278190555061424a6025546024546137c690919063ffffffff16565b6024819055506023546024541115614278576000602260146101000a81548160ff0219169083151502179055505b565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16159050919050565b6000806142fd6010546142ef600f54866137dc90919063ffffffff16565b612b3490919063ffffffff16565b905061435181600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137c690919063ffffffff16565b600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516143f1919061442e565b60405180910390a361440c818461355590919063ffffffff16565b91505092915050565b6000819050919050565b61442881614415565b82525050565b6000602082019050614443600083018461441f565b92915050565b600080fd5b60008115159050919050565b6144638161444e565b811461446e57600080fd5b50565b6000813590506144808161445a565b92915050565b61448f81614415565b811461449a57600080fd5b50565b6000813590506144ac81614486565b92915050565b600080600080608085870312156144cc576144cb614449565b5b60006144da87828801614471565b94505060206144eb8782880161449d565b93505060406144fc8782880161449d565b925050606061450d8782880161449d565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b60005b83811015614553578082015181840152602081019050614538565b83811115614562576000848401525b50505050565b6000601f19601f8301169050919050565b600061458482614519565b61458e8185614524565b935061459e818560208601614535565b6145a781614568565b840191505092915050565b600060208201905081810360008301526145cc8184614579565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006145ff826145d4565b9050919050565b61460f816145f4565b811461461a57600080fd5b50565b60008135905061462c81614606565b92915050565b6000806040838503121561464957614648614449565b5b60006146578582860161461d565b92505060206146688582860161449d565b9150509250929050565b61467b8161444e565b82525050565b60006020820190506146966000830184614672565b92915050565b600080604083850312156146b3576146b2614449565b5b60006146c18582860161449d565b92505060206146d28582860161449d565b9150509250929050565b600080600080608085870312156146f6576146f5614449565b5b60006147048782880161449d565b94505060206147158782880161449d565b93505060406147268782880161449d565b92505060606147378782880161449d565b91505092959194509250565b60006020828403121561475957614758614449565b5b60006147678482850161449d565b91505092915050565b614779816145f4565b82525050565b60006020820190506147946000830184614770565b92915050565b600080604083850312156147b1576147b0614449565b5b60006147bf8582860161461d565b92505060206147d085828601614471565b9150509250929050565b6000806000606084860312156147f3576147f2614449565b5b60006148018682870161461d565b93505060206148128682870161461d565b92505060406148238682870161449d565b9150509250925092565b60006020828403121561484357614842614449565b5b60006148518482850161461d565b91505092915050565b600060ff82169050919050565b6148708161485a565b82525050565b600060208201905061488b6000830184614867565b92915050565b600080604083850312156148a8576148a7614449565b5b60006148b68582860161461d565b92505060206148c78582860161461d565b9150509250929050565b6000819050919050565b60006148f66148f16148ec846145d4565b6148d1565b6145d4565b9050919050565b6000614908826148db565b9050919050565b600061491a826148fd565b9050919050565b61492a8161490f565b82525050565b60006020820190506149456000830184614921565b92915050565b6000806040838503121561496257614961614449565b5b600061497085828601614471565b92505060206149818582860161449d565b9150509250929050565b6000614996826145d4565b9050919050565b6149a68161498b565b81146149b157600080fd5b50565b6000813590506149c38161499d565b92915050565b6000602082840312156149df576149de614449565b5b60006149ed848285016149b4565b91505092915050565b6000614a01826148fd565b9050919050565b614a11816149f6565b82525050565b6000602082019050614a2c6000830184614a08565b92915050565b7f214f574e45520000000000000000000000000000000000000000000000000000600082015250565b6000614a68600683614524565b9150614a7382614a32565b602082019050919050565b60006020820190508181036000830152614a9781614a5b565b9050919050565b7f416c7265616479206c61756e6368656420626f69000000000000000000000000600082015250565b6000614ad4601483614524565b9150614adf82614a9e565b602082019050919050565b60006020820190508181036000830152614b0381614ac7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b4482614415565b9150614b4f83614415565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b8457614b83614b0a565b5b828201905092915050565b6000614b9a82614415565b9150614ba583614415565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614bde57614bdd614b0a565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c2382614415565b9150614c2e83614415565b925082614c3e57614c3d614be9565b5b828204905092915050565b6000604082019050614c5e600083018561441f565b614c6b602083018461441f565b9392505050565b6000604082019050614c876000830185614770565b614c94602083018461441f565b9392505050565b600081519050614caa8161445a565b92915050565b600060208284031215614cc657614cc5614449565b5b6000614cd484828501614c9b565b91505092915050565b6000614ce8826148fd565b9050919050565b614cf881614cdd565b82525050565b6000602082019050614d136000830184614cef565b92915050565b6000819050919050565b6000614d3e614d39614d3484614d19565b6148d1565b614415565b9050919050565b614d4e81614d23565b82525050565b6000604082019050614d696000830185614770565b614d766020830184614d45565b9392505050565b7f54726164696e67206e6f74206f70656e20796574000000000000000000000000600082015250565b6000614db3601483614524565b9150614dbe82614d7d565b602082019050919050565b60006020820190508181036000830152614de281614da6565b9050919050565b7f546f74616c20486f6c64696e672069732063757272656e746c79206c696d697460008201527f65642c20796f752063616e206e6f74206275792074686174206d7563682e0000602082015250565b6000614e45603e83614524565b9150614e5082614de9565b604082019050919050565b60006020820190508181036000830152614e7481614e38565b9050919050565b6000614e8682614415565b9150614e9183614415565b925082821015614ea457614ea3614b0a565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050614eed81614606565b92915050565b600060208284031215614f0957614f08614449565b5b6000614f1784828501614ede565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614f84816145f4565b82525050565b6000614f968383614f7b565b60208301905092915050565b6000602082019050919050565b6000614fba82614f4f565b614fc48185614f5a565b9350614fcf83614f6b565b8060005b83811015615000578151614fe78882614f8a565b9750614ff283614fa2565b925050600181019050614fd3565b5085935050505092915050565b60006080820190506150226000830187614d45565b81810360208301526150348186614faf565b90506150436040830185614770565b615050606083018461441f565b95945050505050565b7f5458204c696d6974204578636565646564000000000000000000000000000000600082015250565b600061508f601183614524565b915061509a82615059565b602082019050919050565b600060208201905081810360008301526150be81615082565b9050919050565b600060a0820190506150da600083018861441f565b6150e76020830187614d45565b81810360408301526150f98186614faf565b90506151086060830185614770565b615115608083018461441f565b9695505050505050565b600060c0820190506151346000830189614770565b615141602083018861441f565b61514e6040830187614d45565b61515b6060830186614d45565b6151686080830185614770565b61517560a083018461441f565b979650505050505050565b60008151905061518f81614486565b92915050565b6000806000606084860312156151ae576151ad614449565b5b60006151bc86828701615180565b93505060206151cd86828701615180565b92505060406151de86828701615180565b915050925092509256fea2646970667358221220a15da7d0707bd3b7f8d72ab658ea3a6ddd54514440d381af1695262c812f69c264736f6c63430008090033608060405273539bde0d7dbd336b79148aa742883198bbf60342600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506ec097ce7bc90715b34b9f1000000000600b55610e10600c55678ac7230489e80000600d553480156200008b57600080fd5b5060405162001d3338038062001d338339818101604052810190620000b19190620001f5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200010257731b02da8cb0d097eb8d57a175b88c7d8b4799750662000104565b805b600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000227565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001bd8262000190565b9050919050565b620001cf81620001b0565b8114620001db57600080fd5b50565b600081519050620001ef81620001c4565b92915050565b6000602082840312156200020e576200020d6200018b565b5b60006200021e84828501620001de565b91505092915050565b611afc80620002376000396000f3fe6080604052600436106100dd5760003560e01c8063ce7c2ac21161007f578063efca2eed11610059578063efca2eed14610291578063f0fc6bca146102bc578063ffb2c479146102d3578063ffd49c84146102fc576100dd565b8063ce7c2ac21461021d578063d0e30db01461025c578063e2d2e21914610266576100dd565b80632d48e896116100bb5780632d48e896146101735780633a98ef391461019c5780634fab0ae8146101c7578063997664d7146101f2576100dd565b806311ce023d146100e257806314b6ca961461010d57806328fd319814610136575b600080fd5b3480156100ee57600080fd5b506100f7610327565b6040516101049190611437565b60405180910390f35b34801561011957600080fd5b50610134600480360381019061012f91906114e1565b61032d565b005b34801561014257600080fd5b5061015d60048036038101906101589190611521565b6105ec565b60405161016a9190611437565b60405180910390f35b34801561017f57600080fd5b5061019a6004803603810190610195919061154e565b610706565b005b3480156101a857600080fd5b506101b1610770565b6040516101be9190611437565b60405180910390f35b3480156101d357600080fd5b506101dc610776565b6040516101e99190611437565b60405180910390f35b3480156101fe57600080fd5b5061020761077c565b6040516102149190611437565b60405180910390f35b34801561022957600080fd5b50610244600480360381019061023f9190611521565b610782565b6040516102539392919061158e565b60405180910390f35b6102646107ac565b005b34801561027257600080fd5b5061027b610c19565b6040516102889190611437565b60405180910390f35b34801561029d57600080fd5b506102a6610c1f565b6040516102b39190611437565b60405180910390f35b3480156102c857600080fd5b506102d1610c25565b005b3480156102df57600080fd5b506102fa60048036038101906102f591906115c5565b610c30565b005b34801561030857600080fd5b50610311610dc4565b60405161031e9190611437565b60405180910390f35b600b5481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461038557600080fd5b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411156103da576103d982610dca565b5b60008111801561042c57506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154145b1561043f5761043a82611071565b6104a1565b60008114801561049157506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154115b156104a05761049f82611120565b5b5b61050a816104fc600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015460075461132790919063ffffffff16565b61133d90919063ffffffff16565b60078190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506105a2600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611353565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505050565b600080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414156106415760009050610701565b600061068e600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611353565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490508082116106e957600092505050610701565b6106fc818361132790919063ffffffff16565b925050505b919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461075e57600080fd5b81600c8190555080600d819055505050565b60075481565b600d5481565b60085481565b60066020528060005260406000206000915090508060000154908060010154908060020154905083565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080457600080fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016108619190611601565b60206040518083038186803b15801561087957600080fd5b505afa15801561088d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b19190611631565b90506000600267ffffffffffffffff8111156108d0576108cf61165e565b5b6040519080825280602002602001820160405280156108fe5781602001602082028036833780820191505090505b509050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561096957600080fd5b505afa15801561097d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a191906116a2565b816000815181106109b5576109b46116cf565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110610a2657610a256116cf565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de953460008430426040518663ffffffff1660e01b8152600401610ac39493929190611801565b6000604051808303818588803b158015610adc57600080fd5b505af1158015610af0573d6000803e3d6000fd5b50505050506000610bb483600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b569190611601565b60206040518083038186803b158015610b6e57600080fd5b505afa158015610b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba69190611631565b61132790919063ffffffff16565b9050610bcb8160085461133d90919063ffffffff16565b600881905550610c0e610bfd600754610bef84600b5461138590919063ffffffff16565b61139b90919063ffffffff16565b600a5461133d90919063ffffffff16565b600a81905550505050565b600a5481565b60095481565b610c2e33610dca565b565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c8857600080fd5b600060038054905090506000811415610ca15750610dc1565b6000805a905060005b8483108015610cb857508381105b15610dbc5783600e5410610ccf576000600e819055505b610d186003600e5481548110610ce857610ce76116cf565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166113b1565b15610d6757610d666003600e5481548110610d3657610d356116cf565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610dca565b5b610d8c610d7d5a8461132790919063ffffffff16565b8461133d90919063ffffffff16565b92505a9150600e6000815480929190610da49061187c565b91905055508080610db49061187c565b915050610caa565b505050505b50565b600c5481565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541415610e1a5761106e565b6000610e25826105ec565b9050600081111561106c57610e458160095461133d90919063ffffffff16565b600981905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610ea89291906118c5565b602060405180830381600087803b158015610ec257600080fd5b505af1158015610ed6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efa9190611926565b5042600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f9481600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015461133d90919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550611025600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611353565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505b505b50565b600380549050600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506003819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360016003805490506111349190611953565b81548110611145576111446116cf565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166003600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054815481106111c3576111c26116cf565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460046000600360016003805490506112639190611953565b81548110611274576112736116cf565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060038054806112ef576112ee611987565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055905550565b600081836113359190611953565b905092915050565b6000818361134b91906119b6565b905092915050565b600061137e600b54611370600a548561138590919063ffffffff16565b61139b90919063ffffffff16565b9050919050565b600081836113939190611a0c565b905092915050565b600081836113a99190611a95565b905092915050565b600042600c54600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461140191906119b6565b1080156114175750600d54611415836105ec565b115b9050919050565b6000819050919050565b6114318161141e565b82525050565b600060208201905061144c6000830184611428565b92915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061148282611457565b9050919050565b61149281611477565b811461149d57600080fd5b50565b6000813590506114af81611489565b92915050565b6114be8161141e565b81146114c957600080fd5b50565b6000813590506114db816114b5565b92915050565b600080604083850312156114f8576114f7611452565b5b6000611506858286016114a0565b9250506020611517858286016114cc565b9150509250929050565b60006020828403121561153757611536611452565b5b6000611545848285016114a0565b91505092915050565b6000806040838503121561156557611564611452565b5b6000611573858286016114cc565b9250506020611584858286016114cc565b9150509250929050565b60006060820190506115a36000830186611428565b6115b06020830185611428565b6115bd6040830184611428565b949350505050565b6000602082840312156115db576115da611452565b5b60006115e9848285016114cc565b91505092915050565b6115fb81611477565b82525050565b600060208201905061161660008301846115f2565b92915050565b60008151905061162b816114b5565b92915050565b60006020828403121561164757611646611452565b5b60006116558482850161161c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008151905061169c81611489565b92915050565b6000602082840312156116b8576116b7611452565b5b60006116c68482850161168d565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000819050919050565b600061172d611728611723846116fe565b611708565b61141e565b9050919050565b61173d81611712565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61177881611477565b82525050565b600061178a838361176f565b60208301905092915050565b6000602082019050919050565b60006117ae82611743565b6117b8818561174e565b93506117c38361175f565b8060005b838110156117f45781516117db888261177e565b97506117e683611796565b9250506001810190506117c7565b5085935050505092915050565b60006080820190506118166000830187611734565b818103602083015261182881866117a3565b905061183760408301856115f2565b6118446060830184611428565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006118878261141e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156118ba576118b961184d565b5b600182019050919050565b60006040820190506118da60008301856115f2565b6118e76020830184611428565b9392505050565b60008115159050919050565b611903816118ee565b811461190e57600080fd5b50565b600081519050611920816118fa565b92915050565b60006020828403121561193c5761193b611452565b5b600061194a84828501611911565b91505092915050565b600061195e8261141e565b91506119698361141e565b92508282101561197c5761197b61184d565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006119c18261141e565b91506119cc8361141e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611a0157611a0061184d565b5b828201905092915050565b6000611a178261141e565b9150611a228361141e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611a5b57611a5a61184d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611aa08261141e565b9150611aab8361141e565b925082611abb57611aba611a66565b5b82820490509291505056fea264697066735822122093487184907cb39cf8acba8c6174326554b01ff7b5435b4f77ebc22f858819c164736f6c63430008090033