Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
Latest 16 from a total of 16 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Create ERC20 | 19343453 | 126 days ago | IN | 1.3 ETH | 0.31936319 | ||||
Update Time Conf... | 19330977 | 128 days ago | IN | 0 ETH | 0.00186259 | ||||
Create ERC20 | 19313288 | 130 days ago | IN | 1.3 ETH | 0.35827768 | ||||
Create ERC20 | 19259513 | 138 days ago | IN | 1.8 ETH | 0.13019779 | ||||
Create ERC20 | 19257908 | 138 days ago | IN | 1.25 ETH | 0.15147882 | ||||
Create ERC20 | 19236681 | 141 days ago | IN | 1.3 ETH | 0.21399476 | ||||
Update Max Team ... | 19236675 | 141 days ago | IN | 0 ETH | 0.00100451 | ||||
Update Max Team ... | 19236474 | 141 days ago | IN | 0 ETH | 0.0011698 | ||||
Update Max Team ... | 19236391 | 141 days ago | IN | 0 ETH | 0.00130409 | ||||
Update Max Team ... | 19236322 | 141 days ago | IN | 0 ETH | 0.00180753 | ||||
Whitelist UUID F... | 19236319 | 141 days ago | IN | 0 ETH | 0.00176078 | ||||
Update Bank Mach... | 19235199 | 141 days ago | IN | 0 ETH | 0.002543 | ||||
Update Min Pair ... | 19217769 | 144 days ago | IN | 0 ETH | 0.00103858 | ||||
Update Min Pair ... | 19217728 | 144 days ago | IN | 0 ETH | 0.00100592 | ||||
Update LP Locker | 19216884 | 144 days ago | IN | 0 ETH | 0.00128506 | ||||
0x60806040 | 19216558 | 144 days ago | IN | Create: ERC20FactoryByBankPad | 0 ETH | 0.10259093 |
Latest 15 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
19343453 | 126 days ago | 0.2 ETH | ||||
19343453 | 126 days ago | 0.1 ETH | ||||
19343453 | 126 days ago | 1 ETH | ||||
19313288 | 130 days ago | 0.2 ETH | ||||
19313288 | 130 days ago | 0.1 ETH | ||||
19313288 | 130 days ago | 1 ETH | ||||
19259513 | 138 days ago | 0.2 ETH | ||||
19259513 | 138 days ago | 0.1 ETH | ||||
19259513 | 138 days ago | 1.5 ETH | ||||
19257908 | 138 days ago | 0.15 ETH | ||||
19257908 | 138 days ago | 0.1 ETH | ||||
19257908 | 138 days ago | 1 ETH | ||||
19236681 | 141 days ago | 0.2 ETH | ||||
19236681 | 141 days ago | 0.1 ETH | ||||
19236681 | 141 days ago | 1 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
ERC20FactoryByBankPad
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// Sources flattened with hardhat v2.19.1 https://hardhat.org // SPDX-License-Identifier: MIT // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^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 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; } } // File @openzeppelin/contracts/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @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() { _transferOwnership(_msgSender()); } /** * @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 { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @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 { require(newOwner != address(0), "Ownable: new owner is the zero address"); _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); } } // File @openzeppelin/contracts/security/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File @openzeppelin/contracts/token/ERC20/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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 amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) 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 `amount` 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 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` 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 amount) external returns (bool); } // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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 * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 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 SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } } // File contracts/interfaces/IBase.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.4; interface IBase { /// - antiBotParam /// 1. holdLimit /// 2. txLimit /// 3. antiDumpLimit /// 4. antiSniperOn /// /// - taxParam /// 1. dexRouter: uniswap or sushiswap /// 2. pairedToken: eth or usdc /// 3. taxPayAccount /// 4. treasuryAccount /// 5. buyTax /// 6. sellTax /// 7. treasuryTax /// /// - distribParam /// 1. totalSupply /// 2. teamAccount /// 3. teamAllocPercent /// /// - lpParam /// 1. isLPBurn /// 2. isTradingDelayed /// 3. isTradingDisabled /// 4. pairedTokenAmount /// 5. lockPeriod struct TokenLaunchConf { string uuid; string name; string symbol; bytes distribParam; bytes antiBotParam; bytes taxParam; bytes lpParam; } // Configuration inherited from the factory contract struct InheritedConf { uint16 autoBurnFirstPercent; uint16 autoBurnSecondPercent; uint16 autoBurnThirdPercent; uint16 maxBuyTaxAfter; uint16 maxSellTaxAfter; uint16 maxTreasuryTaxAfter; uint16 bankPadTax; uint16 maxTaxToRenounce; uint32 bankPadTaxApplyPeriod; uint32 taxWhitelistApplyDelay; uint32 tradingDelayTime; uint32 tradingDisableTime; } } // File contracts/interfaces/IERC20ByBankPad.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.4; interface IERC20ByBankPad { /** * @notice function {preLaunch} * * Configure token contract with the factory configuration * * @param param configuration structure from the factory */ function preLaunch(IBase.InheritedConf calldata param) external; /// @notice Launch the token contract /// @dev Token is launched from this moment, and users can start trading /// @param tradingDelayed Once this flag is set, trading is delayed for 1 min /// @param tradingDisabled Once this flag is set, trading is disabled until it is set or 4 days function launch(bool tradingDelayed, bool tradingDisabled) external; /// @notice View amm related configuration addresses /// @return address dex router address /// @return address base paired token address /// @return address base pair address from the dex router function ammAddresses() external view returns (address, address, address); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) external; /** * @dev BankPad UUID Hash */ function bankUUIDHash() external view returns (bytes32); /** * @notice Check if the anti-dump feature is enabled in the token */ function isAntiDumpEnabled() external view returns (bool); } // File contracts/interfaces/IERC20MachineByBankPad.sol pragma solidity ^0.8.0; // Original license: SPDX_License_Identifier: MIT /** * @dev BankPad ERC-20 contract deployer * * * Lightweight deployment module for use with template contracts */ interface IERC20MachineByBankPad { /** * @notice function {deploy} * * Deploy a fresh instance */ function deploy( bytes32 bankIdHash_, bytes32 salt_, bytes memory args_ ) external payable returns (address erc20ContractAddress_); } // File contracts/interfaces/IDexRouter.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.4; interface IDexFactory { function createPair( address tokenA, address tokenB ) external returns (address pair); } interface IDexRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function getAmountsOut( uint amountIn, address[] calldata path ) external view returns (uint[] memory amounts); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); } // File contracts/interfaces/IUniLocker.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.4; interface IERCBurn { function burn(uint256 _amount) external; function approve(address spender, uint256 amount) external returns (bool); function allowance( address owner, address spender ) external returns (uint256); function balanceOf(address account) external view returns (uint256); } interface IUniLocker { struct FeeStruct { uint256 ethFee; // Small eth fee to prevent spam on the platform IERCBurn secondaryFeeToken; // UNCX or UNCL uint256 secondaryTokenFee; // optional, UNCX or UNCL uint256 secondaryTokenDiscount; // discount on liquidity fee for burning secondaryToken uint256 liquidityFee; // fee on univ2 liquidity tokens uint256 referralPercent; // fee for referrals IERCBurn referralToken; // token the refferer must hold to qualify as a referrer uint256 referralHold; // balance the referrer must hold to qualify as a referrer uint256 referralDiscount; // discount on flatrate fees for using a valid referral address } function gFees() external view returns (FeeStruct memory); function lockLPToken( address _lpToken, uint256 _amount, uint256 _unlock_date, address payable _referral, bool _fee_in_eth, address payable _withdrawer ) external payable; } // File contracts/launchpad/ERC20FactoryByBankPadBase.sol pragma solidity ^0.8.0; // Original license: SPDX_License_Identifier: MIT contract ERC20FactoryByBankPadBase is Ownable { using Address for address payable; uint16 internal constant DENOMINATOR = 10000; // ==================== 32 bytes slot 1 start ================= // /// @dev Anti-snipe tax is burned, reducing total supply /// 1. 20% tax on buys in the first block /// 2. Reducing to 13.33% in the second block /// 3. Reducing to 6.66% in the third /// 4. Finally 0% from the fourth block on uint16 private _autoBurnFirstPercent = 2000; uint16 private _autoBurnSecondPercent = 1333; uint16 private _autoBurnThirdPercent = 666; /// @dev Max buy tax after token launched uint16 private _maxBuyTaxAfter = 1500; /// @dev Max sell tax after token launched uint16 private _maxSellTaxAfter = 1500; /// @dev Max treasury tax after token launched uint16 private _maxTreasuryTaxAfter = 500; /// @dev Bankpad tax is set on top buy / sell / treasury tax as a service fee uint16 private _bankPadTax = 1000; /// @dev Ownership can be renounced only when buy/sell/treasury tax is below limit default 5% uint16 private _maxTaxToRenounce = 500; /// @dev Bankpad tax is removed after some days default 30 days uint32 private _bankPadTaxApplyPeriod = 30 days; /// @dev Tax whitelist (exclude list) is not applied within some days after token launches default 2 days uint32 private _taxWhitelistApplyDelay = 2 days; /// @dev Token transfer is disabled for 1 mins once trading_delay flag is set uint32 private _tradingDelayTime = 1 minutes; /// @dev Trading is disabled once {_isTradingDisabled} flag is set, /// it is unset automatically after 7 days if owner does not enable trading uint32 private _tradingDisableTime = 7 days; // ==================== 32 bytes slot 1 end ================= // // ==================== 32 bytes slot 2 start ================= // /// @dev Service fee and token tax fee receive account address payable internal _servicePayAccount; /// @dev Max team distribution rate default 10% uint16 private _maxTeamAlloc = 1000; /// @dev Max token launch count per wallet uint16 internal _maxLaunchesPerWallet = 12; /// @dev Max buy tax uint16 private _maxBuyTax = 3500; /// @dev Max sell tax uint16 private _maxSellTax = 3500; /// @dev Max treasury tax uint16 private _maxTreasuryTax = 500; // ==================== 32 bytes slot 2 end: 30 bytes ================= // /// @dev BankPad machine contract address internal _machine; /// @dev Minimum lock period default 30 days uint256 internal _minLockPeriod = 30 days; /// @dev Token launch fee in ETH uint256 internal _launchFee; /// @dev Delayed trading fee in ETH uint256 internal _tradingDelayFee; /// @dev Delayed disable fee in ETH uint256 internal _tradingDisableFee; /// @dev Anti-Dump service fee in ETH uint256 internal _antiDumpFee; /// @dev LP locker contract for dex router mapping(address => address) internal _lpLockers; /// @dev Get token address per given BankPad UUID mapping(string => address) internal _tokens; /// @dev Whitelist for the unlimited team allocation mapping(string => uint16) internal _teamAllocWhitelist; /// @dev Whitelist for manually enabling trading mapping(string => bool) internal _manualEnableTradingWhitelist; /// @dev Minimum pair token amount to be added to the liquidity mapping(address => uint256) internal _minPairTokenAmounts; /// @dev Token launched count per account mapping(address => uint16) internal _launchedCounts; event BankPadTaxUpdated(uint16 bankPadTax); event MaxLaunchesPerWalletUpdated(uint16 maxLaunches); event MaxTaxToRenounceUpdated(uint16 maxTax); event MaxTeamAllocUpdated(uint16 teamAlloc); event MaxTeamAllocUpdatedForUUID(string uuid, uint16 teamAlloc); event MinLockPeriodUpdated(uint256 period); event MinPairTokenAmountUpdated(address pairToken, uint256 amount); event ServiceFeesUpdated( uint256 launchFee, uint256 tradingDelayFee, uint256 tradingDisableFee, uint256 antiDumpFee ); event ServicePayAccountUpdated(address payable account); event SnipeAutoBurnPercentsUpdated( uint16 firstPercent, uint16 secondPercent, uint16 thirdPercent ); event TaxAfterLimitsUpdated( uint16 maxBuyTax, uint16 maxSellTax, uint16 maxTreasuryTax ); event TaxLimitsUpdated( uint16 maxBuyTax, uint16 maxSellTax, uint16 maxTreasuryTax ); event ManualEnableTradingForUUIDUpdated(string uuid, bool flag); event TimeConfigurationUpdated( uint32 tradingDelayTime, uint32 tradingDisableTime, uint32 bankPadTaxApplyPeriod, uint32 taxWhitelistApplyDelay ); /** * @dev Build InheritedConf structure to be used in token deployment * * @param uuid token UUID */ function _buildInheritedConf( string memory uuid ) internal view returns (IBase.InheritedConf memory) { IBase.InheritedConf memory param; param.autoBurnFirstPercent = _autoBurnFirstPercent; param.autoBurnSecondPercent = _autoBurnSecondPercent; param.autoBurnThirdPercent = _autoBurnThirdPercent; param.maxBuyTaxAfter = _maxBuyTaxAfter; param.maxSellTaxAfter = _maxSellTaxAfter; param.maxTreasuryTaxAfter = _maxTreasuryTaxAfter; param.bankPadTax = _bankPadTax; param.maxTaxToRenounce = _maxTaxToRenounce; param.bankPadTaxApplyPeriod = _bankPadTaxApplyPeriod; param.taxWhitelistApplyDelay = _taxWhitelistApplyDelay; param.tradingDelayTime = _tradingDelayTime; // when the uuid is whitelisted for the manually enable trading feature // we set tradingDisableTime as MAX_UINT32 param.tradingDisableTime = _manualEnableTradingWhitelist[uuid] ? uint32(int32(-1)) : _tradingDisableTime; return param; } function _validateTaxProps(bytes memory taxParam) internal view { (, , , , uint16 buyTax, uint16 sellTax, uint16 treasuryTax) = abi .decode( taxParam, (address, address, address, address, uint16, uint16, uint16) ); require( buyTax <= _maxBuyTax && sellTax <= _maxSellTax && treasuryTax <= _maxTreasuryTax, "too much tax" ); uint16 bankPadTax_ = _bankPadTax; // check if the applied tax is too much so it exceeds the transfer amount require( (uint256(buyTax + treasuryTax) * (DENOMINATOR + bankPadTax_)) / DENOMINATOR <= DENOMINATOR && (uint256(sellTax + treasuryTax) * (DENOMINATOR + bankPadTax_)) / DENOMINATOR <= DENOMINATOR, "tax out of range" ); } /// @notice Update BankPad service fees /// @param launchFee token launch fee /// @param tradingDelayFee trading delay service fee /// @param tradingDisableFee trading disable service fee function updateServiceFees( uint256 launchFee, uint256 tradingDelayFee, uint256 tradingDisableFee, uint256 antiDumpFee ) external onlyOwner { _launchFee = launchFee; _tradingDelayFee = tradingDelayFee; _tradingDisableFee = tradingDisableFee; _antiDumpFee = antiDumpFee; emit ServiceFeesUpdated( launchFee, tradingDelayFee, tradingDisableFee, antiDumpFee ); } /// @notice View BankPad service fees /// @return uint256 token launch fee /// @return uint256 trading delay service fee /// @return uint256 trading disable service fee /// @return uint256 anti-dump service fee function serviceFees() external view returns (uint256, uint256, uint256, uint256) { return (_launchFee, _tradingDelayFee, _tradingDisableFee, _antiDumpFee); } /// @notice Update LP locker contract function updateLPLocker( address dexRouter, address newLocker ) external onlyOwner { _lpLockers[dexRouter] = newLocker; } function lpLocker(address dexRouter) external view returns (address) { return _lpLockers[dexRouter]; } /** * @notice function {updateBankMachine} * * Update BankPad token machine address */ function updateBankMachine(address machine) external onlyOwner { require(machine != address(0), "invalid machine"); _machine = machine; } function bankMachine() external view returns (address) { return _machine; } /// @notice Update service fee receive account function updateServicePayAccount( address payable account ) external onlyOwner { require(account != address(0), "invalid pay account"); // confirm service pay account can receive ETH account.sendValue(0); _servicePayAccount = account; emit ServicePayAccountUpdated(account); } function servicePayAccount() external view returns (address payable) { return _servicePayAccount; } function getToken(string memory uuid) external view returns (address) { return _tokens[uuid]; } /** * @dev function {updateMaxTeamAlloc} * * Update the limit of the team distribution percent * * @param teamAlloc new max limit of the team distribution percent */ function updateMaxTeamAlloc(uint16 teamAlloc) external onlyOwner { require(teamAlloc <= DENOMINATOR, "out of range"); _maxTeamAlloc = teamAlloc; emit MaxTeamAllocUpdated(teamAlloc); } /** * @dev function {maxTeamAlloc} * * Return common max team distribution percentage */ function maxTeamAlloc() external view returns (uint16) { return _maxTeamAlloc; } /** * @dev function {updateMaxTeamAllocForUUID} * * Whitelist token uuid for the unlimited team allocation percent * * @param uuid token to be whitelisted * @param teamAlloc new max team allocation percent */ function updateMaxTeamAllocForUUID( string calldata uuid, uint16 teamAlloc ) external onlyOwner { require(teamAlloc <= DENOMINATOR, "out of range"); _teamAllocWhitelist[uuid] = teamAlloc; emit MaxTeamAllocUpdatedForUUID(uuid, teamAlloc); } /** * @dev function {maxTeamAllocForUUID} * * Return max team distribution percentage for the given `uuid` of token * whitelisted token will return its max allocation percent * return `_maxTeamAlloc` for others * * @param uuid token UUID */ function maxTeamAllocForUUID( string calldata uuid ) external view returns (uint16) { uint16 teamAllocForUUID = _teamAllocWhitelist[uuid]; if (teamAllocForUUID > 0) return teamAllocForUUID; return _maxTeamAlloc; } /** * @notice function {whitelistUUIDForManualEnableTrading} * * Whitelist token for setting manual enabling trading feature * * @param uuid token uuid to whitelist * @param flag true / false */ function whitelistUUIDForManualEnableTrading( string calldata uuid, bool flag ) external onlyOwner { _manualEnableTradingWhitelist[uuid] = flag; emit ManualEnableTradingForUUIDUpdated(uuid, flag); } function isUUIDWhitelistedForManualEnableTrading( string calldata uuid ) external view returns (bool) { return _manualEnableTradingWhitelist[uuid]; } /** * @dev function {updateMinLockPeriod} * * Update minimum lock period * * @param period new minimum lock period */ function updateMinLockPeriod(uint256 period) external onlyOwner { _minLockPeriod = period; emit MinLockPeriodUpdated(period); } function minLockPeriod() external view returns (uint256) { return _minLockPeriod; } /** * @dev function {updateSnipeAutoBurnPercents} * * Update percent values of anti-snipe auto burning * * @param firstPercent anti-snipe first auto burn percent. max 35% * @param secondPercent anti-snipe second auto burn percent. max 20% * @param thirdPercent anti-snipe third auto burn percent. max 10% */ function updateSnipeAutoBurnPercents( uint16 firstPercent, uint16 secondPercent, uint16 thirdPercent ) external onlyOwner { require( firstPercent <= 3500 && secondPercent <= 2000 && thirdPercent <= 1000, "out of range" ); _autoBurnFirstPercent = firstPercent; _autoBurnSecondPercent = secondPercent; _autoBurnThirdPercent = thirdPercent; emit SnipeAutoBurnPercentsUpdated( firstPercent, secondPercent, thirdPercent ); } /** * @dev function {snipeAutoBurnPercents} * * Return anti-snipe auto burn percent values for 3 steps * * @return uint16 first auto burn percent * @return uint16 second auto burn percent * @return uint16 third auto burn percent */ function snipeAutoBurnPercents() external view returns (uint16, uint16, uint16) { return ( _autoBurnFirstPercent, _autoBurnSecondPercent, _autoBurnThirdPercent ); } /** * @dev function {updateTaxLimits} * * Update max limit of buy/sell/treasury tax which are used at the time of token deployment * * @param maxBuyTax maximum value of {buyTax}. max 35% * @param maxSellTax maximum value of {sellTax}. max 35% * @param maxTreasuryTax maximum value of {treasuryTax}. max 5% */ function updateTaxLimits( uint16 maxBuyTax, uint16 maxSellTax, uint16 maxTreasuryTax ) external onlyOwner { require( maxBuyTax <= 3500 && maxSellTax <= 3500 && maxTreasuryTax <= 500, "out of range" ); _maxBuyTax = maxBuyTax; _maxSellTax = maxSellTax; _maxTreasuryTax = maxTreasuryTax; emit TaxLimitsUpdated(maxBuyTax, maxSellTax, maxTreasuryTax); } /** * @dev function {taxLimits} * * Return tax limits which are used at the time of token deployment * * @return uint16 max buy tax limit * @return uint16 max sell tax limit * @return uint16 max treasury tax limit */ function taxLimits() external view returns (uint16, uint16, uint16) { return (_maxBuyTax, _maxSellTax, _maxTreasuryTax); } /** * @dev function {updateTaxAfterLimits} * * Update max limit of buy/sell/treasury tax which are used after token launched * * @param maxBuyTax maximum value of {buyTax}. max 35% * @param maxSellTax maximum value of {sellTax}. max 35% * @param maxTreasuryTax maximum value of {treasuryTax}. max 5% */ function updateTaxAfterLimits( uint16 maxBuyTax, uint16 maxSellTax, uint16 maxTreasuryTax ) external onlyOwner { require( maxBuyTax <= 3500 && maxSellTax <= 3500 && maxTreasuryTax <= 500, "out of range" ); _maxBuyTaxAfter = maxBuyTax; _maxSellTaxAfter = maxSellTax; _maxTreasuryTaxAfter = maxTreasuryTax; emit TaxAfterLimitsUpdated(maxBuyTax, maxSellTax, maxTreasuryTax); } /** * @dev function {taxAfterLimits} * * Return tax limits which are used after token launched * * @return uint16 max buy tax limit * @return uint16 max sell tax limit * @return uint16 max treasury tax limit */ function taxAfterLimits() external view returns (uint16, uint16, uint16) { return (_maxBuyTaxAfter, _maxSellTaxAfter, _maxTreasuryTaxAfter); } /** * @dev function {updateBankPadTax} * * Update BankPad tax value * * @param tax new BankPad tax */ function updateBankPadTax(uint16 tax) external onlyOwner { _bankPadTax = tax; emit BankPadTaxUpdated(tax); } function bankPadTax() external view returns (uint16) { return _bankPadTax; } /** * @dev function {updateMaxTaxToRenounce} * * Update the tax condition for renouncing ownership of the token * * @param maxTax max tax values for renounce */ function updateMaxTaxToRenounce(uint16 maxTax) external onlyOwner { _maxTaxToRenounce = maxTax; emit MaxTaxToRenounceUpdated(maxTax); } /** * @dev function {maxTaxToRenounce} * * Return the tax condition for renouncing ownership of the token * * @return uint16 max tax values for renounce */ function maxTaxToRenounce() external view returns (uint16) { return _maxTaxToRenounce; } /** * @dev function {updateTradingTimes} * * Update token related time configuration * * @param tradingDelayTime new trading delay time * @param tradingDisableTime new trading disable time * @param bankPadTaxApplyPeriod new bankPad tax apply period * @param taxWhitelistApplyDelay new tax whitelist delay period */ function updateTimeConfiguration( uint32 tradingDelayTime, uint32 tradingDisableTime, uint32 bankPadTaxApplyPeriod, uint32 taxWhitelistApplyDelay ) external onlyOwner { _tradingDelayTime = tradingDelayTime; _tradingDisableTime = tradingDisableTime; _bankPadTaxApplyPeriod = bankPadTaxApplyPeriod; _taxWhitelistApplyDelay = taxWhitelistApplyDelay; emit TimeConfigurationUpdated( tradingDelayTime, tradingDisableTime, bankPadTaxApplyPeriod, taxWhitelistApplyDelay ); } /** * @dev function {tradingTimes} * * Return token related time configuration * * @return uint32 trading delay time * @return uint32 trading disable time * @return uint32 BankPad tax apply period * @return uint32 Tax whitelist delay period */ function timeConfiguration() external view returns (uint32, uint32, uint32, uint32) { return ( _tradingDelayTime, _tradingDisableTime, _bankPadTaxApplyPeriod, _taxWhitelistApplyDelay ); } function updateMinPairTokenAmount( address pairToken, uint256 amount ) external onlyOwner { _minPairTokenAmounts[pairToken] = amount; emit MinPairTokenAmountUpdated(pairToken, amount); } /** * @dev function {minPairTokenAmount} * * Return minimum pair token amount * * @param pairToken address of adding token being added with deployed token */ function minPairTokenAmount( address pairToken ) external view returns (uint256) { return _minPairTokenAmounts[pairToken]; } /** * @dev function {updateMaxLaunchesPerWallet} * * Update max launches count per wallet * * @param maxLaunches new max launches count */ function updateMaxLaunchesPerWallet(uint16 maxLaunches) external onlyOwner { _maxLaunchesPerWallet = maxLaunches; emit MaxLaunchesPerWalletUpdated(maxLaunches); } function maxLaunchesPerWallet() external view returns (uint16) { return _maxLaunchesPerWallet; } /** * @dev function {launchedCount} * * Return launched token count by the given account * * @param account to view */ function launchedCount(address account) external view returns (uint16) { return _launchedCounts[account]; } } // File contracts/launchpad/ERC20FactoryByBankPad.sol pragma solidity ^0.8.0; // Original license: SPDX_License_Identifier: MIT // import "../interfaces/IUniLockerGoerli.sol"; contract ERC20FactoryByBankPad is ERC20FactoryByBankPadBase, Pausable { using SafeERC20 for IERC20; using Address for address payable; address private constant ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; event NewTokenCreated( address token, address serviceAccount, address deployer, bytes32 uuidHash, uint256 serviceFee, IBase.TokenLaunchConf tokenLaunchConf, IBase.InheritedConf inheritedConf ); constructor( address payable servicePayAccount_, uint256 launchFee_, uint256 delayedTradingFee_, uint256 tradingDisableFee_, uint256 antiDumpFee_ ) { require(servicePayAccount_ != address(0), "invalid pay account"); _servicePayAccount = servicePayAccount_; _launchFee = launchFee_; _tradingDelayFee = delayedTradingFee_; _tradingDisableFee = tradingDisableFee_; _antiDumpFee = antiDumpFee_; } /// @notice Create token from the template /// @dev Token configuration parameters are passed as ABI-encoded values. function createERC20( IBase.TokenLaunchConf memory tokenLaunchConf ) external payable whenNotPaused returns (address) { uint256 ethAmount = msg.value; require(_tokens[tokenLaunchConf.uuid] == address(0), "duplicated uuid"); IBase.InheritedConf memory inheritedConf = _buildInheritedConf( tokenLaunchConf.uuid ); IERC20ByBankPad createdToken = _deployERC20( tokenLaunchConf, inheritedConf ); ( bool isTradingDelayed, bool isTradingDisabled, uint256 ethInLP, uint256 ethInLockFee ) = _initializeLP(createdToken, tokenLaunchConf); uint256 serviceFee = _launchFee + (isTradingDelayed ? _tradingDelayFee : 0) + (isTradingDisabled ? _tradingDisableFee : 0) + (createdToken.isAntiDumpEnabled() ? _antiDumpFee : 0); require( ethAmount >= serviceFee + ethInLP + ethInLockFee, "insufficient eth" ); // send remained eth to the service pay account _servicePayAccount.sendValue(address(this).balance); createdToken.launch(isTradingDelayed, isTradingDisabled); emit NewTokenCreated( address(createdToken), _servicePayAccount, _msgSender(), createdToken.bankUUIDHash(), serviceFee, tokenLaunchConf, inheritedConf ); return address(createdToken); } function _deployERC20( IBase.TokenLaunchConf memory tokenLaunchConf, IBase.InheritedConf memory inheritedConf ) private returns (IERC20ByBankPad) { address deployer = _msgSender(); uint16 launchedCount = _launchedCounts[deployer]; require(launchedCount < _maxLaunchesPerWallet, "over launched"); _launchedCounts[deployer] = ++launchedCount; // validate some props in the factory, not to transfer attributes to the token _validateTaxProps(tokenLaunchConf.taxParam); bytes32 salt = keccak256( abi.encodePacked(tokenLaunchConf.uuid, block.timestamp) ); bytes32 bankIdHash = keccak256(abi.encodePacked(tokenLaunchConf.uuid)); bytes memory args = abi.encode( address(this), deployer, tokenLaunchConf, inheritedConf ); address deployedAddress = IERC20MachineByBankPad(_machine).deploy( bankIdHash, salt, args ); _tokens[tokenLaunchConf.uuid] = deployedAddress; return IERC20ByBankPad(deployedAddress); } function _initializeLP( IERC20ByBankPad createdToken, IBase.TokenLaunchConf memory param ) private returns (bool, bool, uint256, uint256) { ( bool isLPBurn, bool isTradingDelayed, bool isTradingDisabled, uint256 pairedTokenAmount, uint256 lockPeriod ) = abi.decode(param.lpParam, (bool, bool, bool, uint256, uint256)); require(pairedTokenAmount > 0, "invalid pair token amount"); // add liquidity (uint256 lpAmount, uint256 ethInLP) = _addLP( createdToken, pairedTokenAmount, isLPBurn ); // lock liquidity uint256 ethInLockFee; if (!isLPBurn) ethInLockFee = _lockLP(createdToken, lpAmount, lockPeriod); return (isTradingDelayed, isTradingDisabled, ethInLP, ethInLockFee); } /// @dev Add liquidity to the uniswap router /// LP is burnt if the burn flag is set /// @return uint256 created LP amount /// @return uint256 if pair is eth, return eth amount function _addLP( IERC20ByBankPad createdToken, uint256 pairedTokenAmount, bool isLPBurn ) private returns (uint256, uint256) { (address dexRouter_, address basePairedToken, ) = createdToken .ammAddresses(); IDexRouter dexRouter = IDexRouter(dexRouter_); uint256 createdTokenAmount = createdToken.balanceOf(address(this)); IERC20(address(createdToken)).safeApprove( address(dexRouter), createdTokenAmount ); require( pairedTokenAmount >= _minPairTokenAmounts[basePairedToken], "too small pair amount" ); if (basePairedToken == ETH_ADDRESS) { (, , uint256 lpAmount) = dexRouter.addLiquidityETH{ value: pairedTokenAmount }( address(createdToken), createdTokenAmount, 0, 0, isLPBurn ? address(0xdead) : address(this), block.timestamp + 300 ); return (lpAmount, pairedTokenAmount); } else { IERC20(basePairedToken).safeTransferFrom( _msgSender(), address(this), pairedTokenAmount ); IERC20(basePairedToken).safeApprove( address(dexRouter), pairedTokenAmount ); (, , uint256 lpAmount) = dexRouter.addLiquidity( address(createdToken), basePairedToken, createdTokenAmount, pairedTokenAmount, 0, 0, isLPBurn ? address(0xdead) : address(this), block.timestamp + 300 ); return (lpAmount, 0); } } /// @dev Lock LP into unicrypt lp locker contract /// We pay fee in ETH /// @return uint256 fee amount function _lockLP( IERC20ByBankPad createdToken, uint256 lpAmount, uint256 lockPeriod ) private returns (uint256) { require(lockPeriod >= _minLockPeriod, "too short lock"); (address dexRouter, , address baseAmmPair) = createdToken .ammAddresses(); IUniLocker lockerForDex = IUniLocker(_lpLockers[dexRouter]); require( address(lockerForDex) != address(0), "unsupported dex for lock" ); uint256 ethFee = lockerForDex.gFees().ethFee; IERC20(baseAmmPair).safeApprove(address(lockerForDex), lpAmount); lockerForDex.lockLPToken{value: ethFee}( baseAmmPair, lpAmount, block.timestamp + lockPeriod, payable(address(0)), true, payable(_msgSender()) // , // 11 // country code is used in the testnet ); return ethFee; } /** * @notice function {pauseFactory} * * Pause factory for the maintenance */ function pauseFactory(bool flag) external onlyOwner { if (flag) _pause(); else _unpause(); } /// @notice It allows the admin to recover tokens sent to the contract /// @param token_: the address of the token to withdraw /// @param amount_: the number of tokens to withdraw /// @dev Only owner can call this function function recoverToken(address token_, uint256 amount_) external onlyOwner { IERC20(token_).safeTransfer(_msgSender(), amount_); } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address payable","name":"servicePayAccount_","type":"address"},{"internalType":"uint256","name":"launchFee_","type":"uint256"},{"internalType":"uint256","name":"delayedTradingFee_","type":"uint256"},{"internalType":"uint256","name":"tradingDisableFee_","type":"uint256"},{"internalType":"uint256","name":"antiDumpFee_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"bankPadTax","type":"uint16"}],"name":"BankPadTaxUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"uuid","type":"string"},{"indexed":false,"internalType":"bool","name":"flag","type":"bool"}],"name":"ManualEnableTradingForUUIDUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"maxLaunches","type":"uint16"}],"name":"MaxLaunchesPerWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"maxTax","type":"uint16"}],"name":"MaxTaxToRenounceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"teamAlloc","type":"uint16"}],"name":"MaxTeamAllocUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"uuid","type":"string"},{"indexed":false,"internalType":"uint16","name":"teamAlloc","type":"uint16"}],"name":"MaxTeamAllocUpdatedForUUID","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"period","type":"uint256"}],"name":"MinLockPeriodUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pairToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MinPairTokenAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"serviceAccount","type":"address"},{"indexed":false,"internalType":"address","name":"deployer","type":"address"},{"indexed":false,"internalType":"bytes32","name":"uuidHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"serviceFee","type":"uint256"},{"components":[{"internalType":"string","name":"uuid","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"bytes","name":"distribParam","type":"bytes"},{"internalType":"bytes","name":"antiBotParam","type":"bytes"},{"internalType":"bytes","name":"taxParam","type":"bytes"},{"internalType":"bytes","name":"lpParam","type":"bytes"}],"indexed":false,"internalType":"struct IBase.TokenLaunchConf","name":"tokenLaunchConf","type":"tuple"},{"components":[{"internalType":"uint16","name":"autoBurnFirstPercent","type":"uint16"},{"internalType":"uint16","name":"autoBurnSecondPercent","type":"uint16"},{"internalType":"uint16","name":"autoBurnThirdPercent","type":"uint16"},{"internalType":"uint16","name":"maxBuyTaxAfter","type":"uint16"},{"internalType":"uint16","name":"maxSellTaxAfter","type":"uint16"},{"internalType":"uint16","name":"maxTreasuryTaxAfter","type":"uint16"},{"internalType":"uint16","name":"bankPadTax","type":"uint16"},{"internalType":"uint16","name":"maxTaxToRenounce","type":"uint16"},{"internalType":"uint32","name":"bankPadTaxApplyPeriod","type":"uint32"},{"internalType":"uint32","name":"taxWhitelistApplyDelay","type":"uint32"},{"internalType":"uint32","name":"tradingDelayTime","type":"uint32"},{"internalType":"uint32","name":"tradingDisableTime","type":"uint32"}],"indexed":false,"internalType":"struct IBase.InheritedConf","name":"inheritedConf","type":"tuple"}],"name":"NewTokenCreated","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"launchFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tradingDelayFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tradingDisableFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"antiDumpFee","type":"uint256"}],"name":"ServiceFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address payable","name":"account","type":"address"}],"name":"ServicePayAccountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"firstPercent","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"secondPercent","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"thirdPercent","type":"uint16"}],"name":"SnipeAutoBurnPercentsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"maxBuyTax","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"maxSellTax","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"maxTreasuryTax","type":"uint16"}],"name":"TaxAfterLimitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"maxBuyTax","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"maxSellTax","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"maxTreasuryTax","type":"uint16"}],"name":"TaxLimitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"tradingDelayTime","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"tradingDisableTime","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"bankPadTaxApplyPeriod","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"taxWhitelistApplyDelay","type":"uint32"}],"name":"TimeConfigurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"bankMachine","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bankPadTax","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"uuid","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"bytes","name":"distribParam","type":"bytes"},{"internalType":"bytes","name":"antiBotParam","type":"bytes"},{"internalType":"bytes","name":"taxParam","type":"bytes"},{"internalType":"bytes","name":"lpParam","type":"bytes"}],"internalType":"struct IBase.TokenLaunchConf","name":"tokenLaunchConf","type":"tuple"}],"name":"createERC20","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"uuid","type":"string"}],"name":"getToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"uuid","type":"string"}],"name":"isUUIDWhitelistedForManualEnableTrading","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"launchedCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dexRouter","type":"address"}],"name":"lpLocker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLaunchesPerWallet","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTaxToRenounce","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTeamAlloc","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"uuid","type":"string"}],"name":"maxTeamAllocForUUID","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minLockPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pairToken","type":"address"}],"name":"minPairTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"pauseFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"serviceFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"servicePayAccount","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"snipeAutoBurnPercents","outputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxAfterLimits","outputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLimits","outputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeConfiguration","outputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"machine","type":"address"}],"name":"updateBankMachine","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"tax","type":"uint16"}],"name":"updateBankPadTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dexRouter","type":"address"},{"internalType":"address","name":"newLocker","type":"address"}],"name":"updateLPLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"maxLaunches","type":"uint16"}],"name":"updateMaxLaunchesPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"maxTax","type":"uint16"}],"name":"updateMaxTaxToRenounce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"teamAlloc","type":"uint16"}],"name":"updateMaxTeamAlloc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uuid","type":"string"},{"internalType":"uint16","name":"teamAlloc","type":"uint16"}],"name":"updateMaxTeamAllocForUUID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"updateMinLockPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pairToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateMinPairTokenAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"launchFee","type":"uint256"},{"internalType":"uint256","name":"tradingDelayFee","type":"uint256"},{"internalType":"uint256","name":"tradingDisableFee","type":"uint256"},{"internalType":"uint256","name":"antiDumpFee","type":"uint256"}],"name":"updateServiceFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"updateServicePayAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"firstPercent","type":"uint16"},{"internalType":"uint16","name":"secondPercent","type":"uint16"},{"internalType":"uint16","name":"thirdPercent","type":"uint16"}],"name":"updateSnipeAutoBurnPercents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"maxBuyTax","type":"uint16"},{"internalType":"uint16","name":"maxSellTax","type":"uint16"},{"internalType":"uint16","name":"maxTreasuryTax","type":"uint16"}],"name":"updateTaxAfterLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"maxBuyTax","type":"uint16"},{"internalType":"uint16","name":"maxSellTax","type":"uint16"},{"internalType":"uint16","name":"maxTreasuryTax","type":"uint16"}],"name":"updateTaxLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"tradingDelayTime","type":"uint32"},{"internalType":"uint32","name":"tradingDisableTime","type":"uint32"},{"internalType":"uint32","name":"bankPadTaxApplyPeriod","type":"uint32"},{"internalType":"uint32","name":"taxWhitelistApplyDelay","type":"uint32"}],"name":"updateTimeConfiguration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uuid","type":"string"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"whitelistUUIDForManualEnableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526107d05f60146101000a81548161ffff021916908361ffff1602179055506105355f60166101000a81548161ffff021916908361ffff16021790555061029a5f60186101000a81548161ffff021916908361ffff1602179055506105dc5f601a6101000a81548161ffff021916908361ffff1602179055506105dc5f601c6101000a81548161ffff021916908361ffff1602179055506101f45f601e6101000a81548161ffff021916908361ffff1602179055506103e860015f6101000a81548161ffff021916908361ffff1602179055506101f4600160026101000a81548161ffff021916908361ffff16021790555062278d00600160046101000a81548163ffffffff021916908363ffffffff1602179055506202a300600160086101000a81548163ffffffff021916908363ffffffff160217905550603c6001600c6101000a81548163ffffffff021916908363ffffffff16021790555062093a80600160106101000a81548163ffffffff021916908363ffffffff1602179055506103e8600260146101000a81548161ffff021916908361ffff160217905550600c600260166101000a81548161ffff021916908361ffff160217905550610dac600260186101000a81548161ffff021916908361ffff160217905550610dac6002601a6101000a81548161ffff021916908361ffff1602179055506101f46002601c6101000a81548161ffff021916908361ffff16021790555062278d0060045534801562000230575f80fd5b5060405162005c0138038062005c018339818101604052810190620002569190620004cc565b620002766200026a6200036760201b60201c565b6200036e60201b60201c565b5f600f5f6101000a81548160ff0219169083151502179055505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160362000300576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002f790620005ae565b60405180910390fd5b8460025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836005819055508260068190555081600781905550806008819055505050505050620005ce565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200045e8262000433565b9050919050565b620004708162000452565b81146200047b575f80fd5b50565b5f815190506200048e8162000465565b92915050565b5f819050919050565b620004a88162000494565b8114620004b3575f80fd5b50565b5f81519050620004c6816200049d565b92915050565b5f805f805f60a08688031215620004e857620004e76200042f565b5b5f620004f7888289016200047e565b95505060206200050a88828901620004b6565b94505060406200051d88828901620004b6565b93505060606200053088828901620004b6565b92505060806200054388828901620004b6565b9150509295509295909350565b5f82825260208201905092915050565b7f696e76616c696420706179206163636f756e74000000000000000000000000005f82015250565b5f6200059660138362000550565b9150620005a38262000560565b602082019050919050565b5f6020820190508181035f830152620005c78162000588565b9050919050565b61562580620005dc5f395ff3fe608060405260043610610245575f3560e01c8063870f856811610138578063bcf48070116100b5578063cb2df41811610079578063cb2df4181461082f578063e602ab8b1461086b578063eb1c834914610893578063f1c71cd4146108cf578063f2fde38b146108f7578063fd109d771461091f57610245565b8063bcf480701461074f578063c1733f6814610777578063c2d4f942146107b3578063c524e82e146107dd578063c5d419151461080757610245565b8063a103657e116100fc578063a103657e14610683578063a3156826146106af578063acd33f31146106d7578063b29a8140146106ff578063b74e68a51461072757610245565b8063870f8568146105b157806387b27a95146105d95780638da5cb5b1461060957806397abb762146106335780639c030fc01461065b57610245565b806357824338116101c65780637c678b161161018a5780637c678b16146104c757806380857ffa146104f157806380c746531461051e57806381b31abd1461054b57806382b0f7d01461058757610245565b8063578243381461040d5780635c975abb146104355780635f57ef2c1461045f578063715018a61461048757806373ae54b51461049d57610245565b80632b1429181161020d5780632b1429181461033d5780632fdd75bf1461036557806349deaf4f146103915780634a1db646146103bb57806351186e9e146103e557610245565b806305860c24146102495780630d426b00146102715780630d7777581461029d57806313345cf9146102d957806329c66e3814610301575b5f80fd5b348015610254575f80fd5b5061026f600480360381019061026a9190613376565b610947565b005b34801561027c575f80fd5b50610285610a50565b604051610294939291906133d5565b60405180910390f35b3480156102a8575f80fd5b506102c360048036038101906102be9190613464565b610a8e565b6040516102d091906134a7565b60405180910390f35b3480156102e4575f80fd5b506102ff60048036038101906102fa91906134fb565b610ad4565b005b34801561030c575f80fd5b5061032760048036038101906103229190613587565b610bed565b60405161033491906135d2565b60405180910390f35b348015610348575f80fd5b50610363600480360381019061035e9190613464565b610c4f565b005b348015610370575f80fd5b50610379610d08565b604051610388939291906133d5565b60405180910390f35b34801561039c575f80fd5b506103a5610d46565b6040516103b291906135d2565b60405180910390f35b3480156103c6575f80fd5b506103cf610d5d565b6040516103dc91906135d2565b60405180910390f35b3480156103f0575f80fd5b5061040b600480360381019061040691906135eb565b610d74565b005b348015610418575f80fd5b50610433600480360381019061042e9190613616565b610dd3565b005b348015610440575f80fd5b50610449610ea2565b604051610456919061368d565b60405180910390f35b34801561046a575f80fd5b50610485600480360381019061048091906136d0565b610eb7565b005b348015610492575f80fd5b5061049b610ede565b005b3480156104a8575f80fd5b506104b1610ef1565b6040516104be91906134a7565b60405180910390f35b3480156104d2575f80fd5b506104db610efa565b6040516104e8919061370a565b60405180910390f35b3480156104fc575f80fd5b50610505610f22565b6040516105159493929190613723565b60405180910390f35b348015610529575f80fd5b50610532610f40565b6040516105429493929190613784565b60405180910390f35b348015610556575f80fd5b50610571600480360381019061056c9190613464565b610f9e565b60405161057e919061370a565b60405180910390f35b348015610592575f80fd5b5061059b611003565b6040516105a891906135d2565b60405180910390f35b3480156105bc575f80fd5b506105d760048036038101906105d29190613376565b61101a565b005b6105f360048036038101906105ee9190613b1a565b611123565b604051610600919061370a565b60405180910390f35b348015610614575f80fd5b5061061d6114bf565b60405161062a919061370a565b60405180910390f35b34801561063e575f80fd5b5061065960048036038101906106549190613b8b565b6114e6565b005b348015610666575f80fd5b50610681600480360381019061067c9190613bc9565b61156d565b005b34801561068e575f80fd5b506106976115b6565b6040516106a6939291906133d5565b60405180910390f35b3480156106ba575f80fd5b506106d560048036038101906106d091906135eb565b6115f7565b005b3480156106e2575f80fd5b506106fd60048036038101906106f89190613bf4565b611656565b005b34801561070a575f80fd5b5061072560048036038101906107209190613b8b565b6116d5565b005b348015610732575f80fd5b5061074d60048036038101906107489190613c51565b611713565b005b34801561075a575f80fd5b5061077560048036038101906107709190613cdf565b61177a565b005b348015610782575f80fd5b5061079d60048036038101906107989190613d43565b611849565b6040516107aa919061370a565b60405180910390f35b3480156107be575f80fd5b506107c761188f565b6040516107d49190613d99565b60405180910390f35b3480156107e8575f80fd5b506107f16118b7565b6040516107fe91906135d2565b60405180910390f35b348015610812575f80fd5b5061082d60048036038101906108289190613376565b6118cd565b005b34801561083a575f80fd5b5061085560048036038101906108509190613587565b6119d9565b604051610862919061368d565b60405180910390f35b348015610876575f80fd5b50610891600480360381019061088c91906135eb565b611a0f565b005b34801561089e575f80fd5b506108b960048036038101906108b49190613464565b611a6d565b6040516108c691906135d2565b60405180910390f35b3480156108da575f80fd5b506108f560048036038101906108f091906135eb565b611ac0565b005b348015610902575f80fd5b5061091d60048036038101906109189190613464565b611b6c565b005b34801561092a575f80fd5b5061094560048036038101906109409190613db2565b611bee565b005b61094f611c75565b610dac8361ffff161115801561096b5750610dac8261ffff1611155b801561097d57506101f48161ffff1611155b6109bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b390613e4a565b60405180910390fd5b825f601a6101000a81548161ffff021916908361ffff160217905550815f601c6101000a81548161ffff021916908361ffff160217905550805f601e6101000a81548161ffff021916908361ffff1602179055507f8157027eb85fd89b2efb2911c47299c62a2f43927770288915a57ff5aa9aff78838383604051610a43939291906133d5565b60405180910390a1505050565b5f805f8060149054906101000a900461ffff165f60169054906101000a900461ffff165f60189054906101000a900461ffff16925092509250909192565b5f600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610adc611c75565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4190613eb2565b60405180910390fd5b610b735f8273ffffffffffffffffffffffffffffffffffffffff16611cf390919063ffffffff16565b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f3625e9e992e84551991603867426211da9c3e048e19eb2aac8e5f1bda7e5f92b81604051610be29190613d99565b60405180910390a150565b5f80600b8484604051610c01929190613efe565b90815260200160405180910390205f9054906101000a900461ffff1690505f8161ffff161115610c345780915050610c49565b600260149054906101000a900461ffff169150505b92915050565b610c57611c75565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbc90613f60565b60405180910390fd5b8060035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f805f80601a9054906101000a900461ffff165f601c9054906101000a900461ffff165f601e9054906101000a900461ffff16925092509250909192565b5f600160029054906101000a900461ffff16905090565b5f600260149054906101000a900461ffff16905090565b610d7c611c75565b80600260166101000a81548161ffff021916908361ffff1602179055507f0d5dfa7e3ffdf0daca1d63bd5ab5c65827be4c580153bef4544eb2512afa12bf81604051610dc891906135d2565b60405180910390a150565b610ddb611c75565b61271061ffff168161ffff161115610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f90613e4a565b60405180910390fd5b80600b8484604051610e3b929190613efe565b90815260200160405180910390205f6101000a81548161ffff021916908361ffff1602179055507fa9a9f157d989d2731dd74a16d2e9f7e9caacb51e0a7cd33b7ec6a1d3908f5520838383604051610e9593929190613faa565b60405180910390a1505050565b5f600f5f9054906101000a900460ff16905090565b610ebf611c75565b8015610ed257610ecd611de3565b610edb565b610eda611e45565b5b50565b610ee6611c75565b610eef5f611ea6565b565b5f600454905090565b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f805f80600554600654600754600854935093509350935090919293565b5f805f806001600c9054906101000a900463ffffffff16600160109054906101000a900463ffffffff16600160049054906101000a900463ffffffff16600160089054906101000a900463ffffffff16935093509350935090919293565b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f600260169054906101000a900461ffff16905090565b611022611c75565b610dac8361ffff161115801561103e57506107d08261ffff1611155b801561105057506103e88161ffff1611155b61108f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108690613e4a565b60405180910390fd5b825f60146101000a81548161ffff021916908361ffff160217905550815f60166101000a81548161ffff021916908361ffff160217905550805f60186101000a81548161ffff021916908361ffff1602179055507f5fa708f2b10f2c2a41a460fe7ec148a656813df1ea95b47e8161bc95166e5a92838383604051611116939291906133d5565b60405180910390a1505050565b5f61112c611f67565b5f3490505f73ffffffffffffffffffffffffffffffffffffffff16600a845f015160405161115a919061403c565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d59061409c565b60405180910390fd5b5f6111eb845f0151611fb1565b90505f6111f885836121e4565b90505f805f80611208858a61249c565b93509350935093505f8573ffffffffffffffffffffffffffffffffffffffff16633e4042286040518163ffffffff1660e01b8152600401602060405180830381865afa15801561125a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061127e91906140ce565b611288575f61128c565b6008545b84611297575f61129b565b6007545b866112a6575f6112aa565b6006545b6005546112b79190614126565b6112c19190614126565b6112cb9190614126565b90508183826112da9190614126565b6112e49190614126565b881015611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d906141a3565b60405180910390fd5b6113704760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611cf390919063ffffffff16565b8573ffffffffffffffffffffffffffffffffffffffff1663f519b7d386866040518363ffffffff1660e01b81526004016113ab9291906141c1565b5f604051808303815f87803b1580156113c2575f80fd5b505af11580156113d4573d5f803e3d5ffd5b505050507fd6f6c63246dd4d36ff9d157c9159371381ee8be9d1475eab442af8743fdab6568660025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661142461254b565b8973ffffffffffffffffffffffffffffffffffffffff1663b4b37bd26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561146d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611491919061421b565b858f8d6040516114a7979695949392919061451f565b60405180910390a18598505050505050505050919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6114ee611c75565b80600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055507f4fe473bd5cc90e6c73cf11d29f6cc091faa692024afacfdb69bc9a9abebfb6188282604051611561929190614594565b60405180910390a15050565b611575611c75565b806004819055507fe818ff6972bf8970ca14a893539e57452588b197b76e6afe29c40a31b3363c61816040516115ab91906134a7565b60405180910390a150565b5f805f600260189054906101000a900461ffff166002601a9054906101000a900461ffff166002601c9054906101000a900461ffff16925092509250909192565b6115ff611c75565b80600160026101000a81548161ffff021916908361ffff1602179055507f269f7677f1796af445e0c26473b7cede0cdee7ee422179b8b7b1438344a73af38160405161164b91906135d2565b60405180910390a150565b61165e611c75565b80600c8484604051611671929190613efe565b90815260200160405180910390205f6101000a81548160ff0219169083151502179055507fc8729436e2f8fcb79ab0f757a04f56302b14f2f2c80b43f0caa626870ca115068383836040516116c8939291906145bb565b60405180910390a1505050565b6116dd611c75565b61170f6116e861254b565b828473ffffffffffffffffffffffffffffffffffffffff166125529092919063ffffffff16565b5050565b61171b611c75565b836005819055508260068190555081600781905550806008819055507f843719a8988f9a856dfa922ecd43b71c9dcfcedbd2d42f44fbf1ed39a93666068484848460405161176c9493929190613723565b60405180910390a150505050565b611782611c75565b836001600c6101000a81548163ffffffff021916908363ffffffff16021790555082600160106101000a81548163ffffffff021916908363ffffffff16021790555081600160046101000a81548163ffffffff021916908363ffffffff16021790555080600160086101000a81548163ffffffff021916908363ffffffff1602179055507fcac069ca087ac0dfda6b83c11d979488cb43699e375b64862130e9005b1c33e98484848460405161183b9493929190613784565b60405180910390a150505050565b5f600a8260405161185a919061403c565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60015f9054906101000a900461ffff16905090565b6118d5611c75565b610dac8361ffff16111580156118f15750610dac8261ffff1611155b801561190357506101f48161ffff1611155b611942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193990613e4a565b60405180910390fd5b82600260186101000a81548161ffff021916908361ffff160217905550816002601a6101000a81548161ffff021916908361ffff160217905550806002601c6101000a81548161ffff021916908361ffff1602179055507f29f254017ff4765c884ec3d1a19c84421b8afb55dc41de389a9869699b3a03858383836040516119cc939291906133d5565b60405180910390a1505050565b5f600c83836040516119ec929190613efe565b90815260200160405180910390205f9054906101000a900460ff16905092915050565b611a17611c75565b8060015f6101000a81548161ffff021916908361ffff1602179055507fa5d64adc4dabd69870f1a872d07b3d117150f1bfd0d046d7c35243f141fe081981604051611a6291906135d2565b60405180910390a150565b5f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff169050919050565b611ac8611c75565b61271061ffff168161ffff161115611b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0c90613e4a565b60405180910390fd5b80600260146101000a81548161ffff021916908361ffff1602179055507f39bbc533273be90b6ca32ee9b59e96795cf54c48c5388c9c00af1e509d2ffbb981604051611b6191906135d2565b60405180910390a150565b611b74611c75565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd99061465b565b60405180910390fd5b611beb81611ea6565b50565b611bf6611c75565b8060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b611c7d61254b565b73ffffffffffffffffffffffffffffffffffffffff16611c9b6114bf565b73ffffffffffffffffffffffffffffffffffffffff1614611cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce8906146c3565b60405180910390fd5b565b80471015611d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2d9061472b565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff1682604051611d5b90614776565b5f6040518083038185875af1925050503d805f8114611d95576040519150601f19603f3d011682016040523d82523d5f602084013e611d9a565b606091505b5050905080611dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd5906147fa565b60405180910390fd5b505050565b611deb611f67565b6001600f5f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611e2e61254b565b604051611e3b919061370a565b60405180910390a1565b611e4d6125d8565b5f600f5f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611e8f61254b565b604051611e9c919061370a565b60405180910390a1565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f6f610ea2565b15611faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa690614862565b60405180910390fd5b565b611fb96132a1565b611fc16132a1565b5f60149054906101000a900461ffff16815f019061ffff16908161ffff16815250505f60169054906101000a900461ffff16816020019061ffff16908161ffff16815250505f60189054906101000a900461ffff16816040019061ffff16908161ffff16815250505f601a9054906101000a900461ffff16816060019061ffff16908161ffff16815250505f601c9054906101000a900461ffff16816080019061ffff16908161ffff16815250505f601e9054906101000a900461ffff168160a0019061ffff16908161ffff168152505060015f9054906101000a900461ffff168160c0019061ffff16908161ffff1681525050600160029054906101000a900461ffff168160e0019061ffff16908161ffff1681525050600160049054906101000a900463ffffffff1681610100019063ffffffff16908163ffffffff1681525050600160089054906101000a900463ffffffff1681610120019063ffffffff16908163ffffffff16815250506001600c9054906101000a900463ffffffff1681610140019063ffffffff16908163ffffffff1681525050600c8360405161216a919061403c565b90815260200160405180910390205f9054906101000a900460ff166121a157600160109054906101000a900463ffffffff166121c3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b81610160019063ffffffff16908163ffffffff168152505080915050919050565b5f806121ee61254b565b90505f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff169050600260169054906101000a900461ffff1661ffff168161ffff1610612298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228f906148ca565b60405180910390fd5b806122a2906148e8565b905080600e5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548161ffff021916908361ffff1602179055506123088560a00151612621565b5f855f01514260405160200161231f929190614931565b6040516020818303038152906040528051906020012090505f865f015160405160200161234c919061403c565b6040516020818303038152906040528051906020012090505f3085898960405160200161237c9493929190614958565b60405160208183030381529060405290505f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d76fad238486856040518463ffffffff1660e01b81526004016123ec939291906149eb565b6020604051808303815f875af1158015612408573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061242c9190614a3b565b905080600a8a5f0151604051612442919061403c565b90815260200160405180910390205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080965050505050505092915050565b5f805f805f805f805f8960c001518060200190518101906124bd9190614a7a565b945094509450945094505f8211612509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250090614b3b565b60405180910390fd5b5f806125168d85896127d2565b915091505f8761252e5761252b8e8486612b88565b90505b868683839b509b509b509b50505050505050505092959194509250565b5f33905090565b6125d38363a9059cbb60e01b8484604051602401612571929190614594565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612e42565b505050565b6125e0610ea2565b61261f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261690614ba3565b60405180910390fd5b565b5f805f838060200190518101906126389190614be9565b96509650965050505050600260189054906101000a900461ffff1661ffff168361ffff161115801561268257506002601a9054906101000a900461ffff1661ffff168261ffff1611155b80156126a657506002601c9054906101000a900461ffff1661ffff168161ffff1611155b6126e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dc90614cd0565b60405180910390fd5b5f60015f9054906101000a900461ffff16905061271061ffff1661271061ffff16826127106127149190614cee565b61ffff1684876127249190614cee565b61ffff166127329190614d23565b61273c9190614d91565b1115801561278c575061271061ffff1661271061ffff16826127106127619190614cee565b61ffff1684866127719190614cee565b61ffff1661277f9190614d23565b6127899190614d91565b11155b6127cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c290614e0b565b60405180910390fd5b5050505050565b5f805f808673ffffffffffffffffffffffffffffffffffffffff16637196d1786040518163ffffffff1660e01b8152600401606060405180830381865afa15801561281f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128439190614e29565b50915091505f8290505f8873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612886919061370a565b602060405180830381865afa1580156128a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128c59190614e79565b90506128f282828b73ffffffffffffffffffffffffffffffffffffffff16612f089092919063ffffffff16565b600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054881015612972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296990614eee565b60405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a6e575f8273ffffffffffffffffffffffffffffffffffffffff1663f305d7198a8c855f808e6129e657306129ea565b61dead5b61012c426129f89190614126565b6040518863ffffffff1660e01b8152600401612a1996959493929190614f45565b60606040518083038185885af1158015612a35573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190612a5a9190614fa4565b925050508089965096505050505050612b80565b612aa2612a7961254b565b308a8673ffffffffffffffffffffffffffffffffffffffff16613053909392919063ffffffff16565b612acd82898573ffffffffffffffffffffffffffffffffffffffff16612f089092919063ffffffff16565b5f8273ffffffffffffffffffffffffffffffffffffffff1663e8e337008b86858d5f808f612afb5730612aff565b61dead5b61012c42612b0d9190614126565b6040518963ffffffff1660e01b8152600401612b30989796959493929190614ff4565b6060604051808303815f875af1158015612b4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b709190614fa4565b92505050805f9650965050505050505b935093915050565b5f600454821015612bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc5906150ba565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff16637196d1786040518163ffffffff1660e01b8152600401606060405180830381865afa158015612c19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c3d9190614e29565b92505091505f60095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790615122565b60405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff166390e1a0036040518163ffffffff1660e01b815260040161012060405180830381865afa158015612d5b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d7f9190615258565b5f01519050612daf82888573ffffffffffffffffffffffffffffffffffffffff16612f089092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff16638af416f682858a8a42612dda9190614126565b5f6001612de561254b565b6040518863ffffffff1660e01b8152600401612e0696959493929190615284565b5f604051808303818588803b158015612e1d575f80fd5b505af1158015612e2f573d5f803e3d5ffd5b5050505050809450505050509392505050565b5f612ea3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130dc9092919063ffffffff16565b90505f81511480612ec4575080806020019051810190612ec391906140ce565b5b612f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612efa90615353565b60405180910390fd5b505050565b5f811480612f8e57505f8373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401612f4d929190615371565b602060405180830381865afa158015612f68573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f8c9190614e79565b145b612fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc490615408565b60405180910390fd5b61304e8363095ea7b360e01b8484604051602401612fec929190614594565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612e42565b505050565b6130d6846323b872dd60e01b85858560405160240161307493929190615426565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612e42565b50505050565b60606130ea84845f856130f3565b90509392505050565b606082471015613138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312f906154cb565b60405180910390fd5b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516131609190615519565b5f6040518083038185875af1925050503d805f811461319a576040519150601f19603f3d011682016040523d82523d5f602084013e61319f565b606091505b50915091506131b0878383876131bc565b92505050949350505050565b6060831561321d575f835103613215576131d585613230565b613214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320b90615579565b60405180910390fd5b5b829050613228565b6132278383613252565b5b949350505050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f825111156132645781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329891906155cf565b60405180910390fd5b6040518061018001604052805f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f63ffffffff1681526020015f63ffffffff1681526020015f63ffffffff1681526020015f63ffffffff1681525090565b5f604051905090565b5f80fd5b5f80fd5b5f61ffff82169050919050565b6133558161333f565b811461335f575f80fd5b50565b5f813590506133708161334c565b92915050565b5f805f6060848603121561338d5761338c613337565b5b5f61339a86828701613362565b93505060206133ab86828701613362565b92505060406133bc86828701613362565b9150509250925092565b6133cf8161333f565b82525050565b5f6060820190506133e85f8301866133c6565b6133f560208301856133c6565b61340260408301846133c6565b949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6134338261340a565b9050919050565b61344381613429565b811461344d575f80fd5b50565b5f8135905061345e8161343a565b92915050565b5f6020828403121561347957613478613337565b5b5f61348684828501613450565b91505092915050565b5f819050919050565b6134a18161348f565b82525050565b5f6020820190506134ba5f830184613498565b92915050565b5f6134ca8261340a565b9050919050565b6134da816134c0565b81146134e4575f80fd5b50565b5f813590506134f5816134d1565b92915050565b5f602082840312156135105761350f613337565b5b5f61351d848285016134e7565b91505092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261354757613546613526565b5b8235905067ffffffffffffffff8111156135645761356361352a565b5b6020830191508360018202830111156135805761357f61352e565b5b9250929050565b5f806020838503121561359d5761359c613337565b5b5f83013567ffffffffffffffff8111156135ba576135b961333b565b5b6135c685828601613532565b92509250509250929050565b5f6020820190506135e55f8301846133c6565b92915050565b5f60208284031215613600576135ff613337565b5b5f61360d84828501613362565b91505092915050565b5f805f6040848603121561362d5761362c613337565b5b5f84013567ffffffffffffffff81111561364a5761364961333b565b5b61365686828701613532565b9350935050602061366986828701613362565b9150509250925092565b5f8115159050919050565b61368781613673565b82525050565b5f6020820190506136a05f83018461367e565b92915050565b6136af81613673565b81146136b9575f80fd5b50565b5f813590506136ca816136a6565b92915050565b5f602082840312156136e5576136e4613337565b5b5f6136f2848285016136bc565b91505092915050565b61370481613429565b82525050565b5f60208201905061371d5f8301846136fb565b92915050565b5f6080820190506137365f830187613498565b6137436020830186613498565b6137506040830185613498565b61375d6060830184613498565b95945050505050565b5f63ffffffff82169050919050565b61377e81613766565b82525050565b5f6080820190506137975f830187613775565b6137a46020830186613775565b6137b16040830185613775565b6137be6060830184613775565b95945050505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613811826137cb565b810181811067ffffffffffffffff821117156138305761382f6137db565b5b80604052505050565b5f61384261332e565b905061384e8282613808565b919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115613875576138746137db565b5b61387e826137cb565b9050602081019050919050565b828183375f83830152505050565b5f6138ab6138a68461385b565b613839565b9050828152602081018484840111156138c7576138c6613857565b5b6138d284828561388b565b509392505050565b5f82601f8301126138ee576138ed613526565b5b81356138fe848260208601613899565b91505092915050565b5f67ffffffffffffffff821115613921576139206137db565b5b61392a826137cb565b9050602081019050919050565b5f61394961394484613907565b613839565b90508281526020810184848401111561396557613964613857565b5b61397084828561388b565b509392505050565b5f82601f83011261398c5761398b613526565b5b813561399c848260208601613937565b91505092915050565b5f60e082840312156139ba576139b96137c7565b5b6139c460e0613839565b90505f82013567ffffffffffffffff8111156139e3576139e2613853565b5b6139ef848285016138da565b5f83015250602082013567ffffffffffffffff811115613a1257613a11613853565b5b613a1e848285016138da565b602083015250604082013567ffffffffffffffff811115613a4257613a41613853565b5b613a4e848285016138da565b604083015250606082013567ffffffffffffffff811115613a7257613a71613853565b5b613a7e84828501613978565b606083015250608082013567ffffffffffffffff811115613aa257613aa1613853565b5b613aae84828501613978565b60808301525060a082013567ffffffffffffffff811115613ad257613ad1613853565b5b613ade84828501613978565b60a08301525060c082013567ffffffffffffffff811115613b0257613b01613853565b5b613b0e84828501613978565b60c08301525092915050565b5f60208284031215613b2f57613b2e613337565b5b5f82013567ffffffffffffffff811115613b4c57613b4b61333b565b5b613b58848285016139a5565b91505092915050565b613b6a8161348f565b8114613b74575f80fd5b50565b5f81359050613b8581613b61565b92915050565b5f8060408385031215613ba157613ba0613337565b5b5f613bae85828601613450565b9250506020613bbf85828601613b77565b9150509250929050565b5f60208284031215613bde57613bdd613337565b5b5f613beb84828501613b77565b91505092915050565b5f805f60408486031215613c0b57613c0a613337565b5b5f84013567ffffffffffffffff811115613c2857613c2761333b565b5b613c3486828701613532565b93509350506020613c47868287016136bc565b9150509250925092565b5f805f8060808587031215613c6957613c68613337565b5b5f613c7687828801613b77565b9450506020613c8787828801613b77565b9350506040613c9887828801613b77565b9250506060613ca987828801613b77565b91505092959194509250565b613cbe81613766565b8114613cc8575f80fd5b50565b5f81359050613cd981613cb5565b92915050565b5f805f8060808587031215613cf757613cf6613337565b5b5f613d0487828801613ccb565b9450506020613d1587828801613ccb565b9350506040613d2687828801613ccb565b9250506060613d3787828801613ccb565b91505092959194509250565b5f60208284031215613d5857613d57613337565b5b5f82013567ffffffffffffffff811115613d7557613d7461333b565b5b613d81848285016138da565b91505092915050565b613d93816134c0565b82525050565b5f602082019050613dac5f830184613d8a565b92915050565b5f8060408385031215613dc857613dc7613337565b5b5f613dd585828601613450565b9250506020613de685828601613450565b9150509250929050565b5f82825260208201905092915050565b7f6f7574206f662072616e676500000000000000000000000000000000000000005f82015250565b5f613e34600c83613df0565b9150613e3f82613e00565b602082019050919050565b5f6020820190508181035f830152613e6181613e28565b9050919050565b7f696e76616c696420706179206163636f756e74000000000000000000000000005f82015250565b5f613e9c601383613df0565b9150613ea782613e68565b602082019050919050565b5f6020820190508181035f830152613ec981613e90565b9050919050565b5f81905092915050565b5f613ee58385613ed0565b9350613ef283858461388b565b82840190509392505050565b5f613f0a828486613eda565b91508190509392505050565b7f696e76616c6964206d616368696e6500000000000000000000000000000000005f82015250565b5f613f4a600f83613df0565b9150613f5582613f16565b602082019050919050565b5f6020820190508181035f830152613f7781613f3e565b9050919050565b5f613f898385613df0565b9350613f9683858461388b565b613f9f836137cb565b840190509392505050565b5f6040820190508181035f830152613fc3818587613f7e565b9050613fd260208301846133c6565b949350505050565b5f81519050919050565b5f5b83811015614001578082015181840152602081019050613fe6565b5f8484015250505050565b5f61401682613fda565b6140208185613ed0565b9350614030818560208601613fe4565b80840191505092915050565b5f614047828461400c565b915081905092915050565b7f6475706c696361746564207575696400000000000000000000000000000000005f82015250565b5f614086600f83613df0565b915061409182614052565b602082019050919050565b5f6020820190508181035f8301526140b38161407a565b9050919050565b5f815190506140c8816136a6565b92915050565b5f602082840312156140e3576140e2613337565b5b5f6140f0848285016140ba565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6141308261348f565b915061413b8361348f565b9250828201905080821115614153576141526140f9565b5b92915050565b7f696e73756666696369656e7420657468000000000000000000000000000000005f82015250565b5f61418d601083613df0565b915061419882614159565b602082019050919050565b5f6020820190508181035f8301526141ba81614181565b9050919050565b5f6040820190506141d45f83018561367e565b6141e1602083018461367e565b9392505050565b5f819050919050565b6141fa816141e8565b8114614204575f80fd5b50565b5f81519050614215816141f1565b92915050565b5f602082840312156142305761422f613337565b5b5f61423d84828501614207565b91505092915050565b5f819050919050565b5f61426961426461425f8461340a565b614246565b61340a565b9050919050565b5f61427a8261424f565b9050919050565b5f61428b82614270565b9050919050565b61429b81614281565b82525050565b6142aa816141e8565b82525050565b5f82825260208201905092915050565b5f6142ca82613fda565b6142d481856142b0565b93506142e4818560208601613fe4565b6142ed816137cb565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f61431c826142f8565b6143268185614302565b9350614336818560208601613fe4565b61433f816137cb565b840191505092915050565b5f60e083015f8301518482035f86015261436482826142c0565b9150506020830151848203602086015261437e82826142c0565b9150506040830151848203604086015261439882826142c0565b915050606083015184820360608601526143b28282614312565b915050608083015184820360808601526143cc8282614312565b91505060a083015184820360a08601526143e68282614312565b91505060c083015184820360c08601526144008282614312565b9150508091505092915050565b6144168161333f565b82525050565b61442581613766565b82525050565b61018082015f8201516144405f85018261440d565b506020820151614453602085018261440d565b506040820151614466604085018261440d565b506060820151614479606085018261440d565b50608082015161448c608085018261440d565b5060a082015161449f60a085018261440d565b5060c08201516144b260c085018261440d565b5060e08201516144c560e085018261440d565b506101008201516144da61010085018261441c565b506101208201516144ef61012085018261441c565b5061014082015161450461014085018261441c565b5061016082015161451961016085018261441c565b50505050565b5f610240820190506145335f83018a6136fb565b6145406020830189614292565b61454d60408301886136fb565b61455a60608301876142a1565b6145676080830186613498565b81810360a0830152614579818561434a565b905061458860c083018461442b565b98975050505050505050565b5f6040820190506145a75f8301856136fb565b6145b46020830184613498565b9392505050565b5f6040820190508181035f8301526145d4818587613f7e565b90506145e3602083018461367e565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f614645602683613df0565b9150614650826145eb565b604082019050919050565b5f6020820190508181035f83015261467281614639565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6146ad602083613df0565b91506146b882614679565b602082019050919050565b5f6020820190508181035f8301526146da816146a1565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e63650000005f82015250565b5f614715601d83613df0565b9150614720826146e1565b602082019050919050565b5f6020820190508181035f83015261474281614709565b9050919050565b5f81905092915050565b50565b5f6147615f83614749565b915061476c82614753565b5f82019050919050565b5f61478082614756565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c20725f8201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b5f6147e4603a83613df0565b91506147ef8261478a565b604082019050919050565b5f6020820190508181035f830152614811816147d8565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f61484c601083613df0565b915061485782614818565b602082019050919050565b5f6020820190508181035f83015261487981614840565b9050919050565b7f6f766572206c61756e63686564000000000000000000000000000000000000005f82015250565b5f6148b4600d83613df0565b91506148bf82614880565b602082019050919050565b5f6020820190508181035f8301526148e1816148a8565b9050919050565b5f6148f28261333f565b915061ffff8203614906576149056140f9565b5b600182019050919050565b5f819050919050565b61492b6149268261348f565b614911565b82525050565b5f61493c828561400c565b9150614948828461491a565b6020820191508190509392505050565b5f6101e08201905061496c5f8301876136fb565b61497960208301866136fb565b818103604083015261498b818561434a565b905061499a606083018461442b565b95945050505050565b5f82825260208201905092915050565b5f6149bd826142f8565b6149c781856149a3565b93506149d7818560208601613fe4565b6149e0816137cb565b840191505092915050565b5f6060820190506149fe5f8301866142a1565b614a0b60208301856142a1565b8181036040830152614a1d81846149b3565b9050949350505050565b5f81519050614a358161343a565b92915050565b5f60208284031215614a5057614a4f613337565b5b5f614a5d84828501614a27565b91505092915050565b5f81519050614a7481613b61565b92915050565b5f805f805f60a08688031215614a9357614a92613337565b5b5f614aa0888289016140ba565b9550506020614ab1888289016140ba565b9450506040614ac2888289016140ba565b9350506060614ad388828901614a66565b9250506080614ae488828901614a66565b9150509295509295909350565b7f696e76616c6964207061697220746f6b656e20616d6f756e74000000000000005f82015250565b5f614b25601983613df0565b9150614b3082614af1565b602082019050919050565b5f6020820190508181035f830152614b5281614b19565b9050919050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f614b8d601483613df0565b9150614b9882614b59565b602082019050919050565b5f6020820190508181035f830152614bba81614b81565b9050919050565b5f81519050614bcf816134d1565b92915050565b5f81519050614be38161334c565b92915050565b5f805f805f805f60e0888a031215614c0457614c03613337565b5b5f614c118a828b01614bc1565b9750506020614c228a828b01614bc1565b9650506040614c338a828b01614bc1565b9550506060614c448a828b01614bc1565b9450506080614c558a828b01614bd5565b93505060a0614c668a828b01614bd5565b92505060c0614c778a828b01614bd5565b91505092959891949750929550565b7f746f6f206d7563682074617800000000000000000000000000000000000000005f82015250565b5f614cba600c83613df0565b9150614cc582614c86565b602082019050919050565b5f6020820190508181035f830152614ce781614cae565b9050919050565b5f614cf88261333f565b9150614d038361333f565b9250828201905061ffff811115614d1d57614d1c6140f9565b5b92915050565b5f614d2d8261348f565b9150614d388361348f565b9250828202614d468161348f565b91508282048414831517614d5d57614d5c6140f9565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614d9b8261348f565b9150614da68361348f565b925082614db657614db5614d64565b5b828204905092915050565b7f746178206f7574206f662072616e6765000000000000000000000000000000005f82015250565b5f614df5601083613df0565b9150614e0082614dc1565b602082019050919050565b5f6020820190508181035f830152614e2281614de9565b9050919050565b5f805f60608486031215614e4057614e3f613337565b5b5f614e4d86828701614a27565b9350506020614e5e86828701614a27565b9250506040614e6f86828701614a27565b9150509250925092565b5f60208284031215614e8e57614e8d613337565b5b5f614e9b84828501614a66565b91505092915050565b7f746f6f20736d616c6c207061697220616d6f756e7400000000000000000000005f82015250565b5f614ed8601583613df0565b9150614ee382614ea4565b602082019050919050565b5f6020820190508181035f830152614f0581614ecc565b9050919050565b5f819050919050565b5f614f2f614f2a614f2584614f0c565b614246565b61348f565b9050919050565b614f3f81614f15565b82525050565b5f60c082019050614f585f8301896136fb565b614f656020830188613498565b614f726040830187614f36565b614f7f6060830186614f36565b614f8c60808301856136fb565b614f9960a0830184613498565b979650505050505050565b5f805f60608486031215614fbb57614fba613337565b5b5f614fc886828701614a66565b9350506020614fd986828701614a66565b9250506040614fea86828701614a66565b9150509250925092565b5f610100820190506150085f83018b6136fb565b615015602083018a6136fb565b6150226040830189613498565b61502f6060830188613498565b61503c6080830187614f36565b61504960a0830186614f36565b61505660c08301856136fb565b61506360e0830184613498565b9998505050505050505050565b7f746f6f2073686f7274206c6f636b0000000000000000000000000000000000005f82015250565b5f6150a4600e83613df0565b91506150af82615070565b602082019050919050565b5f6020820190508181035f8301526150d181615098565b9050919050565b7f756e737570706f727465642064657820666f72206c6f636b00000000000000005f82015250565b5f61510c601883613df0565b9150615117826150d8565b602082019050919050565b5f6020820190508181035f83015261513981615100565b9050919050565b5f61514a82613429565b9050919050565b61515a81615140565b8114615164575f80fd5b50565b5f8151905061517581615151565b92915050565b5f6101208284031215615191576151906137c7565b5b61519c610120613839565b90505f6151ab84828501614a66565b5f8301525060206151be84828501615167565b60208301525060406151d284828501614a66565b60408301525060606151e684828501614a66565b60608301525060806151fa84828501614a66565b60808301525060a061520e84828501614a66565b60a08301525060c061522284828501615167565b60c08301525060e061523684828501614a66565b60e08301525061010061524b84828501614a66565b6101008301525092915050565b5f610120828403121561526e5761526d613337565b5b5f61527b8482850161517b565b91505092915050565b5f60c0820190506152975f8301896136fb565b6152a46020830188613498565b6152b16040830187613498565b6152be6060830186613d8a565b6152cb608083018561367e565b6152d860a0830184613d8a565b979650505050505050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f61533d602a83613df0565b9150615348826152e3565b604082019050919050565b5f6020820190508181035f83015261536a81615331565b9050919050565b5f6040820190506153845f8301856136fb565b61539160208301846136fb565b9392505050565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f5f8201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000602082015250565b5f6153f2603683613df0565b91506153fd82615398565b604082019050919050565b5f6020820190508181035f83015261541f816153e6565b9050919050565b5f6060820190506154395f8301866136fb565b61544660208301856136fb565b6154536040830184613498565b949350505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f6154b5602683613df0565b91506154c08261545b565b604082019050919050565b5f6020820190508181035f8301526154e2816154a9565b9050919050565b5f6154f3826142f8565b6154fd8185614749565b935061550d818560208601613fe4565b80840191505092915050565b5f61552482846154e9565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f615563601d83613df0565b915061556e8261552f565b602082019050919050565b5f6020820190508181035f83015261559081615557565b9050919050565b5f6155a182613fda565b6155ab8185613df0565b93506155bb818560208601613fe4565b6155c4816137cb565b840191505092915050565b5f6020820190508181035f8301526155e78184615597565b90509291505056fea2646970667358221220a8b97ddf370cb723016282196be486f5aa06e2377a5f32bc8731f57f78d0278764736f6c6343000818003300000000000000000000000067262a61c0a459fff172c22e60dbc730393bf790000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000b1a2bc2ec50000000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405260043610610245575f3560e01c8063870f856811610138578063bcf48070116100b5578063cb2df41811610079578063cb2df4181461082f578063e602ab8b1461086b578063eb1c834914610893578063f1c71cd4146108cf578063f2fde38b146108f7578063fd109d771461091f57610245565b8063bcf480701461074f578063c1733f6814610777578063c2d4f942146107b3578063c524e82e146107dd578063c5d419151461080757610245565b8063a103657e116100fc578063a103657e14610683578063a3156826146106af578063acd33f31146106d7578063b29a8140146106ff578063b74e68a51461072757610245565b8063870f8568146105b157806387b27a95146105d95780638da5cb5b1461060957806397abb762146106335780639c030fc01461065b57610245565b806357824338116101c65780637c678b161161018a5780637c678b16146104c757806380857ffa146104f157806380c746531461051e57806381b31abd1461054b57806382b0f7d01461058757610245565b8063578243381461040d5780635c975abb146104355780635f57ef2c1461045f578063715018a61461048757806373ae54b51461049d57610245565b80632b1429181161020d5780632b1429181461033d5780632fdd75bf1461036557806349deaf4f146103915780634a1db646146103bb57806351186e9e146103e557610245565b806305860c24146102495780630d426b00146102715780630d7777581461029d57806313345cf9146102d957806329c66e3814610301575b5f80fd5b348015610254575f80fd5b5061026f600480360381019061026a9190613376565b610947565b005b34801561027c575f80fd5b50610285610a50565b604051610294939291906133d5565b60405180910390f35b3480156102a8575f80fd5b506102c360048036038101906102be9190613464565b610a8e565b6040516102d091906134a7565b60405180910390f35b3480156102e4575f80fd5b506102ff60048036038101906102fa91906134fb565b610ad4565b005b34801561030c575f80fd5b5061032760048036038101906103229190613587565b610bed565b60405161033491906135d2565b60405180910390f35b348015610348575f80fd5b50610363600480360381019061035e9190613464565b610c4f565b005b348015610370575f80fd5b50610379610d08565b604051610388939291906133d5565b60405180910390f35b34801561039c575f80fd5b506103a5610d46565b6040516103b291906135d2565b60405180910390f35b3480156103c6575f80fd5b506103cf610d5d565b6040516103dc91906135d2565b60405180910390f35b3480156103f0575f80fd5b5061040b600480360381019061040691906135eb565b610d74565b005b348015610418575f80fd5b50610433600480360381019061042e9190613616565b610dd3565b005b348015610440575f80fd5b50610449610ea2565b604051610456919061368d565b60405180910390f35b34801561046a575f80fd5b50610485600480360381019061048091906136d0565b610eb7565b005b348015610492575f80fd5b5061049b610ede565b005b3480156104a8575f80fd5b506104b1610ef1565b6040516104be91906134a7565b60405180910390f35b3480156104d2575f80fd5b506104db610efa565b6040516104e8919061370a565b60405180910390f35b3480156104fc575f80fd5b50610505610f22565b6040516105159493929190613723565b60405180910390f35b348015610529575f80fd5b50610532610f40565b6040516105429493929190613784565b60405180910390f35b348015610556575f80fd5b50610571600480360381019061056c9190613464565b610f9e565b60405161057e919061370a565b60405180910390f35b348015610592575f80fd5b5061059b611003565b6040516105a891906135d2565b60405180910390f35b3480156105bc575f80fd5b506105d760048036038101906105d29190613376565b61101a565b005b6105f360048036038101906105ee9190613b1a565b611123565b604051610600919061370a565b60405180910390f35b348015610614575f80fd5b5061061d6114bf565b60405161062a919061370a565b60405180910390f35b34801561063e575f80fd5b5061065960048036038101906106549190613b8b565b6114e6565b005b348015610666575f80fd5b50610681600480360381019061067c9190613bc9565b61156d565b005b34801561068e575f80fd5b506106976115b6565b6040516106a6939291906133d5565b60405180910390f35b3480156106ba575f80fd5b506106d560048036038101906106d091906135eb565b6115f7565b005b3480156106e2575f80fd5b506106fd60048036038101906106f89190613bf4565b611656565b005b34801561070a575f80fd5b5061072560048036038101906107209190613b8b565b6116d5565b005b348015610732575f80fd5b5061074d60048036038101906107489190613c51565b611713565b005b34801561075a575f80fd5b5061077560048036038101906107709190613cdf565b61177a565b005b348015610782575f80fd5b5061079d60048036038101906107989190613d43565b611849565b6040516107aa919061370a565b60405180910390f35b3480156107be575f80fd5b506107c761188f565b6040516107d49190613d99565b60405180910390f35b3480156107e8575f80fd5b506107f16118b7565b6040516107fe91906135d2565b60405180910390f35b348015610812575f80fd5b5061082d60048036038101906108289190613376565b6118cd565b005b34801561083a575f80fd5b5061085560048036038101906108509190613587565b6119d9565b604051610862919061368d565b60405180910390f35b348015610876575f80fd5b50610891600480360381019061088c91906135eb565b611a0f565b005b34801561089e575f80fd5b506108b960048036038101906108b49190613464565b611a6d565b6040516108c691906135d2565b60405180910390f35b3480156108da575f80fd5b506108f560048036038101906108f091906135eb565b611ac0565b005b348015610902575f80fd5b5061091d60048036038101906109189190613464565b611b6c565b005b34801561092a575f80fd5b5061094560048036038101906109409190613db2565b611bee565b005b61094f611c75565b610dac8361ffff161115801561096b5750610dac8261ffff1611155b801561097d57506101f48161ffff1611155b6109bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b390613e4a565b60405180910390fd5b825f601a6101000a81548161ffff021916908361ffff160217905550815f601c6101000a81548161ffff021916908361ffff160217905550805f601e6101000a81548161ffff021916908361ffff1602179055507f8157027eb85fd89b2efb2911c47299c62a2f43927770288915a57ff5aa9aff78838383604051610a43939291906133d5565b60405180910390a1505050565b5f805f8060149054906101000a900461ffff165f60169054906101000a900461ffff165f60189054906101000a900461ffff16925092509250909192565b5f600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610adc611c75565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4190613eb2565b60405180910390fd5b610b735f8273ffffffffffffffffffffffffffffffffffffffff16611cf390919063ffffffff16565b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f3625e9e992e84551991603867426211da9c3e048e19eb2aac8e5f1bda7e5f92b81604051610be29190613d99565b60405180910390a150565b5f80600b8484604051610c01929190613efe565b90815260200160405180910390205f9054906101000a900461ffff1690505f8161ffff161115610c345780915050610c49565b600260149054906101000a900461ffff169150505b92915050565b610c57611c75565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbc90613f60565b60405180910390fd5b8060035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f805f80601a9054906101000a900461ffff165f601c9054906101000a900461ffff165f601e9054906101000a900461ffff16925092509250909192565b5f600160029054906101000a900461ffff16905090565b5f600260149054906101000a900461ffff16905090565b610d7c611c75565b80600260166101000a81548161ffff021916908361ffff1602179055507f0d5dfa7e3ffdf0daca1d63bd5ab5c65827be4c580153bef4544eb2512afa12bf81604051610dc891906135d2565b60405180910390a150565b610ddb611c75565b61271061ffff168161ffff161115610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f90613e4a565b60405180910390fd5b80600b8484604051610e3b929190613efe565b90815260200160405180910390205f6101000a81548161ffff021916908361ffff1602179055507fa9a9f157d989d2731dd74a16d2e9f7e9caacb51e0a7cd33b7ec6a1d3908f5520838383604051610e9593929190613faa565b60405180910390a1505050565b5f600f5f9054906101000a900460ff16905090565b610ebf611c75565b8015610ed257610ecd611de3565b610edb565b610eda611e45565b5b50565b610ee6611c75565b610eef5f611ea6565b565b5f600454905090565b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f805f80600554600654600754600854935093509350935090919293565b5f805f806001600c9054906101000a900463ffffffff16600160109054906101000a900463ffffffff16600160049054906101000a900463ffffffff16600160089054906101000a900463ffffffff16935093509350935090919293565b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f600260169054906101000a900461ffff16905090565b611022611c75565b610dac8361ffff161115801561103e57506107d08261ffff1611155b801561105057506103e88161ffff1611155b61108f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108690613e4a565b60405180910390fd5b825f60146101000a81548161ffff021916908361ffff160217905550815f60166101000a81548161ffff021916908361ffff160217905550805f60186101000a81548161ffff021916908361ffff1602179055507f5fa708f2b10f2c2a41a460fe7ec148a656813df1ea95b47e8161bc95166e5a92838383604051611116939291906133d5565b60405180910390a1505050565b5f61112c611f67565b5f3490505f73ffffffffffffffffffffffffffffffffffffffff16600a845f015160405161115a919061403c565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d59061409c565b60405180910390fd5b5f6111eb845f0151611fb1565b90505f6111f885836121e4565b90505f805f80611208858a61249c565b93509350935093505f8573ffffffffffffffffffffffffffffffffffffffff16633e4042286040518163ffffffff1660e01b8152600401602060405180830381865afa15801561125a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061127e91906140ce565b611288575f61128c565b6008545b84611297575f61129b565b6007545b866112a6575f6112aa565b6006545b6005546112b79190614126565b6112c19190614126565b6112cb9190614126565b90508183826112da9190614126565b6112e49190614126565b881015611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d906141a3565b60405180910390fd5b6113704760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611cf390919063ffffffff16565b8573ffffffffffffffffffffffffffffffffffffffff1663f519b7d386866040518363ffffffff1660e01b81526004016113ab9291906141c1565b5f604051808303815f87803b1580156113c2575f80fd5b505af11580156113d4573d5f803e3d5ffd5b505050507fd6f6c63246dd4d36ff9d157c9159371381ee8be9d1475eab442af8743fdab6568660025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661142461254b565b8973ffffffffffffffffffffffffffffffffffffffff1663b4b37bd26040518163ffffffff1660e01b8152600401602060405180830381865afa15801561146d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611491919061421b565b858f8d6040516114a7979695949392919061451f565b60405180910390a18598505050505050505050919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6114ee611c75565b80600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055507f4fe473bd5cc90e6c73cf11d29f6cc091faa692024afacfdb69bc9a9abebfb6188282604051611561929190614594565b60405180910390a15050565b611575611c75565b806004819055507fe818ff6972bf8970ca14a893539e57452588b197b76e6afe29c40a31b3363c61816040516115ab91906134a7565b60405180910390a150565b5f805f600260189054906101000a900461ffff166002601a9054906101000a900461ffff166002601c9054906101000a900461ffff16925092509250909192565b6115ff611c75565b80600160026101000a81548161ffff021916908361ffff1602179055507f269f7677f1796af445e0c26473b7cede0cdee7ee422179b8b7b1438344a73af38160405161164b91906135d2565b60405180910390a150565b61165e611c75565b80600c8484604051611671929190613efe565b90815260200160405180910390205f6101000a81548160ff0219169083151502179055507fc8729436e2f8fcb79ab0f757a04f56302b14f2f2c80b43f0caa626870ca115068383836040516116c8939291906145bb565b60405180910390a1505050565b6116dd611c75565b61170f6116e861254b565b828473ffffffffffffffffffffffffffffffffffffffff166125529092919063ffffffff16565b5050565b61171b611c75565b836005819055508260068190555081600781905550806008819055507f843719a8988f9a856dfa922ecd43b71c9dcfcedbd2d42f44fbf1ed39a93666068484848460405161176c9493929190613723565b60405180910390a150505050565b611782611c75565b836001600c6101000a81548163ffffffff021916908363ffffffff16021790555082600160106101000a81548163ffffffff021916908363ffffffff16021790555081600160046101000a81548163ffffffff021916908363ffffffff16021790555080600160086101000a81548163ffffffff021916908363ffffffff1602179055507fcac069ca087ac0dfda6b83c11d979488cb43699e375b64862130e9005b1c33e98484848460405161183b9493929190613784565b60405180910390a150505050565b5f600a8260405161185a919061403c565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60015f9054906101000a900461ffff16905090565b6118d5611c75565b610dac8361ffff16111580156118f15750610dac8261ffff1611155b801561190357506101f48161ffff1611155b611942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193990613e4a565b60405180910390fd5b82600260186101000a81548161ffff021916908361ffff160217905550816002601a6101000a81548161ffff021916908361ffff160217905550806002601c6101000a81548161ffff021916908361ffff1602179055507f29f254017ff4765c884ec3d1a19c84421b8afb55dc41de389a9869699b3a03858383836040516119cc939291906133d5565b60405180910390a1505050565b5f600c83836040516119ec929190613efe565b90815260200160405180910390205f9054906101000a900460ff16905092915050565b611a17611c75565b8060015f6101000a81548161ffff021916908361ffff1602179055507fa5d64adc4dabd69870f1a872d07b3d117150f1bfd0d046d7c35243f141fe081981604051611a6291906135d2565b60405180910390a150565b5f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff169050919050565b611ac8611c75565b61271061ffff168161ffff161115611b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0c90613e4a565b60405180910390fd5b80600260146101000a81548161ffff021916908361ffff1602179055507f39bbc533273be90b6ca32ee9b59e96795cf54c48c5388c9c00af1e509d2ffbb981604051611b6191906135d2565b60405180910390a150565b611b74611c75565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd99061465b565b60405180910390fd5b611beb81611ea6565b50565b611bf6611c75565b8060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b611c7d61254b565b73ffffffffffffffffffffffffffffffffffffffff16611c9b6114bf565b73ffffffffffffffffffffffffffffffffffffffff1614611cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce8906146c3565b60405180910390fd5b565b80471015611d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2d9061472b565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff1682604051611d5b90614776565b5f6040518083038185875af1925050503d805f8114611d95576040519150601f19603f3d011682016040523d82523d5f602084013e611d9a565b606091505b5050905080611dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd5906147fa565b60405180910390fd5b505050565b611deb611f67565b6001600f5f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611e2e61254b565b604051611e3b919061370a565b60405180910390a1565b611e4d6125d8565b5f600f5f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611e8f61254b565b604051611e9c919061370a565b60405180910390a1565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f6f610ea2565b15611faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa690614862565b60405180910390fd5b565b611fb96132a1565b611fc16132a1565b5f60149054906101000a900461ffff16815f019061ffff16908161ffff16815250505f60169054906101000a900461ffff16816020019061ffff16908161ffff16815250505f60189054906101000a900461ffff16816040019061ffff16908161ffff16815250505f601a9054906101000a900461ffff16816060019061ffff16908161ffff16815250505f601c9054906101000a900461ffff16816080019061ffff16908161ffff16815250505f601e9054906101000a900461ffff168160a0019061ffff16908161ffff168152505060015f9054906101000a900461ffff168160c0019061ffff16908161ffff1681525050600160029054906101000a900461ffff168160e0019061ffff16908161ffff1681525050600160049054906101000a900463ffffffff1681610100019063ffffffff16908163ffffffff1681525050600160089054906101000a900463ffffffff1681610120019063ffffffff16908163ffffffff16815250506001600c9054906101000a900463ffffffff1681610140019063ffffffff16908163ffffffff1681525050600c8360405161216a919061403c565b90815260200160405180910390205f9054906101000a900460ff166121a157600160109054906101000a900463ffffffff166121c3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b81610160019063ffffffff16908163ffffffff168152505080915050919050565b5f806121ee61254b565b90505f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff169050600260169054906101000a900461ffff1661ffff168161ffff1610612298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228f906148ca565b60405180910390fd5b806122a2906148e8565b905080600e5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548161ffff021916908361ffff1602179055506123088560a00151612621565b5f855f01514260405160200161231f929190614931565b6040516020818303038152906040528051906020012090505f865f015160405160200161234c919061403c565b6040516020818303038152906040528051906020012090505f3085898960405160200161237c9493929190614958565b60405160208183030381529060405290505f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d76fad238486856040518463ffffffff1660e01b81526004016123ec939291906149eb565b6020604051808303815f875af1158015612408573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061242c9190614a3b565b905080600a8a5f0151604051612442919061403c565b90815260200160405180910390205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080965050505050505092915050565b5f805f805f805f805f8960c001518060200190518101906124bd9190614a7a565b945094509450945094505f8211612509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250090614b3b565b60405180910390fd5b5f806125168d85896127d2565b915091505f8761252e5761252b8e8486612b88565b90505b868683839b509b509b509b50505050505050505092959194509250565b5f33905090565b6125d38363a9059cbb60e01b8484604051602401612571929190614594565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612e42565b505050565b6125e0610ea2565b61261f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261690614ba3565b60405180910390fd5b565b5f805f838060200190518101906126389190614be9565b96509650965050505050600260189054906101000a900461ffff1661ffff168361ffff161115801561268257506002601a9054906101000a900461ffff1661ffff168261ffff1611155b80156126a657506002601c9054906101000a900461ffff1661ffff168161ffff1611155b6126e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dc90614cd0565b60405180910390fd5b5f60015f9054906101000a900461ffff16905061271061ffff1661271061ffff16826127106127149190614cee565b61ffff1684876127249190614cee565b61ffff166127329190614d23565b61273c9190614d91565b1115801561278c575061271061ffff1661271061ffff16826127106127619190614cee565b61ffff1684866127719190614cee565b61ffff1661277f9190614d23565b6127899190614d91565b11155b6127cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c290614e0b565b60405180910390fd5b5050505050565b5f805f808673ffffffffffffffffffffffffffffffffffffffff16637196d1786040518163ffffffff1660e01b8152600401606060405180830381865afa15801561281f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128439190614e29565b50915091505f8290505f8873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612886919061370a565b602060405180830381865afa1580156128a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128c59190614e79565b90506128f282828b73ffffffffffffffffffffffffffffffffffffffff16612f089092919063ffffffff16565b600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054881015612972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296990614eee565b60405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a6e575f8273ffffffffffffffffffffffffffffffffffffffff1663f305d7198a8c855f808e6129e657306129ea565b61dead5b61012c426129f89190614126565b6040518863ffffffff1660e01b8152600401612a1996959493929190614f45565b60606040518083038185885af1158015612a35573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190612a5a9190614fa4565b925050508089965096505050505050612b80565b612aa2612a7961254b565b308a8673ffffffffffffffffffffffffffffffffffffffff16613053909392919063ffffffff16565b612acd82898573ffffffffffffffffffffffffffffffffffffffff16612f089092919063ffffffff16565b5f8273ffffffffffffffffffffffffffffffffffffffff1663e8e337008b86858d5f808f612afb5730612aff565b61dead5b61012c42612b0d9190614126565b6040518963ffffffff1660e01b8152600401612b30989796959493929190614ff4565b6060604051808303815f875af1158015612b4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b709190614fa4565b92505050805f9650965050505050505b935093915050565b5f600454821015612bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc5906150ba565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff16637196d1786040518163ffffffff1660e01b8152600401606060405180830381865afa158015612c19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c3d9190614e29565b92505091505f60095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790615122565b60405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff166390e1a0036040518163ffffffff1660e01b815260040161012060405180830381865afa158015612d5b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d7f9190615258565b5f01519050612daf82888573ffffffffffffffffffffffffffffffffffffffff16612f089092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff16638af416f682858a8a42612dda9190614126565b5f6001612de561254b565b6040518863ffffffff1660e01b8152600401612e0696959493929190615284565b5f604051808303818588803b158015612e1d575f80fd5b505af1158015612e2f573d5f803e3d5ffd5b5050505050809450505050509392505050565b5f612ea3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130dc9092919063ffffffff16565b90505f81511480612ec4575080806020019051810190612ec391906140ce565b5b612f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612efa90615353565b60405180910390fd5b505050565b5f811480612f8e57505f8373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401612f4d929190615371565b602060405180830381865afa158015612f68573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f8c9190614e79565b145b612fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc490615408565b60405180910390fd5b61304e8363095ea7b360e01b8484604051602401612fec929190614594565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612e42565b505050565b6130d6846323b872dd60e01b85858560405160240161307493929190615426565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612e42565b50505050565b60606130ea84845f856130f3565b90509392505050565b606082471015613138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312f906154cb565b60405180910390fd5b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516131609190615519565b5f6040518083038185875af1925050503d805f811461319a576040519150601f19603f3d011682016040523d82523d5f602084013e61319f565b606091505b50915091506131b0878383876131bc565b92505050949350505050565b6060831561321d575f835103613215576131d585613230565b613214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320b90615579565b60405180910390fd5b5b829050613228565b6132278383613252565b5b949350505050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f825111156132645781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329891906155cf565b60405180910390fd5b6040518061018001604052805f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f61ffff1681526020015f63ffffffff1681526020015f63ffffffff1681526020015f63ffffffff1681526020015f63ffffffff1681525090565b5f604051905090565b5f80fd5b5f80fd5b5f61ffff82169050919050565b6133558161333f565b811461335f575f80fd5b50565b5f813590506133708161334c565b92915050565b5f805f6060848603121561338d5761338c613337565b5b5f61339a86828701613362565b93505060206133ab86828701613362565b92505060406133bc86828701613362565b9150509250925092565b6133cf8161333f565b82525050565b5f6060820190506133e85f8301866133c6565b6133f560208301856133c6565b61340260408301846133c6565b949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6134338261340a565b9050919050565b61344381613429565b811461344d575f80fd5b50565b5f8135905061345e8161343a565b92915050565b5f6020828403121561347957613478613337565b5b5f61348684828501613450565b91505092915050565b5f819050919050565b6134a18161348f565b82525050565b5f6020820190506134ba5f830184613498565b92915050565b5f6134ca8261340a565b9050919050565b6134da816134c0565b81146134e4575f80fd5b50565b5f813590506134f5816134d1565b92915050565b5f602082840312156135105761350f613337565b5b5f61351d848285016134e7565b91505092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261354757613546613526565b5b8235905067ffffffffffffffff8111156135645761356361352a565b5b6020830191508360018202830111156135805761357f61352e565b5b9250929050565b5f806020838503121561359d5761359c613337565b5b5f83013567ffffffffffffffff8111156135ba576135b961333b565b5b6135c685828601613532565b92509250509250929050565b5f6020820190506135e55f8301846133c6565b92915050565b5f60208284031215613600576135ff613337565b5b5f61360d84828501613362565b91505092915050565b5f805f6040848603121561362d5761362c613337565b5b5f84013567ffffffffffffffff81111561364a5761364961333b565b5b61365686828701613532565b9350935050602061366986828701613362565b9150509250925092565b5f8115159050919050565b61368781613673565b82525050565b5f6020820190506136a05f83018461367e565b92915050565b6136af81613673565b81146136b9575f80fd5b50565b5f813590506136ca816136a6565b92915050565b5f602082840312156136e5576136e4613337565b5b5f6136f2848285016136bc565b91505092915050565b61370481613429565b82525050565b5f60208201905061371d5f8301846136fb565b92915050565b5f6080820190506137365f830187613498565b6137436020830186613498565b6137506040830185613498565b61375d6060830184613498565b95945050505050565b5f63ffffffff82169050919050565b61377e81613766565b82525050565b5f6080820190506137975f830187613775565b6137a46020830186613775565b6137b16040830185613775565b6137be6060830184613775565b95945050505050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613811826137cb565b810181811067ffffffffffffffff821117156138305761382f6137db565b5b80604052505050565b5f61384261332e565b905061384e8282613808565b919050565b5f80fd5b5f80fd5b5f67ffffffffffffffff821115613875576138746137db565b5b61387e826137cb565b9050602081019050919050565b828183375f83830152505050565b5f6138ab6138a68461385b565b613839565b9050828152602081018484840111156138c7576138c6613857565b5b6138d284828561388b565b509392505050565b5f82601f8301126138ee576138ed613526565b5b81356138fe848260208601613899565b91505092915050565b5f67ffffffffffffffff821115613921576139206137db565b5b61392a826137cb565b9050602081019050919050565b5f61394961394484613907565b613839565b90508281526020810184848401111561396557613964613857565b5b61397084828561388b565b509392505050565b5f82601f83011261398c5761398b613526565b5b813561399c848260208601613937565b91505092915050565b5f60e082840312156139ba576139b96137c7565b5b6139c460e0613839565b90505f82013567ffffffffffffffff8111156139e3576139e2613853565b5b6139ef848285016138da565b5f83015250602082013567ffffffffffffffff811115613a1257613a11613853565b5b613a1e848285016138da565b602083015250604082013567ffffffffffffffff811115613a4257613a41613853565b5b613a4e848285016138da565b604083015250606082013567ffffffffffffffff811115613a7257613a71613853565b5b613a7e84828501613978565b606083015250608082013567ffffffffffffffff811115613aa257613aa1613853565b5b613aae84828501613978565b60808301525060a082013567ffffffffffffffff811115613ad257613ad1613853565b5b613ade84828501613978565b60a08301525060c082013567ffffffffffffffff811115613b0257613b01613853565b5b613b0e84828501613978565b60c08301525092915050565b5f60208284031215613b2f57613b2e613337565b5b5f82013567ffffffffffffffff811115613b4c57613b4b61333b565b5b613b58848285016139a5565b91505092915050565b613b6a8161348f565b8114613b74575f80fd5b50565b5f81359050613b8581613b61565b92915050565b5f8060408385031215613ba157613ba0613337565b5b5f613bae85828601613450565b9250506020613bbf85828601613b77565b9150509250929050565b5f60208284031215613bde57613bdd613337565b5b5f613beb84828501613b77565b91505092915050565b5f805f60408486031215613c0b57613c0a613337565b5b5f84013567ffffffffffffffff811115613c2857613c2761333b565b5b613c3486828701613532565b93509350506020613c47868287016136bc565b9150509250925092565b5f805f8060808587031215613c6957613c68613337565b5b5f613c7687828801613b77565b9450506020613c8787828801613b77565b9350506040613c9887828801613b77565b9250506060613ca987828801613b77565b91505092959194509250565b613cbe81613766565b8114613cc8575f80fd5b50565b5f81359050613cd981613cb5565b92915050565b5f805f8060808587031215613cf757613cf6613337565b5b5f613d0487828801613ccb565b9450506020613d1587828801613ccb565b9350506040613d2687828801613ccb565b9250506060613d3787828801613ccb565b91505092959194509250565b5f60208284031215613d5857613d57613337565b5b5f82013567ffffffffffffffff811115613d7557613d7461333b565b5b613d81848285016138da565b91505092915050565b613d93816134c0565b82525050565b5f602082019050613dac5f830184613d8a565b92915050565b5f8060408385031215613dc857613dc7613337565b5b5f613dd585828601613450565b9250506020613de685828601613450565b9150509250929050565b5f82825260208201905092915050565b7f6f7574206f662072616e676500000000000000000000000000000000000000005f82015250565b5f613e34600c83613df0565b9150613e3f82613e00565b602082019050919050565b5f6020820190508181035f830152613e6181613e28565b9050919050565b7f696e76616c696420706179206163636f756e74000000000000000000000000005f82015250565b5f613e9c601383613df0565b9150613ea782613e68565b602082019050919050565b5f6020820190508181035f830152613ec981613e90565b9050919050565b5f81905092915050565b5f613ee58385613ed0565b9350613ef283858461388b565b82840190509392505050565b5f613f0a828486613eda565b91508190509392505050565b7f696e76616c6964206d616368696e6500000000000000000000000000000000005f82015250565b5f613f4a600f83613df0565b9150613f5582613f16565b602082019050919050565b5f6020820190508181035f830152613f7781613f3e565b9050919050565b5f613f898385613df0565b9350613f9683858461388b565b613f9f836137cb565b840190509392505050565b5f6040820190508181035f830152613fc3818587613f7e565b9050613fd260208301846133c6565b949350505050565b5f81519050919050565b5f5b83811015614001578082015181840152602081019050613fe6565b5f8484015250505050565b5f61401682613fda565b6140208185613ed0565b9350614030818560208601613fe4565b80840191505092915050565b5f614047828461400c565b915081905092915050565b7f6475706c696361746564207575696400000000000000000000000000000000005f82015250565b5f614086600f83613df0565b915061409182614052565b602082019050919050565b5f6020820190508181035f8301526140b38161407a565b9050919050565b5f815190506140c8816136a6565b92915050565b5f602082840312156140e3576140e2613337565b5b5f6140f0848285016140ba565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6141308261348f565b915061413b8361348f565b9250828201905080821115614153576141526140f9565b5b92915050565b7f696e73756666696369656e7420657468000000000000000000000000000000005f82015250565b5f61418d601083613df0565b915061419882614159565b602082019050919050565b5f6020820190508181035f8301526141ba81614181565b9050919050565b5f6040820190506141d45f83018561367e565b6141e1602083018461367e565b9392505050565b5f819050919050565b6141fa816141e8565b8114614204575f80fd5b50565b5f81519050614215816141f1565b92915050565b5f602082840312156142305761422f613337565b5b5f61423d84828501614207565b91505092915050565b5f819050919050565b5f61426961426461425f8461340a565b614246565b61340a565b9050919050565b5f61427a8261424f565b9050919050565b5f61428b82614270565b9050919050565b61429b81614281565b82525050565b6142aa816141e8565b82525050565b5f82825260208201905092915050565b5f6142ca82613fda565b6142d481856142b0565b93506142e4818560208601613fe4565b6142ed816137cb565b840191505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f61431c826142f8565b6143268185614302565b9350614336818560208601613fe4565b61433f816137cb565b840191505092915050565b5f60e083015f8301518482035f86015261436482826142c0565b9150506020830151848203602086015261437e82826142c0565b9150506040830151848203604086015261439882826142c0565b915050606083015184820360608601526143b28282614312565b915050608083015184820360808601526143cc8282614312565b91505060a083015184820360a08601526143e68282614312565b91505060c083015184820360c08601526144008282614312565b9150508091505092915050565b6144168161333f565b82525050565b61442581613766565b82525050565b61018082015f8201516144405f85018261440d565b506020820151614453602085018261440d565b506040820151614466604085018261440d565b506060820151614479606085018261440d565b50608082015161448c608085018261440d565b5060a082015161449f60a085018261440d565b5060c08201516144b260c085018261440d565b5060e08201516144c560e085018261440d565b506101008201516144da61010085018261441c565b506101208201516144ef61012085018261441c565b5061014082015161450461014085018261441c565b5061016082015161451961016085018261441c565b50505050565b5f610240820190506145335f83018a6136fb565b6145406020830189614292565b61454d60408301886136fb565b61455a60608301876142a1565b6145676080830186613498565b81810360a0830152614579818561434a565b905061458860c083018461442b565b98975050505050505050565b5f6040820190506145a75f8301856136fb565b6145b46020830184613498565b9392505050565b5f6040820190508181035f8301526145d4818587613f7e565b90506145e3602083018461367e565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f614645602683613df0565b9150614650826145eb565b604082019050919050565b5f6020820190508181035f83015261467281614639565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6146ad602083613df0565b91506146b882614679565b602082019050919050565b5f6020820190508181035f8301526146da816146a1565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e63650000005f82015250565b5f614715601d83613df0565b9150614720826146e1565b602082019050919050565b5f6020820190508181035f83015261474281614709565b9050919050565b5f81905092915050565b50565b5f6147615f83614749565b915061476c82614753565b5f82019050919050565b5f61478082614756565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c20725f8201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b5f6147e4603a83613df0565b91506147ef8261478a565b604082019050919050565b5f6020820190508181035f830152614811816147d8565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f61484c601083613df0565b915061485782614818565b602082019050919050565b5f6020820190508181035f83015261487981614840565b9050919050565b7f6f766572206c61756e63686564000000000000000000000000000000000000005f82015250565b5f6148b4600d83613df0565b91506148bf82614880565b602082019050919050565b5f6020820190508181035f8301526148e1816148a8565b9050919050565b5f6148f28261333f565b915061ffff8203614906576149056140f9565b5b600182019050919050565b5f819050919050565b61492b6149268261348f565b614911565b82525050565b5f61493c828561400c565b9150614948828461491a565b6020820191508190509392505050565b5f6101e08201905061496c5f8301876136fb565b61497960208301866136fb565b818103604083015261498b818561434a565b905061499a606083018461442b565b95945050505050565b5f82825260208201905092915050565b5f6149bd826142f8565b6149c781856149a3565b93506149d7818560208601613fe4565b6149e0816137cb565b840191505092915050565b5f6060820190506149fe5f8301866142a1565b614a0b60208301856142a1565b8181036040830152614a1d81846149b3565b9050949350505050565b5f81519050614a358161343a565b92915050565b5f60208284031215614a5057614a4f613337565b5b5f614a5d84828501614a27565b91505092915050565b5f81519050614a7481613b61565b92915050565b5f805f805f60a08688031215614a9357614a92613337565b5b5f614aa0888289016140ba565b9550506020614ab1888289016140ba565b9450506040614ac2888289016140ba565b9350506060614ad388828901614a66565b9250506080614ae488828901614a66565b9150509295509295909350565b7f696e76616c6964207061697220746f6b656e20616d6f756e74000000000000005f82015250565b5f614b25601983613df0565b9150614b3082614af1565b602082019050919050565b5f6020820190508181035f830152614b5281614b19565b9050919050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f614b8d601483613df0565b9150614b9882614b59565b602082019050919050565b5f6020820190508181035f830152614bba81614b81565b9050919050565b5f81519050614bcf816134d1565b92915050565b5f81519050614be38161334c565b92915050565b5f805f805f805f60e0888a031215614c0457614c03613337565b5b5f614c118a828b01614bc1565b9750506020614c228a828b01614bc1565b9650506040614c338a828b01614bc1565b9550506060614c448a828b01614bc1565b9450506080614c558a828b01614bd5565b93505060a0614c668a828b01614bd5565b92505060c0614c778a828b01614bd5565b91505092959891949750929550565b7f746f6f206d7563682074617800000000000000000000000000000000000000005f82015250565b5f614cba600c83613df0565b9150614cc582614c86565b602082019050919050565b5f6020820190508181035f830152614ce781614cae565b9050919050565b5f614cf88261333f565b9150614d038361333f565b9250828201905061ffff811115614d1d57614d1c6140f9565b5b92915050565b5f614d2d8261348f565b9150614d388361348f565b9250828202614d468161348f565b91508282048414831517614d5d57614d5c6140f9565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614d9b8261348f565b9150614da68361348f565b925082614db657614db5614d64565b5b828204905092915050565b7f746178206f7574206f662072616e6765000000000000000000000000000000005f82015250565b5f614df5601083613df0565b9150614e0082614dc1565b602082019050919050565b5f6020820190508181035f830152614e2281614de9565b9050919050565b5f805f60608486031215614e4057614e3f613337565b5b5f614e4d86828701614a27565b9350506020614e5e86828701614a27565b9250506040614e6f86828701614a27565b9150509250925092565b5f60208284031215614e8e57614e8d613337565b5b5f614e9b84828501614a66565b91505092915050565b7f746f6f20736d616c6c207061697220616d6f756e7400000000000000000000005f82015250565b5f614ed8601583613df0565b9150614ee382614ea4565b602082019050919050565b5f6020820190508181035f830152614f0581614ecc565b9050919050565b5f819050919050565b5f614f2f614f2a614f2584614f0c565b614246565b61348f565b9050919050565b614f3f81614f15565b82525050565b5f60c082019050614f585f8301896136fb565b614f656020830188613498565b614f726040830187614f36565b614f7f6060830186614f36565b614f8c60808301856136fb565b614f9960a0830184613498565b979650505050505050565b5f805f60608486031215614fbb57614fba613337565b5b5f614fc886828701614a66565b9350506020614fd986828701614a66565b9250506040614fea86828701614a66565b9150509250925092565b5f610100820190506150085f83018b6136fb565b615015602083018a6136fb565b6150226040830189613498565b61502f6060830188613498565b61503c6080830187614f36565b61504960a0830186614f36565b61505660c08301856136fb565b61506360e0830184613498565b9998505050505050505050565b7f746f6f2073686f7274206c6f636b0000000000000000000000000000000000005f82015250565b5f6150a4600e83613df0565b91506150af82615070565b602082019050919050565b5f6020820190508181035f8301526150d181615098565b9050919050565b7f756e737570706f727465642064657820666f72206c6f636b00000000000000005f82015250565b5f61510c601883613df0565b9150615117826150d8565b602082019050919050565b5f6020820190508181035f83015261513981615100565b9050919050565b5f61514a82613429565b9050919050565b61515a81615140565b8114615164575f80fd5b50565b5f8151905061517581615151565b92915050565b5f6101208284031215615191576151906137c7565b5b61519c610120613839565b90505f6151ab84828501614a66565b5f8301525060206151be84828501615167565b60208301525060406151d284828501614a66565b60408301525060606151e684828501614a66565b60608301525060806151fa84828501614a66565b60808301525060a061520e84828501614a66565b60a08301525060c061522284828501615167565b60c08301525060e061523684828501614a66565b60e08301525061010061524b84828501614a66565b6101008301525092915050565b5f610120828403121561526e5761526d613337565b5b5f61527b8482850161517b565b91505092915050565b5f60c0820190506152975f8301896136fb565b6152a46020830188613498565b6152b16040830187613498565b6152be6060830186613d8a565b6152cb608083018561367e565b6152d860a0830184613d8a565b979650505050505050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f61533d602a83613df0565b9150615348826152e3565b604082019050919050565b5f6020820190508181035f83015261536a81615331565b9050919050565b5f6040820190506153845f8301856136fb565b61539160208301846136fb565b9392505050565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f5f8201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000602082015250565b5f6153f2603683613df0565b91506153fd82615398565b604082019050919050565b5f6020820190508181035f83015261541f816153e6565b9050919050565b5f6060820190506154395f8301866136fb565b61544660208301856136fb565b6154536040830184613498565b949350505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f6154b5602683613df0565b91506154c08261545b565b604082019050919050565b5f6020820190508181035f8301526154e2816154a9565b9050919050565b5f6154f3826142f8565b6154fd8185614749565b935061550d818560208601613fe4565b80840191505092915050565b5f61552482846154e9565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f615563601d83613df0565b915061556e8261552f565b602082019050919050565b5f6020820190508181035f83015261559081615557565b9050919050565b5f6155a182613fda565b6155ab8185613df0565b93506155bb818560208601613fe4565b6155c4816137cb565b840191505092915050565b5f6020820190508181035f8301526155e78184615597565b90509291505056fea2646970667358221220a8b97ddf370cb723016282196be486f5aa06e2377a5f32bc8731f57f78d0278764736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000067262a61c0a459fff172c22e60dbc730393bf790000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000b1a2bc2ec50000000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : servicePayAccount_ (address): 0x67262A61c0A459Fff172c22E60DBC730393BF790
Arg [1] : launchFee_ (uint256): 100000000000000000
Arg [2] : delayedTradingFee_ (uint256): 50000000000000000
Arg [3] : tradingDisableFee_ (uint256): 100000000000000000
Arg [4] : antiDumpFee_ (uint256): 0
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000067262a61c0a459fff172c22e60dbc730393bf790
Arg [1] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [2] : 00000000000000000000000000000000000000000000000000b1a2bc2ec50000
Arg [3] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.