Contract Address Details
contract
0x17d138722cdAFdd2C1ff61026D568b5332Db02ee
Sponsored: ERAM, a pioneering Central Bank Blockchain. The First Banking Regulatory Blockchain, Licensed by the Central Bank.
ERAM, Central Bank Digital Currency (CBDC) (STABLE COIN)
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- MasterChefV2
- Optimization enabled
- true
- Compiler version
- v0.6.12+commit.27d51765
- Optimization runs
- 99999
- EVM Version
- default
- Verified at
- 2024-07-20T02:54:43.922146Z
Constructor Arguments
0x0000000000000000000000008cda7b8b6587232d8b29fa07238b8d5d61cf055d00000000000000000000000054ba4075ceb2e31ed20e0cc442ea8ca0f3479ccf00000000000000000000000000000000000000000000000000000000000000020000000000000000000000008df97eab2651e87a8a4080008ddabf6824c9f672
Arg [0] (address) : 0x8cda7b8b6587232d8b29fa07238b8d5d61cf055d
Arg [1] (address) : 0x54ba4075ceb2e31ed20e0cc442ea8ca0f3479ccf
Arg [2] (uint256) : 2
Arg [3] (address) : 0x8df97eab2651e87a8a4080008ddabf6824c9f672
contracts/MasterChefV2.sol
// SPDX-License-Identifier: MITpragma solidity 0.6.12;pragma experimental ABIEncoderV2;import "@openzeppelin/contracts/access/Ownable.sol";import "@openzeppelin/contracts/math/SafeMath.sol";import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";import "bsc-library/contracts/IBEP20.sol";import "bsc-library/contracts/SafeBEP20.sol";import "./interfaces/IMasterChef.sol";/// @notice The (older) MasterChef contract gives out a constant number of CAKE tokens per block./// It is the only address with minting rights for CAKE./// The idea for this MasterChef V2 (MCV2) contract is therefore to be the owner of a dummy token/// that is deposited into the MasterChef V1 (MCV1) contract./// The allocation point for this pool on MCV1 is the total allocation point for all pools that receive incentives.contract MasterChefV2 is Ownable, ReentrancyGuard {using SafeMath for uint256;using SafeBEP20 for IBEP20;/// @notice Info of each MCV2 user./// `amount` LP token amount the user has provided./// `rewardDebt` Used to calculate the correct amount of rewards. See explanation below.////// We do some fancy math here. Basically, any point in time, the amount of CAKEs/// entitled to a user but is pending to be distributed is:////// pending reward = (user share * pool.accCakePerShare) - user.rewardDebt////// Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens:/// 1. The pool's `accCakePerShare` (and `lastRewardBlock`) gets updated./// 2. User receives the pending reward sent to his/her address./// 3. User's `amount` gets updated. Pool's `totalBoostedShare` gets updated./// 4. User's `rewardDebt` gets updated.struct UserInfo {uint256 amount;uint256 rewardDebt;uint256 boostMultiplier;}
@openzeppelin/contracts/access/Ownable.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.0 <0.8.0;import "../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.** By default, the owner account will be the one that deploys the contract. 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;event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);/*** @dev Initializes the contract setting the deployer as the initial owner.*/constructor () internal {address msgSender = _msgSender();_owner = msgSender;emit OwnershipTransferred(address(0), msgSender);}/*** @dev Returns the address of the current owner.*/function owner() public view virtual returns (address) {return _owner;}/*** @dev Throws if called by any account other than the owner.*/
@openzeppelin/contracts/math/SafeMath.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.0 <0.8.0;/*** @dev Wrappers over Solidity's arithmetic operations with added overflow* checks.** Arithmetic operations in Solidity wrap on overflow. This can easily result* in bugs, because programmers usually assume that an overflow raises an* error, which is the standard behavior in high level programming languages.* `SafeMath` restores this intuition by reverting the transaction when an* operation overflows.** Using this library instead of the unchecked operations eliminates an entire* class of bugs, so it's recommended to use it always.*/library SafeMath {/*** @dev Returns the addition of two unsigned integers, with an overflow flag.** _Available since v3.4._*/function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {uint256 c = a + b;if (c < a) return (false, 0);return (true, c);}/*** @dev Returns the substraction of two unsigned integers, with an overflow flag.** _Available since v3.4._*/function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {if (b > a) return (false, 0);return (true, a - b);}/*** @dev Returns the multiplication of two unsigned integers, with an overflow flag.
@openzeppelin/contracts/utils/Address.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.2 <0.8.0;/*** @dev Collection of functions related to the address type*/library Address {/*** @dev Returns true if `account` is a contract.** [IMPORTANT]* ====* It is unsafe to assume that an address for which this function returns* false is an externally-owned account (EOA) and not a contract.** Among others, `isContract` will return false for the following* types of addresses:** - an externally-owned account* - a contract in construction* - an address where a contract will be created* - an address where a contract lived, but was destroyed* ====*/function isContract(address account) internal view returns (bool) {// This method relies on extcodesize, which returns 0 for contracts in// construction, since the code is only stored at the end of the// constructor execution.uint256 size;// solhint-disable-next-line no-inline-assemblyassembly { size := extcodesize(account) }return size > 0;}/*** @dev Replacement for Solidity's `transfer`: sends `amount` wei to* `recipient`, forwarding all available gas and reverting on errors.** https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
@openzeppelin/contracts/utils/Context.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.0 <0.8.0;/** @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 GSN 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 payable) {return msg.sender;}function _msgData() internal view virtual returns (bytes memory) {this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691return msg.data;}}
@openzeppelin/contracts/utils/ReentrancyGuard.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.0 <0.8.0;/*** @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 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 ReentrancyGuard {// 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;uint256 private _status;constructor () internal {_status = _NOT_ENTERED;}
bsc-library/contracts/IBEP20.sol
// SPDX-License-Identifier: MITpragma solidity >=0.4.0;interface IBEP20 {/*** @dev Returns the amount of tokens in existence.*/function totalSupply() external view returns (uint256);/*** @dev Returns the token decimals.*/function decimals() external view returns (uint8);/*** @dev Returns the token symbol.*/function symbol() external view returns (string memory);/*** @dev Returns the token name.*/function name() external view returns (string memory);/*** @dev Returns the bep token owner.*/function getOwner() external view returns (address);/*** @dev Returns the amount of tokens owned by `account`.*/function balanceOf(address account) external view returns (uint256);/*** @dev Moves `amount` tokens from the caller's account to `recipient`.** Returns a boolean value indicating whether the operation succeeded.** Emits a {Transfer} event.
bsc-library/contracts/SafeBEP20.sol
// SPDX-License-Identifier: MITpragma solidity ^0.6.0;import "./IBEP20.sol";import "@openzeppelin/contracts/utils/Address.sol";import "@openzeppelin/contracts/math/SafeMath.sol";/*** @title SafeBEP20* @dev Wrappers around BEP20 operations that throw on failure (when the token* contract returns false). Tokens that return no value (and instead revert or* throw on failure) are also supported, non-reverting calls are assumed to be* successful.* To use this library you can add a `using SafeBEP20 for IBEP20;` statement to your contract,* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.*/library SafeBEP20 {using SafeMath for uint256;using Address for address;function safeTransfer(IBEP20 token,address to,uint256 value) internal {_callOptionalReturn(token,abi.encodeWithSelector(token.transfer.selector, to, value));}function safeTransferFrom(IBEP20 token,address from,address to,uint256 value) internal {_callOptionalReturn(token,abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
contracts/interfaces/IMasterChef.sol
// SPDX-License-Identifier: MITpragma solidity 0.6.12;interface IMasterChef {function deposit(uint256 _pid, uint256 _amount) external;function withdraw(uint256 _pid, uint256 _amount) external;function enterStaking(uint256 _amount) external;function leaveStaking(uint256 _amount) external;function pendingCake(uint256 _pid, address _user) external view returns (uint256);function userInfo(uint256 _pid, address _user) external view returns (uint256, uint256);function emergencyWithdraw(uint256 _pid) external;}
Compiler Settings
{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}},"optimizer":{"runs":99999,"enabled":true},"libraries":{}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_MASTER_CHEF","internalType":"contract IMasterChef"},{"type":"address","name":"_CAKE","internalType":"contract IBEP20"},{"type":"uint256","name":"_MASTER_PID","internalType":"uint256"},{"type":"address","name":"_burnAdmin","internalType":"address"}]},{"type":"event","name":"AddPool","inputs":[{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"allocPoint","internalType":"uint256","indexed":false},{"type":"address","name":"lpToken","internalType":"contract IBEP20","indexed":true},{"type":"bool","name":"isRegular","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"Deposit","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"EmergencyWithdraw","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Init","inputs":[],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SetPool","inputs":[{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"allocPoint","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UpdateBoostContract","inputs":[{"type":"address","name":"boostContract","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"UpdateBoostMultiplier","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":false},{"type":"uint256","name":"oldMultiplier","internalType":"uint256","indexed":false},{"type":"uint256","name":"newMultiplier","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UpdateBurnAdmin","inputs":[{"type":"address","name":"oldAdmin","internalType":"address","indexed":true},{"type":"address","name":"newAdmin","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"UpdateCakeRate","inputs":[{"type":"uint256","name":"burnRate","internalType":"uint256","indexed":false},{"type":"uint256","name":"regularFarmRate","internalType":"uint256","indexed":false},{"type":"uint256","name":"specialFarmRate","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UpdatePool","inputs":[{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"lastRewardBlock","internalType":"uint256","indexed":false},{"type":"uint256","name":"lpSupply","internalType":"uint256","indexed":false},{"type":"uint256","name":"accCakePerShare","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UpdateWhiteList","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"bool","name":"isValid","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"Withdraw","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"ACC_CAKE_PRECISION","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"BOOST_PRECISION","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IBEP20"}],"name":"CAKE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"CAKE_RATE_TOTAL_PRECISION","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MASTERCHEF_CAKE_PER_BLOCK","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IMasterChef"}],"name":"MASTER_CHEF","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MASTER_PID","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_BOOST_PRECISION","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"add","inputs":[{"type":"uint256","name":"_allocPoint","internalType":"uint256"},{"type":"address","name":"_lpToken","internalType":"contract IBEP20"},{"type":"bool","name":"_isRegular","internalType":"bool"},{"type":"bool","name":"_withUpdate","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"boostContract","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"burnAdmin","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burnCake","inputs":[{"type":"bool","name":"_withUpdate","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"amount","internalType":"uint256"}],"name":"cakePerBlock","inputs":[{"type":"bool","name":"_isRegular","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"amount","internalType":"uint256"}],"name":"cakePerBlockToBurn","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"cakeRateToBurn","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"cakeRateToRegularFarm","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"cakeRateToSpecialFarm","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deposit","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"emergencyWithdraw","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getBoostMultiplier","inputs":[{"type":"address","name":"_user","internalType":"address"},{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"harvestFromMasterChef","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"init","inputs":[{"type":"address","name":"dummyToken","internalType":"contract IBEP20"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lastBurnedBlock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IBEP20"}],"name":"lpToken","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"massUpdatePools","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"pendingCake","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"accCakePerShare","internalType":"uint256"},{"type":"uint256","name":"lastRewardBlock","internalType":"uint256"},{"type":"uint256","name":"allocPoint","internalType":"uint256"},{"type":"uint256","name":"totalBoostedShare","internalType":"uint256"},{"type":"bool","name":"isRegular","internalType":"bool"}],"name":"poolInfo","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"pools","internalType":"uint256"}],"name":"poolLength","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"set","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"uint256","name":"_allocPoint","internalType":"uint256"},{"type":"bool","name":"_withUpdate","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalRegularAllocPoint","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSpecialAllocPoint","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateBoostContract","inputs":[{"type":"address","name":"_newBoostContract","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateBoostMultiplier","inputs":[{"type":"address","name":"_user","internalType":"address"},{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"uint256","name":"_newMultiplier","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateBurnAdmin","inputs":[{"type":"address","name":"_newAdmin","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateCakeRate","inputs":[{"type":"uint256","name":"_burnRate","internalType":"uint256"},{"type":"uint256","name":"_regularFarmRate","internalType":"uint256"},{"type":"uint256","name":"_specialFarmRate","internalType":"uint256"},{"type":"bool","name":"_withUpdate","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"tuple","name":"pool","internalType":"struct MasterChefV2.PoolInfo","components":[{"type":"uint256","name":"accCakePerShare","internalType":"uint256"},{"type":"uint256","name":"lastRewardBlock","internalType":"uint256"},{"type":"uint256","name":"allocPoint","internalType":"uint256"},{"type":"uint256","name":"totalBoostedShare","internalType":"uint256"},{"type":"bool","name":"isRegular","internalType":"bool"}]}],"name":"updatePool","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateWhiteList","inputs":[{"type":"address","name":"_user","internalType":"address"},{"type":"bool","name":"_isValid","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"rewardDebt","internalType":"uint256"},{"type":"uint256","name":"boostMultiplier","internalType":"uint256"}],"name":"userInfo","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"whiteList","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"uint256","name":"_amount","internalType":"uint256"}]}]
Contract Creation Code
0x60e060405264e302875600600a55640106e050f8600b556404cb3d6908600c553480156200002c57600080fd5b5060405162003e6538038062003e658339810160408190526200004f91620000f3565b60006200005b620000ef565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060018055606093841b6001600160601b03199081166080529290931b90911660a05260c052600280546001600160a01b0319166001600160a01b0390921691909117905562000167565b3390565b6000806000806080858703121562000109578384fd5b845162000116816200014e565b602086015190945062000129816200014e565b60408601516060870151919450925062000143816200014e565b939692955090935050565b6001600160a01b03811681146200016457600080fd5b50565b60805160601c60a05160601c60c051613c9e620001c760003980610f7c528061133552806116925250806112a95280611f7e5280612c0a5280612cdd5280612d8a525080610e955280610f4f5280611308528061278d5250613c9e6000f3fe608060405234801561001057600080fd5b50600436106102e95760003560e01c80637398b7ea11610191578063ac1d0609116100e3578063dfcedeee11610097578063e39e132311610071578063e39e13231461052b578063edd8b17014610569578063f2fde38b14610571576102e9565b8063dfcedeee14610546578063e0f91f6c1461054e578063e2bbb15814610556576102e9565b8063c507aeaa116100c8578063c507aeaa14610518578063cc6db2da1461052b578063dc6363df14610533576102e9565b8063ac1d0609146104fd578063c40d337b14610510576102e9565b80638da5cb5b116101455780639dcc1b5f1161011f5780639dcc1b5f146104da5780639dd2fcc3146104e2578063aa47bc8e146104f5576102e9565b80638da5cb5b146104a857806393f1a40b146104b057806399d7e84a146104d2576102e9565b806378db4c341161017657806378db4c341461048557806378ed5d1f1461048d57806381bdf98c146104a0576102e9565b80637398b7ea1461046a578063777a97f814610472576102e9565b806339aae5ba1161024a5780635312ea8e116101fe57806364482f79116101d857806364482f791461044757806369b021281461045a578063715018a614610462576102e9565b80635312ea8e1461042457806361621aaa14610437578063630b5ba11461043f576102e9565b80634ca6ef281161022f5780634ca6ef28146103e75780634f70b15a146103fc57806351eb05a614610404576102e9565b806339aae5ba146103cc578063441a3e70146103d4576102e9565b80631526fe27116102a15780631ce06d57116102865780631ce06d57146103915780631e9b828b14610399578063372c12b1146103ac576102e9565b80631526fe271461035a57806319ab453c1461037e576102e9565b8063081e3eda116102d2578063081e3eda1461032c5780630bb844bc146103345780631175a1dd14610347576102e9565b8063033186e8146102ee578063041a84c914610317575b600080fd5b6103016102fc366004613081565b610584565b60405161030e9190613ba7565b60405180910390f35b61032a6103253660046130ac565b6105da565b005b610301610952565b61032a61034236600461302d565b610958565b610301610355366004613148565b610ae4565b61036d610368366004613118565b610c97565b60405161030e959493929190613be4565b61032a61038c36600461302d565b610cd8565b610301611009565b6103016103a73660046130e0565b61100f565b6103bf6103ba36600461302d565b611074565b60405161030e91906132e0565b610301611089565b61032a6103e23660046131be565b611096565b6103ef6112a7565b60405161030e9190613268565b61032a6112cb565b610417610412366004613118565b611394565b60405161030e9190613b6b565b61032a610432366004613118565b611562565b610301611690565b61032a6116b4565b61032a6104553660046131df565b611748565b6103016118d6565b61032a6118e0565b6103016119c2565b61032a6104803660046130e0565b6119ce565b610301611aab565b6103ef61049b366004613118565b611ab1565b6103ef611ae5565b6103ef611b01565b6104c36104be366004613148565b611b1d565b60405161030e93929190613bce565b610301611b49565b610301611b4f565b61032a6104f036600461302d565b611b7d565b610301611cd5565b61032a61050b366004613049565b611cdb565b610301611e26565b61032a61052636600461316c565b611e2c565b61030161221c565b61032a610541366004613217565b612225565b6103ef61239e565b6103016123ba565b61032a6105643660046131be565b6123c0565b6103ef61278b565b61032a61057f36600461302d565b6127af565b600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281206002015464e8d4a5100081116105ce5764e8d4a510006105d0565b805b9150505b92915050565b60035473ffffffffffffffffffffffffffffffffffffffff163314610634576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b9061384c565b60405180910390fd5b60026001541415610671576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613a54565b600260015573ffffffffffffffffffffffffffffffffffffffff83166106c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b906135b2565b600482815481106106d057fe5b600091825260209091206004600590920201015460ff1661071d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613906565b64e8d4a51000811015801561073857506501d1a94a20008111155b61076e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613399565b610776612fdb565b61077f83611394565b600084815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8916845290915281209192506107bb8686610584565b90506107c88686836128fc565b610808670de0b6b3a76400006107fc856000015161080264e8d4a510006107fc8a89600001546129d990919063ffffffff16565b90612a2d565b906129d9565b60018301558154610854906108289064e8d4a51000906107fc90886129d9565b835461084e906108439064e8d4a51000906107fc90876129d9565b606087015190612a79565b90612abb565b6060840152600480548491908790811061086a57fe5b6000918252602080832084516005939093020191825583810151600183015560408085015160028085019190915560608601516003850155608090950151600490930180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016931515939093179092558883526006815281832073ffffffffffffffffffffffffffffffffffffffff8b1680855291529181902090920186905590517f01abd62439b64f6c5dab6f94d56099495bd0c094f9c21f98f4d3562a21edb4ba9061093e90889085908990613bce565b60405180910390a250506001805550505050565b60045490565b610960612afa565b73ffffffffffffffffffffffffffffffffffffffff1661097e611b01565b73ffffffffffffffffffffffffffffffffffffffff16146109cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613817565b73ffffffffffffffffffffffffffffffffffffffff8116610a18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b9061360f565b60025473ffffffffffffffffffffffffffffffffffffffff82811691161415610a6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613a8b565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907fd146fe330fdddf682413850a35b28edfccd4c4b53cfee802fd24950de5be1dbe90600090a35050565b6000610aee612fdb565b60048481548110610afb57fe5b60009182526020918290206040805160a0810182526005909302909101805483526001810154938301939093526002830154908201526003820154606082015260049091015460ff16151560808201529050610b5561300c565b50600084815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845282529182902082516060808201855282548252600183015482850152600290920154938101939093528351908401519184015190919043118015610bc357508015155b15610c43576000610be1856020015143612a7990919063ffffffff16565b90506000610c1c8660800151610bf957600954610bfd565b6008545b6107fc8860400151610802610c158b6080015161100f565b87906129d9565b9050610c3e610c37846107fc84670de0b6b3a76400006129d9565b8590612abb565b935050505b6000610c6364e8d4a510006107fc610c5b8a8c610584565b8751906129d9565b6020850151909150610c8b90610c85670de0b6b3a76400006107fc85886129d9565b90612a79565b98975050505050505050565b60048181548110610ca457fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401549294509092909160ff1685565b610ce0612afa565b73ffffffffffffffffffffffffffffffffffffffff16610cfe611b01565b73ffffffffffffffffffffffffffffffffffffffff1614610d4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613817565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190610da0903390600401613268565b60206040518083038186803b158015610db857600080fd5b505afa158015610dcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df09190613130565b905080610e29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b9061333c565b610e4b73ffffffffffffffffffffffffffffffffffffffff8316333084612afe565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063095ea7b390610ebf907f00000000000000000000000000000000000000000000000000000000000000009085906004016132ba565b602060405180830381600087803b158015610ed957600080fd5b505af1158015610eed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1191906130fc565b506040517fe2bbb15800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e2bbb15890610fa6907f0000000000000000000000000000000000000000000000000000000000000000908590600401613bc0565b600060405180830381600087803b158015610fc057600080fd5b505af1158015610fd4573d6000803e3d6000fd5b505043600d5550506040517f57a86f7d14ccde89e22870afe839e3011216827daa9b24e18629f0a1e9d6cc1490600090a15050565b600c5481565b600081156110455761103e64e8d4a510006107fc600b5468022b1c8c1227a000006129d990919063ffffffff16565b905061106f565b61106c64e8d4a510006107fc600c5468022b1c8c1227a000006129d990919063ffffffff16565b90505b919050565b60076020526000908152604090205460ff1681565b68022b1c8c1227a0000081565b600260015414156110d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613a54565b60026001556110e0612fdb565b6110e983611394565b60008481526006602090815260408083203384529091529020805491925090831115611141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b906137a9565b600061114d3386610584565b905061115a3386836128fc565b83156111af57815461116c9085612a79565b82600001819055506111af33856005888154811061118657fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169190612ba1565b6111e3670de0b6b3a76400006107fc856000015161080264e8d4a510006107fc8789600001546129d990919063ffffffff16565b600183015561122b6111fe64e8d4a510006107fc87856129d9565b6004878154811061120b57fe5b906000526020600020906005020160030154612a7990919063ffffffff16565b6004868154811061123857fe5b906000526020600020906005020160030181905550843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568866040516112949190613ba7565b60405180910390a3505060018055505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6040517fe2bbb15800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e2bbb15890611360907f000000000000000000000000000000000000000000000000000000000000000090600090600401613bc0565b600060405180830381600087803b15801561137a57600080fd5b505af115801561138e573d6000803e3d6000fd5b50505050565b61139c612fdb565b600482815481106113a957fe5b60009182526020918290206040805160a0810182526005909302909101805483526001810154938301849052600281015491830191909152600381015460608301526004015460ff1615156080820152915043111561106f576060810151608082015160009061141b5760095461141f565b6008545b90506000821180156114315750600081115b1561149757600061144f846020015143612a7990919063ffffffff16565b9050600061146f836107fc8760400151610802610c158a6080015161100f565b905061149261148a856107fc84670de0b6b3a76400006129d9565b865190612abb565b855250505b43602084015260048054849190869081106114ae57fe5b6000918252602091829020835160059290920201908155828201516001820155604080840151600283015560608401516003830155608090930151600490910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790558401518451915186927f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f46926115539290918791613bce565b60405180910390a25050919050565b6002600154141561159f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613a54565b60026001819055506000600482815481106115b657fe5b60009182526020808320858452600682526040808520338087529352842080548582556001820186905560059094029091019450929061160c9064e8d4a51000906107fc906116059089610584565b85906129d9565b90508084600301541161162057600061162f565b600384015461162f9082612a79565b846003018190555061164933836005888154811061118657fe5b843373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae0595846040516112949190613ba7565b7f000000000000000000000000000000000000000000000000000000000000000081565b60045460005b81811015611744576116ca612fdb565b600482815481106116d757fe5b60009182526020918290206040805160a08101825260059093029091018054835260018101549383019390935260028301549082018190526003830154606083015260049092015460ff161515608082015291501561173b5761173982611394565b505b506001016116ba565b5050565b611750612afa565b73ffffffffffffffffffffffffffffffffffffffff1661176e611b01565b73ffffffffffffffffffffffffffffffffffffffff16146117bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613817565b6117c483611394565b5080156117d3576117d36116b4565b600483815481106117e057fe5b600091825260209091206004600590920201015460ff161561183b576118338261084e6004868154811061181057fe5b906000526020600020906005020160020154600854612a7990919063ffffffff16565b600855611876565b6118728261084e6004868154811061184f57fe5b906000526020600020906005020160020154600954612a7990919063ffffffff16565b6009555b816004848154811061188457fe5b906000526020600020906005020160020181905550827fc0cfd54d2de2b55f1e6e108d3ec53ff0a1abe6055401d32c61e9433b747ef9f8836040516118c99190613ba7565b60405180910390a2505050565b6501d1a94a200081565b6118e8612afa565b73ffffffffffffffffffffffffffffffffffffffff16611906611b01565b73ffffffffffffffffffffffffffffffffffffffff1614611953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613817565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b670de0b6b3a764000081565b6119d6612afa565b73ffffffffffffffffffffffffffffffffffffffff166119f4611b01565b73ffffffffffffffffffffffffffffffffffffffff1614611a41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613817565b8015611a4f57611a4f6116b4565b6000611a66600d5443612a7990919063ffffffff16565b90506000611a7c611a75611b4f565b83906129d9565b600254909150611aa29073ffffffffffffffffffffffffffffffffffffffff1682612bc5565b505043600d5550565b600d5481565b60058181548110611abe57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b600660209081526000928352604080842090915290825290208054600182015460029092015490919083565b60095481565b6000611b7864e8d4a510006107fc600a5468022b1c8c1227a000006129d990919063ffffffff16565b905090565b611b85612afa565b73ffffffffffffffffffffffffffffffffffffffff16611ba3611b01565b73ffffffffffffffffffffffffffffffffffffffff1614611bf0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613817565b73ffffffffffffffffffffffffffffffffffffffff811615801590611c30575060035473ffffffffffffffffffffffffffffffffffffffff828116911614155b611c66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613b0e565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f4c0c07d0b548b824a1b998eb4d11fccf1cfbc1e47edcdb309970ba88315eb30390600090a250565b600b5481565b611ce3612afa565b73ffffffffffffffffffffffffffffffffffffffff16611d01611b01565b73ffffffffffffffffffffffffffffffffffffffff1614611d4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613817565b73ffffffffffffffffffffffffffffffffffffffff8216611d9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613963565b73ffffffffffffffffffffffffffffffffffffffff82166000818152600760205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016841515179055517fc551bbb22d0406dbfb8b6b7740cc521bcf44e1106029cf899c19b6a8e4c99d5190611e1a9084906132e0565b60405180910390a25050565b60085481565b611e34612afa565b73ffffffffffffffffffffffffffffffffffffffff16611e52611b01565b73ffffffffffffffffffffffffffffffffffffffff1614611e9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613817565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190611ef4903090600401613268565b60206040518083038186803b158015611f0c57600080fd5b505afa158015611f20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f449190613130565b1015611f7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b906137e0565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612002576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b906138a9565b8015612010576120106116b4565b811561202b576008546120239085612abb565b60085561203c565b6009546120389085612abb565b6009555b60058054600180820183557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87169081179091556040805160a081018252600080825243602083019081529282018a8152606083018281528915156080850190815260048054808a018255945293517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b9389029384015593517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c830155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d82015591517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e830155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19f90910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905591546121dd91612a79565b7f18caa0724a26384928efe604ae6ddc99c242548876259770fc88fcb7e719d8fa868560405161220e929190613bb0565b60405180910390a350505050565b64e8d4a5100081565b61222d612afa565b73ffffffffffffffffffffffffffffffffffffffff1661224b611b01565b73ffffffffffffffffffffffffffffffffffffffff1614612298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613817565b6000841180156122a85750600083115b80156122b45750600082115b6122ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b9061366c565b64e8d4a510006122fe8361084e8787612abb565b14612335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b906139f7565b8015612343576123436116b4565b61234d60006119ce565b600a849055600b839055600c8290556040517fae2d2e7d1ae84564fc72227253ce0f36a007209f7fd5ec414dea80e5af2fb5b09061239090869086908690613bce565b60405180910390a150505050565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b600260015414156123fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613a54565b600260015561240a612fdb565b61241383611394565b600084815260066020908152604080832033845290915290206080820151919250908061244f57503360009081526007602052604090205460ff165b612485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b906136c9565b60006124913386610584565b8254909150156124a6576124a63386836128fc565b83156126a2576000600586815481106124bb57fe5b6000918252602090912001546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906370a082319061251a903090600401613268565b60206040518083038186803b15801561253257600080fd5b505afa158015612546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256a9190613130565b90506125a933308760058a8154811061257f57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16929190612afe565b61266981600588815481106125ba57fe5b6000918252602090912001546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190612619903090600401613268565b60206040518083038186803b15801561263157600080fd5b505afa158015612645573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c859190613130565b83549095506126789086612abb565b835561269b61269064e8d4a510006107fc88866129d9565b606086015190612abb565b6060850152505b6126d6670de0b6b3a76400006107fc856000015161080264e8d4a510006107fc8789600001546129d990919063ffffffff16565b826001018190555082600486815481106126ec57fe5b6000918252602091829020835160059290920201908155908201516001820155604080830151600283015560608301516003830155608090920151600490910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905551859033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a1590611294908890613ba7565b7f000000000000000000000000000000000000000000000000000000000000000081565b6127b7612afa565b73ffffffffffffffffffffffffffffffffffffffff166127d5611b01565b73ffffffffffffffffffffffffffffffffffffffff1614612822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613817565b73ffffffffffffffffffffffffffffffffffffffff811661286f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613453565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61290461300c565b50600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684528252808320815160608101835281548082526001830154948201949094526002909101549181019190915291906129719064e8d4a51000906107fc90866129d9565b905060006129a9670de0b6b3a76400006107fc6004888154811061299157fe5b600091825260209091206005909102015485906129d9565b905060006129c4846020015183612a7990919063ffffffff16565b90506129d08782612bc5565b50505050505050565b6000826129e8575060006105d4565b828202828482816129f557fe5b04146105ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b9061374c565b6000808211612a68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b9061357b565b818381612a7157fe5b049392505050565b600082821115612ab5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b906134e7565b50900390565b6000828201838110156105ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b906134b0565b3390565b61138e846323b872dd60e01b858585604051602401612b1f93929190613289565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612db1565b612bc08363a9059cbb60e01b8484604051602401612b1f9291906132ba565b505050565b8015611744576040517f70a08231000000000000000000000000000000000000000000000000000000008152819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190612c3f903090600401613268565b60206040518083038186803b158015612c5757600080fd5b505afa158015612c6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c8f9190613130565b1015612c9d57612c9d6112cb565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190612d12903090600401613268565b60206040518083038186803b158015612d2a57600080fd5b505afa158015612d3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d629190613130565b905081811015612d70578091505b612bc073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168484612ba1565b6060612e13826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612e679092919063ffffffff16565b805190915015612bc05780806020019051810190612e3191906130fc565b612bc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b906133f6565b6060612e768484600085612e80565b90505b9392505050565b606082471015612ebc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b9061351e565b612ec585612f82565b612efb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b906139c0565b600060608673ffffffffffffffffffffffffffffffffffffffff168587604051612f25919061324c565b60006040518083038185875af1925050503d8060008114612f62576040519150601f19603f3d011682016040523d82523d6000602084013e612f67565b606091505b5091509150612f77828286612f88565b979650505050505050565b3b151590565b60608315612f97575081612e79565b825115612fa75782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b91906132eb565b6040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b60405180606001604052806000815260200160008152602001600081525090565b60006020828403121561303e578081fd5b81356105ce81613c35565b6000806040838503121561305b578081fd5b823561306681613c35565b9150602083013561307681613c5a565b809150509250929050565b60008060408385031215613093578182fd5b823561309e81613c35565b946020939093013593505050565b6000806000606084860312156130c0578081fd5b83356130cb81613c35565b95602085013595506040909401359392505050565b6000602082840312156130f1578081fd5b81356105ce81613c5a565b60006020828403121561310d578081fd5b81516105ce81613c5a565b600060208284031215613129578081fd5b5035919050565b600060208284031215613141578081fd5b5051919050565b6000806040838503121561315a578182fd5b82359150602083013561307681613c35565b60008060008060808587031215613181578081fd5b84359350602085013561319381613c35565b925060408501356131a381613c5a565b915060608501356131b381613c5a565b939692955090935050565b600080604083850312156131d0578182fd5b50508035926020909101359150565b6000806000606084860312156131f3578283fd5b8335925060208401359150604084013561320c81613c5a565b809150509250925092565b6000806000806080858703121561322c578384fd5b84359350602085013592506040850135915060608501356131b381613c5a565b6000825161325e818460208701613c09565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b600060208252825180602084015261330a816040850160208701613c09565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60208082526023908201527f4d61737465724368656656323a2042616c616e6365206d75737420657863656560408201527f6420300000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602a908201527f4d61737465724368656656323a20496e76616c6964206e657720626f6f73742060408201527f6d756c7469706c69657200000000000000000000000000000000000000000000606082015260800190565b6020808252602a908201527f5361666542455032303a204245503230206f7065726174696f6e20646964206e60408201527f6f74207375636365656400000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60408201527f722063616c6c0000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252602c908201527f4d61737465724368656656323a2054686520757365722061646472657373206d60408201527f7573742062652076616c69640000000000000000000000000000000000000000606082015260800190565b6020808252602e908201527f4d61737465724368656656323a204275726e2061646d696e206164647265737360408201527f206d7573742062652076616c6964000000000000000000000000000000000000606082015260800190565b6020808252602e908201527f4d61737465724368656656323a2043616b652072617465206d7573742062652060408201527f67726561746572207468616e2030000000000000000000000000000000000000606082015260800190565b60208082526042908201527f4d61737465724368656656323a205468652061646472657373206973206e6f7460408201527f20617661696c61626c6520746f206465706f73697420696e207468697320706f60608201527f6f6c000000000000000000000000000000000000000000000000000000000000608082015260a00190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526016908201527f77697468647261773a20496e73756666696369656e7400000000000000000000604082015260600190565b60208082526011908201527f4e6f6e6520424550323020746f6b656e73000000000000000000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4f776e61626c653a2063616c6c6572206973206e6f742074686520626f6f737460408201527f20636f6e74726163740000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f43414b4520746f6b656e2063616e277420626520616464656420746f2066617260408201527f6d20706f6f6c7300000000000000000000000000000000000000000000000000606082015260800190565b60208082526030908201527f4d61737465724368656656323a204f6e6c7920726567756c6172206661726d2060408201527f636f756c6420626520626f6f7374656400000000000000000000000000000000606082015260800190565b60208082526032908201527f4d61737465724368656656323a20546865207768697465206c6973742061646460408201527f72657373206d7573742062652076616c69640000000000000000000000000000606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526025908201527f4d61737465724368656656323a20546f74616c2072617465206d75737420626560408201527f2031653132000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526041908201527f4d61737465724368656656323a204275726e2061646d696e206164647265737360408201527f206973207468652073616d6520776974682063757272656e742061646472657360608201527f7300000000000000000000000000000000000000000000000000000000000000608082015260a00190565b60208082526036908201527f4d61737465724368656656323a204e657720626f6f737420636f6e747261637460408201527f2061646472657373206d7573742062652076616c696400000000000000000000606082015260800190565b600060a0820190508251825260208301516020830152604083015160408301526060830151606083015260808301511515608083015292915050565b90815260200190565b9182521515602082015260400190565b918252602082015260400190565b9283526020830191909152604082015260600190565b9485526020850193909352604084019190915260608301521515608082015260a00190565b60005b83811015613c24578181015183820152602001613c0c565b8381111561138e5750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114613c5757600080fd5b50565b8015158114613c5757600080fdfea2646970667358221220b15c273fe719276f31d125899dc0d7cd6fa97307cb0d8d7e8881e11f5f124ed764736f6c634300060c00330000000000000000000000008cda7b8b6587232d8b29fa07238b8d5d61cf055d00000000000000000000000054ba4075ceb2e31ed20e0cc442ea8ca0f3479ccf00000000000000000000000000000000000000000000000000000000000000020000000000000000000000008df97eab2651e87a8a4080008ddabf6824c9f672
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106102e95760003560e01c80637398b7ea11610191578063ac1d0609116100e3578063dfcedeee11610097578063e39e132311610071578063e39e13231461052b578063edd8b17014610569578063f2fde38b14610571576102e9565b8063dfcedeee14610546578063e0f91f6c1461054e578063e2bbb15814610556576102e9565b8063c507aeaa116100c8578063c507aeaa14610518578063cc6db2da1461052b578063dc6363df14610533576102e9565b8063ac1d0609146104fd578063c40d337b14610510576102e9565b80638da5cb5b116101455780639dcc1b5f1161011f5780639dcc1b5f146104da5780639dd2fcc3146104e2578063aa47bc8e146104f5576102e9565b80638da5cb5b146104a857806393f1a40b146104b057806399d7e84a146104d2576102e9565b806378db4c341161017657806378db4c341461048557806378ed5d1f1461048d57806381bdf98c146104a0576102e9565b80637398b7ea1461046a578063777a97f814610472576102e9565b806339aae5ba1161024a5780635312ea8e116101fe57806364482f79116101d857806364482f791461044757806369b021281461045a578063715018a614610462576102e9565b80635312ea8e1461042457806361621aaa14610437578063630b5ba11461043f576102e9565b80634ca6ef281161022f5780634ca6ef28146103e75780634f70b15a146103fc57806351eb05a614610404576102e9565b806339aae5ba146103cc578063441a3e70146103d4576102e9565b80631526fe27116102a15780631ce06d57116102865780631ce06d57146103915780631e9b828b14610399578063372c12b1146103ac576102e9565b80631526fe271461035a57806319ab453c1461037e576102e9565b8063081e3eda116102d2578063081e3eda1461032c5780630bb844bc146103345780631175a1dd14610347576102e9565b8063033186e8146102ee578063041a84c914610317575b600080fd5b6103016102fc366004613081565b610584565b60405161030e9190613ba7565b60405180910390f35b61032a6103253660046130ac565b6105da565b005b610301610952565b61032a61034236600461302d565b610958565b610301610355366004613148565b610ae4565b61036d610368366004613118565b610c97565b60405161030e959493929190613be4565b61032a61038c36600461302d565b610cd8565b610301611009565b6103016103a73660046130e0565b61100f565b6103bf6103ba36600461302d565b611074565b60405161030e91906132e0565b610301611089565b61032a6103e23660046131be565b611096565b6103ef6112a7565b60405161030e9190613268565b61032a6112cb565b610417610412366004613118565b611394565b60405161030e9190613b6b565b61032a610432366004613118565b611562565b610301611690565b61032a6116b4565b61032a6104553660046131df565b611748565b6103016118d6565b61032a6118e0565b6103016119c2565b61032a6104803660046130e0565b6119ce565b610301611aab565b6103ef61049b366004613118565b611ab1565b6103ef611ae5565b6103ef611b01565b6104c36104be366004613148565b611b1d565b60405161030e93929190613bce565b610301611b49565b610301611b4f565b61032a6104f036600461302d565b611b7d565b610301611cd5565b61032a61050b366004613049565b611cdb565b610301611e26565b61032a61052636600461316c565b611e2c565b61030161221c565b61032a610541366004613217565b612225565b6103ef61239e565b6103016123ba565b61032a6105643660046131be565b6123c0565b6103ef61278b565b61032a61057f36600461302d565b6127af565b600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281206002015464e8d4a5100081116105ce5764e8d4a510006105d0565b805b9150505b92915050565b60035473ffffffffffffffffffffffffffffffffffffffff163314610634576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b9061384c565b60405180910390fd5b60026001541415610671576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613a54565b600260015573ffffffffffffffffffffffffffffffffffffffff83166106c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b906135b2565b600482815481106106d057fe5b600091825260209091206004600590920201015460ff1661071d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613906565b64e8d4a51000811015801561073857506501d1a94a20008111155b61076e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613399565b610776612fdb565b61077f83611394565b600084815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8916845290915281209192506107bb8686610584565b90506107c88686836128fc565b610808670de0b6b3a76400006107fc856000015161080264e8d4a510006107fc8a89600001546129d990919063ffffffff16565b90612a2d565b906129d9565b60018301558154610854906108289064e8d4a51000906107fc90886129d9565b835461084e906108439064e8d4a51000906107fc90876129d9565b606087015190612a79565b90612abb565b6060840152600480548491908790811061086a57fe5b6000918252602080832084516005939093020191825583810151600183015560408085015160028085019190915560608601516003850155608090950151600490930180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016931515939093179092558883526006815281832073ffffffffffffffffffffffffffffffffffffffff8b1680855291529181902090920186905590517f01abd62439b64f6c5dab6f94d56099495bd0c094f9c21f98f4d3562a21edb4ba9061093e90889085908990613bce565b60405180910390a250506001805550505050565b60045490565b610960612afa565b73ffffffffffffffffffffffffffffffffffffffff1661097e611b01565b73ffffffffffffffffffffffffffffffffffffffff16146109cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613817565b73ffffffffffffffffffffffffffffffffffffffff8116610a18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b9061360f565b60025473ffffffffffffffffffffffffffffffffffffffff82811691161415610a6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613a8b565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907fd146fe330fdddf682413850a35b28edfccd4c4b53cfee802fd24950de5be1dbe90600090a35050565b6000610aee612fdb565b60048481548110610afb57fe5b60009182526020918290206040805160a0810182526005909302909101805483526001810154938301939093526002830154908201526003820154606082015260049091015460ff16151560808201529050610b5561300c565b50600084815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845282529182902082516060808201855282548252600183015482850152600290920154938101939093528351908401519184015190919043118015610bc357508015155b15610c43576000610be1856020015143612a7990919063ffffffff16565b90506000610c1c8660800151610bf957600954610bfd565b6008545b6107fc8860400151610802610c158b6080015161100f565b87906129d9565b9050610c3e610c37846107fc84670de0b6b3a76400006129d9565b8590612abb565b935050505b6000610c6364e8d4a510006107fc610c5b8a8c610584565b8751906129d9565b6020850151909150610c8b90610c85670de0b6b3a76400006107fc85886129d9565b90612a79565b98975050505050505050565b60048181548110610ca457fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401549294509092909160ff1685565b610ce0612afa565b73ffffffffffffffffffffffffffffffffffffffff16610cfe611b01565b73ffffffffffffffffffffffffffffffffffffffff1614610d4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613817565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190610da0903390600401613268565b60206040518083038186803b158015610db857600080fd5b505afa158015610dcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df09190613130565b905080610e29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b9061333c565b610e4b73ffffffffffffffffffffffffffffffffffffffff8316333084612afe565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063095ea7b390610ebf907f0000000000000000000000008cda7b8b6587232d8b29fa07238b8d5d61cf055d9085906004016132ba565b602060405180830381600087803b158015610ed957600080fd5b505af1158015610eed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1191906130fc565b506040517fe2bbb15800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000008cda7b8b6587232d8b29fa07238b8d5d61cf055d169063e2bbb15890610fa6907f0000000000000000000000000000000000000000000000000000000000000002908590600401613bc0565b600060405180830381600087803b158015610fc057600080fd5b505af1158015610fd4573d6000803e3d6000fd5b505043600d5550506040517f57a86f7d14ccde89e22870afe839e3011216827daa9b24e18629f0a1e9d6cc1490600090a15050565b600c5481565b600081156110455761103e64e8d4a510006107fc600b5468022b1c8c1227a000006129d990919063ffffffff16565b905061106f565b61106c64e8d4a510006107fc600c5468022b1c8c1227a000006129d990919063ffffffff16565b90505b919050565b60076020526000908152604090205460ff1681565b68022b1c8c1227a0000081565b600260015414156110d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613a54565b60026001556110e0612fdb565b6110e983611394565b60008481526006602090815260408083203384529091529020805491925090831115611141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b906137a9565b600061114d3386610584565b905061115a3386836128fc565b83156111af57815461116c9085612a79565b82600001819055506111af33856005888154811061118657fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169190612ba1565b6111e3670de0b6b3a76400006107fc856000015161080264e8d4a510006107fc8789600001546129d990919063ffffffff16565b600183015561122b6111fe64e8d4a510006107fc87856129d9565b6004878154811061120b57fe5b906000526020600020906005020160030154612a7990919063ffffffff16565b6004868154811061123857fe5b906000526020600020906005020160030181905550843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568866040516112949190613ba7565b60405180910390a3505060018055505050565b7f00000000000000000000000054ba4075ceb2e31ed20e0cc442ea8ca0f3479ccf81565b6040517fe2bbb15800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000008cda7b8b6587232d8b29fa07238b8d5d61cf055d169063e2bbb15890611360907f000000000000000000000000000000000000000000000000000000000000000290600090600401613bc0565b600060405180830381600087803b15801561137a57600080fd5b505af115801561138e573d6000803e3d6000fd5b50505050565b61139c612fdb565b600482815481106113a957fe5b60009182526020918290206040805160a0810182526005909302909101805483526001810154938301849052600281015491830191909152600381015460608301526004015460ff1615156080820152915043111561106f576060810151608082015160009061141b5760095461141f565b6008545b90506000821180156114315750600081115b1561149757600061144f846020015143612a7990919063ffffffff16565b9050600061146f836107fc8760400151610802610c158a6080015161100f565b905061149261148a856107fc84670de0b6b3a76400006129d9565b865190612abb565b855250505b43602084015260048054849190869081106114ae57fe5b6000918252602091829020835160059290920201908155828201516001820155604080840151600283015560608401516003830155608090930151600490910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790558401518451915186927f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f46926115539290918791613bce565b60405180910390a25050919050565b6002600154141561159f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613a54565b60026001819055506000600482815481106115b657fe5b60009182526020808320858452600682526040808520338087529352842080548582556001820186905560059094029091019450929061160c9064e8d4a51000906107fc906116059089610584565b85906129d9565b90508084600301541161162057600061162f565b600384015461162f9082612a79565b846003018190555061164933836005888154811061118657fe5b843373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae0595846040516112949190613ba7565b7f000000000000000000000000000000000000000000000000000000000000000281565b60045460005b81811015611744576116ca612fdb565b600482815481106116d757fe5b60009182526020918290206040805160a08101825260059093029091018054835260018101549383019390935260028301549082018190526003830154606083015260049092015460ff161515608082015291501561173b5761173982611394565b505b506001016116ba565b5050565b611750612afa565b73ffffffffffffffffffffffffffffffffffffffff1661176e611b01565b73ffffffffffffffffffffffffffffffffffffffff16146117bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613817565b6117c483611394565b5080156117d3576117d36116b4565b600483815481106117e057fe5b600091825260209091206004600590920201015460ff161561183b576118338261084e6004868154811061181057fe5b906000526020600020906005020160020154600854612a7990919063ffffffff16565b600855611876565b6118728261084e6004868154811061184f57fe5b906000526020600020906005020160020154600954612a7990919063ffffffff16565b6009555b816004848154811061188457fe5b906000526020600020906005020160020181905550827fc0cfd54d2de2b55f1e6e108d3ec53ff0a1abe6055401d32c61e9433b747ef9f8836040516118c99190613ba7565b60405180910390a2505050565b6501d1a94a200081565b6118e8612afa565b73ffffffffffffffffffffffffffffffffffffffff16611906611b01565b73ffffffffffffffffffffffffffffffffffffffff1614611953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613817565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b670de0b6b3a764000081565b6119d6612afa565b73ffffffffffffffffffffffffffffffffffffffff166119f4611b01565b73ffffffffffffffffffffffffffffffffffffffff1614611a41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613817565b8015611a4f57611a4f6116b4565b6000611a66600d5443612a7990919063ffffffff16565b90506000611a7c611a75611b4f565b83906129d9565b600254909150611aa29073ffffffffffffffffffffffffffffffffffffffff1682612bc5565b505043600d5550565b600d5481565b60058181548110611abe57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b600660209081526000928352604080842090915290825290208054600182015460029092015490919083565b60095481565b6000611b7864e8d4a510006107fc600a5468022b1c8c1227a000006129d990919063ffffffff16565b905090565b611b85612afa565b73ffffffffffffffffffffffffffffffffffffffff16611ba3611b01565b73ffffffffffffffffffffffffffffffffffffffff1614611bf0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613817565b73ffffffffffffffffffffffffffffffffffffffff811615801590611c30575060035473ffffffffffffffffffffffffffffffffffffffff828116911614155b611c66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613b0e565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f4c0c07d0b548b824a1b998eb4d11fccf1cfbc1e47edcdb309970ba88315eb30390600090a250565b600b5481565b611ce3612afa565b73ffffffffffffffffffffffffffffffffffffffff16611d01611b01565b73ffffffffffffffffffffffffffffffffffffffff1614611d4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613817565b73ffffffffffffffffffffffffffffffffffffffff8216611d9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613963565b73ffffffffffffffffffffffffffffffffffffffff82166000818152600760205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016841515179055517fc551bbb22d0406dbfb8b6b7740cc521bcf44e1106029cf899c19b6a8e4c99d5190611e1a9084906132e0565b60405180910390a25050565b60085481565b611e34612afa565b73ffffffffffffffffffffffffffffffffffffffff16611e52611b01565b73ffffffffffffffffffffffffffffffffffffffff1614611e9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613817565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190611ef4903090600401613268565b60206040518083038186803b158015611f0c57600080fd5b505afa158015611f20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f449190613130565b1015611f7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b906137e0565b7f00000000000000000000000054ba4075ceb2e31ed20e0cc442ea8ca0f3479ccf73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612002576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b906138a9565b8015612010576120106116b4565b811561202b576008546120239085612abb565b60085561203c565b6009546120389085612abb565b6009555b60058054600180820183557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87169081179091556040805160a081018252600080825243602083019081529282018a8152606083018281528915156080850190815260048054808a018255945293517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b9389029384015593517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c830155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d82015591517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e830155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19f90910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905591546121dd91612a79565b7f18caa0724a26384928efe604ae6ddc99c242548876259770fc88fcb7e719d8fa868560405161220e929190613bb0565b60405180910390a350505050565b64e8d4a5100081565b61222d612afa565b73ffffffffffffffffffffffffffffffffffffffff1661224b611b01565b73ffffffffffffffffffffffffffffffffffffffff1614612298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613817565b6000841180156122a85750600083115b80156122b45750600082115b6122ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b9061366c565b64e8d4a510006122fe8361084e8787612abb565b14612335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b906139f7565b8015612343576123436116b4565b61234d60006119ce565b600a849055600b839055600c8290556040517fae2d2e7d1ae84564fc72227253ce0f36a007209f7fd5ec414dea80e5af2fb5b09061239090869086908690613bce565b60405180910390a150505050565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b600260015414156123fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613a54565b600260015561240a612fdb565b61241383611394565b600084815260066020908152604080832033845290915290206080820151919250908061244f57503360009081526007602052604090205460ff165b612485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b906136c9565b60006124913386610584565b8254909150156124a6576124a63386836128fc565b83156126a2576000600586815481106124bb57fe5b6000918252602090912001546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906370a082319061251a903090600401613268565b60206040518083038186803b15801561253257600080fd5b505afa158015612546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256a9190613130565b90506125a933308760058a8154811061257f57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16929190612afe565b61266981600588815481106125ba57fe5b6000918252602090912001546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190612619903090600401613268565b60206040518083038186803b15801561263157600080fd5b505afa158015612645573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c859190613130565b83549095506126789086612abb565b835561269b61269064e8d4a510006107fc88866129d9565b606086015190612abb565b6060850152505b6126d6670de0b6b3a76400006107fc856000015161080264e8d4a510006107fc8789600001546129d990919063ffffffff16565b826001018190555082600486815481106126ec57fe5b6000918252602091829020835160059290920201908155908201516001820155604080830151600283015560608301516003830155608090920151600490910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905551859033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a1590611294908890613ba7565b7f0000000000000000000000008cda7b8b6587232d8b29fa07238b8d5d61cf055d81565b6127b7612afa565b73ffffffffffffffffffffffffffffffffffffffff166127d5611b01565b73ffffffffffffffffffffffffffffffffffffffff1614612822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613817565b73ffffffffffffffffffffffffffffffffffffffff811661286f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b90613453565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61290461300c565b50600082815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684528252808320815160608101835281548082526001830154948201949094526002909101549181019190915291906129719064e8d4a51000906107fc90866129d9565b905060006129a9670de0b6b3a76400006107fc6004888154811061299157fe5b600091825260209091206005909102015485906129d9565b905060006129c4846020015183612a7990919063ffffffff16565b90506129d08782612bc5565b50505050505050565b6000826129e8575060006105d4565b828202828482816129f557fe5b04146105ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b9061374c565b6000808211612a68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b9061357b565b818381612a7157fe5b049392505050565b600082821115612ab5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b906134e7565b50900390565b6000828201838110156105ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b906134b0565b3390565b61138e846323b872dd60e01b858585604051602401612b1f93929190613289565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612db1565b612bc08363a9059cbb60e01b8484604051602401612b1f9291906132ba565b505050565b8015611744576040517f70a08231000000000000000000000000000000000000000000000000000000008152819073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000054ba4075ceb2e31ed20e0cc442ea8ca0f3479ccf16906370a0823190612c3f903090600401613268565b60206040518083038186803b158015612c5757600080fd5b505afa158015612c6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c8f9190613130565b1015612c9d57612c9d6112cb565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000054ba4075ceb2e31ed20e0cc442ea8ca0f3479ccf16906370a0823190612d12903090600401613268565b60206040518083038186803b158015612d2a57600080fd5b505afa158015612d3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d629190613130565b905081811015612d70578091505b612bc073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000054ba4075ceb2e31ed20e0cc442ea8ca0f3479ccf168484612ba1565b6060612e13826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612e679092919063ffffffff16565b805190915015612bc05780806020019051810190612e3191906130fc565b612bc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b906133f6565b6060612e768484600085612e80565b90505b9392505050565b606082471015612ebc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b9061351e565b612ec585612f82565b612efb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b906139c0565b600060608673ffffffffffffffffffffffffffffffffffffffff168587604051612f25919061324c565b60006040518083038185875af1925050503d8060008114612f62576040519150601f19603f3d011682016040523d82523d6000602084013e612f67565b606091505b5091509150612f77828286612f88565b979650505050505050565b3b151590565b60608315612f97575081612e79565b825115612fa75782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062b91906132eb565b6040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b60405180606001604052806000815260200160008152602001600081525090565b60006020828403121561303e578081fd5b81356105ce81613c35565b6000806040838503121561305b578081fd5b823561306681613c35565b9150602083013561307681613c5a565b809150509250929050565b60008060408385031215613093578182fd5b823561309e81613c35565b946020939093013593505050565b6000806000606084860312156130c0578081fd5b83356130cb81613c35565b95602085013595506040909401359392505050565b6000602082840312156130f1578081fd5b81356105ce81613c5a565b60006020828403121561310d578081fd5b81516105ce81613c5a565b600060208284031215613129578081fd5b5035919050565b600060208284031215613141578081fd5b5051919050565b6000806040838503121561315a578182fd5b82359150602083013561307681613c35565b60008060008060808587031215613181578081fd5b84359350602085013561319381613c35565b925060408501356131a381613c5a565b915060608501356131b381613c5a565b939692955090935050565b600080604083850312156131d0578182fd5b50508035926020909101359150565b6000806000606084860312156131f3578283fd5b8335925060208401359150604084013561320c81613c5a565b809150509250925092565b6000806000806080858703121561322c578384fd5b84359350602085013592506040850135915060608501356131b381613c5a565b6000825161325e818460208701613c09565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b600060208252825180602084015261330a816040850160208701613c09565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60208082526023908201527f4d61737465724368656656323a2042616c616e6365206d75737420657863656560408201527f6420300000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602a908201527f4d61737465724368656656323a20496e76616c6964206e657720626f6f73742060408201527f6d756c7469706c69657200000000000000000000000000000000000000000000606082015260800190565b6020808252602a908201527f5361666542455032303a204245503230206f7065726174696f6e20646964206e60408201527f6f74207375636365656400000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60408201527f722063616c6c0000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252602c908201527f4d61737465724368656656323a2054686520757365722061646472657373206d60408201527f7573742062652076616c69640000000000000000000000000000000000000000606082015260800190565b6020808252602e908201527f4d61737465724368656656323a204275726e2061646d696e206164647265737360408201527f206d7573742062652076616c6964000000000000000000000000000000000000606082015260800190565b6020808252602e908201527f4d61737465724368656656323a2043616b652072617465206d7573742062652060408201527f67726561746572207468616e2030000000000000000000000000000000000000606082015260800190565b60208082526042908201527f4d61737465724368656656323a205468652061646472657373206973206e6f7460408201527f20617661696c61626c6520746f206465706f73697420696e207468697320706f60608201527f6f6c000000000000000000000000000000000000000000000000000000000000608082015260a00190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526016908201527f77697468647261773a20496e73756666696369656e7400000000000000000000604082015260600190565b60208082526011908201527f4e6f6e6520424550323020746f6b656e73000000000000000000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4f776e61626c653a2063616c6c6572206973206e6f742074686520626f6f737460408201527f20636f6e74726163740000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f43414b4520746f6b656e2063616e277420626520616464656420746f2066617260408201527f6d20706f6f6c7300000000000000000000000000000000000000000000000000606082015260800190565b60208082526030908201527f4d61737465724368656656323a204f6e6c7920726567756c6172206661726d2060408201527f636f756c6420626520626f6f7374656400000000000000000000000000000000606082015260800190565b60208082526032908201527f4d61737465724368656656323a20546865207768697465206c6973742061646460408201527f72657373206d7573742062652076616c69640000000000000000000000000000606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526025908201527f4d61737465724368656656323a20546f74616c2072617465206d75737420626560408201527f2031653132000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526041908201527f4d61737465724368656656323a204275726e2061646d696e206164647265737360408201527f206973207468652073616d6520776974682063757272656e742061646472657360608201527f7300000000000000000000000000000000000000000000000000000000000000608082015260a00190565b60208082526036908201527f4d61737465724368656656323a204e657720626f6f737420636f6e747261637460408201527f2061646472657373206d7573742062652076616c696400000000000000000000606082015260800190565b600060a0820190508251825260208301516020830152604083015160408301526060830151606083015260808301511515608083015292915050565b90815260200190565b9182521515602082015260400190565b918252602082015260400190565b9283526020830191909152604082015260600190565b9485526020850193909352604084019190915260608301521515608082015260a00190565b60005b83811015613c24578181015183820152602001613c0c565b8381111561138e5750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114613c5757600080fd5b50565b8015158114613c5757600080fdfea2646970667358221220b15c273fe719276f31d125899dc0d7cd6fa97307cb0d8d7e8881e11f5f124ed764736f6c634300060c0033