Address Details
contract
0xA13Cd4AEae9Ad7CEC36359C70a589e487e7Cf1Fd
- Contract Name
- cStarIDO
- Creator
- 0x7f09ca–8815c7 at 0xc9f856–b17e53
- Balance
- 0 CELO ( )
- Locked CELO Balance
- 0.00 CELO
- Voting CELO Balance
- 0.00 CELO
- Pending Unlocked Gold
- 0.00 CELO
- Tokens
-
Fetching tokens...
- Transactions
- 4 Transactions
- Transfers
- 3 Transfers
- Gas Used
- 388,809
- Last Balance Update
- 7691844
Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Code
Read Contract
Write Contract
This contract has been verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- cStarIDO
- Optimization enabled
- false
- Compiler version
- v0.6.12+commit.27d51765
- EVM Version
- istanbul
- Verified at
- 2023-02-01T20:19:40.129689Z
project:/contracts/cStarIDO.sol
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.6.12; 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 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) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 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) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold 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; } } library Address { function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } } library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } interface IUserPool { function getAces() external view returns (address[] memory, uint256[] memory); function getKings() external view returns (address[] memory, uint256[] memory); function getJacks() external view returns (address[] memory, uint256[] memory); function getGuards() external view returns (address[] memory, uint256[] memory); } contract cStarIDO { using SafeERC20 for IERC20; using SafeMath for uint256; address addrDev; address addrAdmin; address addrPayout; address[] addrValidAces; address[] addrValidKings; address[] addrValidJacks; address[] addrValidGuards; IUserPool UserPool; IERC20 IPayToken; uint256 iPercentage = 7; uint256 iTokenMaturity = 30 days; enum UserLevel { None, Ace, King, Jack, Guard } mapping (address => bool) public bAllowAlloc; mapping (address => UserLevel) public mapUserLevel; enum MarketPhase {Prepare, Allocation, PublicSale, Closed } struct SaleInfo { IERC20 ISaleToken; uint256 iTokenAmount; uint256 iPublicSaleAmount; uint256 iAcesAmount; uint256 iAcesBatch; uint256 iKingsAmount; uint256 iKingsBatch; uint256 iJacksAmount; uint256 iJacksBatch; uint256 iGuardsAmount; uint256 iGuardsBatch; uint256 iTokenPrice; uint256 iLevelPrice; MarketPhase marketPhase; } SaleInfo public TokenMarket; modifier _needsAdmin() { require(msg.sender == addrDev || msg.sender == addrAdmin, "ALERT: Admin or Dev need to set"); _; } constructor(IUserPool userpool, IERC20 paytoken, IERC20 saletoken, uint256 amount, uint256 price, address payout, uint256 iMaturity) public { addrDev = msg.sender; addrPayout = payout; UserPool = userpool; IPayToken = paytoken; iTokenMaturity = iMaturity; uint256 iAmount = amount / 2; TokenMarket.ISaleToken = saletoken; TokenMarket.iTokenAmount = amount; TokenMarket.iPublicSaleAmount = iAmount; TokenMarket.iAcesAmount = (iAmount * 35) / 100; TokenMarket.iKingsAmount = (iAmount * 20) / 100; TokenMarket.iJacksAmount = (iAmount * 20) / 100; TokenMarket.iGuardsAmount = (iAmount * 25) / 100; TokenMarket.iTokenPrice = price; TokenMarket.iLevelPrice = price / 2; TokenMarket.marketPhase = MarketPhase.Prepare; } function getPayToken() public view returns (IERC20) { return IPayToken; } function getAllowAlloc(address account) public view returns (bool) { return bAllowAlloc[account]; } function openAlloc() public _needsAdmin() { require(TokenMarket.ISaleToken.balanceOf(address(this)) >= TokenMarket.iTokenAmount, "ALERT: Token are not transfered to Market!"); (address[] memory addrAces, uint256[] memory timeAces) = UserPool.getAces(); (address[] memory addrKings, uint256[] memory timeKings) = UserPool.getKings(); (address[] memory addrJacks, uint256[] memory timeJacks) = UserPool.getJacks(); (address[] memory addrGuards, uint256[] memory timeGuards) = UserPool.getGuards(); if(addrAces.length > 0) { for(uint i = 0; i < addrAces.length; i++) { if((timeAces[i] + iTokenMaturity) < block.timestamp) { addrValidAces.push(addrAces[i]); bAllowAlloc[addrAces[i]] = true; mapUserLevel[addrAces[i]] = UserLevel.Ace; } } if(addrValidAces.length > 0) { TokenMarket.iAcesBatch = TokenMarket.iAcesAmount / addrValidAces.length; } } if(addrKings.length > 0) { for(uint i = 0; i < addrKings.length; i++) { if((timeKings[i] + iTokenMaturity) < block.timestamp) { addrValidKings.push(addrKings[i]); bAllowAlloc[addrKings[i]] = true; mapUserLevel[addrKings[i]] = UserLevel.King; } } if(addrValidKings.length > 0) { TokenMarket.iKingsBatch = TokenMarket.iKingsAmount / addrValidKings.length; } } if(addrValidJacks.length > 0) { for(uint i = 0; i < addrJacks.length; i++) { if((timeJacks[i] + iTokenMaturity) < block.timestamp) { addrValidJacks.push(addrJacks[i]); bAllowAlloc[addrJacks[i]] = true; mapUserLevel[addrJacks[i]] = UserLevel.Jack; } } if(addrValidJacks.length > 0) { TokenMarket.iJacksBatch = TokenMarket.iJacksAmount / addrValidJacks.length; } } if(addrGuards.length > 0) { for(uint i = 0; i < addrGuards.length; i++) { if((timeGuards[i] + iTokenMaturity) < block.timestamp) { addrValidGuards.push(addrGuards[i]); bAllowAlloc[addrGuards[i]] = true; mapUserLevel[addrGuards[i]] = UserLevel.Guard; } } if(addrValidGuards.length > 0) { TokenMarket.iGuardsBatch = TokenMarket.iGuardsAmount / addrValidGuards.length; } } TokenMarket.marketPhase = MarketPhase.Allocation; } function openPublicSale() public _needsAdmin() { uint256 iNewPublicAmount; iNewPublicAmount = TokenMarket.iPublicSaleAmount.add(TokenMarket.iAcesAmount).add(TokenMarket.iKingsAmount).add(TokenMarket.iJacksAmount).add(TokenMarket.iGuardsAmount); TokenMarket.iPublicSaleAmount = iNewPublicAmount; TokenMarket.marketPhase = MarketPhase.PublicSale; } function getAllocation() public payable { require(TokenMarket.marketPhase == MarketPhase.Allocation, "ALERT: Market not opened!"); require(bAllowAlloc[msg.sender] == true, "ALERT: Your are not allowed or already buyed during this phase!"); UserLevel buyerLevel = mapUserLevel[msg.sender]; if(buyerLevel == UserLevel.Ace) { uint256 iAcesCost = (TokenMarket.iAcesBatch * TokenMarket.iLevelPrice) / 10**18; require(IPayToken.balanceOf(msg.sender) > iAcesCost, "ALERT: Not enough token for buy!"); require(IPayToken.allowance(msg.sender, address(this)) > iAcesCost, "ALERT: Not enough token for buy!"); require(TokenMarket.iAcesAmount >= TokenMarket.iAcesBatch, "ALERT: Not engough token please call the admin!"); IPayToken.safeTransferFrom(msg.sender, address(this), iAcesCost); TokenMarket.ISaleToken.safeTransfer(msg.sender, TokenMarket.iAcesBatch); TokenMarket.iAcesAmount = TokenMarket.iAcesAmount.sub(TokenMarket.iAcesBatch); bAllowAlloc[msg.sender] = false; } else if(buyerLevel == UserLevel.King) { uint256 iKingsCost = (TokenMarket.iKingsBatch * TokenMarket.iLevelPrice) / 10**18; require(IPayToken.balanceOf(msg.sender) > iKingsCost, "ALERT: Not enough token for buy!"); require(IPayToken.allowance(msg.sender, address(this)) > iKingsCost, "ALERT: Not enough token for buy!"); require(TokenMarket.iKingsAmount >= TokenMarket.iKingsBatch, "ALERT: Not engough token please call the admin!"); IPayToken.safeTransferFrom(msg.sender, address(this), iKingsCost); TokenMarket.ISaleToken.safeTransfer(msg.sender, TokenMarket.iKingsBatch); TokenMarket.iKingsAmount = TokenMarket.iKingsAmount.sub(TokenMarket.iKingsBatch); bAllowAlloc[msg.sender] = false; } else if(buyerLevel == UserLevel.Jack) { uint256 iJacksCost = (TokenMarket.iJacksBatch * TokenMarket.iLevelPrice) / 10**18; require(IPayToken.balanceOf(msg.sender) > iJacksCost, "ALERT: Not enough token for buy!"); require(IPayToken.allowance(msg.sender, address(this)) > iJacksCost, "ALERT: Not enough allowance for buy!"); require(TokenMarket.iJacksAmount >= TokenMarket.iJacksBatch, "ALERT: Not engough token please call the admin!"); IPayToken.safeTransferFrom(msg.sender, address(this), iJacksCost); TokenMarket.ISaleToken.safeTransfer(msg.sender, TokenMarket.iJacksBatch); TokenMarket.iJacksAmount = TokenMarket.iJacksAmount.sub(TokenMarket.iJacksBatch); bAllowAlloc[msg.sender] = false; } else if(buyerLevel == UserLevel.Guard) { uint256 iGuardsCost = (TokenMarket.iGuardsBatch * TokenMarket.iLevelPrice) / 10**18; require(IPayToken.balanceOf(msg.sender) > iGuardsCost, "ALERT: Not enough token for buy!"); require(IPayToken.allowance(msg.sender, address(this)) > iGuardsCost, "ALERT: Not enough allowance for buy!"); require(TokenMarket.iGuardsAmount >= TokenMarket.iGuardsBatch, "ALERT: Not engough token please call the admin!"); IPayToken.safeTransferFrom(msg.sender, address(this), iGuardsCost); TokenMarket.ISaleToken.safeTransfer(msg.sender, TokenMarket.iGuardsBatch); TokenMarket.iGuardsAmount = TokenMarket.iGuardsAmount.sub(TokenMarket.iGuardsBatch); bAllowAlloc[msg.sender] = false; } } function buyToken(uint256 amount) public payable { require(amount > 0, "ALERT: You can not buy nothing!"); require(TokenMarket.marketPhase == MarketPhase.PublicSale, "ALERT: Public Sale not opend now!"); uint256 iCost = (amount * TokenMarket.iTokenPrice) / 10**18; require(TokenMarket.iPublicSaleAmount > 0, "ALERT: Contract is empty"); require(TokenMarket.iPublicSaleAmount > amount, "ALERT: Not enough token to buy!"); require(IPayToken.balanceOf(msg.sender) > iCost, "ALERT: Not enough money for payment!"); require(IPayToken.allowance(msg.sender, address(this)) > iCost, "ALERT: Not enough allowance for buy!"); IPayToken.safeTransferFrom(msg.sender, address(this), iCost); TokenMarket.ISaleToken.safeTransfer(msg.sender, amount); TokenMarket.iPublicSaleAmount = TokenMarket.iPublicSaleAmount.sub(amount); if(TokenMarket.iPublicSaleAmount == 0) { TokenMarket.marketPhase = MarketPhase.Closed; } } function doPayout() public _needsAdmin() { require(TokenMarket.marketPhase == MarketPhase.Closed, "ALERT: Sale is open, no payout!"); uint256 iAmount = IPayToken.balanceOf(address(this)); uint256 iCommission = (iAmount * iPercentage) / 100; iAmount = iAmount.sub(iCommission); IPayToken.safeTransfer(addrDev, iCommission); IPayToken.safeTransfer(addrPayout, iAmount); } function setCommissionPercentage(uint256 percentage) public _needsAdmin() { iPercentage = percentage; } function getMarketPhase() public view returns (MarketPhase) { return TokenMarket.marketPhase; } function setMarketPhase(MarketPhase phase) public _needsAdmin() { TokenMarket.marketPhase = phase; } function setAdmin(address addr) public _needsAdmin() { addrAdmin = addr; } // Added to support recovering LP Rewards from other systems such as BAL to be distributed to holders function recoverERC20(address tokenAddress, uint256 tokenAmount) external _needsAdmin() { IERC20(tokenAddress).safeTransfer(addrDev, tokenAmount); emit Recovered(tokenAddress, tokenAmount); } event Recovered(address token, uint256 amount); }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"userpool","internalType":"contract IUserPool"},{"type":"address","name":"paytoken","internalType":"contract IERC20"},{"type":"address","name":"saletoken","internalType":"contract IERC20"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"price","internalType":"uint256"},{"type":"address","name":"payout","internalType":"address"},{"type":"uint256","name":"iMaturity","internalType":"uint256"}]},{"type":"event","name":"Recovered","inputs":[{"type":"address","name":"token","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"ISaleToken","internalType":"contract IERC20"},{"type":"uint256","name":"iTokenAmount","internalType":"uint256"},{"type":"uint256","name":"iPublicSaleAmount","internalType":"uint256"},{"type":"uint256","name":"iAcesAmount","internalType":"uint256"},{"type":"uint256","name":"iAcesBatch","internalType":"uint256"},{"type":"uint256","name":"iKingsAmount","internalType":"uint256"},{"type":"uint256","name":"iKingsBatch","internalType":"uint256"},{"type":"uint256","name":"iJacksAmount","internalType":"uint256"},{"type":"uint256","name":"iJacksBatch","internalType":"uint256"},{"type":"uint256","name":"iGuardsAmount","internalType":"uint256"},{"type":"uint256","name":"iGuardsBatch","internalType":"uint256"},{"type":"uint256","name":"iTokenPrice","internalType":"uint256"},{"type":"uint256","name":"iLevelPrice","internalType":"uint256"},{"type":"uint8","name":"marketPhase","internalType":"enum cStarIDO.MarketPhase"}],"name":"TokenMarket","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"bAllowAlloc","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"buyToken","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"doPayout","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"getAllocation","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"getAllowAlloc","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"enum cStarIDO.MarketPhase"}],"name":"getMarketPhase","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"getPayToken","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"enum cStarIDO.UserLevel"}],"name":"mapUserLevel","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"openAlloc","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"openPublicSale","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"recoverERC20","inputs":[{"type":"address","name":"tokenAddress","internalType":"address"},{"type":"uint256","name":"tokenAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAdmin","inputs":[{"type":"address","name":"addr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setCommissionPercentage","inputs":[{"type":"uint256","name":"percentage","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMarketPhase","inputs":[{"type":"uint8","name":"phase","internalType":"enum cStarIDO.MarketPhase"}]}]
Contract Creation Code
0x6080604052600760095562278d00600a553480156200001d57600080fd5b50604051620043ac380380620043ac833981810160405260e08110156200004357600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600a81905550600060028581620001a757fe5b04905085600d60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600d6001018190555080600d60020181905550606460238202816200021057fe5b04600d60030181905550606460148202816200022857fe5b04600d60050181905550606460148202816200024057fe5b04600d60070181905550606460198202816200025857fe5b04600d6009018190555083600d600b0181905550600284816200027757fe5b04600d600c01819055506000600d800160006101000a81548160ff02191690836003811115620002a357fe5b021790555050505050505050506140ec80620002c06000396000f3fe6080604052600436106100e85760003560e01c8063558a04ae1161008a5780638c91084e116100595780638c91084e146103d5578063a0bc6d261461047c578063b585209b14610493578063c57a0295146104aa576100e8565b8063558a04ae146102b557806355ae59a3146102eb578063704b6c02146103295780638980f11f1461037a576100e8565b80632d296bf1116100c65780632d296bf11461017e57806339b87c8f146101ac5780634eb0d099146101e7578063556de82d1461024e576100e8565b80630c9e1e8e146100ed57806318494108146100f75780632231da271461010e575b600080fd5b6100f56104eb565b005b34801561010357600080fd5b5061010c6117b1565b005b34801561011a57600080fd5b5061015d6004803603602081101561013157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b36565b6040518082600481111561016d57fe5b815260200191505060405180910390f35b6101aa6004803603602081101561019457600080fd5b8101908080359060200190929190505050611b56565b005b3480156101b857600080fd5b506101e5600480360360208110156101cf57600080fd5b81019080803590602001909291905050506120ab565b005b3480156101f357600080fd5b506102366004803603602081101561020a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121ce565b60405180821515815260200191505060405180910390f35b34801561025a57600080fd5b5061029d6004803603602081101561027157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612224565b60405180821515815260200191505060405180910390f35b3480156102c157600080fd5b506102ca612244565b604051808260038111156102da57fe5b815260200191505060405180910390f35b3480156102f757600080fd5b506103276004803603602081101561030e57600080fd5b81019080803560ff16906020019092919050505061225d565b005b34801561033557600080fd5b506103786004803603602081101561034c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061239e565b005b34801561038657600080fd5b506103d36004803603604081101561039d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506124fb565b005b3480156103e157600080fd5b506103ea6126b8565b604051808f73ffffffffffffffffffffffffffffffffffffffff1681526020018e81526020018d81526020018c81526020018b81526020018a815260200189815260200188815260200187815260200186815260200185815260200184815260200183815260200182600381111561045e57fe5b81526020019e50505050505050505050505050505060405180910390f35b34801561048857600080fd5b5061049161273f565b005b34801561049f57600080fd5b506104a8613824565b005b3480156104b657600080fd5b506104bf6139d6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160038111156104f857fe5b600d800160009054906101000a900460ff16600381111561051557fe5b14610588576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f414c4552543a204d61726b6574206e6f74206f70656e6564210000000000000081525060200191505060405180910390fd5b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180614009603f913960400191505060405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506001600481111561068f57fe5b81600481111561069b57fe5b1415610adc576000670de0b6b3a7640000600d600c0154600d6004015402816106c057fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561074d57600080fd5b505afa158015610761573d6000803e3d6000fd5b505050506040513d602081101561077757600080fd5b8101908080519060200190929190505050116107fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156108a357600080fd5b505afa1580156108b7573d6000803e3d6000fd5b505050506040513d60208110156108cd57600080fd5b810190808051906020019092919050505011610951576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b600d60040154600d6003015410156109b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fda602f913960400191505060405180910390fd5b610a03333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a00909392919063ffffffff16565b610a5833600d60040154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b610a75600d60040154600d60030154613b6390919063ffffffff16565b600d600301819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550506117ae565b60026004811115610ae957fe5b816004811115610af557fe5b1415610f36576000670de0b6b3a7640000600d600c0154600d600601540281610b1a57fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610ba757600080fd5b505afa158015610bbb573d6000803e3d6000fd5b505050506040513d6020811015610bd157600080fd5b810190808051906020019092919050505011610c55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015610cfd57600080fd5b505afa158015610d11573d6000803e3d6000fd5b505050506040513d6020811015610d2757600080fd5b810190808051906020019092919050505011610dab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b600d60060154600d600501541015610e0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fda602f913960400191505060405180910390fd5b610e5d333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a00909392919063ffffffff16565b610eb233600d60060154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b610ecf600d60060154600d60050154613b6390919063ffffffff16565b600d600501819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550506117ad565b60036004811115610f4357fe5b816004811115610f4f57fe5b1415611373576000670de0b6b3a7640000600d600c0154600d600801540281610f7457fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561100157600080fd5b505afa158015611015573d6000803e3d6000fd5b505050506040513d602081101561102b57600080fd5b8101908080519060200190929190505050116110af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561115757600080fd5b505afa15801561116b573d6000803e3d6000fd5b505050506040513d602081101561118157600080fd5b8101908080519060200190929190505050116111e8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613f8c6024913960400191505060405180910390fd5b600d60080154600d60070154101561124b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fda602f913960400191505060405180910390fd5b61129a333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a00909392919063ffffffff16565b6112ef33600d60080154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b61130c600d60080154600d60070154613b6390919063ffffffff16565b600d600701819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550506117ac565b60048081111561137f57fe5b81600481111561138b57fe5b14156117ab576000670de0b6b3a7640000600d600c0154600d600a015402816113b057fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561143d57600080fd5b505afa158015611451573d6000803e3d6000fd5b505050506040513d602081101561146757600080fd5b8101908080519060200190929190505050116114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561159357600080fd5b505afa1580156115a7573d6000803e3d6000fd5b505050506040513d60208110156115bd57600080fd5b810190808051906020019092919050505011611624576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613f8c6024913960400191505060405180910390fd5b600d600a0154600d600901541015611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fda602f913960400191505060405180910390fd5b6116d6333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a00909392919063ffffffff16565b61172b33600d600a0154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b611748600d600a0154600d60090154613b6390919063ffffffff16565b600d600901819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505b5b5b5b50565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806118585750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6118ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b6003808111156118d657fe5b600d800160009054906101000a900460ff1660038111156118f357fe5b14611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2053616c65206973206f70656e2c206e6f207061796f7574210081525060200191505060405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119f157600080fd5b505afa158015611a05573d6000803e3d6000fd5b505050506040513d6020811015611a1b57600080fd5b8101908080519060200190929190505050905060006064600954830281611a3e57fe5b049050611a548183613b6390919063ffffffff16565b9150611ac360008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b611b32600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b5050565b600c6020528060005260406000206000915054906101000a900460ff1681565b60008111611bcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a20596f752063616e206e6f7420627579206e6f7468696e67210081525060200191505060405180910390fd5b60026003811115611bd957fe5b600d800160009054906101000a900460ff166003811115611bf657fe5b14611c4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806140486021913960400191505060405180910390fd5b6000670de0b6b3a7640000600d600b0154830281611c6657fe5b0490506000600d6002015411611ce4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f414c4552543a20436f6e747261637420697320656d707479000000000000000081525060200191505060405180910390fd5b81600d6002015411611d5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20746f20627579210081525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611de857600080fd5b505afa158015611dfc573d6000803e3d6000fd5b505050506040513d6020811015611e1257600080fd5b810190808051906020019092919050505011611e79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806140936024913960400191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611f2157600080fd5b505afa158015611f35573d6000803e3d6000fd5b505050506040513d6020811015611f4b57600080fd5b810190808051906020019092919050505011611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613f8c6024913960400191505060405180910390fd5b612001333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a00909392919063ffffffff16565b6120513383600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b61206982600d60020154613b6390919063ffffffff16565b600d600201819055506000600d6002015414156120a7576003600d800160006101000a81548160ff021916908360038111156120a157fe5b02179055505b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806121525750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6121c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b8060098190555050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600b6020528060005260406000206000915054906101000a900460ff1681565b6000600d800160009054906101000a900460ff16905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123045750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b80600d800160006101000a81548160ff0219169083600381111561239657fe5b021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806124455750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6124b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806125a25750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b61265f60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa288282604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b600d8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b01549080600c01549080600d0160009054906101000a900460ff1690508e565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127e65750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b600d60010154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156128ea57600080fd5b505afa1580156128fe573d6000803e3d6000fd5b505050506040513d602081101561291457600080fd5b8101908080519060200190929190505050101561297c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613fb0602a913960400191505060405180910390fd5b606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166317ad56276040518163ffffffff1660e01b815260040160006040518083038186803b1580156129e757600080fd5b505afa1580156129fb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612a2557600080fd5b8101908080516040519392919084640100000000821115612a4557600080fd5b83820191506020820185811115612a5b57600080fd5b8251866020820283011164010000000082111715612a7857600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612aaf578082015181840152602081019050612a94565b5050505090500160405260200180516040519392919084640100000000821115612ad857600080fd5b83820191506020820185811115612aee57600080fd5b8251866020820283011164010000000082111715612b0b57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612b42578082015181840152602081019050612b27565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632746a2b26040518163ffffffff1660e01b815260040160006040518083038186803b158015612bbe57600080fd5b505afa158015612bd2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612bfc57600080fd5b8101908080516040519392919084640100000000821115612c1c57600080fd5b83820191506020820185811115612c3257600080fd5b8251866020820283011164010000000082111715612c4f57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612c86578082015181840152602081019050612c6b565b5050505090500160405260200180516040519392919084640100000000821115612caf57600080fd5b83820191506020820185811115612cc557600080fd5b8251866020820283011164010000000082111715612ce257600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612d19578082015181840152602081019050612cfe565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663747f58426040518163ffffffff1660e01b815260040160006040518083038186803b158015612d9557600080fd5b505afa158015612da9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612dd357600080fd5b8101908080516040519392919084640100000000821115612df357600080fd5b83820191506020820185811115612e0957600080fd5b8251866020820283011164010000000082111715612e2657600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612e5d578082015181840152602081019050612e42565b5050505090500160405260200180516040519392919084640100000000821115612e8657600080fd5b83820191506020820185811115612e9c57600080fd5b8251866020820283011164010000000082111715612eb957600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612ef0578082015181840152602081019050612ed5565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f0ef21776040518163ffffffff1660e01b815260040160006040518083038186803b158015612f6c57600080fd5b505afa158015612f80573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612faa57600080fd5b8101908080516040519392919084640100000000821115612fca57600080fd5b83820191506020820185811115612fe057600080fd5b8251866020820283011164010000000082111715612ffd57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015613034578082015181840152602081019050613019565b505050509050016040526020018051604051939291908464010000000082111561305d57600080fd5b8382019150602082018581111561307357600080fd5b825186602082028301116401000000008211171561309057600080fd5b8083526020830192505050908051906020019060200280838360005b838110156130c75780820151818401526020810190506130ac565b505050509050016040525050509150915060008851111561329e5760005b88518110156132705742600a548983815181106130fe57fe5b602002602001015101101561326357600389828151811061311b57fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008b848151811061319557fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c60008b848151811061320057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083600481111561325d57fe5b02179055505b80806001019150506130e5565b506000600380549050111561329d57600380549050600d600301548161329257fe5b04600d600401819055505b5b6000865111156134645760005b86518110156134365742600a548783815181106132c457fe5b60200260200101510110156134295760048782815181106132e157fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b600089848151811061335b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600c60008984815181106133c657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083600481111561342357fe5b02179055505b80806001019150506132ab565b506000600480549050111561346357600480549050600d600501548161345857fe5b04600d600601819055505b5b6000600580549050111561362e5760005b84518110156136005742600a5485838151811061348e57fe5b60200260200101510110156135f35760058582815181106134ab57fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b600087848151811061352557fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506003600c600087848151811061359057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360048111156135ed57fe5b02179055505b8080600101915050613475565b506000600580549050111561362d57600580549050600d600701548161362257fe5b04600d600801819055505b5b6000825111156137f45760005b82518110156137c65742600a5483838151811061365457fe5b60200260200101510110156137b957600683828151811061367157fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008584815181106136eb57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506004600c600085848151811061375657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360048111156137b357fe5b02179055505b808060010191505061363b565b50600060068054905011156137f357600680549050600d60090154816137e857fe5b04600d600a01819055505b5b6001600d800160006101000a81548160ff0219169083600381111561381557fe5b02179055505050505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806138cb5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61393d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b60006139a1600d60090154613993600d60070154613985600d60050154613977600d60030154600d60020154613bad90919063ffffffff16565b613bad90919063ffffffff16565b613bad90919063ffffffff16565b613bad90919063ffffffff16565b905080600d600201819055506002600d800160006101000a81548160ff021916908360038111156139ce57fe5b021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b613abb846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c35565b50505050565b613b5e8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c35565b505050565b6000613ba583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613e80565b905092915050565b600080828401905083811015613c2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b613c548273ffffffffffffffffffffffffffffffffffffffff16613f40565b613cc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b60208310613d155780518252602082019150602081019050602083039250613cf2565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613d77576040519150601f19603f3d011682016040523d82523d6000602084013e613d7c565b606091505b509150915081613df4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b600081511115613e7a57808060200190516020811015613e1357600080fd5b8101908080519060200190929190505050613e79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614069602a913960400191505060405180910390fd5b5b50505050565b6000838311158290613f2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ef2578082015181840152602081019050613ed7565b50505050905090810190601f168015613f1f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015613f8257506000801b8214155b9250505091905056fe414c4552543a204e6f7420656e6f75676820616c6c6f77616e636520666f722062757921414c4552543a20546f6b656e20617265206e6f74207472616e73666572656420746f204d61726b657421414c4552543a204e6f7420656e676f75676820746f6b656e20706c656173652063616c6c207468652061646d696e21414c4552543a20596f757220617265206e6f7420616c6c6f776564206f7220616c726561647920627579656420647572696e67207468697320706861736521414c4552543a205075626c69632053616c65206e6f74206f70656e64206e6f77215361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564414c4552543a204e6f7420656e6f756768206d6f6e657920666f72207061796d656e7421a2646970667358221220167026b29a667559cb11a081104eb0b946483e53ab15652e61b36ccdb9f774bd64736f6c634300060c00330000000000000000000000004d06464bc97af140122153dba02b11dfdf7f8134000000000000000000000000007b1dcc6ac10f3f689eb1edce7a2338cd39ceed000000000000000000000000452ef5a4bd00796e62e5e5758548e0da6e8ccdf3000000000000000000000000000000000000000000000a968163f0a57b40000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000001b3c1205dbb7ca4e3b1780a86d147dccf4b0dc57000000000000000000000000000000000000000000000000000000000000003c
Deployed ByteCode
0x6080604052600436106100e85760003560e01c8063558a04ae1161008a5780638c91084e116100595780638c91084e146103d5578063a0bc6d261461047c578063b585209b14610493578063c57a0295146104aa576100e8565b8063558a04ae146102b557806355ae59a3146102eb578063704b6c02146103295780638980f11f1461037a576100e8565b80632d296bf1116100c65780632d296bf11461017e57806339b87c8f146101ac5780634eb0d099146101e7578063556de82d1461024e576100e8565b80630c9e1e8e146100ed57806318494108146100f75780632231da271461010e575b600080fd5b6100f56104eb565b005b34801561010357600080fd5b5061010c6117b1565b005b34801561011a57600080fd5b5061015d6004803603602081101561013157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b36565b6040518082600481111561016d57fe5b815260200191505060405180910390f35b6101aa6004803603602081101561019457600080fd5b8101908080359060200190929190505050611b56565b005b3480156101b857600080fd5b506101e5600480360360208110156101cf57600080fd5b81019080803590602001909291905050506120ab565b005b3480156101f357600080fd5b506102366004803603602081101561020a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121ce565b60405180821515815260200191505060405180910390f35b34801561025a57600080fd5b5061029d6004803603602081101561027157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612224565b60405180821515815260200191505060405180910390f35b3480156102c157600080fd5b506102ca612244565b604051808260038111156102da57fe5b815260200191505060405180910390f35b3480156102f757600080fd5b506103276004803603602081101561030e57600080fd5b81019080803560ff16906020019092919050505061225d565b005b34801561033557600080fd5b506103786004803603602081101561034c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061239e565b005b34801561038657600080fd5b506103d36004803603604081101561039d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506124fb565b005b3480156103e157600080fd5b506103ea6126b8565b604051808f73ffffffffffffffffffffffffffffffffffffffff1681526020018e81526020018d81526020018c81526020018b81526020018a815260200189815260200188815260200187815260200186815260200185815260200184815260200183815260200182600381111561045e57fe5b81526020019e50505050505050505050505050505060405180910390f35b34801561048857600080fd5b5061049161273f565b005b34801561049f57600080fd5b506104a8613824565b005b3480156104b657600080fd5b506104bf6139d6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160038111156104f857fe5b600d800160009054906101000a900460ff16600381111561051557fe5b14610588576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f414c4552543a204d61726b6574206e6f74206f70656e6564210000000000000081525060200191505060405180910390fd5b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180614009603f913960400191505060405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506001600481111561068f57fe5b81600481111561069b57fe5b1415610adc576000670de0b6b3a7640000600d600c0154600d6004015402816106c057fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561074d57600080fd5b505afa158015610761573d6000803e3d6000fd5b505050506040513d602081101561077757600080fd5b8101908080519060200190929190505050116107fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156108a357600080fd5b505afa1580156108b7573d6000803e3d6000fd5b505050506040513d60208110156108cd57600080fd5b810190808051906020019092919050505011610951576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b600d60040154600d6003015410156109b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fda602f913960400191505060405180910390fd5b610a03333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a00909392919063ffffffff16565b610a5833600d60040154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b610a75600d60040154600d60030154613b6390919063ffffffff16565b600d600301819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550506117ae565b60026004811115610ae957fe5b816004811115610af557fe5b1415610f36576000670de0b6b3a7640000600d600c0154600d600601540281610b1a57fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610ba757600080fd5b505afa158015610bbb573d6000803e3d6000fd5b505050506040513d6020811015610bd157600080fd5b810190808051906020019092919050505011610c55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015610cfd57600080fd5b505afa158015610d11573d6000803e3d6000fd5b505050506040513d6020811015610d2757600080fd5b810190808051906020019092919050505011610dab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b600d60060154600d600501541015610e0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fda602f913960400191505060405180910390fd5b610e5d333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a00909392919063ffffffff16565b610eb233600d60060154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b610ecf600d60060154600d60050154613b6390919063ffffffff16565b600d600501819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550506117ad565b60036004811115610f4357fe5b816004811115610f4f57fe5b1415611373576000670de0b6b3a7640000600d600c0154600d600801540281610f7457fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561100157600080fd5b505afa158015611015573d6000803e3d6000fd5b505050506040513d602081101561102b57600080fd5b8101908080519060200190929190505050116110af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561115757600080fd5b505afa15801561116b573d6000803e3d6000fd5b505050506040513d602081101561118157600080fd5b8101908080519060200190929190505050116111e8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613f8c6024913960400191505060405180910390fd5b600d60080154600d60070154101561124b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fda602f913960400191505060405180910390fd5b61129a333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a00909392919063ffffffff16565b6112ef33600d60080154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b61130c600d60080154600d60070154613b6390919063ffffffff16565b600d600701819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550506117ac565b60048081111561137f57fe5b81600481111561138b57fe5b14156117ab576000670de0b6b3a7640000600d600c0154600d600a015402816113b057fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561143d57600080fd5b505afa158015611451573d6000803e3d6000fd5b505050506040513d602081101561146757600080fd5b8101908080519060200190929190505050116114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561159357600080fd5b505afa1580156115a7573d6000803e3d6000fd5b505050506040513d60208110156115bd57600080fd5b810190808051906020019092919050505011611624576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613f8c6024913960400191505060405180910390fd5b600d600a0154600d600901541015611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fda602f913960400191505060405180910390fd5b6116d6333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a00909392919063ffffffff16565b61172b33600d600a0154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b611748600d600a0154600d60090154613b6390919063ffffffff16565b600d600901819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505b5b5b5b50565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806118585750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6118ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b6003808111156118d657fe5b600d800160009054906101000a900460ff1660038111156118f357fe5b14611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2053616c65206973206f70656e2c206e6f207061796f7574210081525060200191505060405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119f157600080fd5b505afa158015611a05573d6000803e3d6000fd5b505050506040513d6020811015611a1b57600080fd5b8101908080519060200190929190505050905060006064600954830281611a3e57fe5b049050611a548183613b6390919063ffffffff16565b9150611ac360008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b611b32600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b5050565b600c6020528060005260406000206000915054906101000a900460ff1681565b60008111611bcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a20596f752063616e206e6f7420627579206e6f7468696e67210081525060200191505060405180910390fd5b60026003811115611bd957fe5b600d800160009054906101000a900460ff166003811115611bf657fe5b14611c4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806140486021913960400191505060405180910390fd5b6000670de0b6b3a7640000600d600b0154830281611c6657fe5b0490506000600d6002015411611ce4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f414c4552543a20436f6e747261637420697320656d707479000000000000000081525060200191505060405180910390fd5b81600d6002015411611d5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20746f20627579210081525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611de857600080fd5b505afa158015611dfc573d6000803e3d6000fd5b505050506040513d6020811015611e1257600080fd5b810190808051906020019092919050505011611e79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806140936024913960400191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611f2157600080fd5b505afa158015611f35573d6000803e3d6000fd5b505050506040513d6020811015611f4b57600080fd5b810190808051906020019092919050505011611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613f8c6024913960400191505060405180910390fd5b612001333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a00909392919063ffffffff16565b6120513383600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b61206982600d60020154613b6390919063ffffffff16565b600d600201819055506000600d6002015414156120a7576003600d800160006101000a81548160ff021916908360038111156120a157fe5b02179055505b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806121525750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6121c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b8060098190555050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600b6020528060005260406000206000915054906101000a900460ff1681565b6000600d800160009054906101000a900460ff16905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123045750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b80600d800160006101000a81548160ff0219169083600381111561239657fe5b021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806124455750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6124b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806125a25750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b61265f60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff16613ac19092919063ffffffff16565b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa288282604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b600d8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b01549080600c01549080600d0160009054906101000a900460ff1690508e565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127e65750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b600d60010154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156128ea57600080fd5b505afa1580156128fe573d6000803e3d6000fd5b505050506040513d602081101561291457600080fd5b8101908080519060200190929190505050101561297c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613fb0602a913960400191505060405180910390fd5b606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166317ad56276040518163ffffffff1660e01b815260040160006040518083038186803b1580156129e757600080fd5b505afa1580156129fb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612a2557600080fd5b8101908080516040519392919084640100000000821115612a4557600080fd5b83820191506020820185811115612a5b57600080fd5b8251866020820283011164010000000082111715612a7857600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612aaf578082015181840152602081019050612a94565b5050505090500160405260200180516040519392919084640100000000821115612ad857600080fd5b83820191506020820185811115612aee57600080fd5b8251866020820283011164010000000082111715612b0b57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612b42578082015181840152602081019050612b27565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632746a2b26040518163ffffffff1660e01b815260040160006040518083038186803b158015612bbe57600080fd5b505afa158015612bd2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612bfc57600080fd5b8101908080516040519392919084640100000000821115612c1c57600080fd5b83820191506020820185811115612c3257600080fd5b8251866020820283011164010000000082111715612c4f57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612c86578082015181840152602081019050612c6b565b5050505090500160405260200180516040519392919084640100000000821115612caf57600080fd5b83820191506020820185811115612cc557600080fd5b8251866020820283011164010000000082111715612ce257600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612d19578082015181840152602081019050612cfe565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663747f58426040518163ffffffff1660e01b815260040160006040518083038186803b158015612d9557600080fd5b505afa158015612da9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612dd357600080fd5b8101908080516040519392919084640100000000821115612df357600080fd5b83820191506020820185811115612e0957600080fd5b8251866020820283011164010000000082111715612e2657600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612e5d578082015181840152602081019050612e42565b5050505090500160405260200180516040519392919084640100000000821115612e8657600080fd5b83820191506020820185811115612e9c57600080fd5b8251866020820283011164010000000082111715612eb957600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612ef0578082015181840152602081019050612ed5565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f0ef21776040518163ffffffff1660e01b815260040160006040518083038186803b158015612f6c57600080fd5b505afa158015612f80573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612faa57600080fd5b8101908080516040519392919084640100000000821115612fca57600080fd5b83820191506020820185811115612fe057600080fd5b8251866020820283011164010000000082111715612ffd57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015613034578082015181840152602081019050613019565b505050509050016040526020018051604051939291908464010000000082111561305d57600080fd5b8382019150602082018581111561307357600080fd5b825186602082028301116401000000008211171561309057600080fd5b8083526020830192505050908051906020019060200280838360005b838110156130c75780820151818401526020810190506130ac565b505050509050016040525050509150915060008851111561329e5760005b88518110156132705742600a548983815181106130fe57fe5b602002602001015101101561326357600389828151811061311b57fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008b848151811061319557fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c60008b848151811061320057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083600481111561325d57fe5b02179055505b80806001019150506130e5565b506000600380549050111561329d57600380549050600d600301548161329257fe5b04600d600401819055505b5b6000865111156134645760005b86518110156134365742600a548783815181106132c457fe5b60200260200101510110156134295760048782815181106132e157fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b600089848151811061335b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600c60008984815181106133c657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083600481111561342357fe5b02179055505b80806001019150506132ab565b506000600480549050111561346357600480549050600d600501548161345857fe5b04600d600601819055505b5b6000600580549050111561362e5760005b84518110156136005742600a5485838151811061348e57fe5b60200260200101510110156135f35760058582815181106134ab57fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b600087848151811061352557fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506003600c600087848151811061359057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360048111156135ed57fe5b02179055505b8080600101915050613475565b506000600580549050111561362d57600580549050600d600701548161362257fe5b04600d600801819055505b5b6000825111156137f45760005b82518110156137c65742600a5483838151811061365457fe5b60200260200101510110156137b957600683828151811061367157fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008584815181106136eb57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506004600c600085848151811061375657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360048111156137b357fe5b02179055505b808060010191505061363b565b50600060068054905011156137f357600680549050600d60090154816137e857fe5b04600d600a01819055505b5b6001600d800160006101000a81548160ff0219169083600381111561381557fe5b02179055505050505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806138cb5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61393d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b60006139a1600d60090154613993600d60070154613985600d60050154613977600d60030154600d60020154613bad90919063ffffffff16565b613bad90919063ffffffff16565b613bad90919063ffffffff16565b613bad90919063ffffffff16565b905080600d600201819055506002600d800160006101000a81548160ff021916908360038111156139ce57fe5b021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b613abb846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c35565b50505050565b613b5e8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c35565b505050565b6000613ba583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613e80565b905092915050565b600080828401905083811015613c2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b613c548273ffffffffffffffffffffffffffffffffffffffff16613f40565b613cc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b60208310613d155780518252602082019150602081019050602083039250613cf2565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613d77576040519150601f19603f3d011682016040523d82523d6000602084013e613d7c565b606091505b509150915081613df4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b600081511115613e7a57808060200190516020811015613e1357600080fd5b8101908080519060200190929190505050613e79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614069602a913960400191505060405180910390fd5b5b50505050565b6000838311158290613f2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ef2578082015181840152602081019050613ed7565b50505050905090810190601f168015613f1f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015613f8257506000801b8214155b9250505091905056fe414c4552543a204e6f7420656e6f75676820616c6c6f77616e636520666f722062757921414c4552543a20546f6b656e20617265206e6f74207472616e73666572656420746f204d61726b657421414c4552543a204e6f7420656e676f75676820746f6b656e20706c656173652063616c6c207468652061646d696e21414c4552543a20596f757220617265206e6f7420616c6c6f776564206f7220616c726561647920627579656420647572696e67207468697320706861736521414c4552543a205075626c69632053616c65206e6f74206f70656e64206e6f77215361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564414c4552543a204e6f7420656e6f756768206d6f6e657920666f72207061796d656e7421a2646970667358221220167026b29a667559cb11a081104eb0b946483e53ab15652e61b36ccdb9f774bd64736f6c634300060c0033