Address Details
contract
0xf6b3285938AA98799e1CAD44C271123eA8f3A05A
- Contract Name
- cStarIDO
- Creator
- 0x7f09ca–8815c7 at 0xe455dd–6cb155
- 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
- 2 Transactions
- Transfers
- 2 Transfers
- Gas Used
- 88,866
- Last Balance Update
- 7690022
Transactions
Token Transfers
Internal Transactions
Coin Balance History
Logs
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-01T13:55:36.875275Z
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 - 1); 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 - 1); 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 - 1); 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 - 1); 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; 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; 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; 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; 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
0x6080604052600760095562278d00600a553480156200001d57600080fd5b506040516200437438038062004374833981810160405260e08110156200004357600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600a81905550600060028581620001a757fe5b04905085600d60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600d6001018190555080600d60020181905550606460238202816200021057fe5b04600d60030181905550606460148202816200022857fe5b04600d60050181905550606460148202816200024057fe5b04600d60070181905550606460198202816200025857fe5b04600d6009018190555083600d600b0181905550600284816200027757fe5b04600d600c01819055506000600d800160006101000a81548160ff02191690836003811115620002a357fe5b021790555050505050505050506140b480620002c06000396000f3fe6080604052600436106100e85760003560e01c8063558a04ae1161008a5780638c91084e116100595780638c91084e146103d5578063a0bc6d261461047c578063b585209b14610493578063c57a0295146104aa576100e8565b8063558a04ae146102b557806355ae59a3146102eb578063704b6c02146103295780638980f11f1461037a576100e8565b80632d296bf1116100c65780632d296bf11461017e57806339b87c8f146101ac5780634eb0d099146101e7578063556de82d1461024e576100e8565b80630c9e1e8e146100ed57806318494108146100f75780632231da271461010e575b600080fd5b6100f56104eb565b005b34801561010357600080fd5b5061010c61176d565b005b34801561011a57600080fd5b5061015d6004803603602081101561013157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611af2565b6040518082600481111561016d57fe5b815260200191505060405180910390f35b6101aa6004803603602081101561019457600080fd5b8101908080359060200190929190505050611b12565b005b3480156101b857600080fd5b506101e5600480360360208110156101cf57600080fd5b8101908080359060200190929190505050612067565b005b3480156101f357600080fd5b506102366004803603602081101561020a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061218a565b60405180821515815260200191505060405180910390f35b34801561025a57600080fd5b5061029d6004803603602081101561027157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121e0565b60405180821515815260200191505060405180910390f35b3480156102c157600080fd5b506102ca612200565b604051808260038111156102da57fe5b815260200191505060405180910390f35b3480156102f757600080fd5b506103276004803603602081101561030e57600080fd5b81019080803560ff169060200190929190505050612219565b005b34801561033557600080fd5b506103786004803603602081101561034c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061235a565b005b34801561038657600080fd5b506103d36004803603604081101561039d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506124b7565b005b3480156103e157600080fd5b506103ea612674565b604051808f73ffffffffffffffffffffffffffffffffffffffff1681526020018e81526020018d81526020018c81526020018b81526020018a815260200189815260200188815260200187815260200186815260200185815260200184815260200183815260200182600381111561045e57fe5b81526020019e50505050505050505050505050505060405180910390f35b34801561048857600080fd5b506104916126fb565b005b34801561049f57600080fd5b506104a86137ec565b005b3480156104b657600080fd5b506104bf61399e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160038111156104f857fe5b600d800160009054906101000a900460ff16600381111561051557fe5b14610588576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f414c4552543a204d61726b6574206e6f74206f70656e6564210000000000000081525060200191505060405180910390fd5b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180613fd1603f913960400191505060405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506001600481111561068f57fe5b81600481111561069b57fe5b1415610acb576000600d600c0154600d6004015402905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561073c57600080fd5b505afa158015610750573d6000803e3d6000fd5b505050506040513d602081101561076657600080fd5b8101908080519060200190929190505050116107ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561089257600080fd5b505afa1580156108a6573d6000803e3d6000fd5b505050506040513d60208110156108bc57600080fd5b810190808051906020019092919050505011610940576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b600d60040154600d6003015410156109a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fa2602f913960400191505060405180910390fd5b6109f2333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166139c8909392919063ffffffff16565b610a4733600d60040154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a899092919063ffffffff16565b610a64600d60040154600d60030154613b2b90919063ffffffff16565b600d600301819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505061176a565b60026004811115610ad857fe5b816004811115610ae457fe5b1415610f14576000600d600c0154600d6006015402905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610b8557600080fd5b505afa158015610b99573d6000803e3d6000fd5b505050506040513d6020811015610baf57600080fd5b810190808051906020019092919050505011610c33576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015610cdb57600080fd5b505afa158015610cef573d6000803e3d6000fd5b505050506040513d6020811015610d0557600080fd5b810190808051906020019092919050505011610d89576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b600d60060154600d600501541015610dec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fa2602f913960400191505060405180910390fd5b610e3b333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166139c8909392919063ffffffff16565b610e9033600d60060154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a899092919063ffffffff16565b610ead600d60060154600d60050154613b2b90919063ffffffff16565b600d600501819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050611769565b60036004811115610f2157fe5b816004811115610f2d57fe5b1415611340576000600d600c0154600d6008015402905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610fce57600080fd5b505afa158015610fe2573d6000803e3d6000fd5b505050506040513d6020811015610ff857600080fd5b81019080805190602001909291905050501161107c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561112457600080fd5b505afa158015611138573d6000803e3d6000fd5b505050506040513d602081101561114e57600080fd5b8101908080519060200190929190505050116111b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613f546024913960400191505060405180910390fd5b600d60080154600d600701541015611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fa2602f913960400191505060405180910390fd5b611267333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166139c8909392919063ffffffff16565b6112bc33600d60080154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a899092919063ffffffff16565b6112d9600d60080154600d60070154613b2b90919063ffffffff16565b600d600701819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050611768565b60048081111561134c57fe5b81600481111561135857fe5b1415611767576000600d600c0154600d600a015402905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156113f957600080fd5b505afa15801561140d573d6000803e3d6000fd5b505050506040513d602081101561142357600080fd5b8101908080519060200190929190505050116114a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561154f57600080fd5b505afa158015611563573d6000803e3d6000fd5b505050506040513d602081101561157957600080fd5b8101908080519060200190929190505050116115e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613f546024913960400191505060405180910390fd5b600d600a0154600d600901541015611643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fa2602f913960400191505060405180910390fd5b611692333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166139c8909392919063ffffffff16565b6116e733600d600a0154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a899092919063ffffffff16565b611704600d600a0154600d60090154613b2b90919063ffffffff16565b600d600901819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505b5b5b5b50565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806118145750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b60038081111561189257fe5b600d800160009054906101000a900460ff1660038111156118af57fe5b14611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2053616c65206973206f70656e2c206e6f207061796f7574210081525060200191505060405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119ad57600080fd5b505afa1580156119c1573d6000803e3d6000fd5b505050506040513d60208110156119d757600080fd5b81019080805190602001909291905050509050600060646009548302816119fa57fe5b049050611a108183613b2b90919063ffffffff16565b9150611a7f60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a899092919063ffffffff16565b611aee600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a899092919063ffffffff16565b5050565b600c6020528060005260406000206000915054906101000a900460ff1681565b60008111611b88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a20596f752063616e206e6f7420627579206e6f7468696e67210081525060200191505060405180910390fd5b60026003811115611b9557fe5b600d800160009054906101000a900460ff166003811115611bb257fe5b14611c08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806140106021913960400191505060405180910390fd5b6000670de0b6b3a7640000600d600b0154830281611c2257fe5b0490506000600d6002015411611ca0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f414c4552543a20436f6e747261637420697320656d707479000000000000000081525060200191505060405180910390fd5b81600d6002015411611d1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20746f20627579210081525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611da457600080fd5b505afa158015611db8573d6000803e3d6000fd5b505050506040513d6020811015611dce57600080fd5b810190808051906020019092919050505011611e35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061405b6024913960400191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611edd57600080fd5b505afa158015611ef1573d6000803e3d6000fd5b505050506040513d6020811015611f0757600080fd5b810190808051906020019092919050505011611f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613f546024913960400191505060405180910390fd5b611fbd333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166139c8909392919063ffffffff16565b61200d3383600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a899092919063ffffffff16565b61202582600d60020154613b2b90919063ffffffff16565b600d600201819055506000600d600201541415612063576003600d800160006101000a81548160ff0219169083600381111561205d57fe5b02179055505b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210e5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b8060098190555050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600b6020528060005260406000206000915054906101000a900460ff1681565b6000600d800160009054906101000a900460ff16905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806122c05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612332576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b80600d800160006101000a81548160ff0219169083600381111561235257fe5b021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806124015750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061255e5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6125d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b61261b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff16613a899092919063ffffffff16565b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa288282604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b600d8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b01549080600c01549080600d0160009054906101000a900460ff1690508e565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127a25750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b600d60010154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156128a657600080fd5b505afa1580156128ba573d6000803e3d6000fd5b505050506040513d60208110156128d057600080fd5b81019080805190602001909291905050501015612938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613f78602a913960400191505060405180910390fd5b606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166317ad56276040518163ffffffff1660e01b815260040160006040518083038186803b1580156129a357600080fd5b505afa1580156129b7573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060408110156129e157600080fd5b8101908080516040519392919084640100000000821115612a0157600080fd5b83820191506020820185811115612a1757600080fd5b8251866020820283011164010000000082111715612a3457600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612a6b578082015181840152602081019050612a50565b5050505090500160405260200180516040519392919084640100000000821115612a9457600080fd5b83820191506020820185811115612aaa57600080fd5b8251866020820283011164010000000082111715612ac757600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612afe578082015181840152602081019050612ae3565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632746a2b26040518163ffffffff1660e01b815260040160006040518083038186803b158015612b7a57600080fd5b505afa158015612b8e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612bb857600080fd5b8101908080516040519392919084640100000000821115612bd857600080fd5b83820191506020820185811115612bee57600080fd5b8251866020820283011164010000000082111715612c0b57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612c42578082015181840152602081019050612c27565b5050505090500160405260200180516040519392919084640100000000821115612c6b57600080fd5b83820191506020820185811115612c8157600080fd5b8251866020820283011164010000000082111715612c9e57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612cd5578082015181840152602081019050612cba565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663747f58426040518163ffffffff1660e01b815260040160006040518083038186803b158015612d5157600080fd5b505afa158015612d65573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612d8f57600080fd5b8101908080516040519392919084640100000000821115612daf57600080fd5b83820191506020820185811115612dc557600080fd5b8251866020820283011164010000000082111715612de257600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612e19578082015181840152602081019050612dfe565b5050505090500160405260200180516040519392919084640100000000821115612e4257600080fd5b83820191506020820185811115612e5857600080fd5b8251866020820283011164010000000082111715612e7557600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612eac578082015181840152602081019050612e91565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f0ef21776040518163ffffffff1660e01b815260040160006040518083038186803b158015612f2857600080fd5b505afa158015612f3c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612f6657600080fd5b8101908080516040519392919084640100000000821115612f8657600080fd5b83820191506020820185811115612f9c57600080fd5b8251866020820283011164010000000082111715612fb957600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612ff0578082015181840152602081019050612fd5565b505050509050016040526020018051604051939291908464010000000082111561301957600080fd5b8382019150602082018581111561302f57600080fd5b825186602082028301116401000000008211171561304c57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015613083578082015181840152602081019050613068565b505050509050016040525050509150915060008851111561325d5760005b600189510381101561322f5742600a548983815181106130bd57fe5b60200260200101510111156132225760038982815181106130da57fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008b848151811061315457fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c60008b84815181106131bf57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083600481111561321c57fe5b02179055505b80806001019150506130a1565b506000600380549050111561325c57600380549050600d600301548161325157fe5b04600d600401819055505b5b6000865111156134265760005b60018751038110156133f85742600a5487838151811061328657fe5b60200260200101510111156133eb5760048782815181106132a357fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b600089848151811061331d57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600c600089848151811061338857fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360048111156133e557fe5b02179055505b808060010191505061326a565b506000600480549050111561342557600480549050600d600501548161341a57fe5b04600d600601819055505b5b600060058054905011156135f35760005b60018551038110156135c55742600a5485838151811061345357fe5b60200260200101510111156135b857600585828151811061347057fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008784815181106134ea57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506003600c600087848151811061355557fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360048111156135b257fe5b02179055505b8080600101915050613437565b50600060058054905011156135f257600580549050600d60070154816135e757fe5b04600d600801819055505b5b6000825111156137bc5760005b600183510381101561378e5742600a5483838151811061361c57fe5b602002602001015101111561378157600683828151811061363957fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008584815181106136b357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506004600c600085848151811061371e57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083600481111561377b57fe5b02179055505b8080600101915050613600565b50600060068054905011156137bb57600680549050600d60090154816137b057fe5b04600d600a01819055505b5b6001600d800160006101000a81548160ff021916908360038111156137dd57fe5b02179055505050505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806138935750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b613905576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b6000613969600d6009015461395b600d6007015461394d600d6005015461393f600d60030154600d60020154613b7590919063ffffffff16565b613b7590919063ffffffff16565b613b7590919063ffffffff16565b613b7590919063ffffffff16565b905080600d600201819055506002600d800160006101000a81548160ff0219169083600381111561399657fe5b021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b613a83846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613bfd565b50505050565b613b268363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613bfd565b505050565b6000613b6d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613e48565b905092915050565b600080828401905083811015613bf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b613c1c8273ffffffffffffffffffffffffffffffffffffffff16613f08565b613c8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b60208310613cdd5780518252602082019150602081019050602083039250613cba565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613d3f576040519150601f19603f3d011682016040523d82523d6000602084013e613d44565b606091505b509150915081613dbc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b600081511115613e4257808060200190516020811015613ddb57600080fd5b8101908080519060200190929190505050613e41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614031602a913960400191505060405180910390fd5b5b50505050565b6000838311158290613ef5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613eba578082015181840152602081019050613e9f565b50505050905090810190601f168015613ee75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015613f4a57506000801b8214155b9250505091905056fe414c4552543a204e6f7420656e6f75676820616c6c6f77616e636520666f722062757921414c4552543a20546f6b656e20617265206e6f74207472616e73666572656420746f204d61726b657421414c4552543a204e6f7420656e676f75676820746f6b656e20706c656173652063616c6c207468652061646d696e21414c4552543a20596f757220617265206e6f7420616c6c6f776564206f7220616c726561647920627579656420647572696e67207468697320706861736521414c4552543a205075626c69632053616c65206e6f74206f70656e64206e6f77215361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564414c4552543a204e6f7420656e6f756768206d6f6e657920666f72207061796d656e7421a26469706673582212200a2c8b6d62d3edeb1a14073022f281f58097bb71c543175842a939ea962d020464736f6c634300060c00330000000000000000000000004d06464bc97af140122153dba02b11dfdf7f8134000000000000000000000000007b1dcc6ac10f3f689eb1edce7a2338cd39ceed000000000000000000000000452ef5a4bd00796e62e5e5758548e0da6e8ccdf3000000000000000000000000000000000000000000000a968163f0a57b40000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000001b3c1205dbb7ca4e3b1780a86d147dccf4b0dc57000000000000000000000000000000000000000000000000000000000000003c
Deployed ByteCode
0x6080604052600436106100e85760003560e01c8063558a04ae1161008a5780638c91084e116100595780638c91084e146103d5578063a0bc6d261461047c578063b585209b14610493578063c57a0295146104aa576100e8565b8063558a04ae146102b557806355ae59a3146102eb578063704b6c02146103295780638980f11f1461037a576100e8565b80632d296bf1116100c65780632d296bf11461017e57806339b87c8f146101ac5780634eb0d099146101e7578063556de82d1461024e576100e8565b80630c9e1e8e146100ed57806318494108146100f75780632231da271461010e575b600080fd5b6100f56104eb565b005b34801561010357600080fd5b5061010c61176d565b005b34801561011a57600080fd5b5061015d6004803603602081101561013157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611af2565b6040518082600481111561016d57fe5b815260200191505060405180910390f35b6101aa6004803603602081101561019457600080fd5b8101908080359060200190929190505050611b12565b005b3480156101b857600080fd5b506101e5600480360360208110156101cf57600080fd5b8101908080359060200190929190505050612067565b005b3480156101f357600080fd5b506102366004803603602081101561020a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061218a565b60405180821515815260200191505060405180910390f35b34801561025a57600080fd5b5061029d6004803603602081101561027157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121e0565b60405180821515815260200191505060405180910390f35b3480156102c157600080fd5b506102ca612200565b604051808260038111156102da57fe5b815260200191505060405180910390f35b3480156102f757600080fd5b506103276004803603602081101561030e57600080fd5b81019080803560ff169060200190929190505050612219565b005b34801561033557600080fd5b506103786004803603602081101561034c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061235a565b005b34801561038657600080fd5b506103d36004803603604081101561039d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506124b7565b005b3480156103e157600080fd5b506103ea612674565b604051808f73ffffffffffffffffffffffffffffffffffffffff1681526020018e81526020018d81526020018c81526020018b81526020018a815260200189815260200188815260200187815260200186815260200185815260200184815260200183815260200182600381111561045e57fe5b81526020019e50505050505050505050505050505060405180910390f35b34801561048857600080fd5b506104916126fb565b005b34801561049f57600080fd5b506104a86137ec565b005b3480156104b657600080fd5b506104bf61399e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160038111156104f857fe5b600d800160009054906101000a900460ff16600381111561051557fe5b14610588576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f414c4552543a204d61726b6574206e6f74206f70656e6564210000000000000081525060200191505060405180910390fd5b60011515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180613fd1603f913960400191505060405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506001600481111561068f57fe5b81600481111561069b57fe5b1415610acb576000600d600c0154600d6004015402905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561073c57600080fd5b505afa158015610750573d6000803e3d6000fd5b505050506040513d602081101561076657600080fd5b8101908080519060200190929190505050116107ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561089257600080fd5b505afa1580156108a6573d6000803e3d6000fd5b505050506040513d60208110156108bc57600080fd5b810190808051906020019092919050505011610940576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b600d60040154600d6003015410156109a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fa2602f913960400191505060405180910390fd5b6109f2333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166139c8909392919063ffffffff16565b610a4733600d60040154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a899092919063ffffffff16565b610a64600d60040154600d60030154613b2b90919063ffffffff16565b600d600301819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505061176a565b60026004811115610ad857fe5b816004811115610ae457fe5b1415610f14576000600d600c0154600d6006015402905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610b8557600080fd5b505afa158015610b99573d6000803e3d6000fd5b505050506040513d6020811015610baf57600080fd5b810190808051906020019092919050505011610c33576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015610cdb57600080fd5b505afa158015610cef573d6000803e3d6000fd5b505050506040513d6020811015610d0557600080fd5b810190808051906020019092919050505011610d89576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b600d60060154600d600501541015610dec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fa2602f913960400191505060405180910390fd5b610e3b333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166139c8909392919063ffffffff16565b610e9033600d60060154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a899092919063ffffffff16565b610ead600d60060154600d60050154613b2b90919063ffffffff16565b600d600501819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050611769565b60036004811115610f2157fe5b816004811115610f2d57fe5b1415611340576000600d600c0154600d6008015402905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610fce57600080fd5b505afa158015610fe2573d6000803e3d6000fd5b505050506040513d6020811015610ff857600080fd5b81019080805190602001909291905050501161107c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561112457600080fd5b505afa158015611138573d6000803e3d6000fd5b505050506040513d602081101561114e57600080fd5b8101908080519060200190929190505050116111b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613f546024913960400191505060405180910390fd5b600d60080154600d600701541015611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fa2602f913960400191505060405180910390fd5b611267333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166139c8909392919063ffffffff16565b6112bc33600d60080154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a899092919063ffffffff16565b6112d9600d60080154600d60070154613b2b90919063ffffffff16565b600d600701819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050611768565b60048081111561134c57fe5b81600481111561135857fe5b1415611767576000600d600c0154600d600a015402905080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156113f957600080fd5b505afa15801561140d573d6000803e3d6000fd5b505050506040513d602081101561142357600080fd5b8101908080519060200190929190505050116114a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20666f72206275792181525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561154f57600080fd5b505afa158015611563573d6000803e3d6000fd5b505050506040513d602081101561157957600080fd5b8101908080519060200190929190505050116115e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613f546024913960400191505060405180910390fd5b600d600a0154600d600901541015611643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fa2602f913960400191505060405180910390fd5b611692333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166139c8909392919063ffffffff16565b6116e733600d600a0154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a899092919063ffffffff16565b611704600d600a0154600d60090154613b2b90919063ffffffff16565b600d600901819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505b5b5b5b50565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806118145750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b60038081111561189257fe5b600d800160009054906101000a900460ff1660038111156118af57fe5b14611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2053616c65206973206f70656e2c206e6f207061796f7574210081525060200191505060405180910390fd5b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119ad57600080fd5b505afa1580156119c1573d6000803e3d6000fd5b505050506040513d60208110156119d757600080fd5b81019080805190602001909291905050509050600060646009548302816119fa57fe5b049050611a108183613b2b90919063ffffffff16565b9150611a7f60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a899092919063ffffffff16565b611aee600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a899092919063ffffffff16565b5050565b600c6020528060005260406000206000915054906101000a900460ff1681565b60008111611b88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a20596f752063616e206e6f7420627579206e6f7468696e67210081525060200191505060405180910390fd5b60026003811115611b9557fe5b600d800160009054906101000a900460ff166003811115611bb257fe5b14611c08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806140106021913960400191505060405180910390fd5b6000670de0b6b3a7640000600d600b0154830281611c2257fe5b0490506000600d6002015411611ca0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f414c4552543a20436f6e747261637420697320656d707479000000000000000081525060200191505060405180910390fd5b81600d6002015411611d1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a204e6f7420656e6f75676820746f6b656e20746f20627579210081525060200191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611da457600080fd5b505afa158015611db8573d6000803e3d6000fd5b505050506040513d6020811015611dce57600080fd5b810190808051906020019092919050505011611e35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061405b6024913960400191505060405180910390fd5b80600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611edd57600080fd5b505afa158015611ef1573d6000803e3d6000fd5b505050506040513d6020811015611f0757600080fd5b810190808051906020019092919050505011611f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613f546024913960400191505060405180910390fd5b611fbd333083600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166139c8909392919063ffffffff16565b61200d3383600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a899092919063ffffffff16565b61202582600d60020154613b2b90919063ffffffff16565b600d600201819055506000600d600201541415612063576003600d800160006101000a81548160ff0219169083600381111561205d57fe5b02179055505b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210e5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b8060098190555050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600b6020528060005260406000206000915054906101000a900460ff1681565b6000600d800160009054906101000a900460ff16905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806122c05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612332576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b80600d800160006101000a81548160ff0219169083600381111561235257fe5b021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806124015750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061255e5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6125d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b61261b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff16613a899092919063ffffffff16565b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa288282604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b600d8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b01549080600c01549080600d0160009054906101000a900460ff1690508e565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127a25750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b600d60010154600d60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156128a657600080fd5b505afa1580156128ba573d6000803e3d6000fd5b505050506040513d60208110156128d057600080fd5b81019080805190602001909291905050501015612938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613f78602a913960400191505060405180910390fd5b606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166317ad56276040518163ffffffff1660e01b815260040160006040518083038186803b1580156129a357600080fd5b505afa1580156129b7573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060408110156129e157600080fd5b8101908080516040519392919084640100000000821115612a0157600080fd5b83820191506020820185811115612a1757600080fd5b8251866020820283011164010000000082111715612a3457600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612a6b578082015181840152602081019050612a50565b5050505090500160405260200180516040519392919084640100000000821115612a9457600080fd5b83820191506020820185811115612aaa57600080fd5b8251866020820283011164010000000082111715612ac757600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612afe578082015181840152602081019050612ae3565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632746a2b26040518163ffffffff1660e01b815260040160006040518083038186803b158015612b7a57600080fd5b505afa158015612b8e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612bb857600080fd5b8101908080516040519392919084640100000000821115612bd857600080fd5b83820191506020820185811115612bee57600080fd5b8251866020820283011164010000000082111715612c0b57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612c42578082015181840152602081019050612c27565b5050505090500160405260200180516040519392919084640100000000821115612c6b57600080fd5b83820191506020820185811115612c8157600080fd5b8251866020820283011164010000000082111715612c9e57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612cd5578082015181840152602081019050612cba565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663747f58426040518163ffffffff1660e01b815260040160006040518083038186803b158015612d5157600080fd5b505afa158015612d65573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612d8f57600080fd5b8101908080516040519392919084640100000000821115612daf57600080fd5b83820191506020820185811115612dc557600080fd5b8251866020820283011164010000000082111715612de257600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612e19578082015181840152602081019050612dfe565b5050505090500160405260200180516040519392919084640100000000821115612e4257600080fd5b83820191506020820185811115612e5857600080fd5b8251866020820283011164010000000082111715612e7557600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612eac578082015181840152602081019050612e91565b5050505090500160405250505091509150606080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f0ef21776040518163ffffffff1660e01b815260040160006040518083038186803b158015612f2857600080fd5b505afa158015612f3c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506040811015612f6657600080fd5b8101908080516040519392919084640100000000821115612f8657600080fd5b83820191506020820185811115612f9c57600080fd5b8251866020820283011164010000000082111715612fb957600080fd5b8083526020830192505050908051906020019060200280838360005b83811015612ff0578082015181840152602081019050612fd5565b505050509050016040526020018051604051939291908464010000000082111561301957600080fd5b8382019150602082018581111561302f57600080fd5b825186602082028301116401000000008211171561304c57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015613083578082015181840152602081019050613068565b505050509050016040525050509150915060008851111561325d5760005b600189510381101561322f5742600a548983815181106130bd57fe5b60200260200101510111156132225760038982815181106130da57fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008b848151811061315457fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c60008b84815181106131bf57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083600481111561321c57fe5b02179055505b80806001019150506130a1565b506000600380549050111561325c57600380549050600d600301548161325157fe5b04600d600401819055505b5b6000865111156134265760005b60018751038110156133f85742600a5487838151811061328657fe5b60200260200101510111156133eb5760048782815181106132a357fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b600089848151811061331d57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506002600c600089848151811061338857fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360048111156133e557fe5b02179055505b808060010191505061326a565b506000600480549050111561342557600480549050600d600501548161341a57fe5b04600d600601819055505b5b600060058054905011156135f35760005b60018551038110156135c55742600a5485838151811061345357fe5b60200260200101510111156135b857600585828151811061347057fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008784815181106134ea57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506003600c600087848151811061355557fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360048111156135b257fe5b02179055505b8080600101915050613437565b50600060058054905011156135f257600580549050600d60070154816135e757fe5b04600d600801819055505b5b6000825111156137bc5760005b600183510381101561378e5742600a5483838151811061361c57fe5b602002602001015101111561378157600683828151811061363957fe5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008584815181106136b357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506004600c600085848151811061371e57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083600481111561377b57fe5b02179055505b8080600101915050613600565b50600060068054905011156137bb57600680549050600d60090154816137b057fe5b04600d600a01819055505b5b6001600d800160006101000a81548160ff021916908360038111156137dd57fe5b02179055505050505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806138935750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b613905576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f414c4552543a2041646d696e206f7220446576206e65656420746f207365740081525060200191505060405180910390fd5b6000613969600d6009015461395b600d6007015461394d600d6005015461393f600d60030154600d60020154613b7590919063ffffffff16565b613b7590919063ffffffff16565b613b7590919063ffffffff16565b613b7590919063ffffffff16565b905080600d600201819055506002600d800160006101000a81548160ff0219169083600381111561399657fe5b021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b613a83846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613bfd565b50505050565b613b268363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613bfd565b505050565b6000613b6d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613e48565b905092915050565b600080828401905083811015613bf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b613c1c8273ffffffffffffffffffffffffffffffffffffffff16613f08565b613c8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b60208310613cdd5780518252602082019150602081019050602083039250613cba565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613d3f576040519150601f19603f3d011682016040523d82523d6000602084013e613d44565b606091505b509150915081613dbc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b600081511115613e4257808060200190516020811015613ddb57600080fd5b8101908080519060200190929190505050613e41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614031602a913960400191505060405180910390fd5b5b50505050565b6000838311158290613ef5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613eba578082015181840152602081019050613e9f565b50505050905090810190601f168015613ee75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015613f4a57506000801b8214155b9250505091905056fe414c4552543a204e6f7420656e6f75676820616c6c6f77616e636520666f722062757921414c4552543a20546f6b656e20617265206e6f74207472616e73666572656420746f204d61726b657421414c4552543a204e6f7420656e676f75676820746f6b656e20706c656173652063616c6c207468652061646d696e21414c4552543a20596f757220617265206e6f7420616c6c6f776564206f7220616c726561647920627579656420647572696e67207468697320706861736521414c4552543a205075626c69632053616c65206e6f74206f70656e64206e6f77215361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564414c4552543a204e6f7420656e6f756768206d6f6e657920666f72207061796d656e7421a26469706673582212200a2c8b6d62d3edeb1a14073022f281f58097bb71c543175842a939ea962d020464736f6c634300060c0033