More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 179 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Add User | 69130927 | 11 days ago | IN | 0 POL | 0.00345472 | ||||
Add User | 68926287 | 16 days ago | IN | 0 POL | 0.00396085 | ||||
Add User | 68037472 | 38 days ago | IN | 0 POL | 0.00429315 | ||||
Add User | 67990014 | 40 days ago | IN | 0 POL | 0.00293693 | ||||
Add User | 67666894 | 48 days ago | IN | 0 POL | 0.00355157 | ||||
Claim Referral R... | 67646968 | 48 days ago | IN | 0 POL | 0.00626357 | ||||
Add User | 67371168 | 55 days ago | IN | 0 POL | 0.00449559 | ||||
Add User | 67327238 | 57 days ago | IN | 0 POL | 0.00297249 | ||||
Add User | 67316590 | 57 days ago | IN | 0 POL | 0.00299452 | ||||
Add User | 67140615 | 61 days ago | IN | 0 POL | 0.00325827 | ||||
Add User | 67122081 | 62 days ago | IN | 0 POL | 0.00171165 | ||||
Add User | 67121472 | 62 days ago | IN | 0 POL | 0.00319661 | ||||
Claim Referral R... | 67103301 | 62 days ago | IN | 0 POL | 0.00144545 | ||||
Add User | 67101079 | 62 days ago | IN | 0 POL | 0.00310982 | ||||
Add User | 67099496 | 62 days ago | IN | 0 POL | 0.00319541 | ||||
Add User | 67091805 | 62 days ago | IN | 0 POL | 0.01171539 | ||||
Buy Tokens | 67085029 | 63 days ago | IN | 0 POL | 0.00972066 | ||||
Add User | 67084951 | 63 days ago | IN | 0 POL | 0.00754327 | ||||
Add User | 67070897 | 63 days ago | IN | 0 POL | 0.00725551 | ||||
Add User | 67066886 | 63 days ago | IN | 0 POL | 0.00148086 | ||||
Add User | 67066113 | 63 days ago | IN | 0 POL | 0.00148086 | ||||
Add User | 67064730 | 63 days ago | IN | 0 POL | 0.00337229 | ||||
Add User | 67057073 | 63 days ago | IN | 0 POL | 0.00132744 | ||||
Buy Tokens | 67000682 | 65 days ago | IN | 0 POL | 0.00728549 | ||||
Add User | 66986263 | 65 days ago | IN | 0 POL | 0.00611462 |
Loading...
Loading
Contract Name:
SachiTokenSale
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
No with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; import "./IsachiICO.sol"; /// @title SachiTokenSale /// @notice A contract to manage token sales, including creating sales, buying tokens, and adding users manually. contract SachiTokenSale is Ownable, ReentrancyGuardUpgradeable, ISachiTokenSale{ /// @notice Constructor to initialize the contract with the token address and initial owner. /// @param _token The address of the token being sold (USDT). /// @param initialOwner The address of the contract's initial owner. constructor(address _token, address initialOwner) Ownable(initialOwner){ require(_token != address(0), "Zero address"); token = IERC20(_token); addAllowedAddress(0xf92b2899297bFd4E5623D10E86A9D240CD4bA244); addAllowedAddress(0xc36795D13Bed9aBD9303F5570783f577d67bBa4e); addAllowedAddress(0xA3B617081f43df3788D7F4F4BB1F3492bC766054); addAllowedAddress(0x43eF585934177383dA0fd7fe1D05F578703619fE); addAllowedAddress(initialOwner); addAddUserAddress(0x7e4763C555AFD25f4748Cc073a56B1c31CeBE99c); createSale(1, 40000, 30912000000000000000000000); createSale(2, 50000, 29568000000000000000000000); createSale(3, 60000, 22400000000000000000000000); startSale(1); addUser(1, 0x31480ADf7a14FA46eBc409b4694C842880bC8291, 14162500000000000000000, address(0)); } /// @notice Represents a sale round. /// @dev This struct contains details about the sale, such as the token price, sold amount, and buyer information. struct Sale { bool saleStarted; ///< @dev Whether the sale has started. bool saleFinished; ///< @dev Whether the sale has finished. uint tokenPrice; ///< @dev The price of one token in the sale. uint soldAmountOfTokens; ///< @dev The total amount of tokens sold so far. uint poolOfTokens; ///< @dev The total number of tokens available to buy. mapping(address => uint) usersToken; ///< @dev A mapping to store the amount of tokens bought by each user. mapping(address => bool) hasBought; ///< @dev A mapping to track whether the user has already bought tokens. address[] buyers; ///< @dev An array of all the buyers in the sale. } IERC20 public token; ///< @dev The ERC20 token that is being sold. uint public currentSaleRound; /// @notice A mapping of sale numbers to Sale structs. mapping(uint => Sale) public sales; /// @notice A mapping of user addresses to claimable referral rewards. mapping(address => uint) public referralRewards; /// @notice A mapping of user addresses to their total claimed rewards. mapping(address => uint) public totalClaimedRewards; /// @notice A mapping of addresses allowed to manage sales. mapping(address => bool) public isAllowed; /// @notice A mapping of addresses allowed to manually add users to sales. mapping(address => bool) public isAllowedToAddUser; event ReferralReward(address indexed promoter, uint amount); event DiscountApplied(address indexed user, uint discountAmount); event TokenBought(address indexed account, uint amount, uint saleType, string bonus); event SaleEnded(uint indexed saleNumber); event SaleCreated(uint indexed saleNumber, uint tokenPrice, uint poolOfTokens); event SaleStarted(uint indexed saleNumber); event UserAdded(uint saleNumber, address account, uint amount); event TokensWithdrawn(address to, uint amount); event AddUserAddressAdded(address indexed _address); event AddUserAddressRemoved(address indexed _address); /// @notice Creates a new sale round. /// @param saleNumber The identifier of the sale round. /// @param tokenPrice The price of one token in the sale round. /// @param poolOfTokens The total number of tokens available in the sale round. /// @dev Only callable by authorized addresses. function createSale(uint saleNumber, uint tokenPrice, uint poolOfTokens) public { require(isAllowed[msg.sender], "You are not allowed to create sales"); require(sales[saleNumber].poolOfTokens == 0, "Sale already exists"); require(tokenPrice > 0, "Token price must be greater than zero"); require(poolOfTokens > 0, "Pool of tokens must be greater than zero"); Sale storage newSale = sales[saleNumber]; newSale.tokenPrice = tokenPrice; newSale.poolOfTokens = poolOfTokens; emit SaleCreated(saleNumber, tokenPrice, poolOfTokens); } /// @notice Gets the token amounts of all users in a specific sale round. /// @param saleNumber The sale round number. /// @return An array of user addresses and their corresponding token amounts. function getAllUsersToken(uint saleNumber) external view returns(address[] memory, uint[] memory){ Sale storage sale = sales[saleNumber]; uint[] memory tokens = new uint[](sale.buyers.length); for(uint i=0; i<sale.buyers.length; i++){ tokens[i] = sale.usersToken[sale.buyers[i]]; } return (sale.buyers, tokens); } /// @notice Gets the token amount of a specific user in a sale round. /// @param saleNumber The sale round number. /// @param account The address of the user. /// @return The token amount the user has bought in the sale. function getUserTokens(uint saleNumber, address account) external view returns(uint) { uint amount = sales[saleNumber].usersToken[account]; return amount; } /// @notice Allows a user to purchase tokens in a sale round. /// @param from The address of the sale buyer. /// @param saleNumber The identifier of the sale round. /// @param amount The amount of currency (e.g., USDT) being spent. /// @param promoterAddress The address of the promoter for referral rewards. /// @dev Discounts and bonuses are applied if applicable. function buyTokens(address from, uint saleNumber, uint amount, address promoterAddress) external nonReentrant { Sale storage sale = sales[saleNumber]; require(sale.poolOfTokens > 0, "Sale does not exist"); require(sale.saleStarted, "Sale hasn't started yet"); require(!sale.saleFinished, "Sale has finished"); require(amount > 0, "Amount must be greater than zero"); uint additionalAmount = 0; uint promoterReward = 0; uint tokensAmount = amount / sale.tokenPrice * 10 **18; if (promoterAddress != address(0) && promoterAddress != from) { additionalAmount = tokensAmount * 3 / 100; promoterReward = amount * 8 / 100; referralRewards[promoterAddress] += promoterReward; emit ReferralReward(promoterAddress, promoterReward); } uint bonusPercentage = calculateBonus(amount); uint bonusTokens = tokensAmount * bonusPercentage / 100; uint tokensWithReferralBonus = tokensAmount + additionalAmount; uint tokensWithBonus = tokensAmount + bonusTokens; uint totalTokens = tokensAmount + bonusTokens + additionalAmount; if (sale.soldAmountOfTokens + totalTokens <= sale.poolOfTokens) { require(token.transferFrom(msg.sender, address(this), amount), "Transfer failed. Balance or Aprroval error"); if (sale.hasBought[from]) { sale.usersToken[from] += totalTokens; } else { sale.hasBought[from] = true; sale.buyers.push(from); sale.usersToken[from] = totalTokens; } sale.soldAmountOfTokens += totalTokens; emit TokenBought(from, totalTokens, saleNumber, "With a refferal and volume bonus"); } else if (sale.soldAmountOfTokens + tokensWithBonus <= sale.poolOfTokens) { require(token.transferFrom(msg.sender, address(this), amount), "Transfer failed. Not enough tokens in the pool or Aprroval error"); if (sale.hasBought[from]) { sale.usersToken[from] += tokensWithBonus; } else { sale.hasBought[from] = true; sale.buyers.push(from); sale.usersToken[from] = tokensWithBonus; } sale.soldAmountOfTokens += tokensWithBonus; emit TokenBought(from, tokensWithBonus, saleNumber, "With volume bonus only"); } else if (sale.soldAmountOfTokens + tokensWithReferralBonus <= sale.poolOfTokens) { require(token.transferFrom(msg.sender, address(this), amount), "Transfer failed. Not enough tokens in the pool or Aprroval error"); if (sale.hasBought[from]) { sale.usersToken[from] += tokensWithReferralBonus; } else { sale.hasBought[from] = true; sale.buyers.push(from); sale.usersToken[from] = tokensWithReferralBonus; } sale.soldAmountOfTokens += tokensWithReferralBonus; emit TokenBought(from, tokensWithReferralBonus, saleNumber, "with referral bonus only"); } else if (sale.soldAmountOfTokens + tokensAmount <= sale.poolOfTokens) { require(token.transferFrom(msg.sender, address(this), amount), "Transfer failed. Not enough tokens in the pool or Aprroval error"); if (sale.hasBought[from]) { sale.usersToken[from] += tokensAmount; } else { sale.hasBought[from] = true; sale.buyers.push(from); sale.usersToken[from] = tokensAmount; } sale.soldAmountOfTokens += tokensAmount; emit TokenBought(from, tokensAmount, saleNumber, "no bonuses"); } else { revert("Not enough tokens in pool for purchase"); } if (sale.soldAmountOfTokens == sale.poolOfTokens) { changeSale(currentSaleRound + 1); } } /// @notice Claims referral rewards for the caller. /// @dev Only callable if the caller has claimable rewards. function claimReferralRewards() external nonReentrant { uint reward = referralRewards[msg.sender]; require(reward > 0, "No rewards to claim"); referralRewards[msg.sender] = 0; totalClaimedRewards[msg.sender] += reward; require(token.transfer(msg.sender, reward), "Claim reward transfer failed"); emit TokensWithdrawn(msg.sender, reward); } /// @notice Calculates the bonus percentage based on the amount spent. /// @param amount The amount spent in the sale. /// @return The bonus percentage. function calculateBonus(uint amount) internal pure returns (uint) { uint bonusPercentage = 0; uint decimals = 10**6; if (amount >= 500 * decimals && amount <= 1500 * decimals) { bonusPercentage = 3; // 3% } else if (amount > 1500 * decimals && amount <= 3000 * decimals) { bonusPercentage = 5; // 5% } else if (amount > 3000 * decimals && amount <= 5000 * decimals) { bonusPercentage = 7; // 7% } else if (amount > 5000 * decimals) { bonusPercentage = 10; // 10% } return bonusPercentage; } /// @notice Adds a user's token allocation manually to a specific sale round. /// @param saleNumber The identifier of the sale round. /// @param account The address of the user to add. /// @param amount The number of tokens to allocate to the user. /// @param promoterAddress The address of the promoter (optional, for referral rewards). /// @dev Can only be called by an authorized address. /// @dev Emits a `UserAdded` event. function addUser(uint saleNumber, address account, uint amount, address promoterAddress) public { require(isAllowedToAddUser[msg.sender] || isAllowed[msg.sender], "You are not allowed to add users"); require(account != address(0), "Invalid account address"); require(amount > 0, "Amount must be greater than zero"); Sale storage sale = sales[saleNumber]; require(sale.poolOfTokens > 0, "Sale does not exist"); require(sale.saleStarted && !sale.saleFinished, "Sale is not active"); uint tokenPrice = sale.tokenPrice; uint totalCost = amount * tokenPrice / 10 ** 18; uint promoterReward = 0; uint referralBonus = 0; if (promoterAddress != address(0) && promoterAddress != account) { promoterReward = totalCost * 8 / 100; referralBonus = amount * 3 / 100; referralRewards[promoterAddress] += promoterReward; emit ReferralReward(promoterAddress, promoterReward); } uint bonusPercentage = calculateBonus(totalCost); uint bonusTokens = amount * bonusPercentage / 100; uint tokensWithBonus = amount + bonusTokens; uint tokensWithReferralBonus = amount + referralBonus; uint totalTokens = amount + bonusTokens + referralBonus; if (sale.soldAmountOfTokens + totalTokens <= sale.poolOfTokens) { sale.usersToken[account] += totalTokens; sale.soldAmountOfTokens += totalTokens; emit UserAdded(saleNumber, account, totalTokens); } else if (sale.soldAmountOfTokens + tokensWithBonus <= sale.poolOfTokens) { sale.usersToken[account] += tokensWithBonus; sale.soldAmountOfTokens += tokensWithBonus; emit UserAdded(saleNumber, account, tokensWithBonus); } else if (sale.soldAmountOfTokens + tokensWithReferralBonus <= sale.poolOfTokens) { sale.usersToken[account] += tokensWithReferralBonus; sale.soldAmountOfTokens += tokensWithReferralBonus; emit UserAdded(saleNumber, account, tokensWithReferralBonus); } else if (sale.soldAmountOfTokens + amount <= sale.poolOfTokens) { sale.usersToken[account] += amount; sale.soldAmountOfTokens += amount; emit UserAdded(saleNumber, account, amount); } else { revert("Not enough tokens in pool to add user"); } if (!sale.hasBought[account]) { sale.hasBought[account] = true; sale.buyers.push(account); } if (sale.soldAmountOfTokens == sale.poolOfTokens) { changeSale(currentSaleRound + 1); } } /// @notice Adds multiple users and their token allocations to a sale round in a batch. /// @param saleNumber The identifier of the sale round. /// @param accounts An array of user addresses to add. /// @param amounts An array of token amounts to allocate to each user. /// @param promoterAddresses An array of promoter addresses corresponding to each user. /// @dev The lengths of `accounts`, `amounts`, and `promoterAddresses` must match. /// @dev Can only be called by an authorized address. /// @dev Uses the `addUser` function internally for each user. function addUserBatch(uint saleNumber, address[] calldata accounts, uint[] calldata amounts, address[] calldata promoterAddresses) external { require(isAllowedToAddUser[msg.sender] || isAllowed[msg.sender], "You are not allowed to add users"); require(accounts.length == amounts.length, "Accounts and amounts length mismatch"); for (uint i = 0; i < accounts.length; i++) { address account = accounts[i]; uint amount = amounts[i]; address promoterAddress = promoterAddresses[i]; addUser(saleNumber, account, amount, promoterAddress); } } /// @notice Starts a sale round. /// @param saleNumber The identifier of the sale round to start. function startSale(uint saleNumber) public { require(isAllowed[msg.sender], "You are not allowed to withdraw tokens"); Sale storage sale = sales[saleNumber]; require(!sale.saleStarted, "Sale has already started"); require(!sale.saleFinished, "Sale has already finished"); sale.saleStarted = true; currentSaleRound = saleNumber; emit SaleStarted(saleNumber); } /// @notice Ends a sale round. /// @param saleNumber The identifier of the sale round to end. function endSale(uint saleNumber) public { require(isAllowed[msg.sender], "You are not allowed to withdraw tokens"); Sale storage sale = sales[saleNumber]; require(sale.poolOfTokens > 0, "Sale doesn't exist"); require(!sale.saleFinished, "Sale already finished"); sale.saleFinished = true; sale.saleStarted = true; emit SaleEnded(saleNumber); } /// @notice Changes the active sale round to a new one. /// @param newSaleNumber The new sale round number. function changeSale(uint newSaleNumber) public { require(isAllowed[msg.sender], "You are not allowed to withdraw tokens"); endSale(currentSaleRound); startSale(newSaleNumber); currentSaleRound = newSaleNumber; } /// @notice Retrieves data of a specific sale round, including user token allocations. /// @param saleNumber The sale round number. /// @return saleStarted Whether the sale has started. /// @return saleFinished Whether the sale has finished. /// @return tokenPrice The price of one token in the sale (in smallest units, e.g., wei). /// @return soldAmountOfTokens The total amount of tokens sold in the sale. /// @return poolOfTokens The total amount of tokens available for sale. /// @return buyers An array of addresses that participated in the sale. /// @return tokens An array of token amounts corresponding to each buyer. /// @dev This function allows anyone to fetch both the basic sale data and token allocations of users. function getSaleData(uint saleNumber) external view returns ( bool saleStarted, bool saleFinished, uint tokenPrice, uint soldAmountOfTokens, uint poolOfTokens, address[] memory buyers, uint[] memory tokens ) { Sale storage sale = sales[saleNumber]; tokens = new uint[](sale.buyers.length); saleStarted = sale.saleStarted; saleFinished = sale.saleFinished; tokenPrice = sale.tokenPrice; soldAmountOfTokens = sale.soldAmountOfTokens; poolOfTokens = sale.poolOfTokens; buyers = sale.buyers; for (uint i = 0; i < sale.buyers.length; i++) { tokens[i] = sale.usersToken[sale.buyers[i]]; } } /// @notice Grants permission to an address to manage sales. /// @param _address The address to grant permission. /// @dev Can only be called by the contract owner. /// @dev Emits an `AddUserAddressAdded` event. function addAllowedAddress(address _address) public onlyOwner { require(!isAllowed[_address], "Address is already allowed"); isAllowed[_address] = true; } /// @notice Revokes permission from an address to manage sales. /// @param _address The address to revoke permission from. /// @dev Can only be called by the contract owner. /// @dev Emits an `AddUserAddressRemoved` event. function removeAllowedAddress(address _address) external onlyOwner { require(isAllowed[_address], "Address is not allowed"); isAllowed[_address] = false; } /// @notice Grants permission to an address to manually add users to sale rounds. /// @param _address The address to grant permission. /// @dev Can only be called by the contract owner. /// @dev Emits an `AddUserAddressAdded` event. function addAddUserAddress(address _address) public onlyOwner { require(!isAllowedToAddUser[_address], "Address is already allowed"); isAllowedToAddUser[_address] = true; emit AddUserAddressAdded(_address); } /// @notice Revokes permission from an address to manually add users to sale rounds. /// @param _address The address to revoke permission from. /// @dev Can only be called by the contract owner. /// @dev Emits an `AddUserAddressRemoved` event. function removeAddUserAddress(address _address) external onlyOwner { require(isAllowedToAddUser[_address], "Address is not allowed"); isAllowedToAddUser[_address] = false; emit AddUserAddressRemoved(_address); } /// @notice Withdraws all tokens from the contract to a specified address. /// @param to The address to receive the withdrawn tokens. /// @dev Ensures that referral rewards are preserved before withdrawing. /// @dev Can only be called by an authorized address. /// @dev Emits a `TokensWithdrawn` event. function withdrawTokens(address to) external { require(isAllowed[msg.sender], "You are not allowed to withdraw tokens"); uint contractBalance = token.balanceOf(address(this)); uint totalReferralRewards; for (uint i = 0; i < sales[currentSaleRound].buyers.length; i++) { address buyer = sales[currentSaleRound].buyers[i]; totalReferralRewards += referralRewards[buyer]; } require(contractBalance > totalReferralRewards, "Insufficient balance to withdraw after reserving referral rewards"); uint withdrawableAmount = contractBalance - totalReferralRewards; require(withdrawableAmount > 0, "No tokens available for withdrawal"); require(token.transfer(to, withdrawableAmount), "Withdrawal failed"); emit TokensWithdrawn(to, withdrawableAmount); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.20; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Storage of the initializable contract. * * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions * when using with upgradeable contracts. * * @custom:storage-location erc7201:openzeppelin.storage.Initializable */ struct InitializableStorage { /** * @dev Indicates that the contract has been initialized. */ uint64 _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool _initializing; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00; /** * @dev The contract is already initialized. */ error InvalidInitialization(); /** * @dev The contract is not initializing. */ error NotInitializing(); /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint64 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in * production. * * Emits an {Initialized} event. */ modifier initializer() { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); // Cache values to avoid duplicated sloads bool isTopLevelCall = !$._initializing; uint64 initialized = $._initialized; // Allowed calls: // - initialSetup: the contract is not in the initializing state and no previous version was // initialized // - construction: the contract is initialized at version 1 (no reininitialization) and the // current contract is just being deployed bool initialSetup = initialized == 0 && isTopLevelCall; bool construction = initialized == 1 && address(this).code.length == 0; if (!initialSetup && !construction) { revert InvalidInitialization(); } $._initialized = 1; if (isTopLevelCall) { $._initializing = true; } _; if (isTopLevelCall) { $._initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint64 version) { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing || $._initialized >= version) { revert InvalidInitialization(); } $._initialized = version; $._initializing = true; _; $._initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { _checkInitializing(); _; } /** * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}. */ function _checkInitializing() internal view virtual { if (!_isInitializing()) { revert NotInitializing(); } } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing) { revert InvalidInitialization(); } if ($._initialized != type(uint64).max) { $._initialized = type(uint64).max; emit Initialized(type(uint64).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint64) { return _getInitializableStorage()._initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _getInitializableStorage()._initializing; } /** * @dev Returns a pointer to the storage namespace. */ // solhint-disable-next-line var-name-mixedcase function _getInitializableStorage() private pure returns (InitializableStorage storage $) { assembly { $.slot := INITIALIZABLE_STORAGE } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; import {Initializable} from "../proxy/utils/Initializable.sol"; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at, * consider using {ReentrancyGuardTransient} instead. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant NOT_ENTERED = 1; uint256 private constant ENTERED = 2; /// @custom:storage-location erc7201:openzeppelin.storage.ReentrancyGuard struct ReentrancyGuardStorage { uint256 _status; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ReentrancyGuard")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant ReentrancyGuardStorageLocation = 0x9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00; function _getReentrancyGuardStorage() private pure returns (ReentrancyGuardStorage storage $) { assembly { $.slot := ReentrancyGuardStorageLocation } } /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage(); $._status = NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage(); // On the first call to nonReentrant, _status will be NOT_ENTERED if ($._status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail $._status = ENTERED; } function _nonReentrantAfter() private { ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage(); // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) $._status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { ReentrancyGuardStorage storage $ = _getReentrancyGuardStorage(); return $._status == ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; interface ISachiTokenSale { function getSaleData(uint saleNumber) external view returns( bool saleStarted, bool saleFinished, uint tokenPrice, uint soldAmount, uint poolOfTokens, address[] memory buyers, uint[] memory tokens); }
{ "evmVersion": "paris", "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"initialOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"AddUserAddressAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"}],"name":"AddUserAddressRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"discountAmount","type":"uint256"}],"name":"DiscountApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"promoter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReferralReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"saleNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"poolOfTokens","type":"uint256"}],"name":"SaleCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"saleNumber","type":"uint256"}],"name":"SaleEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"saleNumber","type":"uint256"}],"name":"SaleStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"saleType","type":"uint256"},{"indexed":false,"internalType":"string","name":"bonus","type":"string"}],"name":"TokenBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"saleNumber","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UserAdded","type":"event"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addAddUserAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addAllowedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"saleNumber","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"promoterAddress","type":"address"}],"name":"addUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"saleNumber","type":"uint256"},{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address[]","name":"promoterAddresses","type":"address[]"}],"name":"addUserBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"saleNumber","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"promoterAddress","type":"address"}],"name":"buyTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSaleNumber","type":"uint256"}],"name":"changeSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimReferralRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"saleNumber","type":"uint256"},{"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"internalType":"uint256","name":"poolOfTokens","type":"uint256"}],"name":"createSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentSaleRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"saleNumber","type":"uint256"}],"name":"endSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"saleNumber","type":"uint256"}],"name":"getAllUsersToken","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"saleNumber","type":"uint256"}],"name":"getSaleData","outputs":[{"internalType":"bool","name":"saleStarted","type":"bool"},{"internalType":"bool","name":"saleFinished","type":"bool"},{"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"internalType":"uint256","name":"soldAmountOfTokens","type":"uint256"},{"internalType":"uint256","name":"poolOfTokens","type":"uint256"},{"internalType":"address[]","name":"buyers","type":"address[]"},{"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"saleNumber","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"getUserTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAllowedToAddUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeAddUserAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeAllowedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sales","outputs":[{"internalType":"bool","name":"saleStarted","type":"bool"},{"internalType":"bool","name":"saleFinished","type":"bool"},{"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"internalType":"uint256","name":"soldAmountOfTokens","type":"uint256"},{"internalType":"uint256","name":"poolOfTokens","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"saleNumber","type":"uint256"}],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalClaimedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200756838038062007568833981810160405281019062000037919062001770565b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000ad5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620000a49190620017c8565b60405180910390fd5b620000be81620002ed60201b60201c565b50600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000131576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001289062001846565b60405180910390fd5b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200019773f92b2899297bfd4e5623d10e86a9d240cd4ba244620003b160201b60201c565b620001bc73c36795d13bed9abd9303f5570783f577d67bba4e620003b160201b60201c565b620001e173a3b617081f43df3788d7f4f4bb1f3492bc766054620003b160201b60201c565b620002067343ef585934177383da0fd7fe1d05f578703619fe620003b160201b60201c565b6200021781620003b160201b60201c565b6200023c737e4763c555afd25f4748cc073a56b1c31cebe99c620004ac60201b60201c565b6200025d6001619c406a1991dee0b714c1f8000000620005ea60201b60201c565b6200027e600261c3506a1875447de6c5f130000000620005ea60201b60201c565b6200029f600361ea606a1287626ee52197b0000000620005ea60201b60201c565b620002b16001620007cc60201b60201c565b620002e560017331480adf7a14fa46ebc409b4694c842880bc82916902ffc02b79dbedba000060006200097160201b60201c565b505062002204565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003c1620012d260201b60201c565b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161562000451576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200044890620018b8565b60405180910390fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b620004bc620012d260201b60201c565b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156200054c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200054390620018b8565b60405180910390fd5b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f5e83dc6b5202f2571bc9cf3131a1c24c523ad38576e15c442941079bb204adc960405160405180910390a250565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1662000679576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006709062001950565b60405180910390fd5b6000600360008581526020019081526020016000206003015414620006d5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006cc90620019c2565b60405180910390fd5b600082116200071b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007129062001a5a565b60405180910390fd5b6000811162000761576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007589062001af2565b60405180910390fd5b6000600360008581526020019081526020016000209050828160010181905550818160030181905550837f2e09a4c04169b80212f22620e94cb03561bb834e884fc8ee5aeba73e1e560c078484604051620007be92919062001b2f565b60405180910390a250505050565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166200085b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008529062001bd2565b60405180910390fd5b60006003600083815260200190815260200160002090508060000160009054906101000a900460ff1615620008c7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008be9062001c44565b60405180910390fd5b8060000160019054906101000a900460ff16156200091c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009139062001cb6565b60405180910390fd5b60018160000160006101000a81548160ff02191690831515021790555081600281905550817fa78c547613f6306e7a70d1bd161c18a496cae1eeb8d4f9e58b60d69ad72ddf5860405160405180910390a25050565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168062000a135750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b62000a55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a4c9062001d28565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000ac7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000abe9062001d9a565b60405180910390fd5b6000821162000b0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b049062001e0c565b60405180910390fd5b6000600360008681526020019081526020016000209050600081600301541162000b6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b659062001e7e565b60405180910390fd5b8060000160009054906101000a900460ff16801562000b9c57508060000160019054906101000a900460ff16155b62000bde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000bd59062001ef0565b60405180910390fd5b6000816001015490506000670de0b6b3a7640000828662000c00919062001f41565b62000c0c919062001fbb565b9050600080600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415801562000c7b57508773ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b1562000d6857606460088462000c92919062001f41565b62000c9e919062001fbb565b9150606460038862000cb1919062001f41565b62000cbd919062001fbb565b905081600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000d10919062001ff3565b925050819055508573ffffffffffffffffffffffffffffffffffffffff167fe7e15037b577ae985e6019722e882f64c5c6a2124ccc573bab8f79bda0a0c5518360405162000d5f91906200202e565b60405180910390a25b600062000d7b846200137460201b60201c565b905060006064828a62000d8f919062001f41565b62000d9b919062001fbb565b90506000818a62000dad919062001ff3565b90506000848b62000dbf919062001ff3565b9050600085848d62000dd2919062001ff3565b62000dde919062001ff3565b90508960030154818b6002015462000df7919062001ff3565b1162000eb757808a60040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000e50919062001ff3565b92505081905550808a600201600082825462000e6d919062001ff3565b925050819055507f865275e7fa20bfbd4ba610b45893bd10c6b08b8aeb9964b72ad321d370726e5f8e8e8360405162000ea9939291906200204b565b60405180910390a16200117c565b8960030154838b6002015462000ece919062001ff3565b1162000f8e57828a60040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000f27919062001ff3565b92505081905550828a600201600082825462000f44919062001ff3565b925050819055507f865275e7fa20bfbd4ba610b45893bd10c6b08b8aeb9964b72ad321d370726e5f8e8e8560405162000f80939291906200204b565b60405180910390a16200117b565b8960030154828b6002015462000fa5919062001ff3565b116200106557818a60040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000ffe919062001ff3565b92505081905550818a60020160008282546200101b919062001ff3565b925050819055507f865275e7fa20bfbd4ba610b45893bd10c6b08b8aeb9964b72ad321d370726e5f8e8e8460405162001057939291906200204b565b60405180910390a16200117a565b89600301548c8b600201546200107c919062001ff3565b116200113c578b8a60040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620010d5919062001ff3565b925050819055508b8a6002016000828254620010f2919062001ff3565b925050819055507f865275e7fa20bfbd4ba610b45893bd10c6b08b8aeb9964b72ad321d370726e5f8e8e8e6040516200112e939291906200204b565b60405180910390a162001179565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200117090620020fe565b60405180910390fd5b5b5b5b8960050160008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16620012905760018a60050160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550896006018d9080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b89600301548a6002015403620012c257620012c16001600254620012b5919062001ff3565b6200146860201b60201c565b5b5050505050505050505050505050565b620012e26200152560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620013086200152d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200137257620013346200152560201b60201c565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401620013699190620017c8565b60405180910390fd5b565b600080600090506000620f42409050806101f462001393919062001f41565b8410158015620013b25750806105dc620013ae919062001f41565b8411155b15620013c257600391506200145e565b806105dc620013d2919062001f41565b84118015620013f0575080610bb8620013ec919062001f41565b8411155b156200140057600591506200145d565b80610bb862001410919062001f41565b841180156200142e5750806113886200142a919062001f41565b8411155b156200143e57600791506200145c565b806113886200144e919062001f41565b8411156200145b57600a91505b5b5b5b8192505050919050565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16620014f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620014ee9062001bd2565b60405180910390fd5b6200150a6002546200155660201b60201c565b6200151b81620007cc60201b60201c565b8060028190555050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16620015e5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620015dc9062001bd2565b60405180910390fd5b6000600360008381526020019081526020016000209050600081600301541162001646576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200163d9062002170565b60405180910390fd5b8060000160019054906101000a900460ff16156200169b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200169290620021e2565b60405180910390fd5b60018160000160016101000a81548160ff02191690831515021790555060018160000160006101000a81548160ff021916908315150217905550817f94bb74a9473ae4063ec1e73dc3e35fd4b5abe9cc1e43ad0db84e5358559ccd5a60405160405180910390a25050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062001738826200170b565b9050919050565b6200174a816200172b565b81146200175657600080fd5b50565b6000815190506200176a816200173f565b92915050565b600080604083850312156200178a576200178962001706565b5b60006200179a8582860162001759565b9250506020620017ad8582860162001759565b9150509250929050565b620017c2816200172b565b82525050565b6000602082019050620017df6000830184620017b7565b92915050565b600082825260208201905092915050565b7f5a65726f20616464726573730000000000000000000000000000000000000000600082015250565b60006200182e600c83620017e5565b91506200183b82620017f6565b602082019050919050565b6000602082019050818103600083015262001861816200181f565b9050919050565b7f4164647265737320697320616c726561647920616c6c6f776564000000000000600082015250565b6000620018a0601a83620017e5565b9150620018ad8262001868565b602082019050919050565b60006020820190508181036000830152620018d38162001891565b9050919050565b7f596f7520617265206e6f7420616c6c6f77656420746f2063726561746520736160008201527f6c65730000000000000000000000000000000000000000000000000000000000602082015250565b600062001938602383620017e5565b91506200194582620018da565b604082019050919050565b600060208201905081810360008301526200196b8162001929565b9050919050565b7f53616c6520616c72656164792065786973747300000000000000000000000000600082015250565b6000620019aa601383620017e5565b9150620019b78262001972565b602082019050919050565b60006020820190508181036000830152620019dd816200199b565b9050919050565b7f546f6b656e207072696365206d7573742062652067726561746572207468616e60008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600062001a42602583620017e5565b915062001a4f82620019e4565b604082019050919050565b6000602082019050818103600083015262001a758162001a33565b9050919050565b7f506f6f6c206f6620746f6b656e73206d7573742062652067726561746572207460008201527f68616e207a65726f000000000000000000000000000000000000000000000000602082015250565b600062001ada602883620017e5565b915062001ae78262001a7c565b604082019050919050565b6000602082019050818103600083015262001b0d8162001acb565b9050919050565b6000819050919050565b62001b298162001b14565b82525050565b600060408201905062001b46600083018562001b1e565b62001b55602083018462001b1e565b9392505050565b7f596f7520617265206e6f7420616c6c6f77656420746f2077697468647261772060008201527f746f6b656e730000000000000000000000000000000000000000000000000000602082015250565b600062001bba602683620017e5565b915062001bc78262001b5c565b604082019050919050565b6000602082019050818103600083015262001bed8162001bab565b9050919050565b7f53616c652068617320616c726561647920737461727465640000000000000000600082015250565b600062001c2c601883620017e5565b915062001c398262001bf4565b602082019050919050565b6000602082019050818103600083015262001c5f8162001c1d565b9050919050565b7f53616c652068617320616c72656164792066696e697368656400000000000000600082015250565b600062001c9e601983620017e5565b915062001cab8262001c66565b602082019050919050565b6000602082019050818103600083015262001cd18162001c8f565b9050919050565b7f596f7520617265206e6f7420616c6c6f77656420746f20616464207573657273600082015250565b600062001d10602083620017e5565b915062001d1d8262001cd8565b602082019050919050565b6000602082019050818103600083015262001d438162001d01565b9050919050565b7f496e76616c6964206163636f756e742061646472657373000000000000000000600082015250565b600062001d82601783620017e5565b915062001d8f8262001d4a565b602082019050919050565b6000602082019050818103600083015262001db58162001d73565b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e207a65726f600082015250565b600062001df4602083620017e5565b915062001e018262001dbc565b602082019050919050565b6000602082019050818103600083015262001e278162001de5565b9050919050565b7f53616c6520646f6573206e6f7420657869737400000000000000000000000000600082015250565b600062001e66601383620017e5565b915062001e738262001e2e565b602082019050919050565b6000602082019050818103600083015262001e998162001e57565b9050919050565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b600062001ed8601283620017e5565b915062001ee58262001ea0565b602082019050919050565b6000602082019050818103600083015262001f0b8162001ec9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062001f4e8262001b14565b915062001f5b8362001b14565b925082820262001f6b8162001b14565b9150828204841483151762001f855762001f8462001f12565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062001fc88262001b14565b915062001fd58362001b14565b92508262001fe85762001fe762001f8c565b5b828204905092915050565b6000620020008262001b14565b91506200200d8362001b14565b925082820190508082111562002028576200202762001f12565b5b92915050565b600060208201905062002045600083018462001b1e565b92915050565b600060608201905062002062600083018662001b1e565b620020716020830185620017b7565b62002080604083018462001b1e565b949350505050565b7f4e6f7420656e6f75676820746f6b656e7320696e20706f6f6c20746f2061646460008201527f2075736572000000000000000000000000000000000000000000000000000000602082015250565b6000620020e6602583620017e5565b9150620020f38262002088565b604082019050919050565b600060208201905081810360008301526200211981620020d7565b9050919050565b7f53616c6520646f65736e27742065786973740000000000000000000000000000600082015250565b600062002158601283620017e5565b9150620021658262002120565b602082019050919050565b600060208201905081810360008301526200218b8162002149565b9050919050565b7f53616c6520616c72656164792066696e69736865640000000000000000000000600082015250565b6000620021ca601583620017e5565b9150620021d78262002192565b602082019050919050565b60006020820190508181036000830152620021fd81620021bb565b9050919050565b61535480620022146000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c8063715018a6116100de578063a7f08f8d11610097578063d82f718411610071578063d82f71841461045d578063f2fde38b1461048e578063fc0c546a146104aa578063fdd5880a146104c85761018e565b8063a7f08f8d146103dd578063b5f522f7146103f9578063babcc5391461042d5761018e565b8063715018a614610317578063749912761461032157806381788e2b1461033d57806386630b7b146103595780638da5cb5b1461038f578063a110b93f146103ad5761018e565b806336489e081161014b578063501a6f5811610125578063501a6f581461027f57806353aaa63b1461029b57806361bdb0ec146102cb5780636c1909ed146102fb5761018e565b806336489e081461022b5780633c9d93b81461024757806349df728c146102635761018e565b806304d1a846146101935780630502697f146101af57806305eaab4b146101cb5780630e3ab61d146101d55780631e5a5898146101f1578063357b46491461020f575b600080fd5b6101ad60048036038101906101a891906138f7565b6104f8565b005b6101c960048036038101906101c491906138f7565b61069f565b005b6101d3610749565b005b6101ef60048036038101906101ea91906138f7565b610996565b005b6101f9610b32565b6040516102069190613933565b60405180910390f35b610229600480360381019061022491906139ac565b610b38565b005b61024560048036038101906102409190613ace565b61142c565b005b610261600480360381019061025c9190613b97565b611604565b005b61027d60048036038101906102789190613b97565b6116f3565b005b61029960048036038101906102949190613b97565b611ab8565b005b6102b560048036038101906102b09190613b97565b611bea565b6040516102c29190613933565b60405180910390f35b6102e560048036038101906102e09190613b97565b611c02565b6040516102f29190613bdf565b60405180910390f35b61031560048036038101906103109190613bfa565b611c22565b005b61031f611df6565b005b61033b60048036038101906103369190613b97565b611e0a565b005b61035760048036038101906103529190613b97565b611f3d565b005b610373600480360381019061036e91906138f7565b61202d565b6040516103869796959493929190613dc9565b60405180910390f35b61039761223c565b6040516103a49190613e55565b60405180910390f35b6103c760048036038101906103c29190613b97565b612265565b6040516103d49190613933565b60405180910390f35b6103f760048036038101906103f29190613e70565b61227d565b005b610413600480360381019061040e91906138f7565b6132a4565b604051610424959493929190613ed7565b60405180910390f35b61044760048036038101906104429190613b97565b6132f4565b6040516104549190613bdf565b60405180910390f35b610477600480360381019061047291906138f7565b613314565b604051610485929190613f2a565b60405180910390f35b6104a860048036038101906104a39190613b97565b6134e1565b005b6104b2613567565b6040516104bf9190613fc0565b60405180910390f35b6104e260048036038101906104dd9190613fdb565b61358d565b6040516104ef9190613933565b60405180910390f35b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057b9061409e565b60405180910390fd5b600060036000838152602001908152602001600020905060008160030154116105e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d99061410a565b60405180910390fd5b8060000160019054906101000a900460ff1615610634576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90614176565b60405180910390fd5b60018160000160016101000a81548160ff02191690831515021790555060018160000160006101000a81548160ff021916908315150217905550817f94bb74a9473ae4063ec1e73dc3e35fd4b5abe9cc1e43ad0db84e5358559ccd5a60405160405180910390a25050565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661072b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107229061409e565b60405180910390fd5b6107366002546104f8565b61073f81610996565b8060028190555050565b6107516135f0565b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081116107d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cf906141e2565b60405180910390fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461086c9190614231565b92505081905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016108d0929190614265565b6020604051808303816000875af11580156108ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091391906142ba565b610952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094990614333565b60405180910390fd5b7f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b3382604051610983929190614265565b60405180910390a150610994613647565b565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a199061409e565b60405180910390fd5b60006003600083815260200190815260200160002090508060000160009054906101000a900460ff1615610a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a829061439f565b60405180910390fd5b8060000160019054906101000a900460ff1615610add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad49061440b565b60405180910390fd5b60018160000160006101000a81548160ff02191690831515021790555081600281905550817fa78c547613f6306e7a70d1bd161c18a496cae1eeb8d4f9e58b60d69ad72ddf5860405160405180910390a25050565b60025481565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610bd95750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0f90614477565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7e906144e3565b60405180910390fd5b60008211610cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc19061454f565b60405180910390fd5b60006003600086815260200190815260200160002090506000816003015411610d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1f906145bb565b60405180910390fd5b8060000160009054906101000a900460ff168015610d5557508060000160019054906101000a900460ff16155b610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8b90614627565b60405180910390fd5b6000816001015490506000670de0b6b3a76400008286610db49190614647565b610dbe91906146b8565b9050600080600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015610e2c57508773ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b15610f0c576064600884610e409190614647565b610e4a91906146b8565b91506064600388610e5b9190614647565b610e6591906146b8565b905081600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610eb69190614231565b925050819055508573ffffffffffffffffffffffffffffffffffffffff167fe7e15037b577ae985e6019722e882f64c5c6a2124ccc573bab8f79bda0a0c55183604051610f039190613933565b60405180910390a25b6000610f1784613660565b905060006064828a610f299190614647565b610f3391906146b8565b90506000818a610f439190614231565b90506000848b610f539190614231565b9050600085848d610f649190614231565b610f6e9190614231565b90508960030154818b60020154610f859190614231565b1161103d57808a60040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fdb9190614231565b92505081905550808a6002016000828254610ff69190614231565b925050819055507f865275e7fa20bfbd4ba610b45893bd10c6b08b8aeb9964b72ad321d370726e5f8e8e83604051611030939291906146e9565b60405180910390a16112e2565b8960030154838b600201546110529190614231565b1161110a57828a60040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110a89190614231565b92505081905550828a60020160008282546110c39190614231565b925050819055507f865275e7fa20bfbd4ba610b45893bd10c6b08b8aeb9964b72ad321d370726e5f8e8e856040516110fd939291906146e9565b60405180910390a16112e1565b8960030154828b6002015461111f9190614231565b116111d757818a60040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111759190614231565b92505081905550818a60020160008282546111909190614231565b925050819055507f865275e7fa20bfbd4ba610b45893bd10c6b08b8aeb9964b72ad321d370726e5f8e8e846040516111ca939291906146e9565b60405180910390a16112e0565b89600301548c8b600201546111ec9190614231565b116112a4578b8a60040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112429190614231565b925050819055508b8a600201600082825461125d9190614231565b925050819055507f865275e7fa20bfbd4ba610b45893bd10c6b08b8aeb9964b72ad321d370726e5f8e8e8e604051611297939291906146e9565b60405180910390a16112df565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d690614792565b60405180910390fd5b5b5b5b8960050160008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166113f55760018a60050160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550896006018d9080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b89600301548a600201540361141c5761141b60016002546114169190614231565b61069f565b5b5050505050505050505050505050565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806114cd5750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61150c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150390614477565b60405180910390fd5b838390508686905014611554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154b90614824565b60405180910390fd5b60005b868690508110156115fa57600087878381811061157757611576614844565b5b905060200201602081019061158c9190613b97565b905060008686848181106115a3576115a2614844565b5b90506020020135905060008585858181106115c1576115c0614844565b5b90506020020160208101906115d69190613b97565b90506115e48b848484610b38565b50505080806115f290614873565b915050611557565b5050505050505050565b61160c61373c565b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614907565b60405180910390fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661177f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117769061409e565b60405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016117dc9190613e55565b602060405180830381865afa1580156117f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181d919061493c565b9050600080600090505b60036000600254815260200190815260200160002060060180549050811015611904576000600360006002548152602001908152602001600020600601828154811061187657611875614844565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836118ee9190614231565b92505080806118fc90614873565b915050611827565b50808211611947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193e90614a01565b60405180910390fd5b600081836119559190614a21565b90506000811161199a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199190614ac7565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff1660e01b81526004016119f7929190614265565b6020604051808303816000875af1158015611a16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3a91906142ba565b611a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7090614b33565b60405180910390fd5b7f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b8482604051611aaa929190614265565b60405180910390a150505050565b611ac061373c565b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4390614907565b60405180910390fd5b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f20ef316471dd8879ccd78c7d468f14e315451401709a97c2a5f29cf36f38c9aa60405160405180910390a250565b60046020528060005260406000206000915090505481565b60076020528060005260406000206000915054906101000a900460ff1681565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca590614bc5565b60405180910390fd5b6000600360008581526020019081526020016000206003015414611d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfe90614c31565b60405180910390fd5b60008211611d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4190614cc3565b60405180910390fd5b60008111611d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8490614d55565b60405180910390fd5b6000600360008581526020019081526020016000209050828160010181905550818160030181905550837f2e09a4c04169b80212f22620e94cb03561bb834e884fc8ee5aeba73e1e560c078484604051611de8929190614d75565b60405180910390a250505050565b611dfe61373c565b611e0860006137c3565b565b611e1261373c565b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9690614dea565b60405180910390fd5b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f5e83dc6b5202f2571bc9cf3131a1c24c523ad38576e15c442941079bb204adc960405160405180910390a250565b611f4561373c565b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc990614dea565b60405180910390fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060008060006060806000600360008a81526020019081526020016000209050806006018054905067ffffffffffffffff8111156120705761206f614e0a565b5b60405190808252806020026020018201604052801561209e5781602001602082028036833780820191505090505b5091508060000160009054906101000a900460ff1697508060000160019054906101000a900460ff1696508060010154955080600201549450806003015493508060060180548060200260200160405190810160405280929190818152602001828054801561216257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612118575b5050505050925060005b816006018054905081101561222f5781600401600083600601838154811061219757612196614844565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548382815181106122105761220f614844565b5b602002602001018181525050808061222790614873565b91505061216c565b5050919395979092949650565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60056020528060005260406000206000915090505481565b6122856135f0565b600060036000858152602001908152602001600020905060008160030154116122e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122da906145bb565b60405180910390fd5b8060000160009054906101000a900460ff16612334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232b90614e85565b60405180910390fd5b8060000160019054906101000a900460ff1615612386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237d90614ef1565b60405180910390fd5b600083116123c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c09061454f565b60405180910390fd5b6000806000670de0b6b3a76400008460010154876123e791906146b8565b6123f19190614647565b9050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561245c57508773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561253c5760646003826124709190614647565b61247a91906146b8565b9250606460088761248b9190614647565b61249591906146b8565b915081600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124e69190614231565b925050819055508473ffffffffffffffffffffffffffffffffffffffff167fe7e15037b577ae985e6019722e882f64c5c6a2124ccc573bab8f79bda0a0c551836040516125339190613933565b60405180910390a25b600061254787613660565b90506000606482846125599190614647565b61256391906146b8565b9050600085846125739190614231565b9050600082856125839190614231565b905060008784876125949190614231565b61259e9190614231565b90508860030154818a600201546125b59190614231565b116128c257600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308e6040518463ffffffff1660e01b815260040161261993929190614f11565b6020604051808303816000875af1158015612638573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265c91906142ba565b61269b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269290614fba565b60405180910390fd5b8860050160008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561274c57808960040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127409190614231565b92505081905550612852565b60018960050160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550886006018d9080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808960040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b808960020160008282546128669190614231565b925050819055508c73ffffffffffffffffffffffffffffffffffffffff167f0e34a84afa34f8f185791c227fbedffb4bc8015ac2da6c69a578fc30f42ae719828e6040516128b5929190615026565b60405180910390a2613266565b8860030154828a600201546128d79190614231565b11612be457600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308e6040518463ffffffff1660e01b815260040161293b93929190614f11565b6020604051808303816000875af115801561295a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297e91906142ba565b6129bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b4906150d4565b60405180910390fd5b8860050160008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612a6e57818960040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a629190614231565b92505081905550612b74565b60018960050160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550886006018d9080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818960040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b81896002016000828254612b889190614231565b925050819055508c73ffffffffffffffffffffffffffffffffffffffff167f0e34a84afa34f8f185791c227fbedffb4bc8015ac2da6c69a578fc30f42ae719838e604051612bd7929190615140565b60405180910390a2613265565b8860030154838a60020154612bf99190614231565b11612f0657600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308e6040518463ffffffff1660e01b8152600401612c5d93929190614f11565b6020604051808303816000875af1158015612c7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ca091906142ba565b612cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd6906150d4565b60405180910390fd5b8860050160008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612d9057828960040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d849190614231565b92505081905550612e96565b60018960050160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550886006018d9080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828960040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b82896002016000828254612eaa9190614231565b925050819055508c73ffffffffffffffffffffffffffffffffffffffff167f0e34a84afa34f8f185791c227fbedffb4bc8015ac2da6c69a578fc30f42ae719848e604051612ef99291906151c8565b60405180910390a2613264565b8860030154868a60020154612f1b9190614231565b1161322857600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308e6040518463ffffffff1660e01b8152600401612f7f93929190614f11565b6020604051808303816000875af1158015612f9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc291906142ba565b613001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff8906150d4565b60405180910390fd5b8860050160008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156130b257858960040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130a69190614231565b925050819055506131b8565b60018960050160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550886006018d9080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550858960040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b858960020160008282546131cc9190614231565b925050819055508c73ffffffffffffffffffffffffffffffffffffffff167f0e34a84afa34f8f185791c227fbedffb4bc8015ac2da6c69a578fc30f42ae719878e60405161321b929190615250565b60405180910390a2613263565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325a906152fe565b60405180910390fd5b5b5b5b886003015489600201540361328d5761328c60016002546132879190614231565b61069f565b5b50505050505050505061329e613647565b50505050565b60036020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060010154908060020154908060030154905085565b60066020528060005260406000206000915054906101000a900460ff1681565b60608060006003600085815260200190815260200160002090506000816006018054905067ffffffffffffffff81111561335157613350614e0a565b5b60405190808252806020026020018201604052801561337f5781602001602082028036833780820191505090505b50905060005b8260060180549050811015613448578260040160008460060183815481106133b0576133af614844565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482828151811061342957613428614844565b5b602002602001018181525050808061344090614873565b915050613385565b508160060181818054806020026020016040519081016040528092919081815260200182805480156134cf57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311613485575b50505050509150935093505050915091565b6134e961373c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361355b5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016135529190613e55565b60405180910390fd5b613564816137c3565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806003600085815260200190815260200160002060040160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508091505092915050565b60006135fa613887565b9050600281600001540361363a576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002816000018190555050565b6000613651613887565b90506001816000018190555050565b600080600090506000620f42409050806101f461367d9190614647565b84101580156136995750806105dc6136959190614647565b8411155b156136a75760039150613732565b806105dc6136b59190614647565b841180156136d0575080610bb86136cc9190614647565b8411155b156136de5760059150613731565b80610bb86136ec9190614647565b841180156137075750806113886137039190614647565b8411155b156137155760079150613730565b806113886137239190614647565b84111561372f57600a91505b5b5b5b8192505050919050565b6137446138af565b73ffffffffffffffffffffffffffffffffffffffff1661376261223c565b73ffffffffffffffffffffffffffffffffffffffff16146137c1576137856138af565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016137b89190613e55565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60007f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00905090565b600033905090565b600080fd5b600080fd5b6000819050919050565b6138d4816138c1565b81146138df57600080fd5b50565b6000813590506138f1816138cb565b92915050565b60006020828403121561390d5761390c6138b7565b5b600061391b848285016138e2565b91505092915050565b61392d816138c1565b82525050565b60006020820190506139486000830184613924565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139798261394e565b9050919050565b6139898161396e565b811461399457600080fd5b50565b6000813590506139a681613980565b92915050565b600080600080608085870312156139c6576139c56138b7565b5b60006139d4878288016138e2565b94505060206139e587828801613997565b93505060406139f6878288016138e2565b9250506060613a0787828801613997565b91505092959194509250565b600080fd5b600080fd5b600080fd5b60008083601f840112613a3857613a37613a13565b5b8235905067ffffffffffffffff811115613a5557613a54613a18565b5b602083019150836020820283011115613a7157613a70613a1d565b5b9250929050565b60008083601f840112613a8e57613a8d613a13565b5b8235905067ffffffffffffffff811115613aab57613aaa613a18565b5b602083019150836020820283011115613ac757613ac6613a1d565b5b9250929050565b60008060008060008060006080888a031215613aed57613aec6138b7565b5b6000613afb8a828b016138e2565b975050602088013567ffffffffffffffff811115613b1c57613b1b6138bc565b5b613b288a828b01613a22565b9650965050604088013567ffffffffffffffff811115613b4b57613b4a6138bc565b5b613b578a828b01613a78565b9450945050606088013567ffffffffffffffff811115613b7a57613b796138bc565b5b613b868a828b01613a22565b925092505092959891949750929550565b600060208284031215613bad57613bac6138b7565b5b6000613bbb84828501613997565b91505092915050565b60008115159050919050565b613bd981613bc4565b82525050565b6000602082019050613bf46000830184613bd0565b92915050565b600080600060608486031215613c1357613c126138b7565b5b6000613c21868287016138e2565b9350506020613c32868287016138e2565b9250506040613c43868287016138e2565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613c828161396e565b82525050565b6000613c948383613c79565b60208301905092915050565b6000602082019050919050565b6000613cb882613c4d565b613cc28185613c58565b9350613ccd83613c69565b8060005b83811015613cfe578151613ce58882613c88565b9750613cf083613ca0565b925050600181019050613cd1565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613d40816138c1565b82525050565b6000613d528383613d37565b60208301905092915050565b6000602082019050919050565b6000613d7682613d0b565b613d808185613d16565b9350613d8b83613d27565b8060005b83811015613dbc578151613da38882613d46565b9750613dae83613d5e565b925050600181019050613d8f565b5085935050505092915050565b600060e082019050613dde600083018a613bd0565b613deb6020830189613bd0565b613df86040830188613924565b613e056060830187613924565b613e126080830186613924565b81810360a0830152613e248185613cad565b905081810360c0830152613e388184613d6b565b905098975050505050505050565b613e4f8161396e565b82525050565b6000602082019050613e6a6000830184613e46565b92915050565b60008060008060808587031215613e8a57613e896138b7565b5b6000613e9887828801613997565b9450506020613ea9878288016138e2565b9350506040613eba878288016138e2565b9250506060613ecb87828801613997565b91505092959194509250565b600060a082019050613eec6000830188613bd0565b613ef96020830187613bd0565b613f066040830186613924565b613f136060830185613924565b613f206080830184613924565b9695505050505050565b60006040820190508181036000830152613f448185613cad565b90508181036020830152613f588184613d6b565b90509392505050565b6000819050919050565b6000613f86613f81613f7c8461394e565b613f61565b61394e565b9050919050565b6000613f9882613f6b565b9050919050565b6000613faa82613f8d565b9050919050565b613fba81613f9f565b82525050565b6000602082019050613fd56000830184613fb1565b92915050565b60008060408385031215613ff257613ff16138b7565b5b6000614000858286016138e2565b925050602061401185828601613997565b9150509250929050565b600082825260208201905092915050565b7f596f7520617265206e6f7420616c6c6f77656420746f2077697468647261772060008201527f746f6b656e730000000000000000000000000000000000000000000000000000602082015250565b600061408860268361401b565b91506140938261402c565b604082019050919050565b600060208201905081810360008301526140b78161407b565b9050919050565b7f53616c6520646f65736e27742065786973740000000000000000000000000000600082015250565b60006140f460128361401b565b91506140ff826140be565b602082019050919050565b60006020820190508181036000830152614123816140e7565b9050919050565b7f53616c6520616c72656164792066696e69736865640000000000000000000000600082015250565b600061416060158361401b565b915061416b8261412a565b602082019050919050565b6000602082019050818103600083015261418f81614153565b9050919050565b7f4e6f207265776172647320746f20636c61696d00000000000000000000000000600082015250565b60006141cc60138361401b565b91506141d782614196565b602082019050919050565b600060208201905081810360008301526141fb816141bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061423c826138c1565b9150614247836138c1565b925082820190508082111561425f5761425e614202565b5b92915050565b600060408201905061427a6000830185613e46565b6142876020830184613924565b9392505050565b61429781613bc4565b81146142a257600080fd5b50565b6000815190506142b48161428e565b92915050565b6000602082840312156142d0576142cf6138b7565b5b60006142de848285016142a5565b91505092915050565b7f436c61696d20726577617264207472616e73666572206661696c656400000000600082015250565b600061431d601c8361401b565b9150614328826142e7565b602082019050919050565b6000602082019050818103600083015261434c81614310565b9050919050565b7f53616c652068617320616c726561647920737461727465640000000000000000600082015250565b600061438960188361401b565b915061439482614353565b602082019050919050565b600060208201905081810360008301526143b88161437c565b9050919050565b7f53616c652068617320616c72656164792066696e697368656400000000000000600082015250565b60006143f560198361401b565b9150614400826143bf565b602082019050919050565b60006020820190508181036000830152614424816143e8565b9050919050565b7f596f7520617265206e6f7420616c6c6f77656420746f20616464207573657273600082015250565b600061446160208361401b565b915061446c8261442b565b602082019050919050565b6000602082019050818103600083015261449081614454565b9050919050565b7f496e76616c6964206163636f756e742061646472657373000000000000000000600082015250565b60006144cd60178361401b565b91506144d882614497565b602082019050919050565b600060208201905081810360008301526144fc816144c0565b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e207a65726f600082015250565b600061453960208361401b565b915061454482614503565b602082019050919050565b600060208201905081810360008301526145688161452c565b9050919050565b7f53616c6520646f6573206e6f7420657869737400000000000000000000000000600082015250565b60006145a560138361401b565b91506145b08261456f565b602082019050919050565b600060208201905081810360008301526145d481614598565b9050919050565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b600061461160128361401b565b915061461c826145db565b602082019050919050565b6000602082019050818103600083015261464081614604565b9050919050565b6000614652826138c1565b915061465d836138c1565b925082820261466b816138c1565b9150828204841483151761468257614681614202565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146c3826138c1565b91506146ce836138c1565b9250826146de576146dd614689565b5b828204905092915050565b60006060820190506146fe6000830186613924565b61470b6020830185613e46565b6147186040830184613924565b949350505050565b7f4e6f7420656e6f75676820746f6b656e7320696e20706f6f6c20746f2061646460008201527f2075736572000000000000000000000000000000000000000000000000000000602082015250565b600061477c60258361401b565b915061478782614720565b604082019050919050565b600060208201905081810360008301526147ab8161476f565b9050919050565b7f4163636f756e747320616e6420616d6f756e7473206c656e677468206d69736d60008201527f6174636800000000000000000000000000000000000000000000000000000000602082015250565b600061480e60248361401b565b9150614819826147b2565b604082019050919050565b6000602082019050818103600083015261483d81614801565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061487e826138c1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148b0576148af614202565b5b600182019050919050565b7f41646472657373206973206e6f7420616c6c6f77656400000000000000000000600082015250565b60006148f160168361401b565b91506148fc826148bb565b602082019050919050565b60006020820190508181036000830152614920816148e4565b9050919050565b600081519050614936816138cb565b92915050565b600060208284031215614952576149516138b7565b5b600061496084828501614927565b91505092915050565b7f496e73756666696369656e742062616c616e636520746f20776974686472617760008201527f20616674657220726573657276696e6720726566657272616c2072657761726460208201527f7300000000000000000000000000000000000000000000000000000000000000604082015250565b60006149eb60418361401b565b91506149f682614969565b606082019050919050565b60006020820190508181036000830152614a1a816149de565b9050919050565b6000614a2c826138c1565b9150614a37836138c1565b9250828203905081811115614a4f57614a4e614202565b5b92915050565b7f4e6f20746f6b656e7320617661696c61626c6520666f7220776974686472617760008201527f616c000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ab160228361401b565b9150614abc82614a55565b604082019050919050565b60006020820190508181036000830152614ae081614aa4565b9050919050565b7f5769746864726177616c206661696c6564000000000000000000000000000000600082015250565b6000614b1d60118361401b565b9150614b2882614ae7565b602082019050919050565b60006020820190508181036000830152614b4c81614b10565b9050919050565b7f596f7520617265206e6f7420616c6c6f77656420746f2063726561746520736160008201527f6c65730000000000000000000000000000000000000000000000000000000000602082015250565b6000614baf60238361401b565b9150614bba82614b53565b604082019050919050565b60006020820190508181036000830152614bde81614ba2565b9050919050565b7f53616c6520616c72656164792065786973747300000000000000000000000000600082015250565b6000614c1b60138361401b565b9150614c2682614be5565b602082019050919050565b60006020820190508181036000830152614c4a81614c0e565b9050919050565b7f546f6b656e207072696365206d7573742062652067726561746572207468616e60008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614cad60258361401b565b9150614cb882614c51565b604082019050919050565b60006020820190508181036000830152614cdc81614ca0565b9050919050565b7f506f6f6c206f6620746f6b656e73206d7573742062652067726561746572207460008201527f68616e207a65726f000000000000000000000000000000000000000000000000602082015250565b6000614d3f60288361401b565b9150614d4a82614ce3565b604082019050919050565b60006020820190508181036000830152614d6e81614d32565b9050919050565b6000604082019050614d8a6000830185613924565b614d976020830184613924565b9392505050565b7f4164647265737320697320616c726561647920616c6c6f776564000000000000600082015250565b6000614dd4601a8361401b565b9150614ddf82614d9e565b602082019050919050565b60006020820190508181036000830152614e0381614dc7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f53616c65206861736e2774207374617274656420796574000000000000000000600082015250565b6000614e6f60178361401b565b9150614e7a82614e39565b602082019050919050565b60006020820190508181036000830152614e9e81614e62565b9050919050565b7f53616c65206861732066696e6973686564000000000000000000000000000000600082015250565b6000614edb60118361401b565b9150614ee682614ea5565b602082019050919050565b60006020820190508181036000830152614f0a81614ece565b9050919050565b6000606082019050614f266000830186613e46565b614f336020830185613e46565b614f406040830184613924565b949350505050565b7f5472616e73666572206661696c65642e2042616c616e6365206f72204170727260008201527f6f76616c206572726f7200000000000000000000000000000000000000000000602082015250565b6000614fa4602a8361401b565b9150614faf82614f48565b604082019050919050565b60006020820190508181036000830152614fd381614f97565b9050919050565b7f57697468206120726566666572616c20616e6420766f6c756d6520626f6e7573600082015250565b600061501060208361401b565b915061501b82614fda565b602082019050919050565b600060608201905061503b6000830185613924565b6150486020830184613924565b818103604083015261505981615003565b90509392505050565b7f5472616e73666572206661696c65642e204e6f7420656e6f75676820746f6b6560008201527f6e7320696e2074686520706f6f6c206f7220417072726f76616c206572726f72602082015250565b60006150be60408361401b565b91506150c982615062565b604082019050919050565b600060208201905081810360008301526150ed816150b1565b9050919050565b7f5769746820766f6c756d6520626f6e7573206f6e6c7900000000000000000000600082015250565b600061512a60168361401b565b9150615135826150f4565b602082019050919050565b60006060820190506151556000830185613924565b6151626020830184613924565b81810360408301526151738161511d565b90509392505050565b7f7769746820726566657272616c20626f6e7573206f6e6c790000000000000000600082015250565b60006151b260188361401b565b91506151bd8261517c565b602082019050919050565b60006060820190506151dd6000830185613924565b6151ea6020830184613924565b81810360408301526151fb816151a5565b90509392505050565b7f6e6f20626f6e7573657300000000000000000000000000000000000000000000600082015250565b600061523a600a8361401b565b915061524582615204565b602082019050919050565b60006060820190506152656000830185613924565b6152726020830184613924565b81810360408301526152838161522d565b90509392505050565b7f4e6f7420656e6f75676820746f6b656e7320696e20706f6f6c20666f7220707560008201527f7263686173650000000000000000000000000000000000000000000000000000602082015250565b60006152e860268361401b565b91506152f38261528c565b604082019050919050565b60006020820190508181036000830152615317816152db565b905091905056fea2646970667358221220226ca304a89476376532adb577510d9fd61e5d1f451ba778f8b8491263041fe164736f6c63430008140033000000000000000000000000c2132d05d31c914a87c6611c10748aeb04b58e8f00000000000000000000000058c61361c94de83f1579937b5f3bce5d955916d3
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c8063715018a6116100de578063a7f08f8d11610097578063d82f718411610071578063d82f71841461045d578063f2fde38b1461048e578063fc0c546a146104aa578063fdd5880a146104c85761018e565b8063a7f08f8d146103dd578063b5f522f7146103f9578063babcc5391461042d5761018e565b8063715018a614610317578063749912761461032157806381788e2b1461033d57806386630b7b146103595780638da5cb5b1461038f578063a110b93f146103ad5761018e565b806336489e081161014b578063501a6f5811610125578063501a6f581461027f57806353aaa63b1461029b57806361bdb0ec146102cb5780636c1909ed146102fb5761018e565b806336489e081461022b5780633c9d93b81461024757806349df728c146102635761018e565b806304d1a846146101935780630502697f146101af57806305eaab4b146101cb5780630e3ab61d146101d55780631e5a5898146101f1578063357b46491461020f575b600080fd5b6101ad60048036038101906101a891906138f7565b6104f8565b005b6101c960048036038101906101c491906138f7565b61069f565b005b6101d3610749565b005b6101ef60048036038101906101ea91906138f7565b610996565b005b6101f9610b32565b6040516102069190613933565b60405180910390f35b610229600480360381019061022491906139ac565b610b38565b005b61024560048036038101906102409190613ace565b61142c565b005b610261600480360381019061025c9190613b97565b611604565b005b61027d60048036038101906102789190613b97565b6116f3565b005b61029960048036038101906102949190613b97565b611ab8565b005b6102b560048036038101906102b09190613b97565b611bea565b6040516102c29190613933565b60405180910390f35b6102e560048036038101906102e09190613b97565b611c02565b6040516102f29190613bdf565b60405180910390f35b61031560048036038101906103109190613bfa565b611c22565b005b61031f611df6565b005b61033b60048036038101906103369190613b97565b611e0a565b005b61035760048036038101906103529190613b97565b611f3d565b005b610373600480360381019061036e91906138f7565b61202d565b6040516103869796959493929190613dc9565b60405180910390f35b61039761223c565b6040516103a49190613e55565b60405180910390f35b6103c760048036038101906103c29190613b97565b612265565b6040516103d49190613933565b60405180910390f35b6103f760048036038101906103f29190613e70565b61227d565b005b610413600480360381019061040e91906138f7565b6132a4565b604051610424959493929190613ed7565b60405180910390f35b61044760048036038101906104429190613b97565b6132f4565b6040516104549190613bdf565b60405180910390f35b610477600480360381019061047291906138f7565b613314565b604051610485929190613f2a565b60405180910390f35b6104a860048036038101906104a39190613b97565b6134e1565b005b6104b2613567565b6040516104bf9190613fc0565b60405180910390f35b6104e260048036038101906104dd9190613fdb565b61358d565b6040516104ef9190613933565b60405180910390f35b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057b9061409e565b60405180910390fd5b600060036000838152602001908152602001600020905060008160030154116105e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d99061410a565b60405180910390fd5b8060000160019054906101000a900460ff1615610634576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90614176565b60405180910390fd5b60018160000160016101000a81548160ff02191690831515021790555060018160000160006101000a81548160ff021916908315150217905550817f94bb74a9473ae4063ec1e73dc3e35fd4b5abe9cc1e43ad0db84e5358559ccd5a60405160405180910390a25050565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661072b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107229061409e565b60405180910390fd5b6107366002546104f8565b61073f81610996565b8060028190555050565b6107516135f0565b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081116107d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cf906141e2565b60405180910390fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461086c9190614231565b92505081905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016108d0929190614265565b6020604051808303816000875af11580156108ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091391906142ba565b610952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094990614333565b60405180910390fd5b7f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b3382604051610983929190614265565b60405180910390a150610994613647565b565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a199061409e565b60405180910390fd5b60006003600083815260200190815260200160002090508060000160009054906101000a900460ff1615610a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a829061439f565b60405180910390fd5b8060000160019054906101000a900460ff1615610add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad49061440b565b60405180910390fd5b60018160000160006101000a81548160ff02191690831515021790555081600281905550817fa78c547613f6306e7a70d1bd161c18a496cae1eeb8d4f9e58b60d69ad72ddf5860405160405180910390a25050565b60025481565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610bd95750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0f90614477565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7e906144e3565b60405180910390fd5b60008211610cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc19061454f565b60405180910390fd5b60006003600086815260200190815260200160002090506000816003015411610d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1f906145bb565b60405180910390fd5b8060000160009054906101000a900460ff168015610d5557508060000160019054906101000a900460ff16155b610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8b90614627565b60405180910390fd5b6000816001015490506000670de0b6b3a76400008286610db49190614647565b610dbe91906146b8565b9050600080600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015610e2c57508773ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b15610f0c576064600884610e409190614647565b610e4a91906146b8565b91506064600388610e5b9190614647565b610e6591906146b8565b905081600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610eb69190614231565b925050819055508573ffffffffffffffffffffffffffffffffffffffff167fe7e15037b577ae985e6019722e882f64c5c6a2124ccc573bab8f79bda0a0c55183604051610f039190613933565b60405180910390a25b6000610f1784613660565b905060006064828a610f299190614647565b610f3391906146b8565b90506000818a610f439190614231565b90506000848b610f539190614231565b9050600085848d610f649190614231565b610f6e9190614231565b90508960030154818b60020154610f859190614231565b1161103d57808a60040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fdb9190614231565b92505081905550808a6002016000828254610ff69190614231565b925050819055507f865275e7fa20bfbd4ba610b45893bd10c6b08b8aeb9964b72ad321d370726e5f8e8e83604051611030939291906146e9565b60405180910390a16112e2565b8960030154838b600201546110529190614231565b1161110a57828a60040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110a89190614231565b92505081905550828a60020160008282546110c39190614231565b925050819055507f865275e7fa20bfbd4ba610b45893bd10c6b08b8aeb9964b72ad321d370726e5f8e8e856040516110fd939291906146e9565b60405180910390a16112e1565b8960030154828b6002015461111f9190614231565b116111d757818a60040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111759190614231565b92505081905550818a60020160008282546111909190614231565b925050819055507f865275e7fa20bfbd4ba610b45893bd10c6b08b8aeb9964b72ad321d370726e5f8e8e846040516111ca939291906146e9565b60405180910390a16112e0565b89600301548c8b600201546111ec9190614231565b116112a4578b8a60040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112429190614231565b925050819055508b8a600201600082825461125d9190614231565b925050819055507f865275e7fa20bfbd4ba610b45893bd10c6b08b8aeb9964b72ad321d370726e5f8e8e8e604051611297939291906146e9565b60405180910390a16112df565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d690614792565b60405180910390fd5b5b5b5b8960050160008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166113f55760018a60050160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550896006018d9080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b89600301548a600201540361141c5761141b60016002546114169190614231565b61069f565b5b5050505050505050505050505050565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806114cd5750600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61150c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150390614477565b60405180910390fd5b838390508686905014611554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154b90614824565b60405180910390fd5b60005b868690508110156115fa57600087878381811061157757611576614844565b5b905060200201602081019061158c9190613b97565b905060008686848181106115a3576115a2614844565b5b90506020020135905060008585858181106115c1576115c0614844565b5b90506020020160208101906115d69190613b97565b90506115e48b848484610b38565b50505080806115f290614873565b915050611557565b5050505050505050565b61160c61373c565b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614907565b60405180910390fd5b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661177f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117769061409e565b60405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016117dc9190613e55565b602060405180830381865afa1580156117f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181d919061493c565b9050600080600090505b60036000600254815260200190815260200160002060060180549050811015611904576000600360006002548152602001908152602001600020600601828154811061187657611875614844565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836118ee9190614231565b92505080806118fc90614873565b915050611827565b50808211611947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193e90614a01565b60405180910390fd5b600081836119559190614a21565b90506000811161199a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199190614ac7565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff1660e01b81526004016119f7929190614265565b6020604051808303816000875af1158015611a16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3a91906142ba565b611a79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7090614b33565b60405180910390fd5b7f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b8482604051611aaa929190614265565b60405180910390a150505050565b611ac061373c565b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4390614907565b60405180910390fd5b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f20ef316471dd8879ccd78c7d468f14e315451401709a97c2a5f29cf36f38c9aa60405160405180910390a250565b60046020528060005260406000206000915090505481565b60076020528060005260406000206000915054906101000a900460ff1681565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca590614bc5565b60405180910390fd5b6000600360008581526020019081526020016000206003015414611d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfe90614c31565b60405180910390fd5b60008211611d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4190614cc3565b60405180910390fd5b60008111611d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8490614d55565b60405180910390fd5b6000600360008581526020019081526020016000209050828160010181905550818160030181905550837f2e09a4c04169b80212f22620e94cb03561bb834e884fc8ee5aeba73e1e560c078484604051611de8929190614d75565b60405180910390a250505050565b611dfe61373c565b611e0860006137c3565b565b611e1261373c565b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9690614dea565b60405180910390fd5b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f5e83dc6b5202f2571bc9cf3131a1c24c523ad38576e15c442941079bb204adc960405160405180910390a250565b611f4561373c565b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc990614dea565b60405180910390fd5b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060008060006060806000600360008a81526020019081526020016000209050806006018054905067ffffffffffffffff8111156120705761206f614e0a565b5b60405190808252806020026020018201604052801561209e5781602001602082028036833780820191505090505b5091508060000160009054906101000a900460ff1697508060000160019054906101000a900460ff1696508060010154955080600201549450806003015493508060060180548060200260200160405190810160405280929190818152602001828054801561216257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612118575b5050505050925060005b816006018054905081101561222f5781600401600083600601838154811061219757612196614844565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548382815181106122105761220f614844565b5b602002602001018181525050808061222790614873565b91505061216c565b5050919395979092949650565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60056020528060005260406000206000915090505481565b6122856135f0565b600060036000858152602001908152602001600020905060008160030154116122e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122da906145bb565b60405180910390fd5b8060000160009054906101000a900460ff16612334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232b90614e85565b60405180910390fd5b8060000160019054906101000a900460ff1615612386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237d90614ef1565b60405180910390fd5b600083116123c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c09061454f565b60405180910390fd5b6000806000670de0b6b3a76400008460010154876123e791906146b8565b6123f19190614647565b9050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561245c57508773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561253c5760646003826124709190614647565b61247a91906146b8565b9250606460088761248b9190614647565b61249591906146b8565b915081600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124e69190614231565b925050819055508473ffffffffffffffffffffffffffffffffffffffff167fe7e15037b577ae985e6019722e882f64c5c6a2124ccc573bab8f79bda0a0c551836040516125339190613933565b60405180910390a25b600061254787613660565b90506000606482846125599190614647565b61256391906146b8565b9050600085846125739190614231565b9050600082856125839190614231565b905060008784876125949190614231565b61259e9190614231565b90508860030154818a600201546125b59190614231565b116128c257600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308e6040518463ffffffff1660e01b815260040161261993929190614f11565b6020604051808303816000875af1158015612638573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265c91906142ba565b61269b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269290614fba565b60405180910390fd5b8860050160008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561274c57808960040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127409190614231565b92505081905550612852565b60018960050160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550886006018d9080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808960040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b808960020160008282546128669190614231565b925050819055508c73ffffffffffffffffffffffffffffffffffffffff167f0e34a84afa34f8f185791c227fbedffb4bc8015ac2da6c69a578fc30f42ae719828e6040516128b5929190615026565b60405180910390a2613266565b8860030154828a600201546128d79190614231565b11612be457600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308e6040518463ffffffff1660e01b815260040161293b93929190614f11565b6020604051808303816000875af115801561295a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297e91906142ba565b6129bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b4906150d4565b60405180910390fd5b8860050160008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612a6e57818960040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a629190614231565b92505081905550612b74565b60018960050160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550886006018d9080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818960040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b81896002016000828254612b889190614231565b925050819055508c73ffffffffffffffffffffffffffffffffffffffff167f0e34a84afa34f8f185791c227fbedffb4bc8015ac2da6c69a578fc30f42ae719838e604051612bd7929190615140565b60405180910390a2613265565b8860030154838a60020154612bf99190614231565b11612f0657600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308e6040518463ffffffff1660e01b8152600401612c5d93929190614f11565b6020604051808303816000875af1158015612c7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ca091906142ba565b612cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd6906150d4565b60405180910390fd5b8860050160008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612d9057828960040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d849190614231565b92505081905550612e96565b60018960050160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550886006018d9080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828960040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b82896002016000828254612eaa9190614231565b925050819055508c73ffffffffffffffffffffffffffffffffffffffff167f0e34a84afa34f8f185791c227fbedffb4bc8015ac2da6c69a578fc30f42ae719848e604051612ef99291906151c8565b60405180910390a2613264565b8860030154868a60020154612f1b9190614231565b1161322857600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33308e6040518463ffffffff1660e01b8152600401612f7f93929190614f11565b6020604051808303816000875af1158015612f9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc291906142ba565b613001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff8906150d4565b60405180910390fd5b8860050160008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156130b257858960040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130a69190614231565b925050819055506131b8565b60018960050160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550886006018d9080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550858960040160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b858960020160008282546131cc9190614231565b925050819055508c73ffffffffffffffffffffffffffffffffffffffff167f0e34a84afa34f8f185791c227fbedffb4bc8015ac2da6c69a578fc30f42ae719878e60405161321b929190615250565b60405180910390a2613263565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325a906152fe565b60405180910390fd5b5b5b5b886003015489600201540361328d5761328c60016002546132879190614231565b61069f565b5b50505050505050505061329e613647565b50505050565b60036020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060010154908060020154908060030154905085565b60066020528060005260406000206000915054906101000a900460ff1681565b60608060006003600085815260200190815260200160002090506000816006018054905067ffffffffffffffff81111561335157613350614e0a565b5b60405190808252806020026020018201604052801561337f5781602001602082028036833780820191505090505b50905060005b8260060180549050811015613448578260040160008460060183815481106133b0576133af614844565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482828151811061342957613428614844565b5b602002602001018181525050808061344090614873565b915050613385565b508160060181818054806020026020016040519081016040528092919081815260200182805480156134cf57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311613485575b50505050509150935093505050915091565b6134e961373c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361355b5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016135529190613e55565b60405180910390fd5b613564816137c3565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806003600085815260200190815260200160002060040160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508091505092915050565b60006135fa613887565b9050600281600001540361363a576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002816000018190555050565b6000613651613887565b90506001816000018190555050565b600080600090506000620f42409050806101f461367d9190614647565b84101580156136995750806105dc6136959190614647565b8411155b156136a75760039150613732565b806105dc6136b59190614647565b841180156136d0575080610bb86136cc9190614647565b8411155b156136de5760059150613731565b80610bb86136ec9190614647565b841180156137075750806113886137039190614647565b8411155b156137155760079150613730565b806113886137239190614647565b84111561372f57600a91505b5b5b5b8192505050919050565b6137446138af565b73ffffffffffffffffffffffffffffffffffffffff1661376261223c565b73ffffffffffffffffffffffffffffffffffffffff16146137c1576137856138af565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016137b89190613e55565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60007f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00905090565b600033905090565b600080fd5b600080fd5b6000819050919050565b6138d4816138c1565b81146138df57600080fd5b50565b6000813590506138f1816138cb565b92915050565b60006020828403121561390d5761390c6138b7565b5b600061391b848285016138e2565b91505092915050565b61392d816138c1565b82525050565b60006020820190506139486000830184613924565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139798261394e565b9050919050565b6139898161396e565b811461399457600080fd5b50565b6000813590506139a681613980565b92915050565b600080600080608085870312156139c6576139c56138b7565b5b60006139d4878288016138e2565b94505060206139e587828801613997565b93505060406139f6878288016138e2565b9250506060613a0787828801613997565b91505092959194509250565b600080fd5b600080fd5b600080fd5b60008083601f840112613a3857613a37613a13565b5b8235905067ffffffffffffffff811115613a5557613a54613a18565b5b602083019150836020820283011115613a7157613a70613a1d565b5b9250929050565b60008083601f840112613a8e57613a8d613a13565b5b8235905067ffffffffffffffff811115613aab57613aaa613a18565b5b602083019150836020820283011115613ac757613ac6613a1d565b5b9250929050565b60008060008060008060006080888a031215613aed57613aec6138b7565b5b6000613afb8a828b016138e2565b975050602088013567ffffffffffffffff811115613b1c57613b1b6138bc565b5b613b288a828b01613a22565b9650965050604088013567ffffffffffffffff811115613b4b57613b4a6138bc565b5b613b578a828b01613a78565b9450945050606088013567ffffffffffffffff811115613b7a57613b796138bc565b5b613b868a828b01613a22565b925092505092959891949750929550565b600060208284031215613bad57613bac6138b7565b5b6000613bbb84828501613997565b91505092915050565b60008115159050919050565b613bd981613bc4565b82525050565b6000602082019050613bf46000830184613bd0565b92915050565b600080600060608486031215613c1357613c126138b7565b5b6000613c21868287016138e2565b9350506020613c32868287016138e2565b9250506040613c43868287016138e2565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613c828161396e565b82525050565b6000613c948383613c79565b60208301905092915050565b6000602082019050919050565b6000613cb882613c4d565b613cc28185613c58565b9350613ccd83613c69565b8060005b83811015613cfe578151613ce58882613c88565b9750613cf083613ca0565b925050600181019050613cd1565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613d40816138c1565b82525050565b6000613d528383613d37565b60208301905092915050565b6000602082019050919050565b6000613d7682613d0b565b613d808185613d16565b9350613d8b83613d27565b8060005b83811015613dbc578151613da38882613d46565b9750613dae83613d5e565b925050600181019050613d8f565b5085935050505092915050565b600060e082019050613dde600083018a613bd0565b613deb6020830189613bd0565b613df86040830188613924565b613e056060830187613924565b613e126080830186613924565b81810360a0830152613e248185613cad565b905081810360c0830152613e388184613d6b565b905098975050505050505050565b613e4f8161396e565b82525050565b6000602082019050613e6a6000830184613e46565b92915050565b60008060008060808587031215613e8a57613e896138b7565b5b6000613e9887828801613997565b9450506020613ea9878288016138e2565b9350506040613eba878288016138e2565b9250506060613ecb87828801613997565b91505092959194509250565b600060a082019050613eec6000830188613bd0565b613ef96020830187613bd0565b613f066040830186613924565b613f136060830185613924565b613f206080830184613924565b9695505050505050565b60006040820190508181036000830152613f448185613cad565b90508181036020830152613f588184613d6b565b90509392505050565b6000819050919050565b6000613f86613f81613f7c8461394e565b613f61565b61394e565b9050919050565b6000613f9882613f6b565b9050919050565b6000613faa82613f8d565b9050919050565b613fba81613f9f565b82525050565b6000602082019050613fd56000830184613fb1565b92915050565b60008060408385031215613ff257613ff16138b7565b5b6000614000858286016138e2565b925050602061401185828601613997565b9150509250929050565b600082825260208201905092915050565b7f596f7520617265206e6f7420616c6c6f77656420746f2077697468647261772060008201527f746f6b656e730000000000000000000000000000000000000000000000000000602082015250565b600061408860268361401b565b91506140938261402c565b604082019050919050565b600060208201905081810360008301526140b78161407b565b9050919050565b7f53616c6520646f65736e27742065786973740000000000000000000000000000600082015250565b60006140f460128361401b565b91506140ff826140be565b602082019050919050565b60006020820190508181036000830152614123816140e7565b9050919050565b7f53616c6520616c72656164792066696e69736865640000000000000000000000600082015250565b600061416060158361401b565b915061416b8261412a565b602082019050919050565b6000602082019050818103600083015261418f81614153565b9050919050565b7f4e6f207265776172647320746f20636c61696d00000000000000000000000000600082015250565b60006141cc60138361401b565b91506141d782614196565b602082019050919050565b600060208201905081810360008301526141fb816141bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061423c826138c1565b9150614247836138c1565b925082820190508082111561425f5761425e614202565b5b92915050565b600060408201905061427a6000830185613e46565b6142876020830184613924565b9392505050565b61429781613bc4565b81146142a257600080fd5b50565b6000815190506142b48161428e565b92915050565b6000602082840312156142d0576142cf6138b7565b5b60006142de848285016142a5565b91505092915050565b7f436c61696d20726577617264207472616e73666572206661696c656400000000600082015250565b600061431d601c8361401b565b9150614328826142e7565b602082019050919050565b6000602082019050818103600083015261434c81614310565b9050919050565b7f53616c652068617320616c726561647920737461727465640000000000000000600082015250565b600061438960188361401b565b915061439482614353565b602082019050919050565b600060208201905081810360008301526143b88161437c565b9050919050565b7f53616c652068617320616c72656164792066696e697368656400000000000000600082015250565b60006143f560198361401b565b9150614400826143bf565b602082019050919050565b60006020820190508181036000830152614424816143e8565b9050919050565b7f596f7520617265206e6f7420616c6c6f77656420746f20616464207573657273600082015250565b600061446160208361401b565b915061446c8261442b565b602082019050919050565b6000602082019050818103600083015261449081614454565b9050919050565b7f496e76616c6964206163636f756e742061646472657373000000000000000000600082015250565b60006144cd60178361401b565b91506144d882614497565b602082019050919050565b600060208201905081810360008301526144fc816144c0565b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e207a65726f600082015250565b600061453960208361401b565b915061454482614503565b602082019050919050565b600060208201905081810360008301526145688161452c565b9050919050565b7f53616c6520646f6573206e6f7420657869737400000000000000000000000000600082015250565b60006145a560138361401b565b91506145b08261456f565b602082019050919050565b600060208201905081810360008301526145d481614598565b9050919050565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b600061461160128361401b565b915061461c826145db565b602082019050919050565b6000602082019050818103600083015261464081614604565b9050919050565b6000614652826138c1565b915061465d836138c1565b925082820261466b816138c1565b9150828204841483151761468257614681614202565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146c3826138c1565b91506146ce836138c1565b9250826146de576146dd614689565b5b828204905092915050565b60006060820190506146fe6000830186613924565b61470b6020830185613e46565b6147186040830184613924565b949350505050565b7f4e6f7420656e6f75676820746f6b656e7320696e20706f6f6c20746f2061646460008201527f2075736572000000000000000000000000000000000000000000000000000000602082015250565b600061477c60258361401b565b915061478782614720565b604082019050919050565b600060208201905081810360008301526147ab8161476f565b9050919050565b7f4163636f756e747320616e6420616d6f756e7473206c656e677468206d69736d60008201527f6174636800000000000000000000000000000000000000000000000000000000602082015250565b600061480e60248361401b565b9150614819826147b2565b604082019050919050565b6000602082019050818103600083015261483d81614801565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061487e826138c1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148b0576148af614202565b5b600182019050919050565b7f41646472657373206973206e6f7420616c6c6f77656400000000000000000000600082015250565b60006148f160168361401b565b91506148fc826148bb565b602082019050919050565b60006020820190508181036000830152614920816148e4565b9050919050565b600081519050614936816138cb565b92915050565b600060208284031215614952576149516138b7565b5b600061496084828501614927565b91505092915050565b7f496e73756666696369656e742062616c616e636520746f20776974686472617760008201527f20616674657220726573657276696e6720726566657272616c2072657761726460208201527f7300000000000000000000000000000000000000000000000000000000000000604082015250565b60006149eb60418361401b565b91506149f682614969565b606082019050919050565b60006020820190508181036000830152614a1a816149de565b9050919050565b6000614a2c826138c1565b9150614a37836138c1565b9250828203905081811115614a4f57614a4e614202565b5b92915050565b7f4e6f20746f6b656e7320617661696c61626c6520666f7220776974686472617760008201527f616c000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ab160228361401b565b9150614abc82614a55565b604082019050919050565b60006020820190508181036000830152614ae081614aa4565b9050919050565b7f5769746864726177616c206661696c6564000000000000000000000000000000600082015250565b6000614b1d60118361401b565b9150614b2882614ae7565b602082019050919050565b60006020820190508181036000830152614b4c81614b10565b9050919050565b7f596f7520617265206e6f7420616c6c6f77656420746f2063726561746520736160008201527f6c65730000000000000000000000000000000000000000000000000000000000602082015250565b6000614baf60238361401b565b9150614bba82614b53565b604082019050919050565b60006020820190508181036000830152614bde81614ba2565b9050919050565b7f53616c6520616c72656164792065786973747300000000000000000000000000600082015250565b6000614c1b60138361401b565b9150614c2682614be5565b602082019050919050565b60006020820190508181036000830152614c4a81614c0e565b9050919050565b7f546f6b656e207072696365206d7573742062652067726561746572207468616e60008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614cad60258361401b565b9150614cb882614c51565b604082019050919050565b60006020820190508181036000830152614cdc81614ca0565b9050919050565b7f506f6f6c206f6620746f6b656e73206d7573742062652067726561746572207460008201527f68616e207a65726f000000000000000000000000000000000000000000000000602082015250565b6000614d3f60288361401b565b9150614d4a82614ce3565b604082019050919050565b60006020820190508181036000830152614d6e81614d32565b9050919050565b6000604082019050614d8a6000830185613924565b614d976020830184613924565b9392505050565b7f4164647265737320697320616c726561647920616c6c6f776564000000000000600082015250565b6000614dd4601a8361401b565b9150614ddf82614d9e565b602082019050919050565b60006020820190508181036000830152614e0381614dc7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f53616c65206861736e2774207374617274656420796574000000000000000000600082015250565b6000614e6f60178361401b565b9150614e7a82614e39565b602082019050919050565b60006020820190508181036000830152614e9e81614e62565b9050919050565b7f53616c65206861732066696e6973686564000000000000000000000000000000600082015250565b6000614edb60118361401b565b9150614ee682614ea5565b602082019050919050565b60006020820190508181036000830152614f0a81614ece565b9050919050565b6000606082019050614f266000830186613e46565b614f336020830185613e46565b614f406040830184613924565b949350505050565b7f5472616e73666572206661696c65642e2042616c616e6365206f72204170727260008201527f6f76616c206572726f7200000000000000000000000000000000000000000000602082015250565b6000614fa4602a8361401b565b9150614faf82614f48565b604082019050919050565b60006020820190508181036000830152614fd381614f97565b9050919050565b7f57697468206120726566666572616c20616e6420766f6c756d6520626f6e7573600082015250565b600061501060208361401b565b915061501b82614fda565b602082019050919050565b600060608201905061503b6000830185613924565b6150486020830184613924565b818103604083015261505981615003565b90509392505050565b7f5472616e73666572206661696c65642e204e6f7420656e6f75676820746f6b6560008201527f6e7320696e2074686520706f6f6c206f7220417072726f76616c206572726f72602082015250565b60006150be60408361401b565b91506150c982615062565b604082019050919050565b600060208201905081810360008301526150ed816150b1565b9050919050565b7f5769746820766f6c756d6520626f6e7573206f6e6c7900000000000000000000600082015250565b600061512a60168361401b565b9150615135826150f4565b602082019050919050565b60006060820190506151556000830185613924565b6151626020830184613924565b81810360408301526151738161511d565b90509392505050565b7f7769746820726566657272616c20626f6e7573206f6e6c790000000000000000600082015250565b60006151b260188361401b565b91506151bd8261517c565b602082019050919050565b60006060820190506151dd6000830185613924565b6151ea6020830184613924565b81810360408301526151fb816151a5565b90509392505050565b7f6e6f20626f6e7573657300000000000000000000000000000000000000000000600082015250565b600061523a600a8361401b565b915061524582615204565b602082019050919050565b60006060820190506152656000830185613924565b6152726020830184613924565b81810360408301526152838161522d565b90509392505050565b7f4e6f7420656e6f75676820746f6b656e7320696e20706f6f6c20666f7220707560008201527f7263686173650000000000000000000000000000000000000000000000000000602082015250565b60006152e860268361401b565b91506152f38261528c565b604082019050919050565b60006020820190508181036000830152615317816152db565b905091905056fea2646970667358221220226ca304a89476376532adb577510d9fd61e5d1f451ba778f8b8491263041fe164736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c2132d05d31c914a87c6611c10748aeb04b58e8f00000000000000000000000058c61361c94de83f1579937b5f3bce5d955916d3
-----Decoded View---------------
Arg [0] : _token (address): 0xc2132D05D31c914a87C6611C10748AEb04B58e8F
Arg [1] : initialOwner (address): 0x58C61361C94De83f1579937B5f3bCE5d955916d3
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c2132d05d31c914a87c6611c10748aeb04b58e8f
Arg [1] : 00000000000000000000000058c61361c94de83f1579937b5f3bce5d955916d3
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
POL | 100.00% | $0.999651 | 7,912.5368 | $7,909.78 |
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.