ERC-20
Overview
Max Total Supply
13,850,000,000 JIANGLIREWARDS
Holders
71
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
100,000,000 JIANGLIREWARDSValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
DividendTracker
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-07 */ //TG: https://t.me/Jiangli_ETH //WEB: https://Jiangli.io //TWITTER: https://twitter.com/JiangliEth pragma solidity ^0.8.19; // SPDX-License-Identifier: Unlicensed interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; int256 private constant MAX_INT256 = ~(int256(1) << 255); function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; // Detect overflow when multiplying MIN_INT256 with -1 require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256)); require((b == 0) || (c / b == a)); return c; } function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing MIN_INT256 by -1 require(b != - 1 || a != MIN_INT256); // Solidity already throws when dividing by 0. return a / b; } function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } function abs(int256 a) internal pure returns (int256) { require(a != MIN_INT256); return a < 0 ? - a : a; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; return msg.data; } } library Address { function isContract(address account) internal view returns (bool) { bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly {codehash := extcodehash(account)} return (codehash != accountHash && codehash != 0x0); } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success,) = recipient.call{value : amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value : weiValue}(data); if (success) { return returndata; } else { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } interface IUniswapV2Factory { function createPair(address tokenA, address tokenB) external returns (address pair); } interface IUniswapV2Router02 { function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function factory() external pure returns (address); function WETH() external pure returns (address); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] memory path) external view returns (uint[] memory amounts); } contract JIANGLI is Context, IERC20, Ownable { using SafeMath for uint256; using Address for address; event HolderBuySell(address holder, string actionType, uint256 ethAmount, uint256 ethBalance); event SwapAndLiquifyEnabledUpdated(bool enabled); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); modifier lockTheSwap { inSwapAndLiquify = true; _; inSwapAndLiquify = false; } IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); address public uniswapV2Pair = address(0); mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; mapping(address => bool) private botWallets; mapping(address => bool) private _isExcludedFromFee; mapping(address => bool) private _isExcludedFromRewards; string private _name = "JIANGLI"; string private _symbol = "JIANGLI"; uint8 private _decimals = 9; uint256 private _tTotal = 100_000 * 10 ** _decimals; bool inSwapAndLiquify; bool public swapAndLiquifyEnabled = true; uint256 public ethPriceToSwap = .4 ether; uint256 public highSellFeeSwapAmount = 3 ether; uint256 public _maxWalletAmount = 2000 * 10 ** _decimals; address public jTreasuryAddress = 0x9FEa6FF2FadB0Bad098754489cBB1Acc2F468A80; address developmentAddress = 0xee093e11A09E3C4B9667860F83f46346FA8B75BE; address public deadWallet = address(0xdead); uint256 public gasForProcessing = 50000; event ProcessedDividendTracker(uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor); event SendDividends(uint256 EthAmount); IterableMapping private holderBalanceMap = new IterableMapping(); struct Distribution { uint256 jTreasury; uint256 development; uint256 jiangliDividend; } struct TaxFees { uint256 buyFee; uint256 sellFee; uint256 highSellFee; } TaxFees public taxFees; DividendTracker public dividendTracker; Distribution public distribution = Distribution(50,50,0); constructor () { _balances[_msgSender()] = _tTotal; _isExcludedFromFee[owner()] = true; _isExcludedFromRewards[owner()] = true; _isExcludedFromRewards[deadWallet] = true; uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH()); _isExcludedFromRewards[uniswapV2Pair] = true; taxFees = TaxFees(30, 35, 35); emit Transfer(address(0), _msgSender(), _tTotal); } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _tTotal; } function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function ethHolderBalance(address account) public view returns (uint) { return holderBalanceMap.get(account); } function setMaxWalletAmount(uint256 maxWalletAmount) external onlyOwner() { _maxWalletAmount = maxWalletAmount * 10 ** 9; } function excludeIncludeFromFee(address[] calldata addresses, bool isExcludeFromFee) public onlyOwner { addRemoveFee(addresses, isExcludeFromFee); } function excludeIncludeFromRewards(address[] calldata addresses, bool isExcluded) public onlyOwner { addRemoveRewards(addresses, isExcluded); } function isExcludedFromRewards(address addr) public view returns (bool) { return _isExcludedFromRewards[addr]; } function addRemoveRewards(address[] calldata addresses, bool flag) private { for (uint256 i = 0; i < addresses.length; i++) { address addr = addresses[i]; _isExcludedFromRewards[addr] = flag; } } function setEthPriceToSwap(uint256 ethPriceToSwap_) external onlyOwner { ethPriceToSwap = ethPriceToSwap_; } function setHighSellFeeSwapAmount(uint256 ethAmount) external onlyOwner { highSellFeeSwapAmount = ethAmount; } function addRemoveFee(address[] calldata addresses, bool flag) private { for (uint256 i = 0; i < addresses.length; i++) { address addr = addresses[i]; _isExcludedFromFee[addr] = flag; } } function setTaxFees(uint256 buyFee, uint256 sellFee, uint256 highSellFee) external onlyOwner { taxFees.buyFee = buyFee; taxFees.sellFee = sellFee; taxFees.highSellFee = highSellFee; } function isAddressBlocked(address addr) public view returns (bool) { return botWallets[addr]; } function blockAddresses(address[] memory addresses) external onlyOwner() { blockUnblockAddress(addresses, true); } function unblockAddresses(address[] memory addresses) external onlyOwner() { blockUnblockAddress(addresses, false); } function blockUnblockAddress(address[] memory addresses, bool doBlock) private { for (uint256 i = 0; i < addresses.length; i++) { address addr = addresses[i]; if (doBlock) { botWallets[addr] = true; } else { delete botWallets[addr]; } } } function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner { swapAndLiquifyEnabled = _enabled; emit SwapAndLiquifyEnabledUpdated(_enabled); } receive() external payable {} function getTokenAmountByEthPrice() public view returns (uint256) { address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = address(this); return uniswapV2Router.getAmountsOut(ethPriceToSwap, path)[1]; } function isExcludedFromFee(address account) public view returns (bool) { return _isExcludedFromFee[account]; } function _approve(address owner, address spender, uint256 amount) private { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _transfer(address from, address to, uint256 amount) private { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); bool takeFees = !_isExcludedFromFee[from] && !_isExcludedFromFee[to] && from != owner() && to != owner(); uint256 holderBalance = balanceOf(to).add(amount); uint256 taxAmount = 0; //block the bots, but allow them to transfer to dead wallet if they are blocked if (from != owner() && to != owner() && to != deadWallet && from != address(this) && to != address(this)) { require(!botWallets[from] && !botWallets[to], "bots are not allowed to sell or transfer tokens"); if (from == uniswapV2Pair) { require(holderBalance <= _maxWalletAmount, "Wallet cannot exceed max Wallet limit"); taxAmount = takeFees ? amount.mul(taxFees.buyFee).div(100) : 0; uint ethBuy = getEthValueFromTokens(amount); uint newBalance = holderBalanceMap.get(to).add(ethBuy); holderBalanceMap.set(to, newBalance); emit HolderBuySell(to, "BUY", ethBuy, newBalance); } if (from != uniswapV2Pair && to == uniswapV2Pair) { taxAmount = takeFees ? amount.mul(taxFees.sellFee).div(100) : 0; uint ethSell = getEthValueFromTokens(amount); if(taxAmount > 0 && ethSell > highSellFeeSwapAmount) { taxAmount = taxFees.highSellFee; } int val = int(holderBalanceMap.get(from)) - int(ethSell); uint256 newBalance = val <= 0 ? 0 : uint256(val); holderBalanceMap.set(from, newBalance); emit HolderBuySell(from, "SELL", ethSell, newBalance); swapTokens(); } if (from != uniswapV2Pair && to != uniswapV2Pair) { require(holderBalance <= _maxWalletAmount, "Wallet cannot exceed max Wallet limit"); } try dividendTracker.setTokenBalance(from) {} catch{} try dividendTracker.setTokenBalance(to) {} catch{} try dividendTracker.process(gasForProcessing) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) { emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gasForProcessing, tx.origin); }catch {} } uint256 transferAmount = amount.sub(taxAmount); _balances[from] = _balances[from].sub(amount); _balances[to] = _balances[to].add(transferAmount); _balances[address(this)] = _balances[address(this)].add(taxAmount); emit Transfer(from, to, amount); } function airDrops(address[] calldata holders, uint256[] calldata amounts) external onlyOwner { require(holders.length == amounts.length, "Holders and amounts must be the same count"); address from = _msgSender(); for(uint256 i=0; i < holders.length; i++) { address to = holders[i]; uint256 amount = amounts[i]; _balances[from] = _balances[from].sub(amount); _balances[to] = _balances[to].add(amount); emit Transfer(from, to, amount); } } function swapTokens() private { uint256 contractTokenBalance = balanceOf(address(this)); if (contractTokenBalance > 0) { uint256 tokenAmount = getTokenAmountByEthPrice(); if (contractTokenBalance >= tokenAmount && !inSwapAndLiquify && swapAndLiquifyEnabled) { //send eth to wallets investment and dev swapTokensForEth(tokenAmount); distributeShares(); } } } function getEthValueFromTokens(uint tokenAmount) public view returns (uint) { address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = address(this); return uniswapV2Router.getAmountsIn(tokenAmount, path)[0]; } function updateGasForProcessing(uint256 newValue) public onlyOwner { require(newValue != gasForProcessing, "Cannot update gasForProcessing to same value"); gasForProcessing = newValue; } function distributeShares() private lockTheSwap { uint256 ethBalance = address(this).balance; uint256 jTreasury = ethBalance.mul(distribution.jTreasury).div(100); uint256 development = ethBalance.mul(distribution.development).div(100); uint256 jiangliDividend = ethBalance.mul(distribution.jiangliDividend).div(100); payable(jTreasuryAddress).transfer(jTreasury); payable(developmentAddress).transfer(development); sendEthDividends(jiangliDividend); } function manualSwap() external { uint256 contractTokenBalance = balanceOf(address(this)); if (contractTokenBalance > 0) { if (!inSwapAndLiquify) { swapTokensForEth(contractTokenBalance); distributeShares(); } } } function setDistribution(uint256 jTreasury, uint256 development, uint256 jiangliDividend) external onlyOwner { distribution.jTreasury = jTreasury; distribution.development = development; distribution.jiangliDividend = jiangliDividend; } function setDividendTracker(address dividendContractAddress) external onlyOwner { dividendTracker = DividendTracker(payable(dividendContractAddress)); } function sendEthDividends(uint256 dividends) private { (bool success,) = address(dividendTracker).call{value : dividends}(""); if (success) { emit SendDividends(dividends); } } function removeEthFromContract() external onlyOwner { uint256 ethBalance = address(this).balance; payable(owner()).transfer(ethBalance); } function swapTokensForEth(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } } contract IterableMapping { // Iterable mapping from address to uint; struct Map { address[] keys; mapping(address => uint) values; mapping(address => uint) indexOf; mapping(address => bool) inserted; } Map private map; function get(address key) public view returns (uint) { return map.values[key]; } function keyExists(address key) public view returns (bool) { return (getIndexOfKey(key) != - 1); } function getIndexOfKey(address key) public view returns (int) { if (!map.inserted[key]) { return - 1; } return int(map.indexOf[key]); } function getKeyAtIndex(uint index) public view returns (address) { return map.keys[index]; } function size() public view returns (uint) { return map.keys.length; } function set(address key, uint val) public { if (map.inserted[key]) { map.values[key] = val; } else { map.inserted[key] = true; map.values[key] = val; map.indexOf[key] = map.keys.length; map.keys.push(key); } } function remove(address key) public { if (!map.inserted[key]) { return; } delete map.inserted[key]; delete map.values[key]; uint index = map.indexOf[key]; uint lastIndex = map.keys.length - 1; address lastKey = map.keys[lastIndex]; map.indexOf[lastKey] = index; delete map.indexOf[key]; map.keys[index] = lastKey; map.keys.pop(); } } contract DividendTracker is IERC20, Context, Ownable { using SafeMath for uint256; using SafeMathUint for uint256; using SafeMathInt for int256; uint256 constant internal magnitude = 2 ** 128; uint256 internal magnifiedDividendPerShare; mapping(address => int256) internal magnifiedDividendCorrections; mapping(address => uint256) internal withdrawnDividends; mapping(address => uint256) internal claimedDividends; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name = "JIANGLI REWARDS"; string private _symbol = "JIANGLIREWARDS"; uint8 private _decimals = 9; uint256 public totalDividendsDistributed; IterableMapping private tokenHoldersMap = new IterableMapping(); JIANGLI private jiangli; event updateBalance(address addr, uint256 amount); event DividendsDistributed(address indexed from, uint256 weiAmount); event DividendWithdrawn(address indexed to, uint256 weiAmount); uint256 public lastProcessedIndex; mapping(address => uint256) public lastClaimTimes; uint256 public claimWait = 3600; event ExcludeFromDividends(address indexed account); event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue); event Claim(address indexed account, uint256 amount, bool indexed automatic); IUniswapV2Router02 uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); IERC20 public jiangliToken = IERC20(0xdAC17F958D2ee523a2206206994597C13D831ec7); //USDT struct EthDividendTiers { uint tier7; uint tier6; uint tier5; uint tier4; uint tier3; uint tier2; uint tier1; } struct TierLevels { uint level1; uint level2; uint level3; uint level4; uint level5; uint level6; uint level7; } EthDividendTiers public ethDividendTiers; TierLevels public tierLevels; constructor() { ethDividendTiers = EthDividendTiers( 8 ether, 4 ether, 2 ether, 1 ether, .5 ether, .25 ether, .1 ether); tierLevels = TierLevels( 1 ether, 2 ether, 3 ether, 4 ether, 5 ether, 6 ether, 8 ether); } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function updateTierLevels( TierLevels memory _tierLevels) external onlyOwner { tierLevels = _tierLevels; } function updateEthDividendTier(EthDividendTiers memory _dividendTiers) external onlyOwner { ethDividendTiers = _dividendTiers; } function getEthTier(uint256 amount) public view returns (uint, string memory) { uint tierLevel = 0; string memory tier = "Not Eligible"; if(amount >= ethDividendTiers.tier1) { tierLevel = .1 ether; tier = "Fortune Seeker"; } if(amount >= ethDividendTiers.tier2) { tierLevel = .25 ether; tier = "Abundance Enthusiast"; } if(amount >= ethDividendTiers.tier3) { tierLevel = .5 ether; tier = "Prosperity Advocate"; } if(amount >= ethDividendTiers.tier4) { tierLevel = 1 ether; tier = "Weahlth Architect"; } if(amount >= ethDividendTiers.tier5) { tierLevel = 2 ether; tier = "Bounty Seeker"; } if(amount >= ethDividendTiers.tier6) { tierLevel = 4 ether; tier = "Virtuous Benefactor"; } if(amount >= ethDividendTiers.tier7) { tierLevel = 8 ether; tier = "Sumpreme Luminary"; } return (tierLevel, tier); } function transfer(address, uint256) public pure returns (bool) { require(false, "No transfers allowed in dividend tracker"); return true; } function transferFrom(address, address, uint256) public pure override returns (bool) { require(false, "No transfers allowed in dividend tracker"); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function _approve(address owner, address spender, uint256 amount) private { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function setTokenBalance(address account) public { uint256 balance = jiangli.ethHolderBalance(account); if (!jiangli.isExcludedFromRewards(account)) { (uint tierLevel,) = getEthTier(balance); if (tierLevel > 0) { _setBalance(account, tierLevel); tokenHoldersMap.set(account, tierLevel); } else { _setBalance(account, 0); tokenHoldersMap.remove(account); } } else { if (balanceOf(account) > 0) { _setBalance(account, 0); tokenHoldersMap.remove(account); } } processAccount(payable(account), true); } function updateTokenBalances(address[] memory accounts) external { uint256 index = 0; while (index < accounts.length) { setTokenBalance(accounts[index]); index += 1; } } function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .sub((magnifiedDividendPerShare.mul(amount)).toInt256Safe()); } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] .add((magnifiedDividendPerShare.mul(amount)).toInt256Safe()); } receive() external payable { distributeDividends(); } function setERC20Contract(address contractAddr) external onlyOwner { jiangli = JIANGLI(payable(contractAddr)); } function excludeFromDividends(address account) external onlyOwner { _setBalance(account, 0); tokenHoldersMap.remove(account); emit ExcludeFromDividends(account); } function distributeDividends() public payable { require(totalSupply() > 0); uint256 initialBalance = jiangliToken.balanceOf(address(this)); swapEthForJIANGLI(msg.value); uint256 newBalance = jiangliToken.balanceOf(address(this)).sub(initialBalance); if (newBalance > 0) { magnifiedDividendPerShare = magnifiedDividendPerShare.add( (newBalance).mul(magnitude) / totalSupply() ); emit DividendsDistributed(msg.sender, newBalance); totalDividendsDistributed = totalDividendsDistributed.add(newBalance); } } function swapEthForJIANGLI(uint256 ethAmount) public { // generate the uniswap pair path of weth -> eth address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = address(jiangliToken); // make the swap uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value : ethAmount}( 0, // accept any amount of Ethereum path, address(this), block.timestamp ); } function withdrawDividend() public virtual { _withdrawDividendOfUser(payable(msg.sender)); } function _withdrawDividendOfUser(address payable user) internal returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user); if (_withdrawableDividend > 0) { withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend); emit DividendWithdrawn(user, _withdrawableDividend); jiangliToken.transfer(user, _withdrawableDividend); return _withdrawableDividend; } return 0; } function dividendOf(address _owner) public view returns (uint256) { return withdrawableDividendOf(_owner); } function withdrawableDividendOf(address _owner) public view returns (uint256) { return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]); } function withdrawnDividendOf(address _owner) public view returns (uint256) { return withdrawnDividends[_owner]; } function accumulativeDividendOf(address _owner) public view returns (uint256) { return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe() .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude; } function updateClaimWait(uint256 newClaimWait) external onlyOwner { require(newClaimWait >= 3600 && newClaimWait <= 86400, "ClaimWait must be updated to between 1 and 24 hours"); require(newClaimWait != claimWait, "Cannot update claimWait to same value"); emit ClaimWaitUpdated(newClaimWait, claimWait); claimWait = newClaimWait; } function getLastProcessedIndex() external view returns (uint256) { return lastProcessedIndex; } function getNumberOfTokenHolders() external view returns (uint256) { return tokenHoldersMap.size(); } function getAccount(address _account) public view returns (address account, int256 index, int256 iterationsUntilProcessed, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime, uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable) { account = _account; index = tokenHoldersMap.getIndexOfKey(account); iterationsUntilProcessed = - 1; if (index >= 0) { if (uint256(index) > lastProcessedIndex) { iterationsUntilProcessed = index.sub(int256(lastProcessedIndex)); } else { uint256 processesUntilEndOfArray = tokenHoldersMap.size() > lastProcessedIndex ? tokenHoldersMap.size().sub(lastProcessedIndex) : 0; iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray)); } } withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); lastClaimTime = lastClaimTimes[account]; nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0; secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0; } function canAutoClaim(uint256 lastClaimTime) private view returns (bool) { if (lastClaimTime > block.timestamp) { return false; } return block.timestamp.sub(lastClaimTime) >= claimWait; } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = balanceOf(account); if (newBalance > currentBalance) { uint256 mintAmount = newBalance.sub(currentBalance); _mint(account, mintAmount); } else if (newBalance < currentBalance) { uint256 burnAmount = currentBalance.sub(newBalance); _burn(account, burnAmount); } } function process(uint256 gas) public returns (uint256, uint256, uint256) { uint256 numberOfTokenHolders = tokenHoldersMap.size(); if (numberOfTokenHolders == 0) { return (0, 0, lastProcessedIndex); } uint256 _lastProcessedIndex = lastProcessedIndex; uint256 gasUsed = 0; uint256 gasLeft = gasleft(); uint256 iterations = 0; uint256 claims = 0; while (gasUsed < gas && iterations < numberOfTokenHolders) { _lastProcessedIndex++; if (_lastProcessedIndex >= tokenHoldersMap.size()) { _lastProcessedIndex = 0; } address account = tokenHoldersMap.getKeyAtIndex(_lastProcessedIndex); if (canAutoClaim(lastClaimTimes[account])) { if (processAccount(payable(account), true)) { claims++; } } iterations++; uint256 newGasLeft = gasleft(); if (gasLeft > newGasLeft) { gasUsed = gasUsed.add(gasLeft.sub(newGasLeft)); } gasLeft = newGasLeft; } lastProcessedIndex = _lastProcessedIndex; return (iterations, claims, lastProcessedIndex); } function processAccountByDeployer(address payable account, bool automatic) external onlyOwner { processAccount(account, automatic); } function airDropJIANGLI(address[] calldata holders, uint256[] calldata amounts) external onlyOwner { require(holders.length == amounts.length, "Holders and amounts must be the same count"); for(uint256 i=0; i < holders.length; i++) { address to = holders[i]; uint256 jiangliAmount = amounts[i]; jiangliToken.transfer(to, jiangliAmount); } } function totalDividendClaimed(address account) public view returns (uint256) { return claimedDividends[account]; } function processAccount(address payable account, bool automatic) private returns (bool) { uint256 amount = _withdrawDividendOfUser(account); if (amount > 0) { uint256 totalClaimed = claimedDividends[account]; claimedDividends[account] = amount.add(totalClaimed); lastClaimTimes[account] = block.timestamp; emit Claim(account, amount, automatic); return true; } return false; } //This should never be used, but available in case of unforseen issues function sendEthBack() external onlyOwner { uint256 ethBalance = address(this).balance; payable(owner()).transfer(ethBalance); } //This should never be used, but available in case of unforseen issues function sendJIANGLIBack() external onlyOwner { uint256 jiangliBalance = jiangliToken.balanceOf(address(this)); jiangliToken.transfer(owner(), jiangliBalance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"ClaimWaitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"DividendWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"DividendsDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeFromDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateBalance","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"accumulativeDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"holders","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airDropJIANGLI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributeDividends","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"dividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethDividendTiers","outputs":[{"internalType":"uint256","name":"tier7","type":"uint256"},{"internalType":"uint256","name":"tier6","type":"uint256"},{"internalType":"uint256","name":"tier5","type":"uint256"},{"internalType":"uint256","name":"tier4","type":"uint256"},{"internalType":"uint256","name":"tier3","type":"uint256"},{"internalType":"uint256","name":"tier2","type":"uint256"},{"internalType":"uint256","name":"tier1","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getAccount","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"int256","name":"index","type":"int256"},{"internalType":"int256","name":"iterationsUntilProcessed","type":"int256"},{"internalType":"uint256","name":"withdrawableDividends","type":"uint256"},{"internalType":"uint256","name":"totalDividends","type":"uint256"},{"internalType":"uint256","name":"lastClaimTime","type":"uint256"},{"internalType":"uint256","name":"nextClaimTime","type":"uint256"},{"internalType":"uint256","name":"secondsUntilAutoClaimAvailable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getEthTier","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"jiangliToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaimTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"process","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"bool","name":"automatic","type":"bool"}],"name":"processAccountByDeployer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sendEthBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sendJIANGLIBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddr","type":"address"}],"name":"setERC20Contract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setTokenBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"swapEthForJIANGLI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tierLevels","outputs":[{"internalType":"uint256","name":"level1","type":"uint256"},{"internalType":"uint256","name":"level2","type":"uint256"},{"internalType":"uint256","name":"level3","type":"uint256"},{"internalType":"uint256","name":"level4","type":"uint256"},{"internalType":"uint256","name":"level5","type":"uint256"},{"internalType":"uint256","name":"level6","type":"uint256"},{"internalType":"uint256","name":"level7","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"totalDividendClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDividendsDistributed","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":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newClaimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tier7","type":"uint256"},{"internalType":"uint256","name":"tier6","type":"uint256"},{"internalType":"uint256","name":"tier5","type":"uint256"},{"internalType":"uint256","name":"tier4","type":"uint256"},{"internalType":"uint256","name":"tier3","type":"uint256"},{"internalType":"uint256","name":"tier2","type":"uint256"},{"internalType":"uint256","name":"tier1","type":"uint256"}],"internalType":"struct DividendTracker.EthDividendTiers","name":"_dividendTiers","type":"tuple"}],"name":"updateEthDividendTier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"level1","type":"uint256"},{"internalType":"uint256","name":"level2","type":"uint256"},{"internalType":"uint256","name":"level3","type":"uint256"},{"internalType":"uint256","name":"level4","type":"uint256"},{"internalType":"uint256","name":"level5","type":"uint256"},{"internalType":"uint256","name":"level6","type":"uint256"},{"internalType":"uint256","name":"level7","type":"uint256"}],"internalType":"struct DividendTracker.TierLevels","name":"_tierLevels","type":"tuple"}],"name":"updateTierLevels","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"updateTokenBalances","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawnDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526040518060400160405280600f81526020017f4a49414e474c4920524557415244530000000000000000000000000000000000815250600890816200004a91906200068a565b506040518060400160405280600e81526020017f4a49414e474c4952455741524453000000000000000000000000000000000000815250600990816200009191906200068a565b506009600a60006101000a81548160ff021916908360ff160217905550604051620000bc9062000402565b604051809103906000f080158015620000d9573d6000803e3d6000fd5b50600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e10601055737a250d5630b4cf539739df2c5dacb4c659f2488d601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073dac17f958d2ee523a2206206994597c13d831ec7601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620001d757600080fd5b506000620001ea620003fa60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506040518060e00160405280676f05b59d3b2000008152602001673782dace9d9000008152602001671bc16d674ec800008152602001670de0b6b3a764000081526020016706f05b59d3b2000081526020016703782dace9d90000815260200167016345785d8a00008152506013600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c082015181600601559050506040518060e00160405280670de0b6b3a76400008152602001671bc16d674ec8000081526020016729a2241af62c00008152602001673782dace9d9000008152602001674563918244f4000081526020016753444835ec5800008152602001676f05b59d3b200000815250601a600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015590505062000771565b600033905090565b610b088062005b4d83390190565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200049257607f821691505b602082108103620004a857620004a76200044a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005127fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004d3565b6200051e8683620004d3565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200056b620005656200055f8462000536565b62000540565b62000536565b9050919050565b6000819050919050565b62000587836200054a565b6200059f620005968262000572565b848454620004e0565b825550505050565b600090565b620005b6620005a7565b620005c38184846200057c565b505050565b5b81811015620005eb57620005df600082620005ac565b600181019050620005c9565b5050565b601f8211156200063a576200060481620004ae565b6200060f84620004c3565b810160208510156200061f578190505b620006376200062e85620004c3565b830182620005c8565b50505b505050565b600082821c905092915050565b60006200065f600019846008026200063f565b1980831691505092915050565b60006200067a83836200064c565b9150826002028217905092915050565b620006958262000410565b67ffffffffffffffff811115620006b157620006b06200041b565b5b620006bd825462000479565b620006ca828285620005ef565b600060209050601f831160018114620007025760008415620006ed578287015190505b620006f985826200066c565b86555062000769565b601f1984166200071286620004ae565b60005b828110156200073c5784890151825560018201915060208501945060208101905062000715565b868310156200075c578489015162000758601f8916826200064c565b8355505b6001600288020188555050505b505050505050565b6153cc80620007816000396000f3fe6080604052600436106102765760003560e01c8063715018a61161014f578063a9059cbb116100c1578063e7841ec01161007a578063e7841ec01461099f578063e98030c7146109ca578063f2fde38b146109f3578063fbcbc0f114610a1c578063fde72ee414610a60578063ffb2c47914610a8957610285565b8063a9059cbb1461086a578063aafd847a146108a7578063cac8d538146108e4578063d3ab82031461090d578063dd62ed3e1461094b578063e0fb0f351461098857610285565b80638da5cb5b116101135780638da5cb5b1461073257806391b89fba1461075d57806395d89b411461079a578063a2299d3f146107c5578063a457c2d7146107f0578063a8b9d2401461082d57610285565b8063715018a6146106615780637ede135a14610678578063804974ea146106a157806385a6b3ae146106de578063897742821461070957610285565b8063313ce567116101e85780634b1727ff116101ac5780634b1727ff1461055f5780634fe59f821461058857806368572c07146105b15780636a474002146105e25780636f2789ec146105f957806370a082311461062457610285565b8063313ce5671461047457806331e79db01461049f57806339509351146104c85780633974d3b11461050557806343d35afc1461052e57610285565b806316c5720a1161023a57806316c5720a1461035057806318160ddd14610367578063226cfa3d1461039257806323b872dd146103cf57806327ce01471461040c5780633009a6091461044957610285565b806303c833021461028a57806306fdde0314610294578063095ea7b3146102bf57806309bbedde146102fc5780630a78839a1461032757610285565b3661028557610283610ac8565b005b600080fd5b610292610ac8565b005b3480156102a057600080fd5b506102a9610cfe565b6040516102b69190613da8565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190613e72565b610d90565b6040516102f39190613ecd565b60405180910390f35b34801561030857600080fd5b50610311610dae565b60405161031e9190613ef7565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190614046565b610e46565b005b34801561035c57600080fd5b50610365610f2a565b005b34801561037357600080fd5b5061037c61110a565b6040516103899190613ef7565b60405180910390f35b34801561039e57600080fd5b506103b960048036038101906103b49190614073565b611114565b6040516103c69190613ef7565b60405180910390f35b3480156103db57600080fd5b506103f660048036038101906103f191906140a0565b61112c565b6040516104039190613ecd565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e9190614073565b611179565b6040516104409190613ef7565b60405180910390f35b34801561045557600080fd5b5061045e61121c565b60405161046b9190613ef7565b60405180910390f35b34801561048057600080fd5b50610489611222565b604051610496919061410f565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c19190614073565b611239565b005b3480156104d457600080fd5b506104ef60048036038101906104ea9190613e72565b6113ac565b6040516104fc9190613ecd565b60405180910390f35b34801561051157600080fd5b5061052c60048036038101906105279190614073565b61145f565b005b34801561053a57600080fd5b506105436117ae565b604051610556979695949392919061412a565b60405180910390f35b34801561056b57600080fd5b5061058660048036038101906105819190614266565b6117de565b005b34801561059457600080fd5b506105af60048036038101906105aa9190614363565b611825565b005b3480156105bd57600080fd5b506105c6611909565b6040516105d9979695949392919061412a565b60405180910390f35b3480156105ee57600080fd5b506105f7611939565b005b34801561060557600080fd5b5061060e611945565b60405161061b9190613ef7565b60405180910390f35b34801561063057600080fd5b5061064b60048036038101906106469190614073565b61194b565b6040516106589190613ef7565b60405180910390f35b34801561066d57600080fd5b50610676611994565b005b34801561068457600080fd5b5061069f600480360381019061069a9190614441565b611ae7565b005b3480156106ad57600080fd5b506106c860048036038101906106c39190614073565b611cd9565b6040516106d59190613ef7565b60405180910390f35b3480156106ea57600080fd5b506106f3611d22565b6040516107009190613ef7565b60405180910390f35b34801561071557600080fd5b50610730600480360381019061072b919061452c565b611d28565b005b34801561073e57600080fd5b50610747611dcc565b604051610754919061457b565b60405180910390f35b34801561076957600080fd5b50610784600480360381019061077f9190614073565b611df5565b6040516107919190613ef7565b60405180910390f35b3480156107a657600080fd5b506107af611e07565b6040516107bc9190613da8565b60405180910390f35b3480156107d157600080fd5b506107da611e99565b6040516107e791906145f5565b60405180910390f35b3480156107fc57600080fd5b5061081760048036038101906108129190613e72565b611ebf565b6040516108249190613ecd565b60405180910390f35b34801561083957600080fd5b50610854600480360381019061084f9190614073565b611f8c565b6040516108619190613ef7565b60405180910390f35b34801561087657600080fd5b50610891600480360381019061088c9190613e72565b611fef565b60405161089e9190613ecd565b60405180910390f35b3480156108b357600080fd5b506108ce60048036038101906108c99190614073565b61203b565b6040516108db9190613ef7565b60405180910390f35b3480156108f057600080fd5b5061090b60048036038101906109069190614073565b612084565b005b34801561091957600080fd5b50610934600480360381019061092f9190614610565b61215d565b60405161094292919061463d565b60405180910390f35b34801561095757600080fd5b50610972600480360381019061096d919061466d565b6123d9565b60405161097f9190613ef7565b60405180910390f35b34801561099457600080fd5b5061099d612460565b005b3480156109ab57600080fd5b506109b461254b565b6040516109c19190613ef7565b60405180910390f35b3480156109d657600080fd5b506109f160048036038101906109ec9190614610565b612555565b005b3480156109ff57600080fd5b50610a1a6004803603810190610a159190614073565b6126bc565b005b348015610a2857600080fd5b50610a436004803603810190610a3e9190614073565b61287d565b604051610a579897969594939291906146c6565b60405180910390f35b348015610a6c57600080fd5b50610a876004803603810190610a829190614610565b612b8b565b005b348015610a9557600080fd5b50610ab06004803603810190610aab9190614610565b612dc2565b604051610abf93929190614744565b60405180910390f35b6000610ad261110a565b11610adc57600080fd5b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b39919061457b565b602060405180830381865afa158015610b56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7a9190614790565b9050610b8534612b8b565b6000610c3582601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610be6919061457b565b602060405180830381865afa158015610c03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c279190614790565b6130bd90919063ffffffff16565b90506000811115610cfa57610c8a610c4b61110a565b610c6f7001000000000000000000000000000000008461310790919063ffffffff16565b610c79919061481b565b60015461318190919063ffffffff16565b6001819055503373ffffffffffffffffffffffffffffffffffffffff167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d7845411651182604051610cd69190613ef7565b60405180910390a2610cf381600b5461318190919063ffffffff16565b600b819055505b5050565b606060088054610d0d9061487b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d399061487b565b8015610d865780601f10610d5b57610100808354040283529160200191610d86565b820191906000526020600020905b815481529060010190602001808311610d6957829003601f168201915b5050505050905090565b6000610da4610d9d6131df565b84846131e7565b6001905092915050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e419190614790565b905090565b610e4e6131df565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed2906148f8565b60405180910390fd5b806013600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015590505050565b610f326131df565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb6906148f8565b60405180910390fd5b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161101c919061457b565b602060405180830381865afa158015611039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105d9190614790565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6110a5611dcc565b836040518363ffffffff1660e01b81526004016110c3929190614918565b6020604051808303816000875af11580156110e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111069190614956565b5050565b6000600754905090565b600f6020528060005260406000206000915090505481565b60008061116e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611165906149f5565b60405180910390fd5b600190509392505050565b600070010000000000000000000000000000000061120b611206600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111f86111f36111e28861194b565b60015461310790919063ffffffff16565b6133b0565b6133cd90919063ffffffff16565b613418565b611215919061481b565b9050919050565b600e5481565b6000600a60009054906101000a900460ff16905090565b6112416131df565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c5906148f8565b60405180910390fd5b6112d981600061342f565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e826040518263ffffffff1660e01b8152600401611334919061457b565b600060405180830381600087803b15801561134e57600080fd5b505af1158015611362573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2560405160405180910390a250565b60006114556113b96131df565b8461145085600660006113ca6131df565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461318190919063ffffffff16565b6131e7565b6001905092915050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663345487d0836040518263ffffffff1660e01b81526004016114bc919061457b565b602060405180830381865afa1580156114d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fd9190614790565b9050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e832273836040518263ffffffff1660e01b815260040161155a919061457b565b602060405180830381865afa158015611577573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159b9190614956565b6116f35760006115aa8261215d565b5090506000811115611654576115c0838261342f565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82884836040518363ffffffff1660e01b815260040161161d929190614918565b600060405180830381600087803b15801561163757600080fd5b505af115801561164b573d6000803e3d6000fd5b505050506116ed565b61165f83600061342f565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e846040518263ffffffff1660e01b81526004016116ba919061457b565b600060405180830381600087803b1580156116d457600080fd5b505af11580156116e8573d6000803e3d6000fd5b505050505b5061179e565b60006116fe8361194b565b111561179d5761170f82600061342f565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e836040518263ffffffff1660e01b815260040161176a919061457b565b600060405180830381600087803b15801561178457600080fd5b505af1158015611798573d6000803e3d6000fd5b505050505b5b6117a982600161349c565b505050565b601a8060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b60005b81518110156118215761180d828281518110611800576117ff614a15565b5b602002602001015161145f565b60018161181a9190614a44565b90506117e1565b5050565b61182d6131df565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b1906148f8565b60405180910390fd5b80601a600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015590505050565b60138060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b611942336135f9565b50565b60105481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61199c6131df565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a20906148f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611aef6131df565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b73906148f8565b60405180910390fd5b818190508484905014611bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbb90614aea565b60405180910390fd5b60005b84849050811015611cd2576000858583818110611be757611be6614a15565b5b9050602002016020810190611bfc9190614073565b90506000848484818110611c1357611c12614a15565b5b905060200201359050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401611c79929190614918565b6020604051808303816000875af1158015611c98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbc9190614956565b5050508080611cca90614b0a565b915050611bc7565b5050505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b5481565b611d306131df565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db4906148f8565b60405180910390fd5b611dc7828261349c565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611e0082611f8c565b9050919050565b606060098054611e169061487b565b80601f0160208091040260200160405190810160405280929190818152602001828054611e429061487b565b8015611e8f5780601f10611e6457610100808354040283529160200191611e8f565b820191906000526020600020905b815481529060010190602001808311611e7257829003601f168201915b5050505050905090565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611f82611ecc6131df565b84611f7d856040518060600160405280602581526020016153726025913960066000611ef66131df565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137a89092919063ffffffff16565b6131e7565b6001905092915050565b6000611fe8600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fda84611179565b6130bd90919063ffffffff16565b9050919050565b600080612031576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612028906149f5565b60405180910390fd5b6001905092915050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61208c6131df565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612119576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612110906148f8565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600060606000806040518060400160405280600c81526020017f4e6f7420456c696769626c650000000000000000000000000000000000000000815250905060136006015485106121ec5767016345785d8a000091506040518060400160405280600e81526020017f466f7274756e65205365656b657200000000000000000000000000000000000081525090505b601360050154851061223c576703782dace9d9000091506040518060400160405280601481526020017f4162756e64616e636520456e746875736961737400000000000000000000000081525090505b601360040154851061228c576706f05b59d3b2000091506040518060400160405280601381526020017f50726f73706572697479204164766f636174650000000000000000000000000081525090505b60136003015485106122dc57670de0b6b3a764000091506040518060400160405280601181526020017f576561686c74682041726368697465637400000000000000000000000000000081525090505b601360020154851061232c57671bc16d674ec8000091506040518060400160405280600d81526020017f426f756e7479205365656b65720000000000000000000000000000000000000081525090505b601360010154851061237c57673782dace9d90000091506040518060400160405280601381526020017f56697274756f75732042656e65666163746f720000000000000000000000000081525090505b60136000015485106123cc57676f05b59d3b20000091506040518060400160405280601181526020017f53756d7072656d65204c756d696e61727900000000000000000000000000000081525090505b8181935093505050915091565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6124686131df565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146124f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ec906148f8565b60405180910390fd5b6000479050612502611dcc565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612547573d6000803e3d6000fd5b5050565b6000600e54905090565b61255d6131df565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e1906148f8565b60405180910390fd5b610e1081101580156125ff5750620151808111155b61263e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263590614bc4565b60405180910390fd5b6010548103612682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267990614c56565b60405180910390fd5b601054817f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f60405160405180910390a38060108190555050565b6126c46131df565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612751576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612748906148f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036127c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b790614ce8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600080600080600080889750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663564c8d11896040518263ffffffff1660e01b81526004016128e7919061457b565b602060405180830381865afa158015612904573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129289190614d34565b96507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff955060008712612add57600e5487111561297b57612974600e548861380c90919063ffffffff16565b9550612adc565b6000600e54600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a119190614790565b11612a1d576000612ac3565b612ac2600e54600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab49190614790565b6130bd90919063ffffffff16565b5b9050612ad881896133cd90919063ffffffff16565b9650505b5b612ae688611f8c565b9450612af188611179565b9350600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054925060008311612b44576000612b5a565b612b596010548461318190919063ffffffff16565b5b9150428211612b6a576000612b7e565b612b7d42836130bd90919063ffffffff16565b5b9050919395975091939597565b6000600267ffffffffffffffff811115612ba857612ba7613f17565b5b604051908082528060200260200182016040528015612bd65781602001602082028036833780820191505090505b509050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c6a9190614d76565b81600081518110612c7e57612c7d614a15565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110612cef57612cee614a15565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de958360008430426040518663ffffffff1660e01b8152600401612d8c9493929190614e9c565b6000604051808303818588803b158015612da557600080fd5b505af1158015612db9573d6000803e3d6000fd5b50505050505050565b600080600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e599190614790565b905060008103612e7557600080600e54935093509350506130b6565b6000600e5490506000805a90506000805b8984108015612e9457508582105b1561309d578480612ea490614b0a565b955050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f389190614790565b8510612f4357600094505b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663663037ac876040518263ffffffff1660e01b8152600401612fa09190613ef7565b602060405180830381865afa158015612fbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fe19190614d76565b905061302b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613857565b156130505761303b81600161349c565b1561304f57818061304b90614b0a565b9250505b5b828061305b90614b0a565b93505060005a9050808511156130935761309061308182876130bd90919063ffffffff16565b8761318190919063ffffffff16565b95505b8094505050612e86565b84600e819055508181600e549850985098505050505050505b9193909250565b60006130ff83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137a8565b905092915050565b6000808303613119576000905061317b565b600082846131279190614ee8565b9050828482613136919061481b565b14613176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316d90614f9c565b60405180910390fd5b809150505b92915050565b60008082846131909190614a44565b9050838110156131d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131cc90615008565b60405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324d9061509a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036132c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132bc9061512c565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516133a39190613ef7565b60405180910390a3505050565b60008082905060008112156133c457600080fd5b80915050919050565b60008082846133dc919061514c565b9050600083121580156133ef5750838112155b80613405575060008312801561340457508381125b5b61340e57600080fd5b8091505092915050565b60008082121561342757600080fd5b819050919050565b600061343a8361194b565b90508082111561346b57600061345982846130bd90919063ffffffff16565b9050613465848261388a565b50613497565b8082101561349657600061348883836130bd90919063ffffffff16565b90506134948482613ac4565b505b5b505050565b6000806134a8846135f9565b905060008111156135ed576000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061350a818361318190919063ffffffff16565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508315158573ffffffffffffffffffffffffffffffffffffffff167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092846040516135da9190613ef7565b60405180910390a36001925050506135f3565b60009150505b92915050565b60008061360583611f8c565b9050600081111561379d5761366281600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461318190919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d826040516136eb9190613ef7565b60405180910390a2601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b81526004016137509291906151b1565b6020604051808303816000875af115801561376f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137939190614956565b50809150506137a3565b60009150505b919050565b60008383111582906137f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137e79190613da8565b60405180910390fd5b50600083856137ff91906151da565b9050809150509392505050565b600080828461381b919061520e565b90506000831215801561382e5750838113155b80613844575060008312801561384357508381135b5b61384d57600080fd5b8091505092915050565b60004282111561386a5760009050613885565b60105461388083426130bd90919063ffffffff16565b101590505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036138f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138f09061529d565b60405180910390fd5b61390e8160075461318190919063ffffffff16565b60078190555061396681600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461318190919063ffffffff16565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613a079190613ef7565b60405180910390a3613a7d613a2f613a2a8360015461310790919063ffffffff16565b6133b0565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461380c90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2a9061532f565b60405180910390fd5b613b9f8160405180606001604052806022815260200161535060229139600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137a89092919063ffffffff16565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613bf7816007546130bd90919063ffffffff16565b600781905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613c5b9190613ef7565b60405180910390a3613cd1613c83613c7e8360015461310790919063ffffffff16565b6133b0565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133cd90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d52578082015181840152602081019050613d37565b60008484015250505050565b6000601f19601f8301169050919050565b6000613d7a82613d18565b613d848185613d23565b9350613d94818560208601613d34565b613d9d81613d5e565b840191505092915050565b60006020820190508181036000830152613dc28184613d6f565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e0982613dde565b9050919050565b613e1981613dfe565b8114613e2457600080fd5b50565b600081359050613e3681613e10565b92915050565b6000819050919050565b613e4f81613e3c565b8114613e5a57600080fd5b50565b600081359050613e6c81613e46565b92915050565b60008060408385031215613e8957613e88613dd4565b5b6000613e9785828601613e27565b9250506020613ea885828601613e5d565b9150509250929050565b60008115159050919050565b613ec781613eb2565b82525050565b6000602082019050613ee26000830184613ebe565b92915050565b613ef181613e3c565b82525050565b6000602082019050613f0c6000830184613ee8565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f4f82613d5e565b810181811067ffffffffffffffff82111715613f6e57613f6d613f17565b5b80604052505050565b6000613f81613dca565b9050613f8d8282613f46565b919050565b600060e08284031215613fa857613fa7613f12565b5b613fb260e0613f77565b90506000613fc284828501613e5d565b6000830152506020613fd684828501613e5d565b6020830152506040613fea84828501613e5d565b6040830152506060613ffe84828501613e5d565b606083015250608061401284828501613e5d565b60808301525060a061402684828501613e5d565b60a08301525060c061403a84828501613e5d565b60c08301525092915050565b600060e0828403121561405c5761405b613dd4565b5b600061406a84828501613f92565b91505092915050565b60006020828403121561408957614088613dd4565b5b600061409784828501613e27565b91505092915050565b6000806000606084860312156140b9576140b8613dd4565b5b60006140c786828701613e27565b93505060206140d886828701613e27565b92505060406140e986828701613e5d565b9150509250925092565b600060ff82169050919050565b614109816140f3565b82525050565b60006020820190506141246000830184614100565b92915050565b600060e08201905061413f600083018a613ee8565b61414c6020830189613ee8565b6141596040830188613ee8565b6141666060830187613ee8565b6141736080830186613ee8565b61418060a0830185613ee8565b61418d60c0830184613ee8565b98975050505050505050565b600080fd5b600067ffffffffffffffff8211156141b9576141b8613f17565b5b602082029050602081019050919050565b600080fd5b60006141e26141dd8461419e565b613f77565b90508083825260208201905060208402830185811115614205576142046141ca565b5b835b8181101561422e578061421a8882613e27565b845260208401935050602081019050614207565b5050509392505050565b600082601f83011261424d5761424c614199565b5b813561425d8482602086016141cf565b91505092915050565b60006020828403121561427c5761427b613dd4565b5b600082013567ffffffffffffffff81111561429a57614299613dd9565b5b6142a684828501614238565b91505092915050565b600060e082840312156142c5576142c4613f12565b5b6142cf60e0613f77565b905060006142df84828501613e5d565b60008301525060206142f384828501613e5d565b602083015250604061430784828501613e5d565b604083015250606061431b84828501613e5d565b606083015250608061432f84828501613e5d565b60808301525060a061434384828501613e5d565b60a08301525060c061435784828501613e5d565b60c08301525092915050565b600060e0828403121561437957614378613dd4565b5b6000614387848285016142af565b91505092915050565b600080fd5b60008083601f8401126143ab576143aa614199565b5b8235905067ffffffffffffffff8111156143c8576143c7614390565b5b6020830191508360208202830111156143e4576143e36141ca565b5b9250929050565b60008083601f84011261440157614400614199565b5b8235905067ffffffffffffffff81111561441e5761441d614390565b5b60208301915083602082028301111561443a576144396141ca565b5b9250929050565b6000806000806040858703121561445b5761445a613dd4565b5b600085013567ffffffffffffffff81111561447957614478613dd9565b5b61448587828801614395565b9450945050602085013567ffffffffffffffff8111156144a8576144a7613dd9565b5b6144b4878288016143eb565b925092505092959194509250565b60006144cd82613dde565b9050919050565b6144dd816144c2565b81146144e857600080fd5b50565b6000813590506144fa816144d4565b92915050565b61450981613eb2565b811461451457600080fd5b50565b60008135905061452681614500565b92915050565b6000806040838503121561454357614542613dd4565b5b6000614551858286016144eb565b925050602061456285828601614517565b9150509250929050565b61457581613dfe565b82525050565b6000602082019050614590600083018461456c565b92915050565b6000819050919050565b60006145bb6145b66145b184613dde565b614596565b613dde565b9050919050565b60006145cd826145a0565b9050919050565b60006145df826145c2565b9050919050565b6145ef816145d4565b82525050565b600060208201905061460a60008301846145e6565b92915050565b60006020828403121561462657614625613dd4565b5b600061463484828501613e5d565b91505092915050565b60006040820190506146526000830185613ee8565b81810360208301526146648184613d6f565b90509392505050565b6000806040838503121561468457614683613dd4565b5b600061469285828601613e27565b92505060206146a385828601613e27565b9150509250929050565b6000819050919050565b6146c0816146ad565b82525050565b6000610100820190506146dc600083018b61456c565b6146e9602083018a6146b7565b6146f660408301896146b7565b6147036060830188613ee8565b6147106080830187613ee8565b61471d60a0830186613ee8565b61472a60c0830185613ee8565b61473760e0830184613ee8565b9998505050505050505050565b60006060820190506147596000830186613ee8565b6147666020830185613ee8565b6147736040830184613ee8565b949350505050565b60008151905061478a81613e46565b92915050565b6000602082840312156147a6576147a5613dd4565b5b60006147b48482850161477b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061482682613e3c565b915061483183613e3c565b925082614841576148406147bd565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061489357607f821691505b6020821081036148a6576148a561484c565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006148e2602083613d23565b91506148ed826148ac565b602082019050919050565b60006020820190508181036000830152614911816148d5565b9050919050565b600060408201905061492d600083018561456c565b61493a6020830184613ee8565b9392505050565b60008151905061495081614500565b92915050565b60006020828403121561496c5761496b613dd4565b5b600061497a84828501614941565b91505092915050565b7f4e6f207472616e736665727320616c6c6f77656420696e206469766964656e6460008201527f20747261636b6572000000000000000000000000000000000000000000000000602082015250565b60006149df602883613d23565b91506149ea82614983565b604082019050919050565b60006020820190508181036000830152614a0e816149d2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614a4f82613e3c565b9150614a5a83613e3c565b9250828201905080821115614a7257614a716147ec565b5b92915050565b7f486f6c6465727320616e6420616d6f756e7473206d757374206265207468652060008201527f73616d6520636f756e7400000000000000000000000000000000000000000000602082015250565b6000614ad4602a83613d23565b9150614adf82614a78565b604082019050919050565b60006020820190508181036000830152614b0381614ac7565b9050919050565b6000614b1582613e3c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614b4757614b466147ec565b5b600182019050919050565b7f436c61696d57616974206d757374206265207570646174656420746f2062657460008201527f7765656e203120616e6420323420686f75727300000000000000000000000000602082015250565b6000614bae603383613d23565b9150614bb982614b52565b604082019050919050565b60006020820190508181036000830152614bdd81614ba1565b9050919050565b7f43616e6e6f742075706461746520636c61696d5761697420746f2073616d652060008201527f76616c7565000000000000000000000000000000000000000000000000000000602082015250565b6000614c40602583613d23565b9150614c4b82614be4565b604082019050919050565b60006020820190508181036000830152614c6f81614c33565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614cd2602683613d23565b9150614cdd82614c76565b604082019050919050565b60006020820190508181036000830152614d0181614cc5565b9050919050565b614d11816146ad565b8114614d1c57600080fd5b50565b600081519050614d2e81614d08565b92915050565b600060208284031215614d4a57614d49613dd4565b5b6000614d5884828501614d1f565b91505092915050565b600081519050614d7081613e10565b92915050565b600060208284031215614d8c57614d8b613dd4565b5b6000614d9a84828501614d61565b91505092915050565b6000819050919050565b6000614dc8614dc3614dbe84614da3565b614596565b613e3c565b9050919050565b614dd881614dad565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614e1381613dfe565b82525050565b6000614e258383614e0a565b60208301905092915050565b6000602082019050919050565b6000614e4982614dde565b614e538185614de9565b9350614e5e83614dfa565b8060005b83811015614e8f578151614e768882614e19565b9750614e8183614e31565b925050600181019050614e62565b5085935050505092915050565b6000608082019050614eb16000830187614dcf565b8181036020830152614ec38186614e3e565b9050614ed2604083018561456c565b614edf6060830184613ee8565b95945050505050565b6000614ef382613e3c565b9150614efe83613e3c565b9250828202614f0c81613e3c565b91508282048414831517614f2357614f226147ec565b5b5092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f86602183613d23565b9150614f9182614f2a565b604082019050919050565b60006020820190508181036000830152614fb581614f79565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614ff2601b83613d23565b9150614ffd82614fbc565b602082019050919050565b6000602082019050818103600083015261502181614fe5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615084602483613d23565b915061508f82615028565b604082019050919050565b600060208201905081810360008301526150b381615077565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000615116602283613d23565b9150615121826150ba565b604082019050919050565b6000602082019050818103600083015261514581615109565b9050919050565b6000615157826146ad565b9150615162836146ad565b92508282019050828112156000831216838212600084121516171561518a576151896147ec565b5b92915050565b600061519b826145c2565b9050919050565b6151ab81615190565b82525050565b60006040820190506151c660008301856151a2565b6151d36020830184613ee8565b9392505050565b60006151e582613e3c565b91506151f083613e3c565b9250828203905081811115615208576152076147ec565b5b92915050565b6000615219826146ad565b9150615224836146ad565b925082820390508181126000841216828213600085121516171561524b5761524a6147ec565b5b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000615287601f83613d23565b915061529282615251565b602082019050919050565b600060208201905081810360008301526152b68161527a565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615319602183613d23565b9150615324826152bd565b604082019050919050565b600060208201905081810360008301526153488161530c565b905091905056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203bef1b0569ae5c990c80af5fe5db0507c4b4c477e5513cceebf9c751018c33d564736f6c63430008130033608060405234801561001057600080fd5b50610ae8806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063663037ac1161005b578063663037ac146100ea578063949d225d1461011a578063c2bc2efc14610138578063cd413329146101685761007d565b806329092d0e146100825780633825d8281461009e578063564c8d11146100ba575b600080fd5b61009c60048036038101906100979190610863565b610198565b005b6100b860048036038101906100b391906108c6565b610464565b005b6100d460048036038101906100cf9190610863565b61065f565b6040516100e1919061091f565b60405180910390f35b61010460048036038101906100ff919061093a565b610727565b6040516101119190610976565b60405180910390f35b610122610771565b60405161012f91906109a0565b60405180910390f35b610152600480360381019061014d9190610863565b610780565b60405161015f91906109a0565b60405180910390f35b610182600480360381019061017d9190610863565b6107cb565b60405161018f91906109d6565b60405180910390f35b600060030160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561046157600060030160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055600060010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905560008060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160008001805490506102e19190610a20565b905060008060000182815481106102fb576102fa610a54565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082600060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060020160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055806000800184815481106103cc576103cb610a54565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000800180548061042857610427610a83565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555050505b50565b600060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156105055780600060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061065b565b6001600060030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600060010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000800180549050600060020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008001829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b60008060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166106dc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050610722565b600060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b919050565b600080600001828154811061073f5761073e610a54565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060000180549050905090565b60008060010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6107f78361065f565b14159050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061083082610805565b9050919050565b61084081610825565b811461084b57600080fd5b50565b60008135905061085d81610837565b92915050565b60006020828403121561087957610878610800565b5b60006108878482850161084e565b91505092915050565b6000819050919050565b6108a381610890565b81146108ae57600080fd5b50565b6000813590506108c08161089a565b92915050565b600080604083850312156108dd576108dc610800565b5b60006108eb8582860161084e565b92505060206108fc858286016108b1565b9150509250929050565b6000819050919050565b61091981610906565b82525050565b60006020820190506109346000830184610910565b92915050565b6000602082840312156109505761094f610800565b5b600061095e848285016108b1565b91505092915050565b61097081610825565b82525050565b600060208201905061098b6000830184610967565b92915050565b61099a81610890565b82525050565b60006020820190506109b56000830184610991565b92915050565b60008115159050919050565b6109d0816109bb565b82525050565b60006020820190506109eb60008301846109c7565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610a2b82610890565b9150610a3683610890565b9250828203905081811115610a4e57610a4d6109f1565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122075101884e33621166beb47cd3d21a1f24874de5a1c6dd9e634643a6a0fc6f53964736f6c63430008130033
Deployed Bytecode
0x6080604052600436106102765760003560e01c8063715018a61161014f578063a9059cbb116100c1578063e7841ec01161007a578063e7841ec01461099f578063e98030c7146109ca578063f2fde38b146109f3578063fbcbc0f114610a1c578063fde72ee414610a60578063ffb2c47914610a8957610285565b8063a9059cbb1461086a578063aafd847a146108a7578063cac8d538146108e4578063d3ab82031461090d578063dd62ed3e1461094b578063e0fb0f351461098857610285565b80638da5cb5b116101135780638da5cb5b1461073257806391b89fba1461075d57806395d89b411461079a578063a2299d3f146107c5578063a457c2d7146107f0578063a8b9d2401461082d57610285565b8063715018a6146106615780637ede135a14610678578063804974ea146106a157806385a6b3ae146106de578063897742821461070957610285565b8063313ce567116101e85780634b1727ff116101ac5780634b1727ff1461055f5780634fe59f821461058857806368572c07146105b15780636a474002146105e25780636f2789ec146105f957806370a082311461062457610285565b8063313ce5671461047457806331e79db01461049f57806339509351146104c85780633974d3b11461050557806343d35afc1461052e57610285565b806316c5720a1161023a57806316c5720a1461035057806318160ddd14610367578063226cfa3d1461039257806323b872dd146103cf57806327ce01471461040c5780633009a6091461044957610285565b806303c833021461028a57806306fdde0314610294578063095ea7b3146102bf57806309bbedde146102fc5780630a78839a1461032757610285565b3661028557610283610ac8565b005b600080fd5b610292610ac8565b005b3480156102a057600080fd5b506102a9610cfe565b6040516102b69190613da8565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190613e72565b610d90565b6040516102f39190613ecd565b60405180910390f35b34801561030857600080fd5b50610311610dae565b60405161031e9190613ef7565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190614046565b610e46565b005b34801561035c57600080fd5b50610365610f2a565b005b34801561037357600080fd5b5061037c61110a565b6040516103899190613ef7565b60405180910390f35b34801561039e57600080fd5b506103b960048036038101906103b49190614073565b611114565b6040516103c69190613ef7565b60405180910390f35b3480156103db57600080fd5b506103f660048036038101906103f191906140a0565b61112c565b6040516104039190613ecd565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e9190614073565b611179565b6040516104409190613ef7565b60405180910390f35b34801561045557600080fd5b5061045e61121c565b60405161046b9190613ef7565b60405180910390f35b34801561048057600080fd5b50610489611222565b604051610496919061410f565b60405180910390f35b3480156104ab57600080fd5b506104c660048036038101906104c19190614073565b611239565b005b3480156104d457600080fd5b506104ef60048036038101906104ea9190613e72565b6113ac565b6040516104fc9190613ecd565b60405180910390f35b34801561051157600080fd5b5061052c60048036038101906105279190614073565b61145f565b005b34801561053a57600080fd5b506105436117ae565b604051610556979695949392919061412a565b60405180910390f35b34801561056b57600080fd5b5061058660048036038101906105819190614266565b6117de565b005b34801561059457600080fd5b506105af60048036038101906105aa9190614363565b611825565b005b3480156105bd57600080fd5b506105c6611909565b6040516105d9979695949392919061412a565b60405180910390f35b3480156105ee57600080fd5b506105f7611939565b005b34801561060557600080fd5b5061060e611945565b60405161061b9190613ef7565b60405180910390f35b34801561063057600080fd5b5061064b60048036038101906106469190614073565b61194b565b6040516106589190613ef7565b60405180910390f35b34801561066d57600080fd5b50610676611994565b005b34801561068457600080fd5b5061069f600480360381019061069a9190614441565b611ae7565b005b3480156106ad57600080fd5b506106c860048036038101906106c39190614073565b611cd9565b6040516106d59190613ef7565b60405180910390f35b3480156106ea57600080fd5b506106f3611d22565b6040516107009190613ef7565b60405180910390f35b34801561071557600080fd5b50610730600480360381019061072b919061452c565b611d28565b005b34801561073e57600080fd5b50610747611dcc565b604051610754919061457b565b60405180910390f35b34801561076957600080fd5b50610784600480360381019061077f9190614073565b611df5565b6040516107919190613ef7565b60405180910390f35b3480156107a657600080fd5b506107af611e07565b6040516107bc9190613da8565b60405180910390f35b3480156107d157600080fd5b506107da611e99565b6040516107e791906145f5565b60405180910390f35b3480156107fc57600080fd5b5061081760048036038101906108129190613e72565b611ebf565b6040516108249190613ecd565b60405180910390f35b34801561083957600080fd5b50610854600480360381019061084f9190614073565b611f8c565b6040516108619190613ef7565b60405180910390f35b34801561087657600080fd5b50610891600480360381019061088c9190613e72565b611fef565b60405161089e9190613ecd565b60405180910390f35b3480156108b357600080fd5b506108ce60048036038101906108c99190614073565b61203b565b6040516108db9190613ef7565b60405180910390f35b3480156108f057600080fd5b5061090b60048036038101906109069190614073565b612084565b005b34801561091957600080fd5b50610934600480360381019061092f9190614610565b61215d565b60405161094292919061463d565b60405180910390f35b34801561095757600080fd5b50610972600480360381019061096d919061466d565b6123d9565b60405161097f9190613ef7565b60405180910390f35b34801561099457600080fd5b5061099d612460565b005b3480156109ab57600080fd5b506109b461254b565b6040516109c19190613ef7565b60405180910390f35b3480156109d657600080fd5b506109f160048036038101906109ec9190614610565b612555565b005b3480156109ff57600080fd5b50610a1a6004803603810190610a159190614073565b6126bc565b005b348015610a2857600080fd5b50610a436004803603810190610a3e9190614073565b61287d565b604051610a579897969594939291906146c6565b60405180910390f35b348015610a6c57600080fd5b50610a876004803603810190610a829190614610565b612b8b565b005b348015610a9557600080fd5b50610ab06004803603810190610aab9190614610565b612dc2565b604051610abf93929190614744565b60405180910390f35b6000610ad261110a565b11610adc57600080fd5b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b39919061457b565b602060405180830381865afa158015610b56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7a9190614790565b9050610b8534612b8b565b6000610c3582601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610be6919061457b565b602060405180830381865afa158015610c03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c279190614790565b6130bd90919063ffffffff16565b90506000811115610cfa57610c8a610c4b61110a565b610c6f7001000000000000000000000000000000008461310790919063ffffffff16565b610c79919061481b565b60015461318190919063ffffffff16565b6001819055503373ffffffffffffffffffffffffffffffffffffffff167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d7845411651182604051610cd69190613ef7565b60405180910390a2610cf381600b5461318190919063ffffffff16565b600b819055505b5050565b606060088054610d0d9061487b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d399061487b565b8015610d865780601f10610d5b57610100808354040283529160200191610d86565b820191906000526020600020905b815481529060010190602001808311610d6957829003601f168201915b5050505050905090565b6000610da4610d9d6131df565b84846131e7565b6001905092915050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e419190614790565b905090565b610e4e6131df565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed2906148f8565b60405180910390fd5b806013600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015590505050565b610f326131df565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb6906148f8565b60405180910390fd5b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161101c919061457b565b602060405180830381865afa158015611039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105d9190614790565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6110a5611dcc565b836040518363ffffffff1660e01b81526004016110c3929190614918565b6020604051808303816000875af11580156110e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111069190614956565b5050565b6000600754905090565b600f6020528060005260406000206000915090505481565b60008061116e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611165906149f5565b60405180910390fd5b600190509392505050565b600070010000000000000000000000000000000061120b611206600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111f86111f36111e28861194b565b60015461310790919063ffffffff16565b6133b0565b6133cd90919063ffffffff16565b613418565b611215919061481b565b9050919050565b600e5481565b6000600a60009054906101000a900460ff16905090565b6112416131df565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c5906148f8565b60405180910390fd5b6112d981600061342f565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e826040518263ffffffff1660e01b8152600401611334919061457b565b600060405180830381600087803b15801561134e57600080fd5b505af1158015611362573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2560405160405180910390a250565b60006114556113b96131df565b8461145085600660006113ca6131df565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461318190919063ffffffff16565b6131e7565b6001905092915050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663345487d0836040518263ffffffff1660e01b81526004016114bc919061457b565b602060405180830381865afa1580156114d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fd9190614790565b9050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e832273836040518263ffffffff1660e01b815260040161155a919061457b565b602060405180830381865afa158015611577573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159b9190614956565b6116f35760006115aa8261215d565b5090506000811115611654576115c0838261342f565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633825d82884836040518363ffffffff1660e01b815260040161161d929190614918565b600060405180830381600087803b15801561163757600080fd5b505af115801561164b573d6000803e3d6000fd5b505050506116ed565b61165f83600061342f565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e846040518263ffffffff1660e01b81526004016116ba919061457b565b600060405180830381600087803b1580156116d457600080fd5b505af11580156116e8573d6000803e3d6000fd5b505050505b5061179e565b60006116fe8361194b565b111561179d5761170f82600061342f565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166329092d0e836040518263ffffffff1660e01b815260040161176a919061457b565b600060405180830381600087803b15801561178457600080fd5b505af1158015611798573d6000803e3d6000fd5b505050505b5b6117a982600161349c565b505050565b601a8060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b60005b81518110156118215761180d828281518110611800576117ff614a15565b5b602002602001015161145f565b60018161181a9190614a44565b90506117e1565b5050565b61182d6131df565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b1906148f8565b60405180910390fd5b80601a600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015590505050565b60138060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b611942336135f9565b50565b60105481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61199c6131df565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a20906148f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611aef6131df565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b73906148f8565b60405180910390fd5b818190508484905014611bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbb90614aea565b60405180910390fd5b60005b84849050811015611cd2576000858583818110611be757611be6614a15565b5b9050602002016020810190611bfc9190614073565b90506000848484818110611c1357611c12614a15565b5b905060200201359050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401611c79929190614918565b6020604051808303816000875af1158015611c98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbc9190614956565b5050508080611cca90614b0a565b915050611bc7565b5050505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b5481565b611d306131df565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db4906148f8565b60405180910390fd5b611dc7828261349c565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611e0082611f8c565b9050919050565b606060098054611e169061487b565b80601f0160208091040260200160405190810160405280929190818152602001828054611e429061487b565b8015611e8f5780601f10611e6457610100808354040283529160200191611e8f565b820191906000526020600020905b815481529060010190602001808311611e7257829003601f168201915b5050505050905090565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611f82611ecc6131df565b84611f7d856040518060600160405280602581526020016153726025913960066000611ef66131df565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137a89092919063ffffffff16565b6131e7565b6001905092915050565b6000611fe8600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611fda84611179565b6130bd90919063ffffffff16565b9050919050565b600080612031576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612028906149f5565b60405180910390fd5b6001905092915050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61208c6131df565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612119576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612110906148f8565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600060606000806040518060400160405280600c81526020017f4e6f7420456c696769626c650000000000000000000000000000000000000000815250905060136006015485106121ec5767016345785d8a000091506040518060400160405280600e81526020017f466f7274756e65205365656b657200000000000000000000000000000000000081525090505b601360050154851061223c576703782dace9d9000091506040518060400160405280601481526020017f4162756e64616e636520456e746875736961737400000000000000000000000081525090505b601360040154851061228c576706f05b59d3b2000091506040518060400160405280601381526020017f50726f73706572697479204164766f636174650000000000000000000000000081525090505b60136003015485106122dc57670de0b6b3a764000091506040518060400160405280601181526020017f576561686c74682041726368697465637400000000000000000000000000000081525090505b601360020154851061232c57671bc16d674ec8000091506040518060400160405280600d81526020017f426f756e7479205365656b65720000000000000000000000000000000000000081525090505b601360010154851061237c57673782dace9d90000091506040518060400160405280601381526020017f56697274756f75732042656e65666163746f720000000000000000000000000081525090505b60136000015485106123cc57676f05b59d3b20000091506040518060400160405280601181526020017f53756d7072656d65204c756d696e61727900000000000000000000000000000081525090505b8181935093505050915091565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6124686131df565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146124f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ec906148f8565b60405180910390fd5b6000479050612502611dcc565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612547573d6000803e3d6000fd5b5050565b6000600e54905090565b61255d6131df565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e1906148f8565b60405180910390fd5b610e1081101580156125ff5750620151808111155b61263e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263590614bc4565b60405180910390fd5b6010548103612682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267990614c56565b60405180910390fd5b601054817f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f60405160405180910390a38060108190555050565b6126c46131df565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612751576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612748906148f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036127c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b790614ce8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600080600080600080889750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663564c8d11896040518263ffffffff1660e01b81526004016128e7919061457b565b602060405180830381865afa158015612904573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129289190614d34565b96507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff955060008712612add57600e5487111561297b57612974600e548861380c90919063ffffffff16565b9550612adc565b6000600e54600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a119190614790565b11612a1d576000612ac3565b612ac2600e54600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab49190614790565b6130bd90919063ffffffff16565b5b9050612ad881896133cd90919063ffffffff16565b9650505b5b612ae688611f8c565b9450612af188611179565b9350600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054925060008311612b44576000612b5a565b612b596010548461318190919063ffffffff16565b5b9150428211612b6a576000612b7e565b612b7d42836130bd90919063ffffffff16565b5b9050919395975091939597565b6000600267ffffffffffffffff811115612ba857612ba7613f17565b5b604051908082528060200260200182016040528015612bd65781602001602082028036833780820191505090505b509050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c6a9190614d76565b81600081518110612c7e57612c7d614a15565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110612cef57612cee614a15565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b6f9de958360008430426040518663ffffffff1660e01b8152600401612d8c9493929190614e9c565b6000604051808303818588803b158015612da557600080fd5b505af1158015612db9573d6000803e3d6000fd5b50505050505050565b600080600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e599190614790565b905060008103612e7557600080600e54935093509350506130b6565b6000600e5490506000805a90506000805b8984108015612e9457508582105b1561309d578480612ea490614b0a565b955050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f389190614790565b8510612f4357600094505b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663663037ac876040518263ffffffff1660e01b8152600401612fa09190613ef7565b602060405180830381865afa158015612fbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fe19190614d76565b905061302b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613857565b156130505761303b81600161349c565b1561304f57818061304b90614b0a565b9250505b5b828061305b90614b0a565b93505060005a9050808511156130935761309061308182876130bd90919063ffffffff16565b8761318190919063ffffffff16565b95505b8094505050612e86565b84600e819055508181600e549850985098505050505050505b9193909250565b60006130ff83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137a8565b905092915050565b6000808303613119576000905061317b565b600082846131279190614ee8565b9050828482613136919061481b565b14613176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316d90614f9c565b60405180910390fd5b809150505b92915050565b60008082846131909190614a44565b9050838110156131d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131cc90615008565b60405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324d9061509a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036132c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132bc9061512c565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516133a39190613ef7565b60405180910390a3505050565b60008082905060008112156133c457600080fd5b80915050919050565b60008082846133dc919061514c565b9050600083121580156133ef5750838112155b80613405575060008312801561340457508381125b5b61340e57600080fd5b8091505092915050565b60008082121561342757600080fd5b819050919050565b600061343a8361194b565b90508082111561346b57600061345982846130bd90919063ffffffff16565b9050613465848261388a565b50613497565b8082101561349657600061348883836130bd90919063ffffffff16565b90506134948482613ac4565b505b5b505050565b6000806134a8846135f9565b905060008111156135ed576000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061350a818361318190919063ffffffff16565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555042600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508315158573ffffffffffffffffffffffffffffffffffffffff167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092846040516135da9190613ef7565b60405180910390a36001925050506135f3565b60009150505b92915050565b60008061360583611f8c565b9050600081111561379d5761366281600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461318190919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d826040516136eb9190613ef7565b60405180910390a2601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b81526004016137509291906151b1565b6020604051808303816000875af115801561376f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137939190614956565b50809150506137a3565b60009150505b919050565b60008383111582906137f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137e79190613da8565b60405180910390fd5b50600083856137ff91906151da565b9050809150509392505050565b600080828461381b919061520e565b90506000831215801561382e5750838113155b80613844575060008312801561384357508381135b5b61384d57600080fd5b8091505092915050565b60004282111561386a5760009050613885565b60105461388083426130bd90919063ffffffff16565b101590505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036138f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138f09061529d565b60405180910390fd5b61390e8160075461318190919063ffffffff16565b60078190555061396681600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461318190919063ffffffff16565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613a079190613ef7565b60405180910390a3613a7d613a2f613a2a8360015461310790919063ffffffff16565b6133b0565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461380c90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2a9061532f565b60405180910390fd5b613b9f8160405180606001604052806022815260200161535060229139600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546137a89092919063ffffffff16565b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613bf7816007546130bd90919063ffffffff16565b600781905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613c5b9190613ef7565b60405180910390a3613cd1613c83613c7e8360015461310790919063ffffffff16565b6133b0565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133cd90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d52578082015181840152602081019050613d37565b60008484015250505050565b6000601f19601f8301169050919050565b6000613d7a82613d18565b613d848185613d23565b9350613d94818560208601613d34565b613d9d81613d5e565b840191505092915050565b60006020820190508181036000830152613dc28184613d6f565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e0982613dde565b9050919050565b613e1981613dfe565b8114613e2457600080fd5b50565b600081359050613e3681613e10565b92915050565b6000819050919050565b613e4f81613e3c565b8114613e5a57600080fd5b50565b600081359050613e6c81613e46565b92915050565b60008060408385031215613e8957613e88613dd4565b5b6000613e9785828601613e27565b9250506020613ea885828601613e5d565b9150509250929050565b60008115159050919050565b613ec781613eb2565b82525050565b6000602082019050613ee26000830184613ebe565b92915050565b613ef181613e3c565b82525050565b6000602082019050613f0c6000830184613ee8565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f4f82613d5e565b810181811067ffffffffffffffff82111715613f6e57613f6d613f17565b5b80604052505050565b6000613f81613dca565b9050613f8d8282613f46565b919050565b600060e08284031215613fa857613fa7613f12565b5b613fb260e0613f77565b90506000613fc284828501613e5d565b6000830152506020613fd684828501613e5d565b6020830152506040613fea84828501613e5d565b6040830152506060613ffe84828501613e5d565b606083015250608061401284828501613e5d565b60808301525060a061402684828501613e5d565b60a08301525060c061403a84828501613e5d565b60c08301525092915050565b600060e0828403121561405c5761405b613dd4565b5b600061406a84828501613f92565b91505092915050565b60006020828403121561408957614088613dd4565b5b600061409784828501613e27565b91505092915050565b6000806000606084860312156140b9576140b8613dd4565b5b60006140c786828701613e27565b93505060206140d886828701613e27565b92505060406140e986828701613e5d565b9150509250925092565b600060ff82169050919050565b614109816140f3565b82525050565b60006020820190506141246000830184614100565b92915050565b600060e08201905061413f600083018a613ee8565b61414c6020830189613ee8565b6141596040830188613ee8565b6141666060830187613ee8565b6141736080830186613ee8565b61418060a0830185613ee8565b61418d60c0830184613ee8565b98975050505050505050565b600080fd5b600067ffffffffffffffff8211156141b9576141b8613f17565b5b602082029050602081019050919050565b600080fd5b60006141e26141dd8461419e565b613f77565b90508083825260208201905060208402830185811115614205576142046141ca565b5b835b8181101561422e578061421a8882613e27565b845260208401935050602081019050614207565b5050509392505050565b600082601f83011261424d5761424c614199565b5b813561425d8482602086016141cf565b91505092915050565b60006020828403121561427c5761427b613dd4565b5b600082013567ffffffffffffffff81111561429a57614299613dd9565b5b6142a684828501614238565b91505092915050565b600060e082840312156142c5576142c4613f12565b5b6142cf60e0613f77565b905060006142df84828501613e5d565b60008301525060206142f384828501613e5d565b602083015250604061430784828501613e5d565b604083015250606061431b84828501613e5d565b606083015250608061432f84828501613e5d565b60808301525060a061434384828501613e5d565b60a08301525060c061435784828501613e5d565b60c08301525092915050565b600060e0828403121561437957614378613dd4565b5b6000614387848285016142af565b91505092915050565b600080fd5b60008083601f8401126143ab576143aa614199565b5b8235905067ffffffffffffffff8111156143c8576143c7614390565b5b6020830191508360208202830111156143e4576143e36141ca565b5b9250929050565b60008083601f84011261440157614400614199565b5b8235905067ffffffffffffffff81111561441e5761441d614390565b5b60208301915083602082028301111561443a576144396141ca565b5b9250929050565b6000806000806040858703121561445b5761445a613dd4565b5b600085013567ffffffffffffffff81111561447957614478613dd9565b5b61448587828801614395565b9450945050602085013567ffffffffffffffff8111156144a8576144a7613dd9565b5b6144b4878288016143eb565b925092505092959194509250565b60006144cd82613dde565b9050919050565b6144dd816144c2565b81146144e857600080fd5b50565b6000813590506144fa816144d4565b92915050565b61450981613eb2565b811461451457600080fd5b50565b60008135905061452681614500565b92915050565b6000806040838503121561454357614542613dd4565b5b6000614551858286016144eb565b925050602061456285828601614517565b9150509250929050565b61457581613dfe565b82525050565b6000602082019050614590600083018461456c565b92915050565b6000819050919050565b60006145bb6145b66145b184613dde565b614596565b613dde565b9050919050565b60006145cd826145a0565b9050919050565b60006145df826145c2565b9050919050565b6145ef816145d4565b82525050565b600060208201905061460a60008301846145e6565b92915050565b60006020828403121561462657614625613dd4565b5b600061463484828501613e5d565b91505092915050565b60006040820190506146526000830185613ee8565b81810360208301526146648184613d6f565b90509392505050565b6000806040838503121561468457614683613dd4565b5b600061469285828601613e27565b92505060206146a385828601613e27565b9150509250929050565b6000819050919050565b6146c0816146ad565b82525050565b6000610100820190506146dc600083018b61456c565b6146e9602083018a6146b7565b6146f660408301896146b7565b6147036060830188613ee8565b6147106080830187613ee8565b61471d60a0830186613ee8565b61472a60c0830185613ee8565b61473760e0830184613ee8565b9998505050505050505050565b60006060820190506147596000830186613ee8565b6147666020830185613ee8565b6147736040830184613ee8565b949350505050565b60008151905061478a81613e46565b92915050565b6000602082840312156147a6576147a5613dd4565b5b60006147b48482850161477b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061482682613e3c565b915061483183613e3c565b925082614841576148406147bd565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061489357607f821691505b6020821081036148a6576148a561484c565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006148e2602083613d23565b91506148ed826148ac565b602082019050919050565b60006020820190508181036000830152614911816148d5565b9050919050565b600060408201905061492d600083018561456c565b61493a6020830184613ee8565b9392505050565b60008151905061495081614500565b92915050565b60006020828403121561496c5761496b613dd4565b5b600061497a84828501614941565b91505092915050565b7f4e6f207472616e736665727320616c6c6f77656420696e206469766964656e6460008201527f20747261636b6572000000000000000000000000000000000000000000000000602082015250565b60006149df602883613d23565b91506149ea82614983565b604082019050919050565b60006020820190508181036000830152614a0e816149d2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614a4f82613e3c565b9150614a5a83613e3c565b9250828201905080821115614a7257614a716147ec565b5b92915050565b7f486f6c6465727320616e6420616d6f756e7473206d757374206265207468652060008201527f73616d6520636f756e7400000000000000000000000000000000000000000000602082015250565b6000614ad4602a83613d23565b9150614adf82614a78565b604082019050919050565b60006020820190508181036000830152614b0381614ac7565b9050919050565b6000614b1582613e3c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614b4757614b466147ec565b5b600182019050919050565b7f436c61696d57616974206d757374206265207570646174656420746f2062657460008201527f7765656e203120616e6420323420686f75727300000000000000000000000000602082015250565b6000614bae603383613d23565b9150614bb982614b52565b604082019050919050565b60006020820190508181036000830152614bdd81614ba1565b9050919050565b7f43616e6e6f742075706461746520636c61696d5761697420746f2073616d652060008201527f76616c7565000000000000000000000000000000000000000000000000000000602082015250565b6000614c40602583613d23565b9150614c4b82614be4565b604082019050919050565b60006020820190508181036000830152614c6f81614c33565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614cd2602683613d23565b9150614cdd82614c76565b604082019050919050565b60006020820190508181036000830152614d0181614cc5565b9050919050565b614d11816146ad565b8114614d1c57600080fd5b50565b600081519050614d2e81614d08565b92915050565b600060208284031215614d4a57614d49613dd4565b5b6000614d5884828501614d1f565b91505092915050565b600081519050614d7081613e10565b92915050565b600060208284031215614d8c57614d8b613dd4565b5b6000614d9a84828501614d61565b91505092915050565b6000819050919050565b6000614dc8614dc3614dbe84614da3565b614596565b613e3c565b9050919050565b614dd881614dad565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614e1381613dfe565b82525050565b6000614e258383614e0a565b60208301905092915050565b6000602082019050919050565b6000614e4982614dde565b614e538185614de9565b9350614e5e83614dfa565b8060005b83811015614e8f578151614e768882614e19565b9750614e8183614e31565b925050600181019050614e62565b5085935050505092915050565b6000608082019050614eb16000830187614dcf565b8181036020830152614ec38186614e3e565b9050614ed2604083018561456c565b614edf6060830184613ee8565b95945050505050565b6000614ef382613e3c565b9150614efe83613e3c565b9250828202614f0c81613e3c565b91508282048414831517614f2357614f226147ec565b5b5092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f86602183613d23565b9150614f9182614f2a565b604082019050919050565b60006020820190508181036000830152614fb581614f79565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614ff2601b83613d23565b9150614ffd82614fbc565b602082019050919050565b6000602082019050818103600083015261502181614fe5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615084602483613d23565b915061508f82615028565b604082019050919050565b600060208201905081810360008301526150b381615077565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000615116602283613d23565b9150615121826150ba565b604082019050919050565b6000602082019050818103600083015261514581615109565b9050919050565b6000615157826146ad565b9150615162836146ad565b92508282019050828112156000831216838212600084121516171561518a576151896147ec565b5b92915050565b600061519b826145c2565b9050919050565b6151ab81615190565b82525050565b60006040820190506151c660008301856151a2565b6151d36020830184613ee8565b9392505050565b60006151e582613e3c565b91506151f083613e3c565b9250828203905081811115615208576152076147ec565b5b92915050565b6000615219826146ad565b9150615224836146ad565b925082820390508181126000841216828213600085121516171561524b5761524a6147ec565b5b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000615287601f83613d23565b915061529282615251565b602082019050919050565b600060208201905081810360008301526152b68161527a565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615319602183613d23565b9150615324826152bd565b604082019050919050565b600060208201905081810360008301526153488161530c565b905091905056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203bef1b0569ae5c990c80af5fe5db0507c4b4c477e5513cceebf9c751018c33d564736f6c63430008130033
Deployed Bytecode Sourcemap
24895:16502:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32956:21;:19;:21::i;:::-;24895:16502;;;;;33330:631;;;:::i;:::-;;27439:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29905:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36310:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28089:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41208:184;;;;;;;;;;;;;:::i;:::-;;27716:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26035:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29562:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35556:247;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25995:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27625:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33127:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30082:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30930:741;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26976:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;31679:227;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27959:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26929:40;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;34495:106;;;;;;;;;;;;;:::i;:::-;;26091:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27824:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7060:148;;;;;;;;;;;;;:::i;:::-;;39854:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40271:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25645:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39699:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6846:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35117:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27530:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26459:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30308:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35247:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29392:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35421:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32993:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28239:1145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;29754:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40973:151;;;;;;;;;;;;;:::i;:::-;;36193:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35813:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7216:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36433:1270;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;33969:516;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38408:1283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;33330:631;33411:1;33395:13;:11;:13::i;:::-;:17;33387:26;;;;;;33424:22;33449:12;;;;;;;;;;;:22;;;33480:4;33449:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33424:62;;33497:28;33515:9;33497:17;:28::i;:::-;33536:18;33557:57;33599:14;33557:12;;;;;;;;;;;:22;;;33588:4;33557:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;:57;;;;:::i;:::-;33536:78;;33642:1;33629:10;:14;33625:329;;;33688:106;33766:13;:11;:13::i;:::-;33736:27;25098:8;33737:10;33736:16;;:27;;;;:::i;:::-;:43;;;;:::i;:::-;33688:25;;:29;;:106;;;;:::i;:::-;33660:25;:134;;;;33835:10;33814:44;;;33847:10;33814:44;;;;;;:::i;:::-;;;;;;;;33901:41;33931:10;33901:25;;:29;;:41;;;;:::i;:::-;33873:25;:69;;;;33625:329;33376:585;;33330:631::o;27439:83::-;27476:13;27509:5;27502:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27439:83;:::o;29905:169::-;29988:4;30005:39;30014:12;:10;:12::i;:::-;30028:7;30037:6;30005:8;:39::i;:::-;30062:4;30055:11;;29905:169;;;;:::o;36310:115::-;36368:7;36395:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36388:29;;36310:115;:::o;28089:142::-;6983:12;:10;:12::i;:::-;6973:22;;:6;;;;;;;;;;:22;;;6965:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28209:14:::1;28190:16;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28089:142:::0;:::o;41208:184::-;6983:12;:10;:12::i;:::-;6973:22;;:6;;;;;;;;;;:22;;;6965:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;41265:22:::1;41290:12;;;;;;;;;;;:22;;;41321:4;41290:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41265:62;;41338:12;;;;;;;;;;;:21;;;41360:7;:5;:7::i;:::-;41369:14;41338:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41254:138;41208:184::o:0;27716:100::-;27769:7;27796:12;;27789:19;;27716:100;:::o;26035:49::-;;;;;;;;;;;;;;;;;:::o;29562:184::-;29641:4;29666:5;29658:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29734:4;29727:11;;29562:184;;;;;:::o;35556:247::-;35625:7;25098:8;35652:131;:115;35730:28;:36;35759:6;35730:36;;;;;;;;;;;;;;;;35652:63;:48;35682:17;35692:6;35682:9;:17::i;:::-;35652:25;;:29;;:48;;;;:::i;:::-;:61;:63::i;:::-;:77;;:115;;;;:::i;:::-;:129;:131::i;:::-;:143;;;;:::i;:::-;35645:150;;35556:247;;;:::o;25995:33::-;;;;:::o;27625:83::-;27666:5;27691:9;;;;;;;;;;;27684:16;;27625:83;:::o;33127:195::-;6983:12;:10;:12::i;:::-;6973:22;;:6;;;;;;;;;;:22;;;6965:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;33204:23:::1;33216:7;33225:1;33204:11;:23::i;:::-;33238:15;;;;;;;;;;;:22;;;33261:7;33238:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33306:7;33285:29;;;;;;;;;;;;33127:195:::0;:::o;30082:218::-;30170:4;30187:83;30196:12;:10;:12::i;:::-;30210:7;30219:50;30258:10;30219:11;:25;30231:12;:10;:12::i;:::-;30219:25;;;;;;;;;;;;;;;:34;30245:7;30219:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;30187:8;:83::i;:::-;30288:4;30281:11;;30082:218;;;;:::o;30930:741::-;30990:15;31008:7;;;;;;;;;;;:24;;;31033:7;31008:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30990:51;;31057:7;;;;;;;;;;;:29;;;31087:7;31057:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31052:563;;31113:14;31132:19;31143:7;31132:10;:19::i;:::-;31112:39;;;31182:1;31170:9;:13;31166:270;;;31204:31;31216:7;31225:9;31204:11;:31::i;:::-;31254:15;;;;;;;;;;;:19;;;31274:7;31283:9;31254:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31166:270;;;31347:23;31359:7;31368:1;31347:11;:23::i;:::-;31389:15;;;;;;;;;;;:22;;;31412:7;31389:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31166:270;31097:350;31052:563;;;31493:1;31472:18;31482:7;31472:9;:18::i;:::-;:22;31468:136;;;31515:23;31527:7;31536:1;31515:11;:23::i;:::-;31557:15;;;;;;;;;;;:22;;;31580:7;31557:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31468:136;31052:563;31625:38;31648:7;31658:4;31625:14;:38::i;:::-;;30979:692;30930:741;:::o;26976:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31679:227::-;31755:13;31783:116;31798:8;:15;31790:5;:23;31783:116;;;31830:32;31846:8;31855:5;31846:15;;;;;;;;:::i;:::-;;;;;;;;31830;:32::i;:::-;31886:1;31877:10;;;;;:::i;:::-;;;31783:116;;;31744:162;31679:227;:::o;27959:122::-;6983:12;:10;:12::i;:::-;6973:22;;:6;;;;;;;;;;:22;;;6965:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;28060:11:::1;28047:10;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27959:122:::0;:::o;26929:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34495:106::-;34549:44;34581:10;34549:23;:44::i;:::-;;34495:106::o;26091:31::-;;;;:::o;27824:127::-;27898:7;27925:9;:18;27935:7;27925:18;;;;;;;;;;;;;;;;27918:25;;27824:127;;;:::o;7060:148::-;6983:12;:10;:12::i;:::-;6973:22;;:6;;;;;;;;;;:22;;;6965:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;7167:1:::1;7130:40;;7151:6;::::0;::::1;;;;;;;;7130:40;;;;;;;;;;;;7198:1;7181:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;7060:148::o:0;39854:411::-;6983:12;:10;:12::i;:::-;6973:22;;:6;;;;;;;;;;:22;;;6965:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;39990:7:::1;;:14;;39972:7;;:14;;:32;39964:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;40066:9;40062:196;40083:7;;:14;;40079:1;:18;40062:196;;;40119:10;40132:7;;40140:1;40132:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;40119:23;;40157:21;40181:7;;40189:1;40181:10;;;;;;;:::i;:::-;;;;;;;;40157:34;;40206:12;;;;;;;;;;;:21;;;40228:2;40232:13;40206:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40104:154;;40099:3;;;;;:::i;:::-;;;;40062:196;;;;39854:411:::0;;;;:::o;40271:128::-;40339:7;40366:16;:25;40383:7;40366:25;;;;;;;;;;;;;;;;40359:32;;40271:128;;;:::o;25645:40::-;;;;:::o;39699:147::-;6983:12;:10;:12::i;:::-;6973:22;;:6;;;;;;;;;;:22;;;6965:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;39804:34:::1;39819:7;39828:9;39804:14;:34::i;:::-;;39699:147:::0;;:::o;6846:79::-;6884:7;6911:6;;;;;;;;;;;6904:13;;6846:79;:::o;35117:122::-;35174:7;35201:30;35224:6;35201:22;:30::i;:::-;35194:37;;35117:122;;;:::o;27530:87::-;27569:13;27602:7;27595:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27530:87;:::o;26459:79::-;;;;;;;;;;;;;:::o;30308:269::-;30401:4;30418:129;30427:12;:10;:12::i;:::-;30441:7;30450:96;30489:15;30450:96;;;;;;;;;;;;;;;;;:11;:25;30462:12;:10;:12::i;:::-;30450:25;;;;;;;;;;;;;;;:34;30476:7;30450:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;30418:8;:129::i;:::-;30565:4;30558:11;;30308:269;;;;:::o;35247:166::-;35316:7;35343:62;35378:18;:26;35397:6;35378:26;;;;;;;;;;;;;;;;35343:30;35366:6;35343:22;:30::i;:::-;:34;;:62;;;;:::i;:::-;35336:69;;35247:166;;;:::o;29392:162::-;29449:4;29474:5;29466:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29542:4;29535:11;;29392:162;;;;:::o;35421:127::-;35487:7;35514:18;:26;35533:6;35514:26;;;;;;;;;;;;;;;;35507:33;;35421:127;;;:::o;32993:126::-;6983:12;:10;:12::i;:::-;6973:22;;:6;;;;;;;;;;:22;;;6965:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;33097:12:::1;33071:7;;:40;;;;;;;;;;;;;;;;;;32993:126:::0;:::o;28239:1145::-;28296:4;28302:13;28328:14;28357:18;:35;;;;;;;;;;;;;;;;;;;28416:16;:22;;;28406:6;:32;28403:122;;28467:8;28455:20;;28490:23;;;;;;;;;;;;;;;;;;;28403:122;28549:16;:22;;;28539:6;:32;28536:129;;28600:9;28588:21;;28624:29;;;;;;;;;;;;;;;;;;;28536:129;28689:16;:22;;;28679:6;:32;28676:127;;28740:8;28728:20;;28763:28;;;;;;;;;;;;;;;;;;;28676:127;28827:16;:22;;;28817:6;:32;28814:124;;28878:7;28866:19;;28900:26;;;;;;;;;;;;;;;;;;;28814:124;28962:16;:22;;;28952:6;:32;28949:120;;29013:7;29001:19;;29035:22;;;;;;;;;;;;;;;;;;;28949:120;29093:16;:22;;;29083:6;:32;29080:126;;29144:7;29132:19;;29166:28;;;;;;;;;;;;;;;;;;;29080:126;29230:16;:22;;;29220:6;:32;29217:124;;29281:7;29269:19;;29303:26;;;;;;;;;;;;;;;;;;;29217:124;29360:9;29371:4;29352:24;;;;;;28239:1145;;;:::o;29754:143::-;29835:7;29862:11;:18;29874:5;29862:18;;;;;;;;;;;;;;;:27;29881:7;29862:27;;;;;;;;;;;;;;;;29855:34;;29754:143;;;;:::o;40973:151::-;6983:12;:10;:12::i;:::-;6973:22;;:6;;;;;;;;;;:22;;;6965:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;41026:18:::1;41047:21;41026:42;;41087:7;:5;:7::i;:::-;41079:25;;:37;41105:10;41079:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;41015:109;40973:151::o:0;36193:109::-;36249:7;36276:18;;36269:25;;36193:109;:::o;35813:372::-;6983:12;:10;:12::i;:::-;6973:22;;:6;;;;;;;;;;:22;;;6965:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35914:4:::1;35898:12;:20;;:45;;;;;35938:5;35922:12;:21;;35898:45;35890:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;36034:9;;36018:12;:25:::0;36010:75:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;36132:9;;36118:12;36101:41;;;;;;;;;;36165:12;36153:9;:24;;;;35813:372:::0;:::o;7216:244::-;6983:12;:10;:12::i;:::-;6973:22;;:6;;;;;;;;;;:22;;;6965:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;7325:1:::1;7305:22;;:8;:22;;::::0;7297:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;7415:8;7386:38;;7407:6;::::0;::::1;;;;;;;;7386:38;;;;;;;;;;;;7444:8;7435:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;7216:244:::0;:::o;36433:1270::-;36492:15;36509:12;36523:31;36565:29;36596:22;36620:21;36652;36675:38;36736:8;36726:18;;36763:15;;;;;;;;;;;:29;;;36793:7;36763:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36755:46;;36839:3;36812:30;;36866:1;36857:5;:10;36853:473;;36905:18;;36896:5;36888:35;36884:431;;;36971:37;36988:18;;36971:5;:9;;:37;;;;:::i;:::-;36944:64;;36884:431;;;37062:32;37122:18;;37097:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;:113;;37209:1;37097:113;;;37160:46;37187:18;;37160:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:26;;:46;;;;:::i;:::-;37097:113;37062:148;;37256:43;37273:24;37256:5;:9;;:43;;;;:::i;:::-;37229:70;;37043:272;36884:431;36853:473;37360:31;37383:7;37360:22;:31::i;:::-;37336:55;;37419:31;37442:7;37419:22;:31::i;:::-;37402:48;;37477:14;:23;37492:7;37477:23;;;;;;;;;;;;;;;;37461:39;;37543:1;37527:13;:17;:52;;37578:1;37527:52;;;37547:28;37565:9;;37547:13;:17;;:28;;;;:::i;:::-;37527:52;37511:68;;37639:15;37623:13;:31;:72;;37694:1;37623:72;;;37657:34;37675:15;37657:13;:17;;:34;;;;:::i;:::-;37623:72;37590:105;;36433:1270;;;;;;;;;:::o;33969:516::-;34091:21;34129:1;34115:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34091:40;;34152:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34142:4;34147:1;34142:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;34203:12;;;;;;;;;;;34185:4;34190:1;34185:7;;;;;;;;:::i;:::-;;;;;;;:31;;;;;;;;;;;34255:15;;;;;;;;;;;:66;;;34330:9;34355:1;34404:4;34431;34451:15;34255:222;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34022:463;33969:516;:::o;38408:1283::-;38454:7;38463;38472;38492:28;38523:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38492:53;;38586:1;38562:20;:25;38558:91;;38612:1;38615;38618:18;;38604:33;;;;;;;;;38558:91;38659:27;38689:18;;38659:48;;38718:15;38748;38766:9;38748:27;;38786:18;38819:14;38848:727;38865:3;38855:7;:13;:50;;;;;38885:20;38872:10;:33;38855:50;38848:727;;;38922:21;;;;;:::i;:::-;;;;38985:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38962:19;:45;38958:109;;39050:1;39028:23;;38958:109;39081:15;39099;;;;;;;;;;;:29;;;39129:19;39099:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39081:68;;39168:37;39181:14;:23;39196:7;39181:23;;;;;;;;;;;;;;;;39168:12;:37::i;:::-;39164:172;;;39230:38;39253:7;39263:4;39230:14;:38::i;:::-;39226:95;;;39293:8;;;;;:::i;:::-;;;;39226:95;39164:172;39350:12;;;;;:::i;:::-;;;;39377:18;39398:9;39377:30;;39436:10;39426:7;:20;39422:107;;;39477:36;39489:23;39501:10;39489:7;:11;;:23;;;;:::i;:::-;39477:7;:11;;:36;;;;:::i;:::-;39467:46;;39422:107;39553:10;39543:20;;38907:668;;38848:727;;;39606:19;39585:18;:40;;;;39644:10;39656:6;39664:18;;39636:47;;;;;;;;;;;;38408:1283;;;;;;:::o;2630:136::-;2688:7;2715:43;2719:1;2722;2715:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;2708:50;;2630:136;;;;:::o;2974:250::-;3032:7;3061:1;3056;:6;3052:47;;3086:1;3079:8;;;;3052:47;3111:9;3127:1;3123;:5;;;;:::i;:::-;3111:17;;3156:1;3151;3147;:5;;;;:::i;:::-;:10;3139:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;3215:1;3208:8;;;2974:250;;;;;:::o;2441:181::-;2499:7;2519:9;2535:1;2531;:5;;;;:::i;:::-;2519:17;;2560:1;2555;:6;;2547:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2613:1;2606:8;;;2441:181;;;;:::o;3915:98::-;3968:7;3995:10;3988:17;;3915:98;:::o;30585:337::-;30695:1;30678:19;;:5;:19;;;30670:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30776:1;30757:21;;:7;:21;;;30749:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30860:6;30830:11;:18;30842:5;30830:18;;;;;;;;;;;;;;;:27;30849:7;30830:27;;;;;;;;;;;;;;;:36;;;;30898:7;30882:32;;30891:5;30882:32;;;30907:6;30882:32;;;;;;:::i;:::-;;;;;;;;30585:337;;;:::o;2260:148::-;2316:6;2335:8;2353:1;2335:20;;2379:1;2374;:6;;2366:15;;;;;;2399:1;2392:8;;;2260:148;;;:::o;1776:176::-;1832:6;1851:8;1866:1;1862;:5;;;;:::i;:::-;1851:16;;1892:1;1887;:6;;:16;;;;;1902:1;1897;:6;;1887:16;1886:38;;;;1913:1;1909;:5;:14;;;;;1922:1;1918;:5;1909:14;1886:38;1878:47;;;;;;1943:1;1936:8;;;1776:176;;;;:::o;2098:127::-;2154:7;2187:1;2182;:6;;2174:15;;;;;;2215:1;2200:17;;2098:127;;;:::o;37951:449::-;38029:22;38054:18;38064:7;38054:9;:18::i;:::-;38029:43;;38100:14;38087:10;:27;38083:310;;;38131:18;38152:30;38167:14;38152:10;:14;;:30;;;;:::i;:::-;38131:51;;38197:26;38203:7;38212:10;38197:5;:26::i;:::-;38116:119;38083:310;;;38258:14;38245:10;:27;38241:152;;;38289:18;38310:30;38329:10;38310:14;:18;;:30;;;;:::i;:::-;38289:51;;38355:26;38361:7;38370:10;38355:5;:26::i;:::-;38274:119;38241:152;38083:310;38018:382;37951:449;;:::o;40407:482::-;40489:4;40506:14;40523:32;40547:7;40523:23;:32::i;:::-;40506:49;;40579:1;40570:6;:10;40566:293;;;40597:20;40620:16;:25;40637:7;40620:25;;;;;;;;;;;;;;;;40597:48;;40688:24;40699:12;40688:6;:10;;:24;;;;:::i;:::-;40660:16;:25;40677:7;40660:25;;;;;;;;;;;;;;;:52;;;;40753:15;40727:14;:23;40742:7;40727:23;;;;;;;;;;;;;;;:41;;;;40811:9;40788:33;;40794:7;40788:33;;;40803:6;40788:33;;;;;;:::i;:::-;;;;;;;;40843:4;40836:11;;;;;;40566:293;40876:5;40869:12;;;40407:482;;;;;:::o;34609:500::-;34682:7;34702:29;34734:28;34757:4;34734:22;:28::i;:::-;34702:60;;34801:1;34777:21;:25;34773:310;;;34846:51;34875:21;34846:18;:24;34865:4;34846:24;;;;;;;;;;;;;;;;:28;;:51;;;;:::i;:::-;34819:18;:24;34838:4;34819:24;;;;;;;;;;;;;;;:78;;;;34935:4;34917:46;;;34941:21;34917:46;;;;;;:::i;:::-;;;;;;;;34978:12;;;;;;;;;;;:21;;;35000:4;35006:21;34978:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35050:21;35043:28;;;;;34773:310;35100:1;35093:8;;;34609:500;;;;:::o;2774:192::-;2860:7;2893:1;2888;:6;;2896:12;2880:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;2920:9;2936:1;2932;:5;;;;:::i;:::-;2920:17;;2957:1;2950:8;;;2774:192;;;;;:::o;1592:176::-;1648:6;1667:8;1682:1;1678;:5;;;;:::i;:::-;1667:16;;1708:1;1703;:6;;:16;;;;;1718:1;1713;:6;;1703:16;1702:38;;;;1729:1;1725;:5;:14;;;;;1738:1;1734;:5;1725:14;1702:38;1694:47;;;;;;1759:1;1752:8;;;1592:176;;;;:::o;37711:232::-;37778:4;37815:15;37799:13;:31;37795:76;;;37854:5;37847:12;;;;37795:76;37926:9;;37888:34;37908:13;37888:15;:19;;:34;;;;:::i;:::-;:47;;37881:54;;37711:232;;;;:::o;31914:472::-;32017:1;31998:21;;:7;:21;;;31990:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32081:24;32098:6;32081:12;;:16;;:24;;;;:::i;:::-;32066:12;:39;;;;32137:30;32160:6;32137:9;:18;32147:7;32137:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;32116:9;:18;32126:7;32116:18;;;;;;;;;;;;;;;:51;;;;32204:7;32183:37;;32200:1;32183:37;;;32213:6;32183:37;;;;;;:::i;:::-;;;;;;;;32271:107;32323:54;32324:37;32354:6;32324:25;;:29;;:37;;;;:::i;:::-;32323:52;:54::i;:::-;32271:28;:37;32300:7;32271:37;;;;;;;;;;;;;;;;:51;;:107;;;;:::i;:::-;32231:28;:37;32260:7;32231:37;;;;;;;;;;;;;;;:147;;;;31914:472;;:::o;32394:516::-;32497:1;32478:21;;:7;:21;;;32470:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;32571:68;32594:6;32571:68;;;;;;;;;;;;;;;;;:9;:18;32581:7;32571:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;32550:9;:18;32560:7;32550:18;;;;;;;;;;;;;;;:89;;;;32665:24;32682:6;32665:12;;:16;;:24;;;;:::i;:::-;32650:12;:39;;;;32731:1;32705:37;;32714:7;32705:37;;;32735:6;32705:37;;;;;;:::i;:::-;;;;;;;;32795:107;32847:54;32848:37;32878:6;32848:25;;:29;;:37;;;;:::i;:::-;32847:52;:54::i;:::-;32795:28;:37;32824:7;32795:37;;;;;;;;;;;;;;;;:51;;:107;;;;:::i;:::-;32755:28;:37;32784:7;32755:37;;;;;;;;;;;;;;;:147;;;;32394:516;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:117::-;3907:1;3904;3897:12;3921:180;3969:77;3966:1;3959:88;4066:4;4063:1;4056:15;4090:4;4087:1;4080:15;4107:281;4190:27;4212:4;4190:27;:::i;:::-;4182:6;4178:40;4320:6;4308:10;4305:22;4284:18;4272:10;4269:34;4266:62;4263:88;;;4331:18;;:::i;:::-;4263:88;4371:10;4367:2;4360:22;4150:238;4107:281;;:::o;4394:129::-;4428:6;4455:20;;:::i;:::-;4445:30;;4484:33;4512:4;4504:6;4484:33;:::i;:::-;4394:129;;;:::o;4699:1398::-;4782:5;4826:4;4814:9;4809:3;4805:19;4801:30;4798:117;;;4834:79;;:::i;:::-;4798:117;4933:21;4949:4;4933:21;:::i;:::-;4924:30;;5014:1;5054:49;5099:3;5090:6;5079:9;5075:22;5054:49;:::i;:::-;5047:4;5040:5;5036:16;5029:75;4964:151;5175:2;5216:49;5261:3;5252:6;5241:9;5237:22;5216:49;:::i;:::-;5209:4;5202:5;5198:16;5191:75;5125:152;5337:2;5378:49;5423:3;5414:6;5403:9;5399:22;5378:49;:::i;:::-;5371:4;5364:5;5360:16;5353:75;5287:152;5499:2;5540:49;5585:3;5576:6;5565:9;5561:22;5540:49;:::i;:::-;5533:4;5526:5;5522:16;5515:75;5449:152;5661:3;5703:49;5748:3;5739:6;5728:9;5724:22;5703:49;:::i;:::-;5696:4;5689:5;5685:16;5678:75;5611:153;5824:3;5866:49;5911:3;5902:6;5891:9;5887:22;5866:49;:::i;:::-;5859:4;5852:5;5848:16;5841:75;5774:153;5987:3;6029:49;6074:3;6065:6;6054:9;6050:22;6029:49;:::i;:::-;6022:4;6015:5;6011:16;6004:75;5937:153;4699:1398;;;;:::o;6103:398::-;6196:6;6245:3;6233:9;6224:7;6220:23;6216:33;6213:120;;;6252:79;;:::i;:::-;6213:120;6372:1;6397:87;6476:7;6467:6;6456:9;6452:22;6397:87;:::i;:::-;6387:97;;6343:151;6103:398;;;;:::o;6507:329::-;6566:6;6615:2;6603:9;6594:7;6590:23;6586:32;6583:119;;;6621:79;;:::i;:::-;6583:119;6741:1;6766:53;6811:7;6802:6;6791:9;6787:22;6766:53;:::i;:::-;6756:63;;6712:117;6507:329;;;;:::o;6842:619::-;6919:6;6927;6935;6984:2;6972:9;6963:7;6959:23;6955:32;6952:119;;;6990:79;;:::i;:::-;6952:119;7110:1;7135:53;7180:7;7171:6;7160:9;7156:22;7135:53;:::i;:::-;7125:63;;7081:117;7237:2;7263:53;7308:7;7299:6;7288:9;7284:22;7263:53;:::i;:::-;7253:63;;7208:118;7365:2;7391:53;7436:7;7427:6;7416:9;7412:22;7391:53;:::i;:::-;7381:63;;7336:118;6842:619;;;;;:::o;7467:86::-;7502:7;7542:4;7535:5;7531:16;7520:27;;7467:86;;;:::o;7559:112::-;7642:22;7658:5;7642:22;:::i;:::-;7637:3;7630:35;7559:112;;:::o;7677:214::-;7766:4;7804:2;7793:9;7789:18;7781:26;;7817:67;7881:1;7870:9;7866:17;7857:6;7817:67;:::i;:::-;7677:214;;;;:::o;7897:886::-;8158:4;8196:3;8185:9;8181:19;8173:27;;8210:71;8278:1;8267:9;8263:17;8254:6;8210:71;:::i;:::-;8291:72;8359:2;8348:9;8344:18;8335:6;8291:72;:::i;:::-;8373;8441:2;8430:9;8426:18;8417:6;8373:72;:::i;:::-;8455;8523:2;8512:9;8508:18;8499:6;8455:72;:::i;:::-;8537:73;8605:3;8594:9;8590:19;8581:6;8537:73;:::i;:::-;8620;8688:3;8677:9;8673:19;8664:6;8620:73;:::i;:::-;8703;8771:3;8760:9;8756:19;8747:6;8703:73;:::i;:::-;7897:886;;;;;;;;;;:::o;8789:117::-;8898:1;8895;8888:12;8912:311;8989:4;9079:18;9071:6;9068:30;9065:56;;;9101:18;;:::i;:::-;9065:56;9151:4;9143:6;9139:17;9131:25;;9211:4;9205;9201:15;9193:23;;8912:311;;;:::o;9229:117::-;9338:1;9335;9328:12;9369:710;9465:5;9490:81;9506:64;9563:6;9506:64;:::i;:::-;9490:81;:::i;:::-;9481:90;;9591:5;9620:6;9613:5;9606:21;9654:4;9647:5;9643:16;9636:23;;9707:4;9699:6;9695:17;9687:6;9683:30;9736:3;9728:6;9725:15;9722:122;;;9755:79;;:::i;:::-;9722:122;9870:6;9853:220;9887:6;9882:3;9879:15;9853:220;;;9962:3;9991:37;10024:3;10012:10;9991:37;:::i;:::-;9986:3;9979:50;10058:4;10053:3;10049:14;10042:21;;9929:144;9913:4;9908:3;9904:14;9897:21;;9853:220;;;9857:21;9471:608;;9369:710;;;;;:::o;10102:370::-;10173:5;10222:3;10215:4;10207:6;10203:17;10199:27;10189:122;;10230:79;;:::i;:::-;10189:122;10347:6;10334:20;10372:94;10462:3;10454:6;10447:4;10439:6;10435:17;10372:94;:::i;:::-;10363:103;;10179:293;10102:370;;;;:::o;10478:539::-;10562:6;10611:2;10599:9;10590:7;10586:23;10582:32;10579:119;;;10617:79;;:::i;:::-;10579:119;10765:1;10754:9;10750:17;10737:31;10795:18;10787:6;10784:30;10781:117;;;10817:79;;:::i;:::-;10781:117;10922:78;10992:7;10983:6;10972:9;10968:22;10922:78;:::i;:::-;10912:88;;10708:302;10478:539;;;;:::o;11064:1399::-;11141:5;11185:4;11173:9;11168:3;11164:19;11160:30;11157:117;;;11193:79;;:::i;:::-;11157:117;11292:21;11308:4;11292:21;:::i;:::-;11283:30;;11374:1;11414:49;11459:3;11450:6;11439:9;11435:22;11414:49;:::i;:::-;11407:4;11400:5;11396:16;11389:75;11323:152;11536:2;11577:49;11622:3;11613:6;11602:9;11598:22;11577:49;:::i;:::-;11570:4;11563:5;11559:16;11552:75;11485:153;11699:2;11740:49;11785:3;11776:6;11765:9;11761:22;11740:49;:::i;:::-;11733:4;11726:5;11722:16;11715:75;11648:153;11862:2;11903:49;11948:3;11939:6;11928:9;11924:22;11903:49;:::i;:::-;11896:4;11889:5;11885:16;11878:75;11811:153;12025:3;12067:49;12112:3;12103:6;12092:9;12088:22;12067:49;:::i;:::-;12060:4;12053:5;12049:16;12042:75;11974:154;12189:3;12231:49;12276:3;12267:6;12256:9;12252:22;12231:49;:::i;:::-;12224:4;12217:5;12213:16;12206:75;12138:154;12353:3;12395:49;12440:3;12431:6;12420:9;12416:22;12395:49;:::i;:::-;12388:4;12381:5;12377:16;12370:75;12302:154;11064:1399;;;;:::o;12469:386::-;12556:6;12605:3;12593:9;12584:7;12580:23;12576:33;12573:120;;;12612:79;;:::i;:::-;12573:120;12732:1;12757:81;12830:7;12821:6;12810:9;12806:22;12757:81;:::i;:::-;12747:91;;12703:145;12469:386;;;;:::o;12861:117::-;12970:1;12967;12960:12;13001:568;13074:8;13084:6;13134:3;13127:4;13119:6;13115:17;13111:27;13101:122;;13142:79;;:::i;:::-;13101:122;13255:6;13242:20;13232:30;;13285:18;13277:6;13274:30;13271:117;;;13307:79;;:::i;:::-;13271:117;13421:4;13413:6;13409:17;13397:29;;13475:3;13467:4;13459:6;13455:17;13445:8;13441:32;13438:41;13435:128;;;13482:79;;:::i;:::-;13435:128;13001:568;;;;;:::o;13592:::-;13665:8;13675:6;13725:3;13718:4;13710:6;13706:17;13702:27;13692:122;;13733:79;;:::i;:::-;13692:122;13846:6;13833:20;13823:30;;13876:18;13868:6;13865:30;13862:117;;;13898:79;;:::i;:::-;13862:117;14012:4;14004:6;14000:17;13988:29;;14066:3;14058:4;14050:6;14046:17;14036:8;14032:32;14029:41;14026:128;;;14073:79;;:::i;:::-;14026:128;13592:568;;;;;:::o;14166:934::-;14288:6;14296;14304;14312;14361:2;14349:9;14340:7;14336:23;14332:32;14329:119;;;14367:79;;:::i;:::-;14329:119;14515:1;14504:9;14500:17;14487:31;14545:18;14537:6;14534:30;14531:117;;;14567:79;;:::i;:::-;14531:117;14680:80;14752:7;14743:6;14732:9;14728:22;14680:80;:::i;:::-;14662:98;;;;14458:312;14837:2;14826:9;14822:18;14809:32;14868:18;14860:6;14857:30;14854:117;;;14890:79;;:::i;:::-;14854:117;15003:80;15075:7;15066:6;15055:9;15051:22;15003:80;:::i;:::-;14985:98;;;;14780:313;14166:934;;;;;;;:::o;15106:104::-;15151:7;15180:24;15198:5;15180:24;:::i;:::-;15169:35;;15106:104;;;:::o;15216:138::-;15297:32;15323:5;15297:32;:::i;:::-;15290:5;15287:43;15277:71;;15344:1;15341;15334:12;15277:71;15216:138;:::o;15360:155::-;15414:5;15452:6;15439:20;15430:29;;15468:41;15503:5;15468:41;:::i;:::-;15360:155;;;;:::o;15521:116::-;15591:21;15606:5;15591:21;:::i;:::-;15584:5;15581:32;15571:60;;15627:1;15624;15617:12;15571:60;15521:116;:::o;15643:133::-;15686:5;15724:6;15711:20;15702:29;;15740:30;15764:5;15740:30;:::i;:::-;15643:133;;;;:::o;15782:484::-;15855:6;15863;15912:2;15900:9;15891:7;15887:23;15883:32;15880:119;;;15918:79;;:::i;:::-;15880:119;16038:1;16063:61;16116:7;16107:6;16096:9;16092:22;16063:61;:::i;:::-;16053:71;;16009:125;16173:2;16199:50;16241:7;16232:6;16221:9;16217:22;16199:50;:::i;:::-;16189:60;;16144:115;15782:484;;;;;:::o;16272:118::-;16359:24;16377:5;16359:24;:::i;:::-;16354:3;16347:37;16272:118;;:::o;16396:222::-;16489:4;16527:2;16516:9;16512:18;16504:26;;16540:71;16608:1;16597:9;16593:17;16584:6;16540:71;:::i;:::-;16396:222;;;;:::o;16624:60::-;16652:3;16673:5;16666:12;;16624:60;;;:::o;16690:142::-;16740:9;16773:53;16791:34;16800:24;16818:5;16800:24;:::i;:::-;16791:34;:::i;:::-;16773:53;:::i;:::-;16760:66;;16690:142;;;:::o;16838:126::-;16888:9;16921:37;16952:5;16921:37;:::i;:::-;16908:50;;16838:126;;;:::o;16970:139::-;17033:9;17066:37;17097:5;17066:37;:::i;:::-;17053:50;;16970:139;;;:::o;17115:157::-;17215:50;17259:5;17215:50;:::i;:::-;17210:3;17203:63;17115:157;;:::o;17278:248::-;17384:4;17422:2;17411:9;17407:18;17399:26;;17435:84;17516:1;17505:9;17501:17;17492:6;17435:84;:::i;:::-;17278:248;;;;:::o;17532:329::-;17591:6;17640:2;17628:9;17619:7;17615:23;17611:32;17608:119;;;17646:79;;:::i;:::-;17608:119;17766:1;17791:53;17836:7;17827:6;17816:9;17812:22;17791:53;:::i;:::-;17781:63;;17737:117;17532:329;;;;:::o;17867:423::-;18008:4;18046:2;18035:9;18031:18;18023:26;;18059:71;18127:1;18116:9;18112:17;18103:6;18059:71;:::i;:::-;18177:9;18171:4;18167:20;18162:2;18151:9;18147:18;18140:48;18205:78;18278:4;18269:6;18205:78;:::i;:::-;18197:86;;17867:423;;;;;:::o;18296:474::-;18364:6;18372;18421:2;18409:9;18400:7;18396:23;18392:32;18389:119;;;18427:79;;:::i;:::-;18389:119;18547:1;18572:53;18617:7;18608:6;18597:9;18593:22;18572:53;:::i;:::-;18562:63;;18518:117;18674:2;18700:53;18745:7;18736:6;18725:9;18721:22;18700:53;:::i;:::-;18690:63;;18645:118;18296:474;;;;;:::o;18776:76::-;18812:7;18841:5;18830:16;;18776:76;;;:::o;18858:115::-;18943:23;18960:5;18943:23;:::i;:::-;18938:3;18931:36;18858:115;;:::o;18979:989::-;19264:4;19302:3;19291:9;19287:19;19279:27;;19316:71;19384:1;19373:9;19369:17;19360:6;19316:71;:::i;:::-;19397:70;19463:2;19452:9;19448:18;19439:6;19397:70;:::i;:::-;19477;19543:2;19532:9;19528:18;19519:6;19477:70;:::i;:::-;19557:72;19625:2;19614:9;19610:18;19601:6;19557:72;:::i;:::-;19639:73;19707:3;19696:9;19692:19;19683:6;19639:73;:::i;:::-;19722;19790:3;19779:9;19775:19;19766:6;19722:73;:::i;:::-;19805;19873:3;19862:9;19858:19;19849:6;19805:73;:::i;:::-;19888;19956:3;19945:9;19941:19;19932:6;19888:73;:::i;:::-;18979:989;;;;;;;;;;;:::o;19974:442::-;20123:4;20161:2;20150:9;20146:18;20138:26;;20174:71;20242:1;20231:9;20227:17;20218:6;20174:71;:::i;:::-;20255:72;20323:2;20312:9;20308:18;20299:6;20255:72;:::i;:::-;20337;20405:2;20394:9;20390:18;20381:6;20337:72;:::i;:::-;19974:442;;;;;;:::o;20422:143::-;20479:5;20510:6;20504:13;20495:22;;20526:33;20553:5;20526:33;:::i;:::-;20422:143;;;;:::o;20571:351::-;20641:6;20690:2;20678:9;20669:7;20665:23;20661:32;20658:119;;;20696:79;;:::i;:::-;20658:119;20816:1;20841:64;20897:7;20888:6;20877:9;20873:22;20841:64;:::i;:::-;20831:74;;20787:128;20571:351;;;;:::o;20928:180::-;20976:77;20973:1;20966:88;21073:4;21070:1;21063:15;21097:4;21094:1;21087:15;21114:180;21162:77;21159:1;21152:88;21259:4;21256:1;21249:15;21283:4;21280:1;21273:15;21300:185;21340:1;21357:20;21375:1;21357:20;:::i;:::-;21352:25;;21391:20;21409:1;21391:20;:::i;:::-;21386:25;;21430:1;21420:35;;21435:18;;:::i;:::-;21420:35;21477:1;21474;21470:9;21465:14;;21300:185;;;;:::o;21491:180::-;21539:77;21536:1;21529:88;21636:4;21633:1;21626:15;21660:4;21657:1;21650:15;21677:320;21721:6;21758:1;21752:4;21748:12;21738:22;;21805:1;21799:4;21795:12;21826:18;21816:81;;21882:4;21874:6;21870:17;21860:27;;21816:81;21944:2;21936:6;21933:14;21913:18;21910:38;21907:84;;21963:18;;:::i;:::-;21907:84;21728:269;21677:320;;;:::o;22003:182::-;22143:34;22139:1;22131:6;22127:14;22120:58;22003:182;:::o;22191:366::-;22333:3;22354:67;22418:2;22413:3;22354:67;:::i;:::-;22347:74;;22430:93;22519:3;22430:93;:::i;:::-;22548:2;22543:3;22539:12;22532:19;;22191:366;;;:::o;22563:419::-;22729:4;22767:2;22756:9;22752:18;22744:26;;22816:9;22810:4;22806:20;22802:1;22791:9;22787:17;22780:47;22844:131;22970:4;22844:131;:::i;:::-;22836:139;;22563:419;;;:::o;22988:332::-;23109:4;23147:2;23136:9;23132:18;23124:26;;23160:71;23228:1;23217:9;23213:17;23204:6;23160:71;:::i;:::-;23241:72;23309:2;23298:9;23294:18;23285:6;23241:72;:::i;:::-;22988:332;;;;;:::o;23326:137::-;23380:5;23411:6;23405:13;23396:22;;23427:30;23451:5;23427:30;:::i;:::-;23326:137;;;;:::o;23469:345::-;23536:6;23585:2;23573:9;23564:7;23560:23;23556:32;23553:119;;;23591:79;;:::i;:::-;23553:119;23711:1;23736:61;23789:7;23780:6;23769:9;23765:22;23736:61;:::i;:::-;23726:71;;23682:125;23469:345;;;;:::o;23820:227::-;23960:34;23956:1;23948:6;23944:14;23937:58;24029:10;24024:2;24016:6;24012:15;24005:35;23820:227;:::o;24053:366::-;24195:3;24216:67;24280:2;24275:3;24216:67;:::i;:::-;24209:74;;24292:93;24381:3;24292:93;:::i;:::-;24410:2;24405:3;24401:12;24394:19;;24053:366;;;:::o;24425:419::-;24591:4;24629:2;24618:9;24614:18;24606:26;;24678:9;24672:4;24668:20;24664:1;24653:9;24649:17;24642:47;24706:131;24832:4;24706:131;:::i;:::-;24698:139;;24425:419;;;:::o;24850:180::-;24898:77;24895:1;24888:88;24995:4;24992:1;24985:15;25019:4;25016:1;25009:15;25036:191;25076:3;25095:20;25113:1;25095:20;:::i;:::-;25090:25;;25129:20;25147:1;25129:20;:::i;:::-;25124:25;;25172:1;25169;25165:9;25158:16;;25193:3;25190:1;25187:10;25184:36;;;25200:18;;:::i;:::-;25184:36;25036:191;;;;:::o;25233:229::-;25373:34;25369:1;25361:6;25357:14;25350:58;25442:12;25437:2;25429:6;25425:15;25418:37;25233:229;:::o;25468:366::-;25610:3;25631:67;25695:2;25690:3;25631:67;:::i;:::-;25624:74;;25707:93;25796:3;25707:93;:::i;:::-;25825:2;25820:3;25816:12;25809:19;;25468:366;;;:::o;25840:419::-;26006:4;26044:2;26033:9;26029:18;26021:26;;26093:9;26087:4;26083:20;26079:1;26068:9;26064:17;26057:47;26121:131;26247:4;26121:131;:::i;:::-;26113:139;;25840:419;;;:::o;26265:233::-;26304:3;26327:24;26345:5;26327:24;:::i;:::-;26318:33;;26373:66;26366:5;26363:77;26360:103;;26443:18;;:::i;:::-;26360:103;26490:1;26483:5;26479:13;26472:20;;26265:233;;;:::o;26504:238::-;26644:34;26640:1;26632:6;26628:14;26621:58;26713:21;26708:2;26700:6;26696:15;26689:46;26504:238;:::o;26748:366::-;26890:3;26911:67;26975:2;26970:3;26911:67;:::i;:::-;26904:74;;26987:93;27076:3;26987:93;:::i;:::-;27105:2;27100:3;27096:12;27089:19;;26748:366;;;:::o;27120:419::-;27286:4;27324:2;27313:9;27309:18;27301:26;;27373:9;27367:4;27363:20;27359:1;27348:9;27344:17;27337:47;27401:131;27527:4;27401:131;:::i;:::-;27393:139;;27120:419;;;:::o;27545:224::-;27685:34;27681:1;27673:6;27669:14;27662:58;27754:7;27749:2;27741:6;27737:15;27730:32;27545:224;:::o;27775:366::-;27917:3;27938:67;28002:2;27997:3;27938:67;:::i;:::-;27931:74;;28014:93;28103:3;28014:93;:::i;:::-;28132:2;28127:3;28123:12;28116:19;;27775:366;;;:::o;28147:419::-;28313:4;28351:2;28340:9;28336:18;28328:26;;28400:9;28394:4;28390:20;28386:1;28375:9;28371:17;28364:47;28428:131;28554:4;28428:131;:::i;:::-;28420:139;;28147:419;;;:::o;28572:225::-;28712:34;28708:1;28700:6;28696:14;28689:58;28781:8;28776:2;28768:6;28764:15;28757:33;28572:225;:::o;28803:366::-;28945:3;28966:67;29030:2;29025:3;28966:67;:::i;:::-;28959:74;;29042:93;29131:3;29042:93;:::i;:::-;29160:2;29155:3;29151:12;29144:19;;28803:366;;;:::o;29175:419::-;29341:4;29379:2;29368:9;29364:18;29356:26;;29428:9;29422:4;29418:20;29414:1;29403:9;29399:17;29392:47;29456:131;29582:4;29456:131;:::i;:::-;29448:139;;29175:419;;;:::o;29600:120::-;29672:23;29689:5;29672:23;:::i;:::-;29665:5;29662:34;29652:62;;29710:1;29707;29700:12;29652:62;29600:120;:::o;29726:141::-;29782:5;29813:6;29807:13;29798:22;;29829:32;29855:5;29829:32;:::i;:::-;29726:141;;;;:::o;29873:349::-;29942:6;29991:2;29979:9;29970:7;29966:23;29962:32;29959:119;;;29997:79;;:::i;:::-;29959:119;30117:1;30142:63;30197:7;30188:6;30177:9;30173:22;30142:63;:::i;:::-;30132:73;;30088:127;29873:349;;;;:::o;30228:143::-;30285:5;30316:6;30310:13;30301:22;;30332:33;30359:5;30332:33;:::i;:::-;30228:143;;;;:::o;30377:351::-;30447:6;30496:2;30484:9;30475:7;30471:23;30467:32;30464:119;;;30502:79;;:::i;:::-;30464:119;30622:1;30647:64;30703:7;30694:6;30683:9;30679:22;30647:64;:::i;:::-;30637:74;;30593:128;30377:351;;;;:::o;30734:85::-;30779:7;30808:5;30797:16;;30734:85;;;:::o;30825:158::-;30883:9;30916:61;30934:42;30943:32;30969:5;30943:32;:::i;:::-;30934:42;:::i;:::-;30916:61;:::i;:::-;30903:74;;30825:158;;;:::o;30989:147::-;31084:45;31123:5;31084:45;:::i;:::-;31079:3;31072:58;30989:147;;:::o;31142:114::-;31209:6;31243:5;31237:12;31227:22;;31142:114;;;:::o;31262:184::-;31361:11;31395:6;31390:3;31383:19;31435:4;31430:3;31426:14;31411:29;;31262:184;;;;:::o;31452:132::-;31519:4;31542:3;31534:11;;31572:4;31567:3;31563:14;31555:22;;31452:132;;;:::o;31590:108::-;31667:24;31685:5;31667:24;:::i;:::-;31662:3;31655:37;31590:108;;:::o;31704:179::-;31773:10;31794:46;31836:3;31828:6;31794:46;:::i;:::-;31872:4;31867:3;31863:14;31849:28;;31704:179;;;;:::o;31889:113::-;31959:4;31991;31986:3;31982:14;31974:22;;31889:113;;;:::o;32038:732::-;32157:3;32186:54;32234:5;32186:54;:::i;:::-;32256:86;32335:6;32330:3;32256:86;:::i;:::-;32249:93;;32366:56;32416:5;32366:56;:::i;:::-;32445:7;32476:1;32461:284;32486:6;32483:1;32480:13;32461:284;;;32562:6;32556:13;32589:63;32648:3;32633:13;32589:63;:::i;:::-;32582:70;;32675:60;32728:6;32675:60;:::i;:::-;32665:70;;32521:224;32508:1;32505;32501:9;32496:14;;32461:284;;;32465:14;32761:3;32754:10;;32162:608;;;32038:732;;;;:::o;32776:720::-;33011:4;33049:3;33038:9;33034:19;33026:27;;33063:79;33139:1;33128:9;33124:17;33115:6;33063:79;:::i;:::-;33189:9;33183:4;33179:20;33174:2;33163:9;33159:18;33152:48;33217:108;33320:4;33311:6;33217:108;:::i;:::-;33209:116;;33335:72;33403:2;33392:9;33388:18;33379:6;33335:72;:::i;:::-;33417;33485:2;33474:9;33470:18;33461:6;33417:72;:::i;:::-;32776:720;;;;;;;:::o;33502:410::-;33542:7;33565:20;33583:1;33565:20;:::i;:::-;33560:25;;33599:20;33617:1;33599:20;:::i;:::-;33594:25;;33654:1;33651;33647:9;33676:30;33694:11;33676:30;:::i;:::-;33665:41;;33855:1;33846:7;33842:15;33839:1;33836:22;33816:1;33809:9;33789:83;33766:139;;33885:18;;:::i;:::-;33766:139;33550:362;33502:410;;;;:::o;33918:220::-;34058:34;34054:1;34046:6;34042:14;34035:58;34127:3;34122:2;34114:6;34110:15;34103:28;33918:220;:::o;34144:366::-;34286:3;34307:67;34371:2;34366:3;34307:67;:::i;:::-;34300:74;;34383:93;34472:3;34383:93;:::i;:::-;34501:2;34496:3;34492:12;34485:19;;34144:366;;;:::o;34516:419::-;34682:4;34720:2;34709:9;34705:18;34697:26;;34769:9;34763:4;34759:20;34755:1;34744:9;34740:17;34733:47;34797:131;34923:4;34797:131;:::i;:::-;34789:139;;34516:419;;;:::o;34941:177::-;35081:29;35077:1;35069:6;35065:14;35058:53;34941:177;:::o;35124:366::-;35266:3;35287:67;35351:2;35346:3;35287:67;:::i;:::-;35280:74;;35363:93;35452:3;35363:93;:::i;:::-;35481:2;35476:3;35472:12;35465:19;;35124:366;;;:::o;35496:419::-;35662:4;35700:2;35689:9;35685:18;35677:26;;35749:9;35743:4;35739:20;35735:1;35724:9;35720:17;35713:47;35777:131;35903:4;35777:131;:::i;:::-;35769:139;;35496:419;;;:::o;35921:223::-;36061:34;36057:1;36049:6;36045:14;36038:58;36130:6;36125:2;36117:6;36113:15;36106:31;35921:223;:::o;36150:366::-;36292:3;36313:67;36377:2;36372:3;36313:67;:::i;:::-;36306:74;;36389:93;36478:3;36389:93;:::i;:::-;36507:2;36502:3;36498:12;36491:19;;36150:366;;;:::o;36522:419::-;36688:4;36726:2;36715:9;36711:18;36703:26;;36775:9;36769:4;36765:20;36761:1;36750:9;36746:17;36739:47;36803:131;36929:4;36803:131;:::i;:::-;36795:139;;36522:419;;;:::o;36947:221::-;37087:34;37083:1;37075:6;37071:14;37064:58;37156:4;37151:2;37143:6;37139:15;37132:29;36947:221;:::o;37174:366::-;37316:3;37337:67;37401:2;37396:3;37337:67;:::i;:::-;37330:74;;37413:93;37502:3;37413:93;:::i;:::-;37531:2;37526:3;37522:12;37515:19;;37174:366;;;:::o;37546:419::-;37712:4;37750:2;37739:9;37735:18;37727:26;;37799:9;37793:4;37789:20;37785:1;37774:9;37770:17;37763:47;37827:131;37953:4;37827:131;:::i;:::-;37819:139;;37546:419;;;:::o;37971:375::-;38010:3;38029:19;38046:1;38029:19;:::i;:::-;38024:24;;38062:19;38079:1;38062:19;:::i;:::-;38057:24;;38104:1;38101;38097:9;38090:16;;38302:1;38297:3;38293:11;38286:19;38282:1;38279;38275:9;38271:35;38254:1;38249:3;38245:11;38240:1;38237;38233:9;38226:17;38222:35;38206:110;38203:136;;;38319:18;;:::i;:::-;38203:136;37971:375;;;;:::o;38352:134::-;38410:9;38443:37;38474:5;38443:37;:::i;:::-;38430:50;;38352:134;;;:::o;38492:147::-;38587:45;38626:5;38587:45;:::i;:::-;38582:3;38575:58;38492:147;;:::o;38645:348::-;38774:4;38812:2;38801:9;38797:18;38789:26;;38825:79;38901:1;38890:9;38886:17;38877:6;38825:79;:::i;:::-;38914:72;38982:2;38971:9;38967:18;38958:6;38914:72;:::i;:::-;38645:348;;;;;:::o;38999:194::-;39039:4;39059:20;39077:1;39059:20;:::i;:::-;39054:25;;39093:20;39111:1;39093:20;:::i;:::-;39088:25;;39137:1;39134;39130:9;39122:17;;39161:1;39155:4;39152:11;39149:37;;;39166:18;;:::i;:::-;39149:37;38999:194;;;;:::o;39199:372::-;39238:4;39258:19;39275:1;39258:19;:::i;:::-;39253:24;;39291:19;39308:1;39291:19;:::i;:::-;39286:24;;39334:1;39331;39327:9;39319:17;;39528:1;39522:4;39518:12;39514:1;39511;39507:9;39503:28;39486:1;39480:4;39476:12;39471:1;39468;39464:9;39457:17;39453:36;39437:104;39434:130;;;39544:18;;:::i;:::-;39434:130;39199:372;;;;:::o;39577:181::-;39717:33;39713:1;39705:6;39701:14;39694:57;39577:181;:::o;39764:366::-;39906:3;39927:67;39991:2;39986:3;39927:67;:::i;:::-;39920:74;;40003:93;40092:3;40003:93;:::i;:::-;40121:2;40116:3;40112:12;40105:19;;39764:366;;;:::o;40136:419::-;40302:4;40340:2;40329:9;40325:18;40317:26;;40389:9;40383:4;40379:20;40375:1;40364:9;40360:17;40353:47;40417:131;40543:4;40417:131;:::i;:::-;40409:139;;40136:419;;;:::o;40561:220::-;40701:34;40697:1;40689:6;40685:14;40678:58;40770:3;40765:2;40757:6;40753:15;40746:28;40561:220;:::o;40787:366::-;40929:3;40950:67;41014:2;41009:3;40950:67;:::i;:::-;40943:74;;41026:93;41115:3;41026:93;:::i;:::-;41144:2;41139:3;41135:12;41128:19;;40787:366;;;:::o;41159:419::-;41325:4;41363:2;41352:9;41348:18;41340:26;;41412:9;41406:4;41402:20;41398:1;41387:9;41383:17;41376:47;41440:131;41566:4;41440:131;:::i;:::-;41432:139;;41159:419;;;:::o
Swarm Source
ipfs://75101884e33621166beb47cd3d21a1f24874de5a1c6dd9e634643a6a0fc6f539
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.