Address Details
contract
0x00CE58563CC60E9e8b7a40541BBB1F78262bde22
- Contract Name
- cStarIDO
- Creator
- 0x7f09ca–8815c7 at 0x927e47–eaca82
- 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
- 3 Transactions
- Transfers
- 3 Transfers
- Gas Used
- 373,232
- Last Balance Update
- 7702671
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-01T23:23:59.883741Z
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; 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.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.iAcesAmount = 0; TokenMarket.iKingsAmount = 0; TokenMarket.iJacksAmount = 0; TokenMarket.iGuardsAmount = 0; 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.iTokenPrice) / 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 allowance for buy!"); require(TokenMarket.iAcesAmount >= TokenMarket.iAcesBatch, "ALERT: Not enough 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.iTokenPrice) / 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.iTokenPrice) / 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.iTokenPrice) / 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":"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
0x6080604052600760095562278d00600a553480156200001d57600080fd5b50604051620043db380380620043db833981810160405260e08110156200004357600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600a81905550600060028581620001a757fe5b04905085600d60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600d6001018190555080600d60020181905550606460238202816200021057fe5b04600d60030181905550606460148202816200022857fe5b04600d60050181905550606460148202816200024057fe5b04600d60070181905550606460198202816200025857fe5b04600d6009018190555083600d600b01819055506000600d600c0160006101000a81548160ff021916908360038111156200028f57fe5b0217905550505050505050505061412f80620002ac6000396000f3fe6080604052600436106100e85760003560e01c8063558a04ae1161008a5780638c91084e116100595780638c91084e146103d5578063a0bc6d2614610475578063b585209b1461048c578063c57a0295146104a3576100e8565b8063558a04ae146102b557806355ae59a3146102eb578063704b6c02146103295780638980f11f1461037a576100e8565b80632d296bf1116100c65780632d296bf11461017e57806339b87c8f146101ac5780634eb0d099146101e7578063556de82d1461024e576100e8565b80630c9e1e8e146100ed57806318494108146100f75780632231da271461010e575b600080fd5b6100f56104e4565b005b34801561010357600080fd5b5061010c611796565b005b34801561011a57600080fd5b5061015d6004803603602081101561013157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b1c565b6040518082600481111561016d57fe5b815260200191505060405180910390f35b6101aa6004803603602081101561019457600080fd5b8101908080359060200190929190505050611b3c565b005b3480156101b857600080fd5b506101e5600480360360208110156101cf57600080fd5b8101908080359060200190929190505050612096565b005b3480156101f357600080fd5b506102366004803603602081101561020a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121b9565b60405180821515815260200191505060405180910390f35b34801561025a57600080fd5b5061029d6004803603602081101561027157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061220f565b60405180821515815260200191505060405180910390f35b3480156102c157600080fd5b506102ca61222f565b604051808260038111156102da57fe5b815260200191505060405180910390f35b3480156102f757600080fd5b506103276004803603602081101561030e57600080fd5b81019080803560ff169060200190929190505050612249565b005b34801561033557600080fd5b506103786004803603602081101561034c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061238b565b005b34801561038657600080fd5b506103d36004803603604081101561039d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506124e8565b005b3480156103e157600080fd5b506103ea6126a5565b604051808e73ffffffffffffffffffffffffffffffffffffffff1681526020018d81526020018c81526020018b81526020018a815260200189815260200188815260200187815260200186815260200185815260200184815260200183815260200182600381111561045857fe5b81526020019d505050505050505050505050505060405180910390f35b34801561048157600080fd5b5061048a612726565b005b34801561049857600080fd5b506104a161380c565b005b3480156104af57600080fd5b506104b86139eb565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160038111156104f157fe5b600d600c0160009054906101000a900460ff16600381111561050f57fe5b14610582576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f414c4552543a204d61726b6574206e6f74206f70656e6564210000000000000081525060200191505060405180910390fd5b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461062b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f81526020018061401e603f913960400191505060405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506001600481111561068957fe5b81600481111561069557fe5b1415610abb576000670de0b6b3a7640000600d600b0154600d6004015402816106ba57fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561074757600080fd5b505afa15801561075b573d6000803e3d6000fd5b505050506040513d602081101561077157600080fd5b810190808051906020019092919050505010156107f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561089e57600080fd5b505afa1580156108b2573d6000803e3d6000fd5b505050506040513d60208110156108c857600080fd5b81019080805190602001909291905050501015610930576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613fa16024913960400191505060405180910390fd5b600d60040154600d600301541015610993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061407e602e913960400191505060405180910390fd5b6109e2333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a15909392919063ffffffff16565b610a3733600d60040154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ad69092919063ffffffff16565b610a54600d60040154600d60030154613b7890919063ffffffff16565b600d600301819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050611793565b60026004811115610ac857fe5b816004811115610ad457fe5b1415610f17576000670de0b6b3a7640000600d600b0154600d600601540281610af957fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610b8657600080fd5b505afa158015610b9a573d6000803e3d6000fd5b505050506040513d6020811015610bb057600080fd5b81019080805190602001909291905050501015610c35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015610cdd57600080fd5b505afa158015610cf1573d6000803e3d6000fd5b505050506040513d6020811015610d0757600080fd5b81019080805190602001909291905050501015610d8c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b600d60060154600d600501541015610def576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fef602f913960400191505060405180910390fd5b610e3e333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a15909392919063ffffffff16565b610e9333600d60060154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ad69092919063ffffffff16565b610eb0600d60060154600d60050154613b7890919063ffffffff16565b600d600501819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050611792565b60036004811115610f2457fe5b816004811115610f3057fe5b1415611356576000670de0b6b3a7640000600d600b0154600d600801540281610f5557fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610fe257600080fd5b505afa158015610ff6573d6000803e3d6000fd5b505050506040513d602081101561100c57600080fd5b81019080805190602001909291905050501015611091576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561113957600080fd5b505afa15801561114d573d6000803e3d6000fd5b505050506040513d602081101561116357600080fd5b810190808051906020019092919050505010156111cb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613fa16024913960400191505060405180910390fd5b600d60080154600d60070154101561122e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fef602f913960400191505060405180910390fd5b61127d333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a15909392919063ffffffff16565b6112d233600d60080154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ad69092919063ffffffff16565b6112ef600d60080154600d60070154613b7890919063ffffffff16565b600d600701819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050611791565b60048081111561136257fe5b81600481111561136e57fe5b1415611790576000670de0b6b3a7640000600d600b0154600d600a0154028161139357fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561142057600080fd5b505afa158015611434573d6000803e3d6000fd5b505050506040513d602081101561144a57600080fd5b810190808051906020019092919050505010156114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561157757600080fd5b505afa15801561158b573d6000803e3d6000fd5b505050506040513d60208110156115a157600080fd5b81019080805190602001909291905050501015611609576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613fa16024913960400191505060405180910390fd5b600d600a0154600d60090154101561166c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fef602f913960400191505060405180910390fd5b6116bb333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a15909392919063ffffffff16565b61171033600d600a0154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ad69092919063ffffffff16565b61172d600d600a0154600d60090154613b7890919063ffffffff16565b600d600901819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505b5b5b5b50565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061183d5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6118af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b6003808111156118bb57fe5b600d600c0160009054906101000a900460ff1660038111156118d957fe5b1461194c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2053616c65206973206f70656e2c206e6f207061796f7574210081525060200191505060405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119d757600080fd5b505afa1580156119eb573d6000803e3d6000fd5b505050506040513d6020811015611a0157600080fd5b8101908080519060200190929190505050905060006064600954830281611a2457fe5b049050611a3a8183613b7890919063ffffffff16565b9150611aa960008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ad69092919063ffffffff16565b611b18600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ad69092919063ffffffff16565b5050565b600c6020528060005260406000206000915054906101000a900460ff1681565b60008111611bb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a20596f752063616e206e6f7420627579206e6f7468696e67210081525060200191505060405180910390fd5b60026003811115611bbf57fe5b600d600c0160009054906101000a900460ff166003811115611bdd57fe5b14611c33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061405d6021913960400191505060405180910390fd5b6000670de0b6b3a7640000600d600b0154830281611c4d57fe5b0490506000600d6002015411611ccb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f414c4552543a20436f6e747261637420697320656d707479000000000000000081525060200191505060405180910390fd5b81600d600201541015611d46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20746f20627579210081525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611dd057600080fd5b505afa158015611de4573d6000803e3d6000fd5b505050506040513d6020811015611dfa57600080fd5b81019080805190602001909291905050501015611e62576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806140d66024913960400191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611f0a57600080fd5b505afa158015611f1e573d6000803e3d6000fd5b505050506040513d6020811015611f3457600080fd5b81019080805190602001909291905050501015611f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613fa16024913960400191505060405180910390fd5b611feb333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a15909392919063ffffffff16565b61203b3383600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ad69092919063ffffffff16565b61205382600d60020154613b7890919063ffffffff16565b600d600201819055506000600d600201541415612092576003600d600c0160006101000a81548160ff0219169083600381111561208c57fe5b02179055505b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061213d5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6121af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b8060098190555050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600b6020528060005260406000206000915054906101000a900460ff1681565b6000600d600c0160009054906101000a900460ff16905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806122f05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b80600d600c0160006101000a81548160ff0219169083600381111561238357fe5b021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806124325750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6124a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061258f5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612601576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b61264c60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff16613ad69092919063ffffffff16565b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa288282604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b600d8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b01549080600c0160009054906101000a900460ff1690508d565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127cd5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61283f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b600d60010154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156128d157600080fd5b505afa1580156128e5573d6000803e3d6000fd5b505050506040513d60208110156128fb57600080fd5b81019080805190602001909291905050501015612963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613fc5602a913960400191505060405180910390fd5b606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166317ad56276040518163ffffffff1660e01b815260040160006040518083038186803b1580156129ce57600080fd5b505afa1580156129e2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612a0c57600080fd5b8101908080516040519392919084640100000000821115612a2c57600080fd5b83820191506020820185811115612a4257600080fd5b8251866020820283011164010000000082111715612a5f57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612a96578082015181840152602081019050612a7b565b5050505090500160405260200180516040519392919084640100000000821115612abf57600080fd5b83820191506020820185811115612ad557600080fd5b8251866020820283011164010000000082111715612af257600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612b29578082015181840152602081019050612b0e565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632746a2b26040518163ffffffff1660e01b815260040160006040518083038186803b158015612ba557600080fd5b505afa158015612bb9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612be357600080fd5b8101908080516040519392919084640100000000821115612c0357600080fd5b83820191506020820185811115612c1957600080fd5b8251866020820283011164010000000082111715612c3657600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612c6d578082015181840152602081019050612c52565b5050505090500160405260200180516040519392919084640100000000821115612c9657600080fd5b83820191506020820185811115612cac57600080fd5b8251866020820283011164010000000082111715612cc957600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612d00578082015181840152602081019050612ce5565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663747f58426040518163ffffffff1660e01b815260040160006040518083038186803b158015612d7c57600080fd5b505afa158015612d90573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612dba57600080fd5b8101908080516040519392919084640100000000821115612dda57600080fd5b83820191506020820185811115612df057600080fd5b8251866020820283011164010000000082111715612e0d57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612e44578082015181840152602081019050612e29565b5050505090500160405260200180516040519392919084640100000000821115612e6d57600080fd5b83820191506020820185811115612e8357600080fd5b8251866020820283011164010000000082111715612ea057600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612ed7578082015181840152602081019050612ebc565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f0ef21776040518163ffffffff1660e01b815260040160006040518083038186803b158015612f5357600080fd5b505afa158015612f67573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612f9157600080fd5b8101908080516040519392919084640100000000821115612fb157600080fd5b83820191506020820185811115612fc757600080fd5b8251866020820283011164010000000082111715612fe457600080fd5b8083526020830192505050908051906020019060200280838360005b8381101561301b578082015181840152602081019050613000565b505050509050016040526020018051604051939291908464010000000082111561304457600080fd5b8382019150602082018581111561305a57600080fd5b825186602082028301116401000000008211171561307757600080fd5b8083526020830192505050908051906020019060200280838360005b838110156130ae578082015181840152602081019050613093565b50505050905001604052505050915091506000885111156132855760005b88518110156132575742600a548983815181106130e557fe5b602002602001015101101561324a57600389828151811061310257fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008b848151811061317c57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c60008b84815181106131e757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083600481111561324457fe5b02179055505b80806001019150506130cc565b506000600380549050111561328457600380549050600d600301548161327957fe5b04600d600401819055505b5b60008651111561344b5760005b865181101561341d5742600a548783815181106132ab57fe5b60200260200101510110156134105760048782815181106132c857fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b600089848151811061334257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600c60008984815181106133ad57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083600481111561340a57fe5b02179055505b8080600101915050613292565b506000600480549050111561344a57600480549050600d600501548161343f57fe5b04600d600601819055505b5b600060058054905011156136155760005b84518110156135e75742600a5485838151811061347557fe5b60200260200101510110156135da57600585828151811061349257fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b600087848151811061350c57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506003600c600087848151811061357757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360048111156135d457fe5b02179055505b808060010191505061345c565b506000600580549050111561361457600580549050600d600701548161360957fe5b04600d600801819055505b5b6000825111156137db5760005b82518110156137ad5742600a5483838151811061363b57fe5b60200260200101510110156137a057600683828151811061365857fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008584815181106136d257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506004600c600085848151811061373d57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083600481111561379a57fe5b02179055505b8080600101915050613622565b50600060068054905011156137da57600680549050600d60090154816137cf57fe5b04600d600a01819055505b5b6001600d600c0160006101000a81548160ff021916908360038111156137fd57fe5b02179055505050505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806138b35750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b613925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b6000613989600d6009015461397b600d6007015461396d600d6005015461395f600d60030154600d60020154613bc290919063ffffffff16565b613bc290919063ffffffff16565b613bc290919063ffffffff16565b613bc290919063ffffffff16565b905080600d600201819055506000600d600301819055506000600d600501819055506000600d600701819055506000600d600901819055506002600d600c0160006101000a81548160ff021916908360038111156139e357fe5b021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b613ad0846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c4a565b50505050565b613b738363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c4a565b505050565b6000613bba83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613e95565b905092915050565b600080828401905083811015613c40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b613c698273ffffffffffffffffffffffffffffffffffffffff16613f55565b613cdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b60208310613d2a5780518252602082019150602081019050602083039250613d07565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613d8c576040519150601f19603f3d011682016040523d82523d6000602084013e613d91565b606091505b509150915081613e09576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b600081511115613e8f57808060200190516020811015613e2857600080fd5b8101908080519060200190929190505050613e8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806140ac602a913960400191505060405180910390fd5b5b50505050565b6000838311158290613f42576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f07578082015181840152602081019050613eec565b50505050905090810190601f168015613f345780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015613f9757506000801b8214155b9250505091905056fe414c4552543a204e6f7420656e6f75676820616c6c6f77616e636520666f722062757921414c4552543a20546f6b656e20617265206e6f74207472616e73666572656420746f204d61726b657421414c4552543a204e6f7420656e676f75676820746f6b656e20706c656173652063616c6c207468652061646d696e21414c4552543a20596f757220617265206e6f7420616c6c6f776564206f7220616c726561647920627579656420647572696e67207468697320706861736521414c4552543a205075626c69632053616c65206e6f74206f70656e64206e6f7721414c4552543a204e6f7420656e6f75676820746f6b656e20706c656173652063616c6c207468652061646d696e215361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564414c4552543a204e6f7420656e6f756768206d6f6e657920666f72207061796d656e7421a264697066735822122043017e3b10ec0607a2d7b30baf839569490459518ee961095d08cfbff2a0d06964736f6c634300060c00330000000000000000000000004d06464bc97af140122153dba02b11dfdf7f8134000000000000000000000000874069fa1eb16d44d622f2e0ca25eea172369bc1000000000000000000000000452ef5a4bd00796e62e5e5758548e0da6e8ccdf3000000000000000000000000000000000000000000000a968163f0a57b40000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000001b3c1205dbb7ca4e3b1780a86d147dccf4b0dc57000000000000000000000000000000000000000000000000000000000000003c
Deployed ByteCode
0x6080604052600436106100e85760003560e01c8063558a04ae1161008a5780638c91084e116100595780638c91084e146103d5578063a0bc6d2614610475578063b585209b1461048c578063c57a0295146104a3576100e8565b8063558a04ae146102b557806355ae59a3146102eb578063704b6c02146103295780638980f11f1461037a576100e8565b80632d296bf1116100c65780632d296bf11461017e57806339b87c8f146101ac5780634eb0d099146101e7578063556de82d1461024e576100e8565b80630c9e1e8e146100ed57806318494108146100f75780632231da271461010e575b600080fd5b6100f56104e4565b005b34801561010357600080fd5b5061010c611796565b005b34801561011a57600080fd5b5061015d6004803603602081101561013157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b1c565b6040518082600481111561016d57fe5b815260200191505060405180910390f35b6101aa6004803603602081101561019457600080fd5b8101908080359060200190929190505050611b3c565b005b3480156101b857600080fd5b506101e5600480360360208110156101cf57600080fd5b8101908080359060200190929190505050612096565b005b3480156101f357600080fd5b506102366004803603602081101561020a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121b9565b60405180821515815260200191505060405180910390f35b34801561025a57600080fd5b5061029d6004803603602081101561027157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061220f565b60405180821515815260200191505060405180910390f35b3480156102c157600080fd5b506102ca61222f565b604051808260038111156102da57fe5b815260200191505060405180910390f35b3480156102f757600080fd5b506103276004803603602081101561030e57600080fd5b81019080803560ff169060200190929190505050612249565b005b34801561033557600080fd5b506103786004803603602081101561034c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061238b565b005b34801561038657600080fd5b506103d36004803603604081101561039d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506124e8565b005b3480156103e157600080fd5b506103ea6126a5565b604051808e73ffffffffffffffffffffffffffffffffffffffff1681526020018d81526020018c81526020018b81526020018a815260200189815260200188815260200187815260200186815260200185815260200184815260200183815260200182600381111561045857fe5b81526020019d505050505050505050505050505060405180910390f35b34801561048157600080fd5b5061048a612726565b005b34801561049857600080fd5b506104a161380c565b005b3480156104af57600080fd5b506104b86139eb565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160038111156104f157fe5b600d600c0160009054906101000a900460ff16600381111561050f57fe5b14610582576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f414c4552543a204d61726b6574206e6f74206f70656e6564210000000000000081525060200191505060405180910390fd5b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461062b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f81526020018061401e603f913960400191505060405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506001600481111561068957fe5b81600481111561069557fe5b1415610abb576000670de0b6b3a7640000600d600b0154600d6004015402816106ba57fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561074757600080fd5b505afa15801561075b573d6000803e3d6000fd5b505050506040513d602081101561077157600080fd5b810190808051906020019092919050505010156107f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561089e57600080fd5b505afa1580156108b2573d6000803e3d6000fd5b505050506040513d60208110156108c857600080fd5b81019080805190602001909291905050501015610930576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613fa16024913960400191505060405180910390fd5b600d60040154600d600301541015610993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061407e602e913960400191505060405180910390fd5b6109e2333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a15909392919063ffffffff16565b610a3733600d60040154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ad69092919063ffffffff16565b610a54600d60040154600d60030154613b7890919063ffffffff16565b600d600301819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050611793565b60026004811115610ac857fe5b816004811115610ad457fe5b1415610f17576000670de0b6b3a7640000600d600b0154600d600601540281610af957fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610b8657600080fd5b505afa158015610b9a573d6000803e3d6000fd5b505050506040513d6020811015610bb057600080fd5b81019080805190602001909291905050501015610c35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015610cdd57600080fd5b505afa158015610cf1573d6000803e3d6000fd5b505050506040513d6020811015610d0757600080fd5b81019080805190602001909291905050501015610d8c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b600d60060154600d600501541015610def576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fef602f913960400191505060405180910390fd5b610e3e333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a15909392919063ffffffff16565b610e9333600d60060154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ad69092919063ffffffff16565b610eb0600d60060154600d60050154613b7890919063ffffffff16565b600d600501819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050611792565b60036004811115610f2457fe5b816004811115610f3057fe5b1415611356576000670de0b6b3a7640000600d600b0154600d600801540281610f5557fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610fe257600080fd5b505afa158015610ff6573d6000803e3d6000fd5b505050506040513d602081101561100c57600080fd5b81019080805190602001909291905050501015611091576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561113957600080fd5b505afa15801561114d573d6000803e3d6000fd5b505050506040513d602081101561116357600080fd5b810190808051906020019092919050505010156111cb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613fa16024913960400191505060405180910390fd5b600d60080154600d60070154101561122e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fef602f913960400191505060405180910390fd5b61127d333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a15909392919063ffffffff16565b6112d233600d60080154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ad69092919063ffffffff16565b6112ef600d60080154600d60070154613b7890919063ffffffff16565b600d600701819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050611791565b60048081111561136257fe5b81600481111561136e57fe5b1415611790576000670de0b6b3a7640000600d600b0154600d600a0154028161139357fe5b04905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561142057600080fd5b505afa158015611434573d6000803e3d6000fd5b505050506040513d602081101561144a57600080fd5b810190808051906020019092919050505010156114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561157757600080fd5b505afa15801561158b573d6000803e3d6000fd5b505050506040513d60208110156115a157600080fd5b81019080805190602001909291905050501015611609576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613fa16024913960400191505060405180910390fd5b600d600a0154600d60090154101561166c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fef602f913960400191505060405180910390fd5b6116bb333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a15909392919063ffffffff16565b61171033600d600a0154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ad69092919063ffffffff16565b61172d600d600a0154600d60090154613b7890919063ffffffff16565b600d600901819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505b5b5b5b50565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061183d5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6118af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b6003808111156118bb57fe5b600d600c0160009054906101000a900460ff1660038111156118d957fe5b1461194c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2053616c65206973206f70656e2c206e6f207061796f7574210081525060200191505060405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119d757600080fd5b505afa1580156119eb573d6000803e3d6000fd5b505050506040513d6020811015611a0157600080fd5b8101908080519060200190929190505050905060006064600954830281611a2457fe5b049050611a3a8183613b7890919063ffffffff16565b9150611aa960008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ad69092919063ffffffff16565b611b18600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ad69092919063ffffffff16565b5050565b600c6020528060005260406000206000915054906101000a900460ff1681565b60008111611bb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a20596f752063616e206e6f7420627579206e6f7468696e67210081525060200191505060405180910390fd5b60026003811115611bbf57fe5b600d600c0160009054906101000a900460ff166003811115611bdd57fe5b14611c33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061405d6021913960400191505060405180910390fd5b6000670de0b6b3a7640000600d600b0154830281611c4d57fe5b0490506000600d6002015411611ccb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f414c4552543a20436f6e747261637420697320656d707479000000000000000081525060200191505060405180910390fd5b81600d600201541015611d46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20746f20627579210081525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611dd057600080fd5b505afa158015611de4573d6000803e3d6000fd5b505050506040513d6020811015611dfa57600080fd5b81019080805190602001909291905050501015611e62576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806140d66024913960400191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611f0a57600080fd5b505afa158015611f1e573d6000803e3d6000fd5b505050506040513d6020811015611f3457600080fd5b81019080805190602001909291905050501015611f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613fa16024913960400191505060405180910390fd5b611feb333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a15909392919063ffffffff16565b61203b3383600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613ad69092919063ffffffff16565b61205382600d60020154613b7890919063ffffffff16565b600d600201819055506000600d600201541415612092576003600d600c0160006101000a81548160ff0219169083600381111561208c57fe5b02179055505b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061213d5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6121af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b8060098190555050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600b6020528060005260406000206000915054906101000a900460ff1681565b6000600d600c0160009054906101000a900460ff16905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806122f05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b80600d600c0160006101000a81548160ff0219169083600381111561238357fe5b021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806124325750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6124a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061258f5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612601576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b61264c60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff16613ad69092919063ffffffff16565b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa288282604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b600d8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b01549080600c0160009054906101000a900460ff1690508d565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127cd5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61283f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b600d60010154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156128d157600080fd5b505afa1580156128e5573d6000803e3d6000fd5b505050506040513d60208110156128fb57600080fd5b81019080805190602001909291905050501015612963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613fc5602a913960400191505060405180910390fd5b606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166317ad56276040518163ffffffff1660e01b815260040160006040518083038186803b1580156129ce57600080fd5b505afa1580156129e2573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612a0c57600080fd5b8101908080516040519392919084640100000000821115612a2c57600080fd5b83820191506020820185811115612a4257600080fd5b8251866020820283011164010000000082111715612a5f57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612a96578082015181840152602081019050612a7b565b5050505090500160405260200180516040519392919084640100000000821115612abf57600080fd5b83820191506020820185811115612ad557600080fd5b8251866020820283011164010000000082111715612af257600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612b29578082015181840152602081019050612b0e565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632746a2b26040518163ffffffff1660e01b815260040160006040518083038186803b158015612ba557600080fd5b505afa158015612bb9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612be357600080fd5b8101908080516040519392919084640100000000821115612c0357600080fd5b83820191506020820185811115612c1957600080fd5b8251866020820283011164010000000082111715612c3657600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612c6d578082015181840152602081019050612c52565b5050505090500160405260200180516040519392919084640100000000821115612c9657600080fd5b83820191506020820185811115612cac57600080fd5b8251866020820283011164010000000082111715612cc957600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612d00578082015181840152602081019050612ce5565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663747f58426040518163ffffffff1660e01b815260040160006040518083038186803b158015612d7c57600080fd5b505afa158015612d90573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612dba57600080fd5b8101908080516040519392919084640100000000821115612dda57600080fd5b83820191506020820185811115612df057600080fd5b8251866020820283011164010000000082111715612e0d57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612e44578082015181840152602081019050612e29565b5050505090500160405260200180516040519392919084640100000000821115612e6d57600080fd5b83820191506020820185811115612e8357600080fd5b8251866020820283011164010000000082111715612ea057600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612ed7578082015181840152602081019050612ebc565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f0ef21776040518163ffffffff1660e01b815260040160006040518083038186803b158015612f5357600080fd5b505afa158015612f67573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612f9157600080fd5b8101908080516040519392919084640100000000821115612fb157600080fd5b83820191506020820185811115612fc757600080fd5b8251866020820283011164010000000082111715612fe457600080fd5b8083526020830192505050908051906020019060200280838360005b8381101561301b578082015181840152602081019050613000565b505050509050016040526020018051604051939291908464010000000082111561304457600080fd5b8382019150602082018581111561305a57600080fd5b825186602082028301116401000000008211171561307757600080fd5b8083526020830192505050908051906020019060200280838360005b838110156130ae578082015181840152602081019050613093565b50505050905001604052505050915091506000885111156132855760005b88518110156132575742600a548983815181106130e557fe5b602002602001015101101561324a57600389828151811061310257fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008b848151811061317c57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c60008b84815181106131e757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083600481111561324457fe5b02179055505b80806001019150506130cc565b506000600380549050111561328457600380549050600d600301548161327957fe5b04600d600401819055505b5b60008651111561344b5760005b865181101561341d5742600a548783815181106132ab57fe5b60200260200101510110156134105760048782815181106132c857fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b600089848151811061334257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600c60008984815181106133ad57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083600481111561340a57fe5b02179055505b8080600101915050613292565b506000600480549050111561344a57600480549050600d600501548161343f57fe5b04600d600601819055505b5b600060058054905011156136155760005b84518110156135e75742600a5485838151811061347557fe5b60200260200101510110156135da57600585828151811061349257fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b600087848151811061350c57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506003600c600087848151811061357757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360048111156135d457fe5b02179055505b808060010191505061345c565b506000600580549050111561361457600580549050600d600701548161360957fe5b04600d600801819055505b5b6000825111156137db5760005b82518110156137ad5742600a5483838151811061363b57fe5b60200260200101510110156137a057600683828151811061365857fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008584815181106136d257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506004600c600085848151811061373d57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083600481111561379a57fe5b02179055505b8080600101915050613622565b50600060068054905011156137da57600680549050600d60090154816137cf57fe5b04600d600a01819055505b5b6001600d600c0160006101000a81548160ff021916908360038111156137fd57fe5b02179055505050505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806138b35750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b613925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b6000613989600d6009015461397b600d6007015461396d600d6005015461395f600d60030154600d60020154613bc290919063ffffffff16565b613bc290919063ffffffff16565b613bc290919063ffffffff16565b613bc290919063ffffffff16565b905080600d600201819055506000600d600301819055506000600d600501819055506000600d600701819055506000600d600901819055506002600d600c0160006101000a81548160ff021916908360038111156139e357fe5b021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b613ad0846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c4a565b50505050565b613b738363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c4a565b505050565b6000613bba83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613e95565b905092915050565b600080828401905083811015613c40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b613c698273ffffffffffffffffffffffffffffffffffffffff16613f55565b613cdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b60208310613d2a5780518252602082019150602081019050602083039250613d07565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613d8c576040519150601f19603f3d011682016040523d82523d6000602084013e613d91565b606091505b509150915081613e09576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b600081511115613e8f57808060200190516020811015613e2857600080fd5b8101908080519060200190929190505050613e8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806140ac602a913960400191505060405180910390fd5b5b50505050565b6000838311158290613f42576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f07578082015181840152602081019050613eec565b50505050905090810190601f168015613f345780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015613f9757506000801b8214155b9250505091905056fe414c4552543a204e6f7420656e6f75676820616c6c6f77616e636520666f722062757921414c4552543a20546f6b656e20617265206e6f74207472616e73666572656420746f204d61726b657421414c4552543a204e6f7420656e676f75676820746f6b656e20706c656173652063616c6c207468652061646d696e21414c4552543a20596f757220617265206e6f7420616c6c6f776564206f7220616c726561647920627579656420647572696e67207468697320706861736521414c4552543a205075626c69632053616c65206e6f74206f70656e64206e6f7721414c4552543a204e6f7420656e6f75676820746f6b656e20706c656173652063616c6c207468652061646d696e215361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564414c4552543a204e6f7420656e6f756768206d6f6e657920666f72207061796d656e7421a264697066735822122043017e3b10ec0607a2d7b30baf839569490459518ee961095d08cfbff2a0d06964736f6c634300060c0033