Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
HawkTtuuaahh
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2024-07-11
*/
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @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 value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
// File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.20;
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```solidity
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
*
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Storage of the initializable contract.
*
* It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions
* when using with upgradeable contracts.
*
* @custom:storage-location erc7201:openzeppelin.storage.Initializable
*/
struct InitializableStorage {
/**
* @dev Indicates that the contract has been initialized.
*/
uint64 _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool _initializing;
}
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;
/**
* @dev The contract is already initialized.
*/
error InvalidInitialization();
/**
* @dev The contract is not initializing.
*/
error NotInitializing();
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint64 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts.
*
* Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any
* number of times. This behavior in the constructor can be useful during testing and is not expected to be used in
* production.
*
* Emits an {Initialized} event.
*/
modifier initializer() {
// solhint-disable-next-line var-name-mixedcase
InitializableStorage storage $ = _getInitializableStorage();
// Cache values to avoid duplicated sloads
bool isTopLevelCall = !$._initializing;
uint64 initialized = $._initialized;
// Allowed calls:
// - initialSetup: the contract is not in the initializing state and no previous version was
// initialized
// - construction: the contract is initialized at version 1 (no reininitialization) and the
// current contract is just being deployed
bool initialSetup = initialized == 0 && isTopLevelCall;
bool construction = initialized == 1 && address(this).code.length == 0;
if (!initialSetup && !construction) {
revert InvalidInitialization();
}
$._initialized = 1;
if (isTopLevelCall) {
$._initializing = true;
}
_;
if (isTopLevelCall) {
$._initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* A reinitializer may be used after the original initialization step. This is essential to configure modules that
* are added through upgrades and that require initialization.
*
* When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
* cannot be nested. If one is invoked in the context of another, execution will revert.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*
* WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.
*
* Emits an {Initialized} event.
*/
modifier reinitializer(uint64 version) {
// solhint-disable-next-line var-name-mixedcase
InitializableStorage storage $ = _getInitializableStorage();
if ($._initializing || $._initialized >= version) {
revert InvalidInitialization();
}
$._initialized = version;
$._initializing = true;
_;
$._initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
_checkInitializing();
_;
}
/**
* @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.
*/
function _checkInitializing() internal view virtual {
if (!_isInitializing()) {
revert NotInitializing();
}
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*
* Emits an {Initialized} event the first time it is successfully executed.
*/
function _disableInitializers() internal virtual {
// solhint-disable-next-line var-name-mixedcase
InitializableStorage storage $ = _getInitializableStorage();
if ($._initializing) {
revert InvalidInitialization();
}
if ($._initialized != type(uint64).max) {
$._initialized = type(uint64).max;
emit Initialized(type(uint64).max);
}
}
/**
* @dev Returns the highest version that has been initialized. See {reinitializer}.
*/
function _getInitializedVersion() internal view returns (uint64) {
return _getInitializableStorage()._initialized;
}
/**
* @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
*/
function _isInitializing() internal view returns (bool) {
return _getInitializableStorage()._initializing;
}
/**
* @dev Returns a pointer to the storage namespace.
*/
// solhint-disable-next-line var-name-mixedcase
function _getInitializableStorage() private pure returns (InitializableStorage storage $) {
assembly {
$.slot := INITIALIZABLE_STORAGE
}
}
}
// File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard ERC20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}
// File: @openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*/
abstract contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20, IERC20Metadata, IERC20Errors {
/// @custom:storage-location erc7201:openzeppelin.storage.ERC20
struct ERC20Storage {
mapping(address account => uint256) _balances;
mapping(address account => mapping(address spender => uint256)) _allowances;
uint256 _totalSupply;
string _name;
string _symbol;
}
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC20")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant ERC20StorageLocation = 0x52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00;
function _getERC20Storage() private pure returns (ERC20Storage storage $) {
assembly {
$.slot := ERC20StorageLocation
}
}
/**
* @dev Sets the values for {name} and {symbol}.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing {
__ERC20_init_unchained(name_, symbol_);
}
function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {
ERC20Storage storage $ = _getERC20Storage();
$._name = name_;
$._symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
ERC20Storage storage $ = _getERC20Storage();
return $._name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
ERC20Storage storage $ = _getERC20Storage();
return $._symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual returns (uint256) {
ERC20Storage storage $ = _getERC20Storage();
return $._totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual returns (uint256) {
ERC20Storage storage $ = _getERC20Storage();
return $._balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `value`.
*/
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual returns (uint256) {
ERC20Storage storage $ = _getERC20Storage();
return $._allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `value`.
* - the caller must have allowance for ``from``'s tokens of at least
* `value`.
*/
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
return true;
}
/**
* @dev Moves a `value` amount of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _transfer(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value);
}
/**
* @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
* (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
* this function.
*
* Emits a {Transfer} event.
*/
function _update(address from, address to, uint256 value) internal virtual {
ERC20Storage storage $ = _getERC20Storage();
if (from == address(0)) {
// Overflow check required: The rest of the code assumes that totalSupply never overflows
$._totalSupply += value;
} else {
uint256 fromBalance = $._balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
// Overflow not possible: value <= fromBalance <= totalSupply.
$._balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
// Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
$._totalSupply -= value;
}
} else {
unchecked {
// Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
$._balances[to] += value;
}
}
emit Transfer(from, to, value);
}
/**
* @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
* Relies on the `_update` mechanism
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _mint(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(address(0), account, value);
}
/**
* @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
* Relies on the `_update` mechanism.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead
*/
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
/**
* @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
/**
* @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
*
* By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
* `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
* `Approval` event during `transferFrom` operations.
*
* Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
* true using the following override:
* ```
* function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
* super._approve(owner, spender, value, true);
* }
* ```
*
* Requirements are the same as {_approve}.
*/
function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
ERC20Storage storage $ = _getERC20Storage();
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
$._allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `value`.
*
* Does not update the allowance value in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Does not emit an {Approval} event.
*/
function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(spender, currentAllowance, value);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
}
// File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
/// @custom:storage-location erc7201:openzeppelin.storage.Ownable
struct OwnableStorage {
address _owner;
}
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Ownable")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300;
function _getOwnableStorage() private pure returns (OwnableStorage storage $) {
assembly {
$.slot := OwnableStorageLocation
}
}
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
function __Ownable_init(address initialOwner) internal onlyInitializing {
__Ownable_init_unchained(initialOwner);
}
function __Ownable_init_unchained(address initialOwner) internal onlyInitializing {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
OwnableStorage storage $ = _getOwnableStorage();
return $._owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
OwnableStorage storage $ = _getOwnableStorage();
address oldOwner = $._owner;
$._owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: @openzeppelin/contracts/interfaces/draft-IERC1822.sol
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC1822.sol)
pragma solidity ^0.8.20;
/**
* @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified
* proxy whose upgrades are fully controlled by the current implementation.
*/
interface IERC1822Proxiable {
/**
* @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation
* address.
*
* IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
* bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
* function revert if invoked through a proxy.
*/
function proxiableUUID() external view returns (bytes32);
}
// File: @openzeppelin/contracts/proxy/beacon/IBeacon.sol
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)
pragma solidity ^0.8.20;
/**
* @dev This is the interface that {BeaconProxy} expects of its beacon.
*/
interface IBeacon {
/**
* @dev Must return an address that can be used as a delegate call target.
*
* {UpgradeableBeacon} will check that this address is a contract.
*/
function implementation() external view returns (address);
}
// File: @openzeppelin/contracts/utils/Address.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)
pragma solidity ^0.8.20;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev The ETH balance of the account is not enough to perform the operation.
*/
error AddressInsufficientBalance(address account);
/**
* @dev There's no code at `target` (it is not a contract).
*/
error AddressEmptyCode(address target);
/**
* @dev A call to an address target failed. The target may have reverted.
*/
error FailedInnerCall();
/**
* @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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
if (address(this).balance < amount) {
revert AddressInsufficientBalance(address(this));
}
(bool success, ) = recipient.call{value: amount}("");
if (!success) {
revert FailedInnerCall();
}
}
/**
* @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 or custom error, it is bubbled
* up by this function (like regular Solidity function calls). However, if
* the call reverted with no returned reason, this function reverts with a
* {FailedInnerCall} error.
*
* 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.
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0);
}
/**
* @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`.
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
if (address(this).balance < value) {
revert AddressInsufficientBalance(address(this));
}
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
* was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
* unsuccessful call.
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata
) internal view returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
// only check if target is a contract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
if (returndata.length == 0 && target.code.length == 0) {
revert AddressEmptyCode(target);
}
return returndata;
}
}
/**
* @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
* revert reason or with a default {FailedInnerCall} error.
*/
function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
return returndata;
}
}
/**
* @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.
*/
function _revert(bytes memory returndata) 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 FailedInnerCall();
}
}
}
// File: @openzeppelin/contracts/utils/StorageSlot.sol
// OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol)
// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.
pragma solidity ^0.8.20;
/**
* @dev Library for reading and writing primitive types to specific storage slots.
*
* Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
* This library helps with reading and writing to such slots without the need for inline assembly.
*
* The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
*
* Example usage to set ERC1967 implementation slot:
* ```solidity
* contract ERC1967 {
* bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
*
* function _getImplementation() internal view returns (address) {
* return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
* }
*
* function _setImplementation(address newImplementation) internal {
* require(newImplementation.code.length > 0);
* StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
* }
* }
* ```
*/
library StorageSlot {
struct AddressSlot {
address value;
}
struct BooleanSlot {
bool value;
}
struct Bytes32Slot {
bytes32 value;
}
struct Uint256Slot {
uint256 value;
}
struct StringSlot {
string value;
}
struct BytesSlot {
bytes value;
}
/**
* @dev Returns an `AddressSlot` with member `value` located at `slot`.
*/
function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `BooleanSlot` with member `value` located at `slot`.
*/
function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
*/
function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `Uint256Slot` with member `value` located at `slot`.
*/
function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `StringSlot` with member `value` located at `slot`.
*/
function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `StringSlot` representation of the string storage pointer `store`.
*/
function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := store.slot
}
}
/**
* @dev Returns an `BytesSlot` with member `value` located at `slot`.
*/
function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.
*/
function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := store.slot
}
}
}
// File: @openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/ERC1967/ERC1967Utils.sol)
pragma solidity ^0.8.20;
/**
* @dev This abstract contract provides getters and event emitting update functions for
* https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
*/
library ERC1967Utils {
// We re-declare ERC-1967 events here because they can't be used directly from IERC1967.
// This will be fixed in Solidity 0.8.21. At that point we should remove these events.
/**
* @dev Emitted when the implementation is upgraded.
*/
event Upgraded(address indexed implementation);
/**
* @dev Emitted when the admin account has changed.
*/
event AdminChanged(address previousAdmin, address newAdmin);
/**
* @dev Emitted when the beacon is changed.
*/
event BeaconUpgraded(address indexed beacon);
/**
* @dev Storage slot with the address of the current implementation.
* This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1.
*/
// solhint-disable-next-line private-vars-leading-underscore
bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
/**
* @dev The `implementation` of the proxy is invalid.
*/
error ERC1967InvalidImplementation(address implementation);
/**
* @dev The `admin` of the proxy is invalid.
*/
error ERC1967InvalidAdmin(address admin);
/**
* @dev The `beacon` of the proxy is invalid.
*/
error ERC1967InvalidBeacon(address beacon);
/**
* @dev An upgrade function sees `msg.value > 0` that may be lost.
*/
error ERC1967NonPayable();
/**
* @dev Returns the current implementation address.
*/
function getImplementation() internal view returns (address) {
return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;
}
/**
* @dev Stores a new address in the EIP1967 implementation slot.
*/
function _setImplementation(address newImplementation) private {
if (newImplementation.code.length == 0) {
revert ERC1967InvalidImplementation(newImplementation);
}
StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;
}
/**
* @dev Performs implementation upgrade with additional setup call if data is nonempty.
* This function is payable only if the setup call is performed, otherwise `msg.value` is rejected
* to avoid stuck value in the contract.
*
* Emits an {IERC1967-Upgraded} event.
*/
function upgradeToAndCall(address newImplementation, bytes memory data) internal {
_setImplementation(newImplementation);
emit Upgraded(newImplementation);
if (data.length > 0) {
Address.functionDelegateCall(newImplementation, data);
} else {
_checkNonPayable();
}
}
/**
* @dev Storage slot with the admin of the contract.
* This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1.
*/
// solhint-disable-next-line private-vars-leading-underscore
bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
/**
* @dev Returns the current admin.
*
* TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using
* the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
* `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`
*/
function getAdmin() internal view returns (address) {
return StorageSlot.getAddressSlot(ADMIN_SLOT).value;
}
/**
* @dev Stores a new address in the EIP1967 admin slot.
*/
function _setAdmin(address newAdmin) private {
if (newAdmin == address(0)) {
revert ERC1967InvalidAdmin(address(0));
}
StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;
}
/**
* @dev Changes the admin of the proxy.
*
* Emits an {IERC1967-AdminChanged} event.
*/
function changeAdmin(address newAdmin) internal {
emit AdminChanged(getAdmin(), newAdmin);
_setAdmin(newAdmin);
}
/**
* @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.
* This is the keccak-256 hash of "eip1967.proxy.beacon" subtracted by 1.
*/
// solhint-disable-next-line private-vars-leading-underscore
bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
/**
* @dev Returns the current beacon.
*/
function getBeacon() internal view returns (address) {
return StorageSlot.getAddressSlot(BEACON_SLOT).value;
}
/**
* @dev Stores a new beacon in the EIP1967 beacon slot.
*/
function _setBeacon(address newBeacon) private {
if (newBeacon.code.length == 0) {
revert ERC1967InvalidBeacon(newBeacon);
}
StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;
address beaconImplementation = IBeacon(newBeacon).implementation();
if (beaconImplementation.code.length == 0) {
revert ERC1967InvalidImplementation(beaconImplementation);
}
}
/**
* @dev Change the beacon and trigger a setup call if data is nonempty.
* This function is payable only if the setup call is performed, otherwise `msg.value` is rejected
* to avoid stuck value in the contract.
*
* Emits an {IERC1967-BeaconUpgraded} event.
*
* CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since
* it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for
* efficiency.
*/
function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {
_setBeacon(newBeacon);
emit BeaconUpgraded(newBeacon);
if (data.length > 0) {
Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);
} else {
_checkNonPayable();
}
}
/**
* @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract
* if an upgrade doesn't perform an initialization call.
*/
function _checkNonPayable() private {
if (msg.value > 0) {
revert ERC1967NonPayable();
}
}
}
// File: @openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/UUPSUpgradeable.sol)
pragma solidity ^0.8.20;
/**
* @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an
* {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.
*
* A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is
* reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing
* `UUPSUpgradeable` with a custom implementation of upgrades.
*
* The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.
*/
abstract contract UUPSUpgradeable is Initializable, IERC1822Proxiable {
/// @custom:oz-upgrades-unsafe-allow state-variable-immutable
address private immutable __self = address(this);
/**
* @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgradeTo(address)`
* and `upgradeToAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called,
* while `upgradeToAndCall` will invoke the `receive` function if the second argument is the empty byte string.
* If the getter returns `"5.0.0"`, only `upgradeToAndCall(address,bytes)` is present, and the second argument must
* be the empty byte string if no function should be called, making it impossible to invoke the `receive` function
* during an upgrade.
*/
string public constant UPGRADE_INTERFACE_VERSION = "5.0.0";
/**
* @dev The call is from an unauthorized context.
*/
error UUPSUnauthorizedCallContext();
/**
* @dev The storage `slot` is unsupported as a UUID.
*/
error UUPSUnsupportedProxiableUUID(bytes32 slot);
/**
* @dev Check that the execution is being performed through a delegatecall call and that the execution context is
* a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case
* for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a
* function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to
* fail.
*/
modifier onlyProxy() {
_checkProxy();
_;
}
/**
* @dev Check that the execution is not being performed through a delegate call. This allows a function to be
* callable on the implementing contract but not through proxies.
*/
modifier notDelegated() {
_checkNotDelegated();
_;
}
function __UUPSUpgradeable_init() internal onlyInitializing {
}
function __UUPSUpgradeable_init_unchained() internal onlyInitializing {
}
/**
* @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the
* implementation. It is used to validate the implementation's compatibility when performing an upgrade.
*
* IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
* bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
* function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.
*/
function proxiableUUID() external view virtual notDelegated returns (bytes32) {
return ERC1967Utils.IMPLEMENTATION_SLOT;
}
/**
* @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call
* encoded in `data`.
*
* Calls {_authorizeUpgrade}.
*
* Emits an {Upgraded} event.
*
* @custom:oz-upgrades-unsafe-allow-reachable delegatecall
*/
function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {
_authorizeUpgrade(newImplementation);
_upgradeToAndCallUUPS(newImplementation, data);
}
/**
* @dev Reverts if the execution is not performed via delegatecall or the execution
* context is not of a proxy with an ERC1967-compliant implementation pointing to self.
* See {_onlyProxy}.
*/
function _checkProxy() internal view virtual {
if (
address(this) == __self || // Must be called through delegatecall
ERC1967Utils.getImplementation() != __self // Must be called through an active proxy
) {
revert UUPSUnauthorizedCallContext();
}
}
/**
* @dev Reverts if the execution is performed via delegatecall.
* See {notDelegated}.
*/
function _checkNotDelegated() internal view virtual {
if (address(this) != __self) {
// Must not be called through delegatecall
revert UUPSUnauthorizedCallContext();
}
}
/**
* @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by
* {upgradeToAndCall}.
*
* Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.
*
* ```solidity
* function _authorizeUpgrade(address) internal onlyOwner {}
* ```
*/
function _authorizeUpgrade(address newImplementation) internal virtual;
/**
* @dev Performs an implementation upgrade with a security check for UUPS proxies, and additional setup call.
*
* As a security check, {proxiableUUID} is invoked in the new implementation, and the return value
* is expected to be the implementation slot in ERC1967.
*
* Emits an {IERC1967-Upgraded} event.
*/
function _upgradeToAndCallUUPS(address newImplementation, bytes memory data) private {
try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {
if (slot != ERC1967Utils.IMPLEMENTATION_SLOT) {
revert UUPSUnsupportedProxiableUUID(slot);
}
ERC1967Utils.upgradeToAndCall(newImplementation, data);
} catch {
// The implementation is not UUPS
revert ERC1967Utils.ERC1967InvalidImplementation(newImplementation);
}
}
}
// File: Token.sol
pragma solidity ^0.8.20;
interface IUniswapV2Factory {
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IUniswapV2Router02 {
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}
contract HawkTtuuaahh is Initializable, ERC20Upgradeable, OwnableUpgradeable, UUPSUpgradeable {
address public marketingWallet;
uint256 public taxRate; // tax rate in basis points (1% = 100 basis points)
uint256 public reflectionRate; // reflection rate in basis points
uint256 public maxWalletPercentage; // max wallet holding percentage in basis points (3% = 300 basis points)
uint256 public maxWalletAmount; // max wallet holding amount
mapping(address => uint256) private _reflectedBalances;
mapping(address => bool) private _isExcludedFromFees;
mapping(address => bool) private _whitelistedForLiquidity;
address[] private allHolders;
mapping(address => bool) private holderExists;
IUniswapV2Router02 public uniswapV2Router;
address public uniswapV2Pair;
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() {
_disableInitializers();
}
function initialize(address initialOwner, address _marketingWallet) initializer public {
__ERC20_init("Hawk Ttuuaahh", "Spit");
__Ownable_init(initialOwner);
_transferOwnership(initialOwner);
__UUPSUpgradeable_init();
marketingWallet = _marketingWallet;
taxRate = 100; // 1% tax
reflectionRate = 200; // 2% reflection
maxWalletPercentage = 300; // 3% max per wallet
_mint(initialOwner, 420_000_000_000_000 * 10 ** decimals());
_updateMaxWalletAmount();
_isExcludedFromFees[msg.sender] = true;
uniswapV2Router = IUniswapV2Router02(0xC532a74256D3Db42D0Bf7a0400fEFDbad7694008);
uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
}
function burn(uint256 amount) public {
_burn(msg.sender, amount);
_updateMaxWalletAmount();
}
function burnFrom(address account, uint256 amount) public {
uint256 currentAllowance = allowance(account, msg.sender);
require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
_approve(account, msg.sender, currentAllowance - amount);
_burn(account, amount);
_updateMaxWalletAmount();
}
function _transfer(address sender, address recipient, uint256 amount) internal virtual override {
uint256 taxAmount = (amount * taxRate) / 10000;
uint256 reflectionAmount = (amount * reflectionRate) / 10000;
uint256 netAmount = amount - taxAmount - reflectionAmount;
if (recipient != uniswapV2Pair || recipient !=owner()) {
require(balanceOf(recipient) + netAmount <= maxWalletAmount, "ERC20: transfer amount exceeds the max wallet size");
}
if (!_isExcludedFromFees[sender] && !_isExcludedFromFees[recipient]) {
super._transfer(sender, marketingWallet, taxAmount);
_reflectTokens(sender, reflectionAmount);
}
super._transfer(sender, recipient, netAmount);
_addHolder(recipient);
}
function _reflectTokens(address sender, uint256 reflectionAmount) private {
for (uint256 i = 0; i < allHolders.length; i++) {
address holder = allHolders[i];
if (holder != sender) {
uint256 holderShare = (reflectionAmount * balanceOf(holder)) / totalSupply();
_reflectedBalances[holder] += holderShare;
}
}
}
function _addHolder(address holder) private {
if (!holderExists[holder]) {
allHolders.push(holder);
holderExists[holder] = true;
}
}
function setMarketingWallet(address _marketingWallet) external onlyOwner {
marketingWallet = _marketingWallet;
}
function setTaxRate(uint256 _taxRate) external onlyOwner {
require(_taxRate <= 1000, "Tax rate too high"); // max 10%
taxRate = _taxRate;
}
function setReflectionRate(uint256 _reflectionRate) external onlyOwner {
require(_reflectionRate <= 500, "Reflection rate too high"); // max 5%
reflectionRate = _reflectionRate;
}
function setMaxWalletPercentage(uint256 _maxWalletPercentage) external onlyOwner {
require(_maxWalletPercentage <= 1000, "Max wallet percentage too high"); // max 10%
maxWalletPercentage = _maxWalletPercentage;
_updateMaxWalletAmount();
}
function _updateMaxWalletAmount() internal {
maxWalletAmount = (totalSupply() * maxWalletPercentage) / 10000;
}
function _authorizeUpgrade(address newImplementation) internal onlyOwner override {}
// To include or exclude addresses from fees
function excludeFromFees(address account, bool excluded) public onlyOwner {
_isExcludedFromFees[account] = excluded;
}
// To get the reflection balance of an account
function reflectionBalanceOf(address account) public view returns (uint256) {
return _reflectedBalances[account];
}
// Whitelist an address for liquidity management
function whitelistForLiquidity(address account, bool whitelisted) external onlyOwner {
_whitelistedForLiquidity[account] = whitelisted;
}
// To check if an address is whitelisted for liquidity management
function isWhitelistedForLiquidity(address account) public view returns (bool) {
return _whitelistedForLiquidity[account];
}
}Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"address","name":"_marketingWallet","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelistedForLiquidity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"reflectionBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletPercentage","type":"uint256"}],"name":"setMaxWalletPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reflectionRate","type":"uint256"}],"name":"setReflectionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxRate","type":"uint256"}],"name":"setTaxRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"whitelisted","type":"bool"}],"name":"whitelistForLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250348015610042575f80fd5b5061005161005660201b60201c565b6101b6565b5f61006561015460201b60201c565b9050805f0160089054906101000a900460ff16156100af576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff16146101515767ffffffffffffffff815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d267ffffffffffffffff604051610148919061019d565b60405180910390a15b50565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b5f67ffffffffffffffff82169050919050565b6101978161017b565b82525050565b5f6020820190506101b05f83018461018e565b92915050565b6080516137e36101dc5f395f81816119e001528181611a350152611bef01526137e35ff3fe6080604052600436106101ed575f3560e01c8063715018a61161010c57806395d89b411161009f578063ad3cb1cc1161006e578063ad3cb1cc146106c5578063c0246668146106ef578063c6d69a3014610717578063dd62ed3e1461073f578063f2fde38b1461077b576101ed565b806395d89b41146105f9578063a39c850014610623578063a9059cbb1461065f578063aa4bde281461069b576101ed565b806379f476eb116100db57806379f476eb146105435780637a845ece1461056b57806384aa9fb6146105935780638da5cb5b146105cf576101ed565b8063715018a6146104b157806375f0a874146104c7578063771a3a1d146104f157806379cc67901461051b576101ed565b806349bd5a5e11610184578063599ca39711610153578063599ca397146103fb5780635d098b381461042557806367f3aa401461044d57806370a0823114610475576101ed565b806349bd5a5e146103615780634f1ef2861461038b57806352d1902d146103a7578063542aa229146103d1576101ed565b806323b872dd116101c057806323b872dd146102ab578063313ce567146102e757806342966c6814610311578063485cc95514610339576101ed565b806306fdde03146101f1578063095ea7b31461021b5780631694505e1461025757806318160ddd14610281575b5f80fd5b3480156101fc575f80fd5b506102056107a3565b60405161021291906128e9565b60405180910390f35b348015610226575f80fd5b50610241600480360381019061023c91906129a7565b610841565b60405161024e91906129ff565b60405180910390f35b348015610262575f80fd5b5061026b610863565b6040516102789190612a73565b60405180910390f35b34801561028c575f80fd5b50610295610888565b6040516102a29190612a9b565b60405180910390f35b3480156102b6575f80fd5b506102d160048036038101906102cc9190612ab4565b61089f565b6040516102de91906129ff565b60405180910390f35b3480156102f2575f80fd5b506102fb6108cd565b6040516103089190612b1f565b60405180910390f35b34801561031c575f80fd5b5061033760048036038101906103329190612b38565b6108d5565b005b348015610344575f80fd5b5061035f600480360381019061035a9190612b63565b6108ea565b005b34801561036c575f80fd5b50610375610dfd565b6040516103829190612bb0565b60405180910390f35b6103a560048036038101906103a09190612cf5565b610e22565b005b3480156103b2575f80fd5b506103bb610e41565b6040516103c89190612d67565b60405180910390f35b3480156103dc575f80fd5b506103e5610e72565b6040516103f29190612a9b565b60405180910390f35b348015610406575f80fd5b5061040f610e78565b60405161041c9190612a9b565b60405180910390f35b348015610430575f80fd5b5061044b60048036038101906104469190612d80565b610e7e565b005b348015610458575f80fd5b50610473600480360381019061046e9190612b38565b610ec8565b005b348015610480575f80fd5b5061049b60048036038101906104969190612d80565b610f1f565b6040516104a89190612a9b565b60405180910390f35b3480156104bc575f80fd5b506104c5610f72565b005b3480156104d2575f80fd5b506104db610f85565b6040516104e89190612bb0565b60405180910390f35b3480156104fc575f80fd5b50610505610fa8565b6040516105129190612a9b565b60405180910390f35b348015610526575f80fd5b50610541600480360381019061053c91906129a7565b610fae565b005b34801561054e575f80fd5b5061056960048036038101906105649190612dd5565b61102b565b005b348015610576575f80fd5b50610591600480360381019061058c9190612b38565b61108b565b005b34801561059e575f80fd5b506105b960048036038101906105b49190612d80565b6110ea565b6040516105c69190612a9b565b60405180910390f35b3480156105da575f80fd5b506105e3611130565b6040516105f09190612bb0565b60405180910390f35b348015610604575f80fd5b5061060d611165565b60405161061a91906128e9565b60405180910390f35b34801561062e575f80fd5b5061064960048036038101906106449190612d80565b611203565b60405161065691906129ff565b60405180910390f35b34801561066a575f80fd5b50610685600480360381019061068091906129a7565b611255565b60405161069291906129ff565b60405180910390f35b3480156106a6575f80fd5b506106af611277565b6040516106bc9190612a9b565b60405180910390f35b3480156106d0575f80fd5b506106d961127d565b6040516106e691906128e9565b60405180910390f35b3480156106fa575f80fd5b5061071560048036038101906107109190612dd5565b6112b6565b005b348015610722575f80fd5b5061073d60048036038101906107389190612b38565b611316565b005b34801561074a575f80fd5b5061076560048036038101906107609190612b63565b61136d565b6040516107729190612a9b565b60405180910390f35b348015610786575f80fd5b506107a1600480360381019061079c9190612d80565b6113fd565b005b60605f6107ae611481565b90508060030180546107bf90612e40565b80601f01602080910402602001604051908101604052809291908181526020018280546107eb90612e40565b80156108365780601f1061080d57610100808354040283529160200191610836565b820191905f5260205f20905b81548152906001019060200180831161081957829003601f168201915b505050505091505090565b5f8061084b6114a8565b90506108588185856114af565b600191505092915050565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80610892611481565b9050806002015491505090565b5f806108a96114a8565b90506108b68582856114c1565b6108c1858585611553565b60019150509392505050565b5f6012905090565b6108df338261178a565b6108e7611809565b50565b5f6108f3611833565b90505f815f0160089054906101000a900460ff161590505f825f015f9054906101000a900467ffffffffffffffff1690505f808267ffffffffffffffff1614801561093b5750825b90505f60018367ffffffffffffffff1614801561096e57505f3073ffffffffffffffffffffffffffffffffffffffff163b145b90508115801561097c575080155b156109b3576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001855f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508315610a00576001855f0160086101000a81548160ff0219169083151502179055505b610a746040518060400160405280600d81526020017f4861776b205474757561616868000000000000000000000000000000000000008152506040518060400160405280600481526020017f537069740000000000000000000000000000000000000000000000000000000081525061185a565b610a7d87611870565b610a8687611884565b610a8e611955565b855f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606460018190555060c860028190555061012c600381905550610b1587610af26108cd565b600a610afe9190612fcc565b66017dfcdece4000610b109190613016565b61195f565b610b1d611809565b600160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555073c532a74256d3db42d0bf7a0400fefdbad7694008600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c54919061306b565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cfe919061306b565b6040518363ffffffff1660e01b8152600401610d1b929190613096565b6020604051808303815f875af1158015610d37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5b919061306b565b600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508315610df4575f855f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d26001604051610deb9190613109565b60405180910390a15b50505050505050565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e2a6119de565b610e3382611ac4565b610e3d8282611acf565b5050565b5f610e4a611bed565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b60025481565b60035481565b610e86611c74565b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610ed0611c74565b6101f4811115610f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0c9061316c565b60405180910390fd5b8060028190555050565b5f80610f29611481565b9050805f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054915050919050565b610f7a611c74565b610f835f611884565b565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015481565b5f610fb9833361136d565b905081811015610ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff5906131fa565b60405180910390fd5b6110148333848461100f9190613218565b6114af565b61101e838361178a565b611026611809565b505050565b611033611c74565b8060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b611093611c74565b6103e88111156110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf90613295565b60405180910390fd5b806003819055506110e7611809565b50565b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f8061113a611cfb565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b60605f611170611481565b905080600401805461118190612e40565b80601f01602080910402602001604051908101604052809291908181526020018280546111ad90612e40565b80156111f85780601f106111cf576101008083540402835291602001916111f8565b820191905f5260205f20905b8154815290600101906020018083116111db57829003601f168201915b505050505091505090565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f8061125f6114a8565b905061126c818585611553565b600191505092915050565b60045481565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6112be611c74565b8060065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b61131e611c74565b6103e8811115611363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135a906132fd565b60405180910390fd5b8060018190555050565b5f80611377611481565b9050806001015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205491505092915050565b611405611c74565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611475575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161146c9190612bb0565b60405180910390fd5b61147e81611884565b50565b5f7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00905090565b5f33905090565b6114bc8383836001611d22565b505050565b5f6114cc848461136d565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461154d578181101561153e578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016115359392919061331b565b60405180910390fd5b61154c84848484035f611d22565b5b50505050565b5f612710600154836115659190613016565b61156f919061337d565b90505f612710600254846115839190613016565b61158d919061337d565b90505f81838561159d9190613218565b6115a79190613218565b9050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415806116385750611608611130565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15611696576004548161164a87610f1f565b61165491906133ad565b1115611695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168c90613450565b60405180910390fd5b5b60065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015611734575060065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561176e57611763865f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685611eff565b61176d8683611fef565b5b611779868683611eff565b61178285612101565b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117fa575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016117f19190612bb0565b60405180910390fd5b611805825f83612208565b5050565b612710600354611817610888565b6118219190613016565b61182b919061337d565b600481905550565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b611862612437565b61186c8282612477565b5050565b611878612437565b611881816124b3565b50565b5f61188d611cfb565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b61195d612437565b565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119cf575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016119c69190612bb0565b60405180910390fd5b6119da5f8383612208565b5050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480611a8b57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611a72612537565b73ffffffffffffffffffffffffffffffffffffffff1614155b15611ac2576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b611acc611c74565b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611b3757506040513d601f19601f82011682018060405250810190611b349190613498565b60015b611b7857816040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401611b6f9190612bb0565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b8114611bde57806040517faa1d49a4000000000000000000000000000000000000000000000000000000008152600401611bd59190612d67565b60405180910390fd5b611be8838361258a565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614611c72576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b611c7c6114a8565b73ffffffffffffffffffffffffffffffffffffffff16611c9a611130565b73ffffffffffffffffffffffffffffffffffffffff1614611cf957611cbd6114a8565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611cf09190612bb0565b60405180910390fd5b565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b5f611d2b611481565b90505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611d9d575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611d949190612bb0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611e0d575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611e049190612bb0565b60405180910390fd5b82816001015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508115611ef8578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051611eef9190612a9b565b60405180910390a35b5050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f6f575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611f669190612bb0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fdf575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611fd69190612bb0565b60405180910390fd5b611fea838383612208565b505050565b5f5b6008805490508110156120fc575f60088281548110612013576120126134c3565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146120ee575f612079610888565b61208283610f1f565b8561208d9190613016565b612097919061337d565b90508060055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546120e591906133ad565b92505081905550505b508080600101915050611ff1565b505050565b60095f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661220557600881908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b50565b5f612211611481565b90505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036122655781816002015f82825461225991906133ad565b92505081905550612337565b5f815f015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050828110156122f0578481846040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016122e79392919061331b565b60405180910390fd5b828103825f015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123805781816002015f82825403925050819055506123cc565b81815f015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516124299190612a9b565b60405180910390a350505050565b61243f6125fc565b612475576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b61247f612437565b5f612488611481565b90508281600301908161249b9190613684565b50818160040190816124ad9190613684565b50505050565b6124bb612437565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361252b575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016125229190612bb0565b60405180910390fd5b61253481611884565b50565b5f6125637f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b61261a565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61259382612623565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f815111156125ef576125e982826126ec565b506125f8565b6125f761276c565b5b5050565b5f612605611833565b5f0160089054906101000a900460ff16905090565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b0361267e57806040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016126759190612bb0565b60405180910390fd5b806126aa7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b61261a565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff16846040516127159190613797565b5f60405180830381855af49150503d805f811461274d576040519150601f19603f3d011682016040523d82523d5f602084013e612752565b606091505b50915091506127628583836127a8565b9250505092915050565b5f3411156127a6576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6060826127bd576127b882612835565b61282d565b5f82511480156127e357505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561282557836040517f9996b31500000000000000000000000000000000000000000000000000000000815260040161281c9190612bb0565b60405180910390fd5b81905061282e565b5b9392505050565b5f815111156128475780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6128bb82612879565b6128c58185612883565b93506128d5818560208601612893565b6128de816128a1565b840191505092915050565b5f6020820190508181035f83015261290181846128b1565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6129438261291a565b9050919050565b61295381612939565b811461295d575f80fd5b50565b5f8135905061296e8161294a565b92915050565b5f819050919050565b61298681612974565b8114612990575f80fd5b50565b5f813590506129a18161297d565b92915050565b5f80604083850312156129bd576129bc612912565b5b5f6129ca85828601612960565b92505060206129db85828601612993565b9150509250929050565b5f8115159050919050565b6129f9816129e5565b82525050565b5f602082019050612a125f8301846129f0565b92915050565b5f819050919050565b5f612a3b612a36612a318461291a565b612a18565b61291a565b9050919050565b5f612a4c82612a21565b9050919050565b5f612a5d82612a42565b9050919050565b612a6d81612a53565b82525050565b5f602082019050612a865f830184612a64565b92915050565b612a9581612974565b82525050565b5f602082019050612aae5f830184612a8c565b92915050565b5f805f60608486031215612acb57612aca612912565b5b5f612ad886828701612960565b9350506020612ae986828701612960565b9250506040612afa86828701612993565b9150509250925092565b5f60ff82169050919050565b612b1981612b04565b82525050565b5f602082019050612b325f830184612b10565b92915050565b5f60208284031215612b4d57612b4c612912565b5b5f612b5a84828501612993565b91505092915050565b5f8060408385031215612b7957612b78612912565b5b5f612b8685828601612960565b9250506020612b9785828601612960565b9150509250929050565b612baa81612939565b82525050565b5f602082019050612bc35f830184612ba1565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612c07826128a1565b810181811067ffffffffffffffff82111715612c2657612c25612bd1565b5b80604052505050565b5f612c38612909565b9050612c448282612bfe565b919050565b5f67ffffffffffffffff821115612c6357612c62612bd1565b5b612c6c826128a1565b9050602081019050919050565b828183375f83830152505050565b5f612c99612c9484612c49565b612c2f565b905082815260208101848484011115612cb557612cb4612bcd565b5b612cc0848285612c79565b509392505050565b5f82601f830112612cdc57612cdb612bc9565b5b8135612cec848260208601612c87565b91505092915050565b5f8060408385031215612d0b57612d0a612912565b5b5f612d1885828601612960565b925050602083013567ffffffffffffffff811115612d3957612d38612916565b5b612d4585828601612cc8565b9150509250929050565b5f819050919050565b612d6181612d4f565b82525050565b5f602082019050612d7a5f830184612d58565b92915050565b5f60208284031215612d9557612d94612912565b5b5f612da284828501612960565b91505092915050565b612db4816129e5565b8114612dbe575f80fd5b50565b5f81359050612dcf81612dab565b92915050565b5f8060408385031215612deb57612dea612912565b5b5f612df885828601612960565b9250506020612e0985828601612dc1565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612e5757607f821691505b602082108103612e6a57612e69612e13565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b6001851115612ef257808604811115612ece57612ecd612e70565b5b6001851615612edd5780820291505b8081029050612eeb85612e9d565b9450612eb2565b94509492505050565b5f82612f0a5760019050612fc5565b81612f17575f9050612fc5565b8160018114612f2d5760028114612f3757612f66565b6001915050612fc5565b60ff841115612f4957612f48612e70565b5b8360020a915084821115612f6057612f5f612e70565b5b50612fc5565b5060208310610133831016604e8410600b8410161715612f9b5782820a905083811115612f9657612f95612e70565b5b612fc5565b612fa88484846001612ea9565b92509050818404811115612fbf57612fbe612e70565b5b81810290505b9392505050565b5f612fd682612974565b9150612fe183612b04565b925061300e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612efb565b905092915050565b5f61302082612974565b915061302b83612974565b925082820261303981612974565b915082820484148315176130505761304f612e70565b5b5092915050565b5f815190506130658161294a565b92915050565b5f602082840312156130805761307f612912565b5b5f61308d84828501613057565b91505092915050565b5f6040820190506130a95f830185612ba1565b6130b66020830184612ba1565b9392505050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f6130f36130ee6130e9846130bd565b612a18565b6130c6565b9050919050565b613103816130d9565b82525050565b5f60208201905061311c5f8301846130fa565b92915050565b7f5265666c656374696f6e207261746520746f6f206869676800000000000000005f82015250565b5f613156601883612883565b915061316182613122565b602082019050919050565b5f6020820190508181035f8301526131838161314a565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f775f8201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b5f6131e4602483612883565b91506131ef8261318a565b604082019050919050565b5f6020820190508181035f830152613211816131d8565b9050919050565b5f61322282612974565b915061322d83612974565b925082820390508181111561324557613244612e70565b5b92915050565b7f4d61782077616c6c65742070657263656e7461676520746f6f206869676800005f82015250565b5f61327f601e83612883565b915061328a8261324b565b602082019050919050565b5f6020820190508181035f8301526132ac81613273565b9050919050565b7f546178207261746520746f6f20686967680000000000000000000000000000005f82015250565b5f6132e7601183612883565b91506132f2826132b3565b602082019050919050565b5f6020820190508181035f830152613314816132db565b9050919050565b5f60608201905061332e5f830186612ba1565b61333b6020830185612a8c565b6133486040830184612a8c565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61338782612974565b915061339283612974565b9250826133a2576133a1613350565b5b828204905092915050565b5f6133b782612974565b91506133c283612974565b92508282019050808211156133da576133d9612e70565b5b92915050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320745f8201527f6865206d61782077616c6c65742073697a650000000000000000000000000000602082015250565b5f61343a603283612883565b9150613445826133e0565b604082019050919050565b5f6020820190508181035f8301526134678161342e565b9050919050565b61347781612d4f565b8114613481575f80fd5b50565b5f815190506134928161346e565b92915050565b5f602082840312156134ad576134ac612912565b5b5f6134ba84828501613484565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261354c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613511565b6135568683613511565b95508019841693508086168417925050509392505050565b5f61358861358361357e84612974565b612a18565b612974565b9050919050565b5f819050919050565b6135a18361356e565b6135b56135ad8261358f565b84845461351d565b825550505050565b5f90565b6135c96135bd565b6135d4818484613598565b505050565b5b818110156135f7576135ec5f826135c1565b6001810190506135da565b5050565b601f82111561363c5761360d816134f0565b61361684613502565b81016020851015613625578190505b61363961363185613502565b8301826135d9565b50505b505050565b5f82821c905092915050565b5f61365c5f1984600802613641565b1980831691505092915050565b5f613674838361364d565b9150826002028217905092915050565b61368d82612879565b67ffffffffffffffff8111156136a6576136a5612bd1565b5b6136b08254612e40565b6136bb8282856135fb565b5f60209050601f8311600181146136ec575f84156136da578287015190505b6136e48582613669565b86555061374b565b601f1984166136fa866134f0565b5f5b82811015613721578489015182556001820191506020850194506020810190506136fc565b8683101561373e578489015161373a601f89168261364d565b8355505b6001600288020188555050505b505050505050565b5f81519050919050565b5f81905092915050565b5f61377182613753565b61377b818561375d565b935061378b818560208601612893565b80840191505092915050565b5f6137a28284613767565b91508190509291505056fea26469706673582212200eb28ab68cc9710183991df1ff3fffca965c769f4f3908f20da7a39a33a1c8a664736f6c634300081a0033
Deployed Bytecode
0x6080604052600436106101ed575f3560e01c8063715018a61161010c57806395d89b411161009f578063ad3cb1cc1161006e578063ad3cb1cc146106c5578063c0246668146106ef578063c6d69a3014610717578063dd62ed3e1461073f578063f2fde38b1461077b576101ed565b806395d89b41146105f9578063a39c850014610623578063a9059cbb1461065f578063aa4bde281461069b576101ed565b806379f476eb116100db57806379f476eb146105435780637a845ece1461056b57806384aa9fb6146105935780638da5cb5b146105cf576101ed565b8063715018a6146104b157806375f0a874146104c7578063771a3a1d146104f157806379cc67901461051b576101ed565b806349bd5a5e11610184578063599ca39711610153578063599ca397146103fb5780635d098b381461042557806367f3aa401461044d57806370a0823114610475576101ed565b806349bd5a5e146103615780634f1ef2861461038b57806352d1902d146103a7578063542aa229146103d1576101ed565b806323b872dd116101c057806323b872dd146102ab578063313ce567146102e757806342966c6814610311578063485cc95514610339576101ed565b806306fdde03146101f1578063095ea7b31461021b5780631694505e1461025757806318160ddd14610281575b5f80fd5b3480156101fc575f80fd5b506102056107a3565b60405161021291906128e9565b60405180910390f35b348015610226575f80fd5b50610241600480360381019061023c91906129a7565b610841565b60405161024e91906129ff565b60405180910390f35b348015610262575f80fd5b5061026b610863565b6040516102789190612a73565b60405180910390f35b34801561028c575f80fd5b50610295610888565b6040516102a29190612a9b565b60405180910390f35b3480156102b6575f80fd5b506102d160048036038101906102cc9190612ab4565b61089f565b6040516102de91906129ff565b60405180910390f35b3480156102f2575f80fd5b506102fb6108cd565b6040516103089190612b1f565b60405180910390f35b34801561031c575f80fd5b5061033760048036038101906103329190612b38565b6108d5565b005b348015610344575f80fd5b5061035f600480360381019061035a9190612b63565b6108ea565b005b34801561036c575f80fd5b50610375610dfd565b6040516103829190612bb0565b60405180910390f35b6103a560048036038101906103a09190612cf5565b610e22565b005b3480156103b2575f80fd5b506103bb610e41565b6040516103c89190612d67565b60405180910390f35b3480156103dc575f80fd5b506103e5610e72565b6040516103f29190612a9b565b60405180910390f35b348015610406575f80fd5b5061040f610e78565b60405161041c9190612a9b565b60405180910390f35b348015610430575f80fd5b5061044b60048036038101906104469190612d80565b610e7e565b005b348015610458575f80fd5b50610473600480360381019061046e9190612b38565b610ec8565b005b348015610480575f80fd5b5061049b60048036038101906104969190612d80565b610f1f565b6040516104a89190612a9b565b60405180910390f35b3480156104bc575f80fd5b506104c5610f72565b005b3480156104d2575f80fd5b506104db610f85565b6040516104e89190612bb0565b60405180910390f35b3480156104fc575f80fd5b50610505610fa8565b6040516105129190612a9b565b60405180910390f35b348015610526575f80fd5b50610541600480360381019061053c91906129a7565b610fae565b005b34801561054e575f80fd5b5061056960048036038101906105649190612dd5565b61102b565b005b348015610576575f80fd5b50610591600480360381019061058c9190612b38565b61108b565b005b34801561059e575f80fd5b506105b960048036038101906105b49190612d80565b6110ea565b6040516105c69190612a9b565b60405180910390f35b3480156105da575f80fd5b506105e3611130565b6040516105f09190612bb0565b60405180910390f35b348015610604575f80fd5b5061060d611165565b60405161061a91906128e9565b60405180910390f35b34801561062e575f80fd5b5061064960048036038101906106449190612d80565b611203565b60405161065691906129ff565b60405180910390f35b34801561066a575f80fd5b50610685600480360381019061068091906129a7565b611255565b60405161069291906129ff565b60405180910390f35b3480156106a6575f80fd5b506106af611277565b6040516106bc9190612a9b565b60405180910390f35b3480156106d0575f80fd5b506106d961127d565b6040516106e691906128e9565b60405180910390f35b3480156106fa575f80fd5b5061071560048036038101906107109190612dd5565b6112b6565b005b348015610722575f80fd5b5061073d60048036038101906107389190612b38565b611316565b005b34801561074a575f80fd5b5061076560048036038101906107609190612b63565b61136d565b6040516107729190612a9b565b60405180910390f35b348015610786575f80fd5b506107a1600480360381019061079c9190612d80565b6113fd565b005b60605f6107ae611481565b90508060030180546107bf90612e40565b80601f01602080910402602001604051908101604052809291908181526020018280546107eb90612e40565b80156108365780601f1061080d57610100808354040283529160200191610836565b820191905f5260205f20905b81548152906001019060200180831161081957829003601f168201915b505050505091505090565b5f8061084b6114a8565b90506108588185856114af565b600191505092915050565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80610892611481565b9050806002015491505090565b5f806108a96114a8565b90506108b68582856114c1565b6108c1858585611553565b60019150509392505050565b5f6012905090565b6108df338261178a565b6108e7611809565b50565b5f6108f3611833565b90505f815f0160089054906101000a900460ff161590505f825f015f9054906101000a900467ffffffffffffffff1690505f808267ffffffffffffffff1614801561093b5750825b90505f60018367ffffffffffffffff1614801561096e57505f3073ffffffffffffffffffffffffffffffffffffffff163b145b90508115801561097c575080155b156109b3576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001855f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508315610a00576001855f0160086101000a81548160ff0219169083151502179055505b610a746040518060400160405280600d81526020017f4861776b205474757561616868000000000000000000000000000000000000008152506040518060400160405280600481526020017f537069740000000000000000000000000000000000000000000000000000000081525061185a565b610a7d87611870565b610a8687611884565b610a8e611955565b855f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606460018190555060c860028190555061012c600381905550610b1587610af26108cd565b600a610afe9190612fcc565b66017dfcdece4000610b109190613016565b61195f565b610b1d611809565b600160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555073c532a74256d3db42d0bf7a0400fefdbad7694008600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c54919061306b565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cfe919061306b565b6040518363ffffffff1660e01b8152600401610d1b929190613096565b6020604051808303815f875af1158015610d37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5b919061306b565b600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508315610df4575f855f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d26001604051610deb9190613109565b60405180910390a15b50505050505050565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e2a6119de565b610e3382611ac4565b610e3d8282611acf565b5050565b5f610e4a611bed565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b905090565b60025481565b60035481565b610e86611c74565b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610ed0611c74565b6101f4811115610f15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0c9061316c565b60405180910390fd5b8060028190555050565b5f80610f29611481565b9050805f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054915050919050565b610f7a611c74565b610f835f611884565b565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015481565b5f610fb9833361136d565b905081811015610ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff5906131fa565b60405180910390fd5b6110148333848461100f9190613218565b6114af565b61101e838361178a565b611026611809565b505050565b611033611c74565b8060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b611093611c74565b6103e88111156110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf90613295565b60405180910390fd5b806003819055506110e7611809565b50565b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f8061113a611cfb565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b60605f611170611481565b905080600401805461118190612e40565b80601f01602080910402602001604051908101604052809291908181526020018280546111ad90612e40565b80156111f85780601f106111cf576101008083540402835291602001916111f8565b820191905f5260205f20905b8154815290600101906020018083116111db57829003601f168201915b505050505091505090565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f8061125f6114a8565b905061126c818585611553565b600191505092915050565b60045481565b6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6112be611c74565b8060065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b61131e611c74565b6103e8811115611363576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135a906132fd565b60405180910390fd5b8060018190555050565b5f80611377611481565b9050806001015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205491505092915050565b611405611c74565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611475575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161146c9190612bb0565b60405180910390fd5b61147e81611884565b50565b5f7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00905090565b5f33905090565b6114bc8383836001611d22565b505050565b5f6114cc848461136d565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461154d578181101561153e578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016115359392919061331b565b60405180910390fd5b61154c84848484035f611d22565b5b50505050565b5f612710600154836115659190613016565b61156f919061337d565b90505f612710600254846115839190613016565b61158d919061337d565b90505f81838561159d9190613218565b6115a79190613218565b9050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415806116385750611608611130565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15611696576004548161164a87610f1f565b61165491906133ad565b1115611695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168c90613450565b60405180910390fd5b5b60065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015611734575060065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561176e57611763865f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685611eff565b61176d8683611fef565b5b611779868683611eff565b61178285612101565b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117fa575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016117f19190612bb0565b60405180910390fd5b611805825f83612208565b5050565b612710600354611817610888565b6118219190613016565b61182b919061337d565b600481905550565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b611862612437565b61186c8282612477565b5050565b611878612437565b611881816124b3565b50565b5f61188d611cfb565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b61195d612437565b565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119cf575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016119c69190612bb0565b60405180910390fd5b6119da5f8383612208565b5050565b7f0000000000000000000000002515e2e4ca8aac3ef0030c5c67a62ec7e07abf7673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480611a8b57507f0000000000000000000000002515e2e4ca8aac3ef0030c5c67a62ec7e07abf7673ffffffffffffffffffffffffffffffffffffffff16611a72612537565b73ffffffffffffffffffffffffffffffffffffffff1614155b15611ac2576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b611acc611c74565b50565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611b3757506040513d601f19601f82011682018060405250810190611b349190613498565b60015b611b7857816040517f4c9c8ce3000000000000000000000000000000000000000000000000000000008152600401611b6f9190612bb0565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b8114611bde57806040517faa1d49a4000000000000000000000000000000000000000000000000000000008152600401611bd59190612d67565b60405180910390fd5b611be8838361258a565b505050565b7f0000000000000000000000002515e2e4ca8aac3ef0030c5c67a62ec7e07abf7673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614611c72576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b611c7c6114a8565b73ffffffffffffffffffffffffffffffffffffffff16611c9a611130565b73ffffffffffffffffffffffffffffffffffffffff1614611cf957611cbd6114a8565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611cf09190612bb0565b60405180910390fd5b565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b5f611d2b611481565b90505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611d9d575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611d949190612bb0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611e0d575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611e049190612bb0565b60405180910390fd5b82816001015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508115611ef8578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051611eef9190612a9b565b60405180910390a35b5050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f6f575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611f669190612bb0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fdf575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611fd69190612bb0565b60405180910390fd5b611fea838383612208565b505050565b5f5b6008805490508110156120fc575f60088281548110612013576120126134c3565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146120ee575f612079610888565b61208283610f1f565b8561208d9190613016565b612097919061337d565b90508060055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546120e591906133ad565b92505081905550505b508080600101915050611ff1565b505050565b60095f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661220557600881908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b50565b5f612211611481565b90505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036122655781816002015f82825461225991906133ad565b92505081905550612337565b5f815f015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050828110156122f0578481846040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016122e79392919061331b565b60405180910390fd5b828103825f015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123805781816002015f82825403925050819055506123cc565b81815f015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516124299190612a9b565b60405180910390a350505050565b61243f6125fc565b612475576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b61247f612437565b5f612488611481565b90508281600301908161249b9190613684565b50818160040190816124ad9190613684565b50505050565b6124bb612437565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361252b575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016125229190612bb0565b60405180910390fd5b61253481611884565b50565b5f6125637f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b61261a565b5f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61259382612623565b8173ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25f815111156125ef576125e982826126ec565b506125f8565b6125f761276c565b5b5050565b5f612605611833565b5f0160089054906101000a900460ff16905090565b5f819050919050565b5f8173ffffffffffffffffffffffffffffffffffffffff163b0361267e57806040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526004016126759190612bb0565b60405180910390fd5b806126aa7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5f1b61261a565b5f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60605f808473ffffffffffffffffffffffffffffffffffffffff16846040516127159190613797565b5f60405180830381855af49150503d805f811461274d576040519150601f19603f3d011682016040523d82523d5f602084013e612752565b606091505b50915091506127628583836127a8565b9250505092915050565b5f3411156127a6576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6060826127bd576127b882612835565b61282d565b5f82511480156127e357505f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561282557836040517f9996b31500000000000000000000000000000000000000000000000000000000815260040161281c9190612bb0565b60405180910390fd5b81905061282e565b5b9392505050565b5f815111156128475780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6128bb82612879565b6128c58185612883565b93506128d5818560208601612893565b6128de816128a1565b840191505092915050565b5f6020820190508181035f83015261290181846128b1565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6129438261291a565b9050919050565b61295381612939565b811461295d575f80fd5b50565b5f8135905061296e8161294a565b92915050565b5f819050919050565b61298681612974565b8114612990575f80fd5b50565b5f813590506129a18161297d565b92915050565b5f80604083850312156129bd576129bc612912565b5b5f6129ca85828601612960565b92505060206129db85828601612993565b9150509250929050565b5f8115159050919050565b6129f9816129e5565b82525050565b5f602082019050612a125f8301846129f0565b92915050565b5f819050919050565b5f612a3b612a36612a318461291a565b612a18565b61291a565b9050919050565b5f612a4c82612a21565b9050919050565b5f612a5d82612a42565b9050919050565b612a6d81612a53565b82525050565b5f602082019050612a865f830184612a64565b92915050565b612a9581612974565b82525050565b5f602082019050612aae5f830184612a8c565b92915050565b5f805f60608486031215612acb57612aca612912565b5b5f612ad886828701612960565b9350506020612ae986828701612960565b9250506040612afa86828701612993565b9150509250925092565b5f60ff82169050919050565b612b1981612b04565b82525050565b5f602082019050612b325f830184612b10565b92915050565b5f60208284031215612b4d57612b4c612912565b5b5f612b5a84828501612993565b91505092915050565b5f8060408385031215612b7957612b78612912565b5b5f612b8685828601612960565b9250506020612b9785828601612960565b9150509250929050565b612baa81612939565b82525050565b5f602082019050612bc35f830184612ba1565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612c07826128a1565b810181811067ffffffffffffffff82111715612c2657612c25612bd1565b5b80604052505050565b5f612c38612909565b9050612c448282612bfe565b919050565b5f67ffffffffffffffff821115612c6357612c62612bd1565b5b612c6c826128a1565b9050602081019050919050565b828183375f83830152505050565b5f612c99612c9484612c49565b612c2f565b905082815260208101848484011115612cb557612cb4612bcd565b5b612cc0848285612c79565b509392505050565b5f82601f830112612cdc57612cdb612bc9565b5b8135612cec848260208601612c87565b91505092915050565b5f8060408385031215612d0b57612d0a612912565b5b5f612d1885828601612960565b925050602083013567ffffffffffffffff811115612d3957612d38612916565b5b612d4585828601612cc8565b9150509250929050565b5f819050919050565b612d6181612d4f565b82525050565b5f602082019050612d7a5f830184612d58565b92915050565b5f60208284031215612d9557612d94612912565b5b5f612da284828501612960565b91505092915050565b612db4816129e5565b8114612dbe575f80fd5b50565b5f81359050612dcf81612dab565b92915050565b5f8060408385031215612deb57612dea612912565b5b5f612df885828601612960565b9250506020612e0985828601612dc1565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612e5757607f821691505b602082108103612e6a57612e69612e13565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b6001851115612ef257808604811115612ece57612ecd612e70565b5b6001851615612edd5780820291505b8081029050612eeb85612e9d565b9450612eb2565b94509492505050565b5f82612f0a5760019050612fc5565b81612f17575f9050612fc5565b8160018114612f2d5760028114612f3757612f66565b6001915050612fc5565b60ff841115612f4957612f48612e70565b5b8360020a915084821115612f6057612f5f612e70565b5b50612fc5565b5060208310610133831016604e8410600b8410161715612f9b5782820a905083811115612f9657612f95612e70565b5b612fc5565b612fa88484846001612ea9565b92509050818404811115612fbf57612fbe612e70565b5b81810290505b9392505050565b5f612fd682612974565b9150612fe183612b04565b925061300e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612efb565b905092915050565b5f61302082612974565b915061302b83612974565b925082820261303981612974565b915082820484148315176130505761304f612e70565b5b5092915050565b5f815190506130658161294a565b92915050565b5f602082840312156130805761307f612912565b5b5f61308d84828501613057565b91505092915050565b5f6040820190506130a95f830185612ba1565b6130b66020830184612ba1565b9392505050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f6130f36130ee6130e9846130bd565b612a18565b6130c6565b9050919050565b613103816130d9565b82525050565b5f60208201905061311c5f8301846130fa565b92915050565b7f5265666c656374696f6e207261746520746f6f206869676800000000000000005f82015250565b5f613156601883612883565b915061316182613122565b602082019050919050565b5f6020820190508181035f8301526131838161314a565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f775f8201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b5f6131e4602483612883565b91506131ef8261318a565b604082019050919050565b5f6020820190508181035f830152613211816131d8565b9050919050565b5f61322282612974565b915061322d83612974565b925082820390508181111561324557613244612e70565b5b92915050565b7f4d61782077616c6c65742070657263656e7461676520746f6f206869676800005f82015250565b5f61327f601e83612883565b915061328a8261324b565b602082019050919050565b5f6020820190508181035f8301526132ac81613273565b9050919050565b7f546178207261746520746f6f20686967680000000000000000000000000000005f82015250565b5f6132e7601183612883565b91506132f2826132b3565b602082019050919050565b5f6020820190508181035f830152613314816132db565b9050919050565b5f60608201905061332e5f830186612ba1565b61333b6020830185612a8c565b6133486040830184612a8c565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61338782612974565b915061339283612974565b9250826133a2576133a1613350565b5b828204905092915050565b5f6133b782612974565b91506133c283612974565b92508282019050808211156133da576133d9612e70565b5b92915050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320745f8201527f6865206d61782077616c6c65742073697a650000000000000000000000000000602082015250565b5f61343a603283612883565b9150613445826133e0565b604082019050919050565b5f6020820190508181035f8301526134678161342e565b9050919050565b61347781612d4f565b8114613481575f80fd5b50565b5f815190506134928161346e565b92915050565b5f602082840312156134ad576134ac612912565b5b5f6134ba84828501613484565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261354c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613511565b6135568683613511565b95508019841693508086168417925050509392505050565b5f61358861358361357e84612974565b612a18565b612974565b9050919050565b5f819050919050565b6135a18361356e565b6135b56135ad8261358f565b84845461351d565b825550505050565b5f90565b6135c96135bd565b6135d4818484613598565b505050565b5b818110156135f7576135ec5f826135c1565b6001810190506135da565b5050565b601f82111561363c5761360d816134f0565b61361684613502565b81016020851015613625578190505b61363961363185613502565b8301826135d9565b50505b505050565b5f82821c905092915050565b5f61365c5f1984600802613641565b1980831691505092915050565b5f613674838361364d565b9150826002028217905092915050565b61368d82612879565b67ffffffffffffffff8111156136a6576136a5612bd1565b5b6136b08254612e40565b6136bb8282856135fb565b5f60209050601f8311600181146136ec575f84156136da578287015190505b6136e48582613669565b86555061374b565b601f1984166136fa866134f0565b5f5b82811015613721578489015182556001820191506020850194506020810190506136fc565b8683101561373e578489015161373a601f89168261364d565b8355505b6001600288020188555050505b505050505050565b5f81519050919050565b5f81905092915050565b5f61377182613753565b61377b818561375d565b935061378b818560208601612893565b80840191505092915050565b5f6137a28284613767565b91508190509291505056fea26469706673582212200eb28ab68cc9710183991df1ff3fffca965c769f4f3908f20da7a39a33a1c8a664736f6c634300081a0033
Deployed Bytecode Sourcemap
63521:5502:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23524:147;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26097:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64270:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24738:155;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26865:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24589:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65288:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64472:808;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64318:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60198:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59731:136;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63740:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63811:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67202:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67506:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24956:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36426:103;;;;;;;;;;;;;:::i;:::-;;63622:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63659:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65412:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68652:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67716:270;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68461:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35691:147;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23790:151;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68882:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25335:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63925:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57799:58;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68269:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67336:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25580:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36684:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23524:147;23569:13;23595:22;23620:18;:16;:18::i;:::-;23595:43;;23656:1;:7;;23649:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23524:147;:::o;26097:190::-;26170:4;26187:13;26203:12;:10;:12::i;:::-;26187:28;;26226:31;26235:5;26242:7;26251:5;26226:8;:31::i;:::-;26275:4;26268:11;;;26097:190;;;;:::o;64270:41::-;;;;;;;;;;;;;:::o;24738:155::-;24790:7;24810:22;24835:18;:16;:18::i;:::-;24810:43;;24871:1;:14;;;24864:21;;;24738:155;:::o;26865:249::-;26952:4;26969:15;26987:12;:10;:12::i;:::-;26969:30;;27010:37;27026:4;27032:7;27041:5;27010:15;:37::i;:::-;27058:26;27068:4;27074:2;27078:5;27058:9;:26::i;:::-;27102:4;27095:11;;;26865:249;;;;;:::o;24589:84::-;24638:5;24663:2;24656:9;;24589:84;:::o;65288:116::-;65336:25;65342:10;65354:6;65336:5;:25::i;:::-;65372:24;:22;:24::i;:::-;65288:116;:::o;64472:808::-;7956:30;7989:26;:24;:26::i;:::-;7956:59;;8080:19;8103:1;:15;;;;;;;;;;;;8102:16;8080:38;;8129:18;8150:1;:14;;;;;;;;;;;;8129:35;;8515:17;8550:1;8535:11;:16;;;:34;;;;;8555:14;8535:34;8515:54;;8580:17;8615:1;8600:11;:16;;;:50;;;;;8649:1;8628:4;8620:25;;;:30;8600:50;8580:70;;8668:12;8667:13;:30;;;;;8685:12;8684:13;8667:30;8663:93;;;8721:23;;;;;;;;;;;;;;8663:93;8783:1;8766;:14;;;:18;;;;;;;;;;;;;;;;;;8799:14;8795:69;;;8848:4;8830:1;:15;;;:22;;;;;;;;;;;;;;;;;;8795:69;64570:37:::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;::::0;:12:::1;:37::i;:::-;64618:28;64633:12;64618:14;:28::i;:::-;64657:32;64676:12;64657:18;:32::i;:::-;64700:24;:22;:24::i;:::-;64753:16;64735:15;::::0;:34:::1;;;;;;;;;;;;;;;;;;64790:3;64780:7;:13;;;;64831:3;64814:14;:20;;;;64884:3;64862:19;:25;;;;64919:59;64925:12;64967:10;:8;:10::i;:::-;64961:2;:16;;;;:::i;:::-;64939:19;:38;;;;:::i;:::-;64919:5;:59::i;:::-;64989:24;:22;:24::i;:::-;65058:4;65024:19;:31;65044:10;65024:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;65110:42;65073:15;;:80;;;;;;;;;;;;;;;;;;65194:15;;;;;;;;;;;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65176:55;;;65240:4;65247:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65176:94;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65160:13;;:110;;;;;;;;;;;;;;;;;;8890:14:::0;8886:104;;;8939:5;8921:1;:15;;;:23;;;;;;;;;;;;;;;;;;8964:14;8976:1;8964:14;;;;;;:::i;:::-;;;;;;;;8886:104;7888:1109;;;;;64472:808;;:::o;64318:28::-;;;;;;;;;;;;;:::o;60198:217::-;58653:13;:11;:13::i;:::-;60314:36:::1;60332:17;60314;:36::i;:::-;60361:46;60383:17;60402:4;60361:21;:46::i;:::-;60198:217:::0;;:::o;59731:136::-;59800:7;58933:20;:18;:20::i;:::-;50569:66:::1;59827:32;;59820:39;;59731:136:::0;:::o;63740:29::-;;;;:::o;63811:34::-;;;;:::o;67202:126::-;35577:13;:11;:13::i;:::-;67304:16:::1;67286:15;::::0;:34:::1;;;;;;;;;;;;;;;;;;67202:126:::0;:::o;67506:202::-;35577:13;:11;:13::i;:::-;67615:3:::1;67596:15;:22;;67588:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;67685:15;67668:14;:32;;;;67506:202:::0;:::o;24956:174::-;25021:7;25041:22;25066:18;:16;:18::i;:::-;25041:43;;25102:1;:11;;:20;25114:7;25102:20;;;;;;;;;;;;;;;;25095:27;;;24956:174;;;:::o;36426:103::-;35577:13;:11;:13::i;:::-;36491:30:::1;36518:1;36491:18;:30::i;:::-;36426:103::o:0;63622:30::-;;;;;;;;;;;;:::o;63659:22::-;;;;:::o;65412:355::-;65481:24;65508:30;65518:7;65527:10;65508:9;:30::i;:::-;65481:57;;65577:6;65557:16;:26;;65549:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;65635:56;65644:7;65653:10;65684:6;65665:16;:25;;;;:::i;:::-;65635:8;:56::i;:::-;65702:22;65708:7;65717:6;65702:5;:22::i;:::-;65735:24;:22;:24::i;:::-;65470:297;65412:355;;:::o;68652:151::-;35577:13;:11;:13::i;:::-;68784:11:::1;68748:24;:33;68773:7;68748:33;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;68652:151:::0;;:::o;67716:270::-;35577:13;:11;:13::i;:::-;67840:4:::1;67816:20;:28;;67808:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;67923:20;67901:19;:42;;;;67954:24;:22;:24::i;:::-;67716:270:::0;:::o;68461:129::-;68528:7;68555:18;:27;68574:7;68555:27;;;;;;;;;;;;;;;;68548:34;;68461:129;;;:::o;35691:147::-;35737:7;35757:24;35784:20;:18;:20::i;:::-;35757:47;;35822:1;:8;;;;;;;;;;;;35815:15;;;35691:147;:::o;23790:151::-;23837:13;23863:22;23888:18;:16;:18::i;:::-;23863:43;;23924:1;:9;;23917:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23790:151;:::o;68882:138::-;68955:4;68979:24;:33;69004:7;68979:33;;;;;;;;;;;;;;;;;;;;;;;;;68972:40;;68882:138;;;:::o;25335:182::-;25404:4;25421:13;25437:12;:10;:12::i;:::-;25421:28;;25460:27;25470:5;25477:2;25481:5;25460:9;:27::i;:::-;25505:4;25498:11;;;25335:182;;;;:::o;63925:30::-;;;;:::o;57799:58::-;;;;;;;;;;;;;;;;;;;:::o;68269:132::-;35577:13;:11;:13::i;:::-;68385:8:::1;68354:19;:28;68374:7;68354:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;68269:132:::0;;:::o;67336:162::-;35577:13;:11;:13::i;:::-;67424:4:::1;67412:8;:16;;67404:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;67482:8;67472:7;:18;;;;67336:162:::0;:::o;25580:198::-;25660:7;25680:22;25705:18;:16;:18::i;:::-;25680:43;;25741:1;:13;;:20;25755:5;25741:20;;;;;;;;;;;;;;;:29;25762:7;25741:29;;;;;;;;;;;;;;;;25734:36;;;25580:198;;;;:::o;36684:220::-;35577:13;:11;:13::i;:::-;36789:1:::1;36769:22;;:8;:22;;::::0;36765:93:::1;;36843:1;36815:31;;;;;;;;;;;:::i;:::-;;;;;;;;36765:93;36868:28;36887:8;36868:18;:28::i;:::-;36684:220:::0;:::o;22730:157::-;22780:22;22849:20;22839:30;;22730:157;:::o;13725:98::-;13778:7;13805:10;13798:17;;13725:98;:::o;30997:130::-;31082:37;31091:5;31098:7;31107:5;31114:4;31082:8;:37::i;:::-;30997:130;;;:::o;32769:487::-;32869:24;32896:25;32906:5;32913:7;32896:9;:25::i;:::-;32869:52;;32956:17;32936:16;:37;32932:317;;33013:5;32994:16;:24;32990:132;;;33073:7;33082:16;33100:5;33046:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;32990:132;33165:57;33174:5;33181:7;33209:5;33190:16;:24;33216:5;33165:8;:57::i;:::-;32932:317;32858:398;32769:487;;;:::o;65775:818::-;65883:17;65924:5;65913:7;;65904:6;:16;;;;:::i;:::-;65903:26;;;;:::i;:::-;65883:46;;65940:24;65995:5;65977:14;;65968:6;:23;;;;:::i;:::-;65967:33;;;;:::i;:::-;65940:60;;66011:17;66052:16;66040:9;66031:6;:18;;;;:::i;:::-;:37;;;;:::i;:::-;66011:57;;66098:13;;;;;;;;;;;66085:26;;:9;:26;;;;:49;;;;66127:7;:5;:7::i;:::-;66115:19;;:9;:19;;;;66085:49;66081:199;;;66196:15;;66183:9;66160:20;66170:9;66160;:20::i;:::-;:32;;;;:::i;:::-;:51;;66152:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;66081:199;66297:19;:27;66317:6;66297:27;;;;;;;;;;;;;;;;;;;;;;;;;66296:28;:63;;;;;66329:19;:30;66349:9;66329:30;;;;;;;;;;;;;;;;;;;;;;;;;66328:31;66296:63;66292:202;;;66376:51;66392:6;66400:15;;;;;;;;;;66417:9;66376:15;:51::i;:::-;66442:40;66457:6;66465:16;66442:14;:40::i;:::-;66292:202;66506:45;66522:6;66530:9;66541;66506:15;:45::i;:::-;66564:21;66575:9;66564:10;:21::i;:::-;65872:721;;;65775:818;;;:::o;30233:211::-;30323:1;30304:21;;:7;:21;;;30300:91;;30376:1;30349:30;;;;;;;;;;;:::i;:::-;;;;;;;;30300:91;30401:35;30409:7;30426:1;30430:5;30401:7;:35::i;:::-;30233:211;;:::o;67994:125::-;68106:5;68083:19;;68067:13;:11;:13::i;:::-;:35;;;;:::i;:::-;68066:45;;;;:::i;:::-;68048:15;:63;;;;67994:125::o;12652:174::-;12710:30;12787:21;12777:31;;12652:174;:::o;23077:149::-;10794:20;:18;:20::i;:::-;23180:38:::1;23203:5;23210:7;23180:22;:38::i;:::-;23077:149:::0;;:::o;35075:129::-;10794:20;:18;:20::i;:::-;35158:38:::1;35183:12;35158:24;:38::i;:::-;35075:129:::0;:::o;37064:253::-;37138:24;37165:20;:18;:20::i;:::-;37138:47;;37196:16;37215:1;:8;;;;;;;;;;;;37196:27;;37245:8;37234:1;:8;;;:19;;;;;;;;;;;;;;;;;;37300:8;37269:40;;37290:8;37269:40;;;;;;;;;;;;37127:190;;37064:253;:::o;58981:68::-;10794:20;:18;:20::i;:::-;58981:68::o;29692:213::-;29782:1;29763:21;;:7;:21;;;29759:93;;29837:1;29808:32;;;;;;;;;;;:::i;:::-;;;;;;;;29759:93;29862:35;29878:1;29882:7;29891:5;29862:7;:35::i;:::-;29692:213;;:::o;60649:319::-;60740:6;60723:23;;60731:4;60723:23;;;:121;;;;60838:6;60802:42;;:32;:30;:32::i;:::-;:42;;;;60723:121;60705:256;;;60920:29;;;;;;;;;;;;;;60705:256;60649:319::o;68127:84::-;35577:13;:11;:13::i;:::-;68127:84;:::o;62142:548::-;62260:17;62242:50;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;62238:445;;62653:17;62611:60;;;;;;;;;;;:::i;:::-;;;;;;;;62238:445;50569:66;62345:32;;62337:4;:40;62333:122;;62434:4;62405:34;;;;;;;;;;;:::i;:::-;;;;;;;;62333:122;62469:54;62499:17;62518:4;62469:29;:54::i;:::-;62295:240;62142:548;;:::o;61091:218::-;61175:6;61158:23;;61166:4;61158:23;;;61154:148;;61261:29;;;;;;;;;;;;;;61154:148;61091:218::o;35916:166::-;35987:12;:10;:12::i;:::-;35976:23;;:7;:5;:7::i;:::-;:23;;;35972:103;;36050:12;:10;:12::i;:::-;36023:40;;;;;;;;;;;:::i;:::-;;;;;;;;35972:103;35916:166::o;34399:163::-;34451:24;34522:22;34512:32;;34399:163;:::o;31978:499::-;32087:22;32112:18;:16;:18::i;:::-;32087:43;;32162:1;32145:19;;:5;:19;;;32141:91;;32217:1;32188:32;;;;;;;;;;;:::i;:::-;;;;;;;;32141:91;32265:1;32246:21;;:7;:21;;;32242:92;;32319:1;32291:31;;;;;;;;;;;:::i;:::-;;;;;;;;32242:92;32376:5;32344:1;:13;;:20;32358:5;32344:20;;;;;;;;;;;;;;;:29;32365:7;32344:29;;;;;;;;;;;;;;;:37;;;;32396:9;32392:78;;;32443:7;32427:31;;32436:5;32427:31;;;32452:5;32427:31;;;;;;:::i;:::-;;;;;;;;32392:78;32076:401;31978:499;;;;:::o;27499:317::-;27608:1;27592:18;;:4;:18;;;27588:88;;27661:1;27634:30;;;;;;;;;;;:::i;:::-;;;;;;;;27588:88;27704:1;27690:16;;:2;:16;;;27686:88;;27759:1;27730:32;;;;;;;;;;;:::i;:::-;;;;;;;;27686:88;27784:24;27792:4;27798:2;27802:5;27784:7;:24::i;:::-;27499:317;;;:::o;66601:404::-;66691:9;66686:312;66710:10;:17;;;;66706:1;:21;66686:312;;;66749:14;66766:10;66777:1;66766:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;66749:30;;66808:6;66798:16;;:6;:16;;;66794:193;;66835:19;66898:13;:11;:13::i;:::-;66877:17;66887:6;66877:9;:17::i;:::-;66858:16;:36;;;;:::i;:::-;66857:54;;;;:::i;:::-;66835:76;;66960:11;66930:18;:26;66949:6;66930:26;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;66816:171;66794:193;66734:264;66729:3;;;;;;;66686:312;;;;66601:404;;:::o;67013:181::-;67073:12;:20;67086:6;67073:20;;;;;;;;;;;;;;;;;;;;;;;;;67068:119;;67110:10;67126:6;67110:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67171:4;67148:12;:20;67161:6;67148:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;67068:119;67013:181;:::o;28140:1199::-;28226:22;28251:18;:16;:18::i;:::-;28226:43;;28300:1;28284:18;;:4;:18;;;28280:558;;28440:5;28422:1;:14;;;:23;;;;;;;:::i;:::-;;;;;;;;28280:558;;;28478:19;28500:1;:11;;:17;28512:4;28500:17;;;;;;;;;;;;;;;;28478:39;;28550:5;28536:11;:19;28532:117;;;28608:4;28614:11;28627:5;28583:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;28532:117;28806:5;28792:11;:19;28772:1;:11;;:17;28784:4;28772:17;;;;;;;;;;;;;;;:39;;;;28463:375;28280:558;28868:1;28854:16;;:2;:16;;;28850:439;;29038:5;29020:1;:14;;;:23;;;;;;;;;;;28850:439;;;29257:5;29238:1;:11;;:15;29250:2;29238:15;;;;;;;;;;;;;;;;:24;;;;;;;;;;;28850:439;29321:2;29306:25;;29315:4;29306:25;;;29325:5;29306:25;;;;;;:::i;:::-;;;;;;;;28215:1124;28140:1199;;;:::o;10954:145::-;11022:17;:15;:17::i;:::-;11017:75;;11063:17;;;;;;;;;;;;;;11017:75;10954:145::o;23234:220::-;10794:20;:18;:20::i;:::-;23347:22:::1;23372:18;:16;:18::i;:::-;23347:43;;23411:5;23401:1;:7;;:15;;;;;;:::i;:::-;;23439:7;23427:1;:9;;:19;;;;;;:::i;:::-;;23336:118;23234:220:::0;;:::o;35212:240::-;10794:20;:18;:20::i;:::-;35333:1:::1;35309:26;;:12;:26;;::::0;35305:97:::1;;35387:1;35359:31;;;;;;;;;;;:::i;:::-;;;;;;;;35305:97;35412:32;35431:12;35412:18;:32::i;:::-;35212:240:::0;:::o;51224:140::-;51276:7;51303:47;50569:66;51330:19;;51303:26;:47::i;:::-;:53;;;;;;;;;;;;51296:60;;51224:140;:::o;52067:344::-;52159:37;52178:17;52159:18;:37::i;:::-;52221:17;52212:27;;;;;;;;;;;;52270:1;52256:4;:11;:15;52252:152;;;52288:53;52317:17;52336:4;52288:28;:53::i;:::-;;52252:152;;;52374:18;:16;:18::i;:::-;52252:152;52067:344;;:::o;12394:122::-;12444:4;12468:26;:24;:26::i;:::-;:40;;;;;;;;;;;;12461:47;;12394:122;:::o;46996:195::-;47057:21;47169:4;47159:14;;46996:195;;;:::o;51460:286::-;51571:1;51538:17;:29;;;:34;51534:121;;51625:17;51596:47;;;;;;;;;;;:::i;:::-;;;;;;;;51534:121;51721:17;51665:47;50569:66;51692:19;;51665:26;:47::i;:::-;:53;;;:73;;;;;;;;;;;;;;;;;;51460:286;:::o;43013:256::-;43096:12;43122;43136:23;43163:6;:19;;43183:4;43163:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43121:67;;;;43206:55;43233:6;43241:7;43250:10;43206:26;:55::i;:::-;43199:62;;;;43013:256;;;;:::o;55991:126::-;56054:1;56042:9;:13;56038:72;;;56079:19;;;;;;;;;;;;;;56038:72;55991:126::o;43542:597::-;43690:12;43720:7;43715:417;;43744:19;43752:10;43744:7;:19::i;:::-;43715:417;;;43993:1;43972:10;:17;:22;:49;;;;;44020:1;43998:6;:18;;;:23;43972:49;43968:121;;;44066:6;44049:24;;;;;;;;;;;:::i;:::-;;;;;;;;43968:121;44110:10;44103:17;;;;43715:417;43542:597;;;;;;:::o;44692:528::-;44845:1;44825:10;:17;:21;44821:392;;;45057:10;45051:17;45114:15;45101:10;45097:2;45093:19;45086:44;44821:392;45184:17;;;;;;;;;;;;;;7:99:1;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:139::-;376:6;371:3;366;360:23;417:1;408:6;403:3;399:16;392:27;287:139;;;:::o;432:102::-;473:6;524:2;520:7;515:2;508:5;504:14;500:28;490:38;;432:102;;;:::o;540:377::-;628:3;656:39;689:5;656:39;:::i;:::-;711:71;775:6;770:3;711:71;:::i;:::-;704:78;;791:65;849:6;844:3;837:4;830:5;826:16;791:65;:::i;:::-;881:29;903:6;881:29;:::i;:::-;876:3;872:39;865:46;;632:285;540:377;;;;:::o;923:313::-;1036:4;1074:2;1063:9;1059:18;1051:26;;1123:9;1117:4;1113:20;1109:1;1098:9;1094:17;1087:47;1151:78;1224:4;1215:6;1151:78;:::i;:::-;1143:86;;923:313;;;;:::o;1242:75::-;1275:6;1308:2;1302:9;1292:19;;1242:75;:::o;1323:117::-;1432:1;1429;1422:12;1446:117;1555:1;1552;1545:12;1569:126;1606:7;1646:42;1639:5;1635:54;1624:65;;1569:126;;;:::o;1701:96::-;1738:7;1767:24;1785:5;1767:24;:::i;:::-;1756:35;;1701:96;;;:::o;1803:122::-;1876:24;1894:5;1876:24;:::i;:::-;1869:5;1866:35;1856:63;;1915:1;1912;1905:12;1856:63;1803:122;:::o;1931:139::-;1977:5;2015:6;2002:20;1993:29;;2031:33;2058:5;2031:33;:::i;:::-;1931:139;;;;:::o;2076:77::-;2113:7;2142:5;2131:16;;2076:77;;;:::o;2159:122::-;2232:24;2250:5;2232:24;:::i;:::-;2225:5;2222:35;2212:63;;2271:1;2268;2261:12;2212:63;2159:122;:::o;2287:139::-;2333:5;2371:6;2358:20;2349:29;;2387:33;2414:5;2387:33;:::i;:::-;2287:139;;;;:::o;2432:474::-;2500:6;2508;2557:2;2545:9;2536:7;2532:23;2528:32;2525:119;;;2563:79;;:::i;:::-;2525:119;2683:1;2708:53;2753:7;2744:6;2733:9;2729:22;2708:53;:::i;:::-;2698:63;;2654:117;2810:2;2836:53;2881:7;2872:6;2861:9;2857:22;2836:53;:::i;:::-;2826:63;;2781:118;2432:474;;;;;:::o;2912:90::-;2946:7;2989:5;2982:13;2975:21;2964:32;;2912:90;;;:::o;3008:109::-;3089:21;3104:5;3089:21;:::i;:::-;3084:3;3077:34;3008:109;;:::o;3123:210::-;3210:4;3248:2;3237:9;3233:18;3225:26;;3261:65;3323:1;3312:9;3308:17;3299:6;3261:65;:::i;:::-;3123:210;;;;:::o;3339:60::-;3367:3;3388:5;3381:12;;3339:60;;;:::o;3405:142::-;3455:9;3488:53;3506:34;3515:24;3533:5;3515:24;:::i;:::-;3506:34;:::i;:::-;3488:53;:::i;:::-;3475:66;;3405:142;;;:::o;3553:126::-;3603:9;3636:37;3667:5;3636:37;:::i;:::-;3623:50;;3553:126;;;:::o;3685:153::-;3762:9;3795:37;3826:5;3795:37;:::i;:::-;3782:50;;3685:153;;;:::o;3844:185::-;3958:64;4016:5;3958:64;:::i;:::-;3953:3;3946:77;3844:185;;:::o;4035:276::-;4155:4;4193:2;4182:9;4178:18;4170:26;;4206:98;4301:1;4290:9;4286:17;4277:6;4206:98;:::i;:::-;4035:276;;;;:::o;4317:118::-;4404:24;4422:5;4404:24;:::i;:::-;4399:3;4392:37;4317:118;;:::o;4441:222::-;4534:4;4572:2;4561:9;4557:18;4549:26;;4585:71;4653:1;4642:9;4638:17;4629:6;4585:71;:::i;:::-;4441:222;;;;:::o;4669:619::-;4746:6;4754;4762;4811:2;4799:9;4790:7;4786:23;4782:32;4779:119;;;4817:79;;:::i;:::-;4779:119;4937:1;4962:53;5007:7;4998:6;4987:9;4983:22;4962:53;:::i;:::-;4952:63;;4908:117;5064:2;5090:53;5135:7;5126:6;5115:9;5111:22;5090:53;:::i;:::-;5080:63;;5035:118;5192:2;5218:53;5263:7;5254:6;5243:9;5239:22;5218:53;:::i;:::-;5208:63;;5163:118;4669:619;;;;;:::o;5294:86::-;5329:7;5369:4;5362:5;5358:16;5347:27;;5294:86;;;:::o;5386:112::-;5469:22;5485:5;5469:22;:::i;:::-;5464:3;5457:35;5386:112;;:::o;5504:214::-;5593:4;5631:2;5620:9;5616:18;5608:26;;5644:67;5708:1;5697:9;5693:17;5684:6;5644:67;:::i;:::-;5504:214;;;;:::o;5724:329::-;5783:6;5832:2;5820:9;5811:7;5807:23;5803:32;5800:119;;;5838:79;;:::i;:::-;5800:119;5958:1;5983:53;6028:7;6019:6;6008:9;6004:22;5983:53;:::i;:::-;5973:63;;5929:117;5724:329;;;;:::o;6059:474::-;6127:6;6135;6184:2;6172:9;6163:7;6159:23;6155:32;6152:119;;;6190:79;;:::i;:::-;6152:119;6310:1;6335:53;6380:7;6371:6;6360:9;6356:22;6335:53;:::i;:::-;6325:63;;6281:117;6437:2;6463:53;6508:7;6499:6;6488:9;6484:22;6463:53;:::i;:::-;6453:63;;6408:118;6059:474;;;;;:::o;6539:118::-;6626:24;6644:5;6626:24;:::i;:::-;6621:3;6614:37;6539:118;;:::o;6663:222::-;6756:4;6794:2;6783:9;6779:18;6771:26;;6807:71;6875:1;6864:9;6860:17;6851:6;6807:71;:::i;:::-;6663:222;;;;:::o;6891:117::-;7000:1;6997;6990:12;7014:117;7123:1;7120;7113:12;7137:180;7185:77;7182:1;7175:88;7282:4;7279:1;7272:15;7306:4;7303:1;7296:15;7323:281;7406:27;7428:4;7406:27;:::i;:::-;7398:6;7394:40;7536:6;7524:10;7521:22;7500:18;7488:10;7485:34;7482:62;7479:88;;;7547:18;;:::i;:::-;7479:88;7587:10;7583:2;7576:22;7366:238;7323:281;;:::o;7610:129::-;7644:6;7671:20;;:::i;:::-;7661:30;;7700:33;7728:4;7720:6;7700:33;:::i;:::-;7610:129;;;:::o;7745:307::-;7806:4;7896:18;7888:6;7885:30;7882:56;;;7918:18;;:::i;:::-;7882:56;7956:29;7978:6;7956:29;:::i;:::-;7948:37;;8040:4;8034;8030:15;8022:23;;7745:307;;;:::o;8058:148::-;8156:6;8151:3;8146;8133:30;8197:1;8188:6;8183:3;8179:16;8172:27;8058:148;;;:::o;8212:423::-;8289:5;8314:65;8330:48;8371:6;8330:48;:::i;:::-;8314:65;:::i;:::-;8305:74;;8402:6;8395:5;8388:21;8440:4;8433:5;8429:16;8478:3;8469:6;8464:3;8460:16;8457:25;8454:112;;;8485:79;;:::i;:::-;8454:112;8575:54;8622:6;8617:3;8612;8575:54;:::i;:::-;8295:340;8212:423;;;;;:::o;8654:338::-;8709:5;8758:3;8751:4;8743:6;8739:17;8735:27;8725:122;;8766:79;;:::i;:::-;8725:122;8883:6;8870:20;8908:78;8982:3;8974:6;8967:4;8959:6;8955:17;8908:78;:::i;:::-;8899:87;;8715:277;8654:338;;;;:::o;8998:652::-;9075:6;9083;9132:2;9120:9;9111:7;9107:23;9103:32;9100:119;;;9138:79;;:::i;:::-;9100:119;9258:1;9283:53;9328:7;9319:6;9308:9;9304:22;9283:53;:::i;:::-;9273:63;;9229:117;9413:2;9402:9;9398:18;9385:32;9444:18;9436:6;9433:30;9430:117;;;9466:79;;:::i;:::-;9430:117;9571:62;9625:7;9616:6;9605:9;9601:22;9571:62;:::i;:::-;9561:72;;9356:287;8998:652;;;;;:::o;9656:77::-;9693:7;9722:5;9711:16;;9656:77;;;:::o;9739:118::-;9826:24;9844:5;9826:24;:::i;:::-;9821:3;9814:37;9739:118;;:::o;9863:222::-;9956:4;9994:2;9983:9;9979:18;9971:26;;10007:71;10075:1;10064:9;10060:17;10051:6;10007:71;:::i;:::-;9863:222;;;;:::o;10091:329::-;10150:6;10199:2;10187:9;10178:7;10174:23;10170:32;10167:119;;;10205:79;;:::i;:::-;10167:119;10325:1;10350:53;10395:7;10386:6;10375:9;10371:22;10350:53;:::i;:::-;10340:63;;10296:117;10091:329;;;;:::o;10426:116::-;10496:21;10511:5;10496:21;:::i;:::-;10489:5;10486:32;10476:60;;10532:1;10529;10522:12;10476:60;10426:116;:::o;10548:133::-;10591:5;10629:6;10616:20;10607:29;;10645:30;10669:5;10645:30;:::i;:::-;10548:133;;;;:::o;10687:468::-;10752:6;10760;10809:2;10797:9;10788:7;10784:23;10780:32;10777:119;;;10815:79;;:::i;:::-;10777:119;10935:1;10960:53;11005:7;10996:6;10985:9;10981:22;10960:53;:::i;:::-;10950:63;;10906:117;11062:2;11088:50;11130:7;11121:6;11110:9;11106:22;11088:50;:::i;:::-;11078:60;;11033:115;10687:468;;;;;:::o;11161:180::-;11209:77;11206:1;11199:88;11306:4;11303:1;11296:15;11330:4;11327:1;11320:15;11347:320;11391:6;11428:1;11422:4;11418:12;11408:22;;11475:1;11469:4;11465:12;11496:18;11486:81;;11552:4;11544:6;11540:17;11530:27;;11486:81;11614:2;11606:6;11603:14;11583:18;11580:38;11577:84;;11633:18;;:::i;:::-;11577:84;11398:269;11347:320;;;:::o;11673:180::-;11721:77;11718:1;11711:88;11818:4;11815:1;11808:15;11842:4;11839:1;11832:15;11859:102;11901:8;11948:5;11945:1;11941:13;11920:34;;11859:102;;;:::o;11967:848::-;12028:5;12035:4;12059:6;12050:15;;12083:5;12074:14;;12097:712;12118:1;12108:8;12105:15;12097:712;;;12213:4;12208:3;12204:14;12198:4;12195:24;12192:50;;;12222:18;;:::i;:::-;12192:50;12272:1;12262:8;12258:16;12255:451;;;12687:4;12680:5;12676:16;12667:25;;12255:451;12737:4;12731;12727:15;12719:23;;12767:32;12790:8;12767:32;:::i;:::-;12755:44;;12097:712;;;11967:848;;;;;;;:::o;12821:1073::-;12875:5;13066:8;13056:40;;13087:1;13078:10;;13089:5;;13056:40;13115:4;13105:36;;13132:1;13123:10;;13134:5;;13105:36;13201:4;13249:1;13244:27;;;;13285:1;13280:191;;;;13194:277;;13244:27;13262:1;13253:10;;13264:5;;;13280:191;13325:3;13315:8;13312:17;13309:43;;;13332:18;;:::i;:::-;13309:43;13381:8;13378:1;13374:16;13365:25;;13416:3;13409:5;13406:14;13403:40;;;13423:18;;:::i;:::-;13403:40;13456:5;;;13194:277;;13580:2;13570:8;13567:16;13561:3;13555:4;13552:13;13548:36;13530:2;13520:8;13517:16;13512:2;13506:4;13503:12;13499:35;13483:111;13480:246;;;13636:8;13630:4;13626:19;13617:28;;13671:3;13664:5;13661:14;13658:40;;;13678:18;;:::i;:::-;13658:40;13711:5;;13480:246;13751:42;13789:3;13779:8;13773:4;13770:1;13751:42;:::i;:::-;13736:57;;;;13825:4;13820:3;13816:14;13809:5;13806:25;13803:51;;;13834:18;;:::i;:::-;13803:51;13883:4;13876:5;13872:16;13863:25;;12821:1073;;;;;;:::o;13900:281::-;13958:5;13982:23;14000:4;13982:23;:::i;:::-;13974:31;;14026:25;14042:8;14026:25;:::i;:::-;14014:37;;14070:104;14107:66;14097:8;14091:4;14070:104;:::i;:::-;14061:113;;13900:281;;;;:::o;14187:410::-;14227:7;14250:20;14268:1;14250:20;:::i;:::-;14245:25;;14284:20;14302:1;14284:20;:::i;:::-;14279:25;;14339:1;14336;14332:9;14361:30;14379:11;14361:30;:::i;:::-;14350:41;;14540:1;14531:7;14527:15;14524:1;14521:22;14501:1;14494:9;14474:83;14451:139;;14570:18;;:::i;:::-;14451:139;14235:362;14187:410;;;;:::o;14603:143::-;14660:5;14691:6;14685:13;14676:22;;14707:33;14734:5;14707:33;:::i;:::-;14603:143;;;;:::o;14752:351::-;14822:6;14871:2;14859:9;14850:7;14846:23;14842:32;14839:119;;;14877:79;;:::i;:::-;14839:119;14997:1;15022:64;15078:7;15069:6;15058:9;15054:22;15022:64;:::i;:::-;15012:74;;14968:128;14752:351;;;;:::o;15109:332::-;15230:4;15268:2;15257:9;15253:18;15245:26;;15281:71;15349:1;15338:9;15334:17;15325:6;15281:71;:::i;:::-;15362:72;15430:2;15419:9;15415:18;15406:6;15362:72;:::i;:::-;15109:332;;;;;:::o;15447:85::-;15492:7;15521:5;15510:16;;15447:85;;;:::o;15538:101::-;15574:7;15614:18;15607:5;15603:30;15592:41;;15538:101;;;:::o;15645:156::-;15702:9;15735:60;15752:42;15761:32;15787:5;15761:32;:::i;:::-;15752:42;:::i;:::-;15735:60;:::i;:::-;15722:73;;15645:156;;;:::o;15807:145::-;15901:44;15939:5;15901:44;:::i;:::-;15896:3;15889:57;15807:145;;:::o;15958:236::-;16058:4;16096:2;16085:9;16081:18;16073:26;;16109:78;16184:1;16173:9;16169:17;16160:6;16109:78;:::i;:::-;15958:236;;;;:::o;16200:174::-;16340:26;16336:1;16328:6;16324:14;16317:50;16200:174;:::o;16380:366::-;16522:3;16543:67;16607:2;16602:3;16543:67;:::i;:::-;16536:74;;16619:93;16708:3;16619:93;:::i;:::-;16737:2;16732:3;16728:12;16721:19;;16380:366;;;:::o;16752:419::-;16918:4;16956:2;16945:9;16941:18;16933:26;;17005:9;16999:4;16995:20;16991:1;16980:9;16976:17;16969:47;17033:131;17159:4;17033:131;:::i;:::-;17025:139;;16752:419;;;:::o;17177:223::-;17317:34;17313:1;17305:6;17301:14;17294:58;17386:6;17381:2;17373:6;17369:15;17362:31;17177:223;:::o;17406:366::-;17548:3;17569:67;17633:2;17628:3;17569:67;:::i;:::-;17562:74;;17645:93;17734:3;17645:93;:::i;:::-;17763:2;17758:3;17754:12;17747:19;;17406:366;;;:::o;17778:419::-;17944:4;17982:2;17971:9;17967:18;17959:26;;18031:9;18025:4;18021:20;18017:1;18006:9;18002:17;17995:47;18059:131;18185:4;18059:131;:::i;:::-;18051:139;;17778:419;;;:::o;18203:194::-;18243:4;18263:20;18281:1;18263:20;:::i;:::-;18258:25;;18297:20;18315:1;18297:20;:::i;:::-;18292:25;;18341:1;18338;18334:9;18326:17;;18365:1;18359:4;18356:11;18353:37;;;18370:18;;:::i;:::-;18353:37;18203:194;;;;:::o;18403:180::-;18543:32;18539:1;18531:6;18527:14;18520:56;18403:180;:::o;18589:366::-;18731:3;18752:67;18816:2;18811:3;18752:67;:::i;:::-;18745:74;;18828:93;18917:3;18828:93;:::i;:::-;18946:2;18941:3;18937:12;18930:19;;18589:366;;;:::o;18961:419::-;19127:4;19165:2;19154:9;19150:18;19142:26;;19214:9;19208:4;19204:20;19200:1;19189:9;19185:17;19178:47;19242:131;19368:4;19242:131;:::i;:::-;19234:139;;18961:419;;;:::o;19386:167::-;19526:19;19522:1;19514:6;19510:14;19503:43;19386:167;:::o;19559:366::-;19701:3;19722:67;19786:2;19781:3;19722:67;:::i;:::-;19715:74;;19798:93;19887:3;19798:93;:::i;:::-;19916:2;19911:3;19907:12;19900:19;;19559:366;;;:::o;19931:419::-;20097:4;20135:2;20124:9;20120:18;20112:26;;20184:9;20178:4;20174:20;20170:1;20159:9;20155:17;20148:47;20212:131;20338:4;20212:131;:::i;:::-;20204:139;;19931:419;;;:::o;20356:442::-;20505:4;20543:2;20532:9;20528:18;20520:26;;20556:71;20624:1;20613:9;20609:17;20600:6;20556:71;:::i;:::-;20637:72;20705:2;20694:9;20690:18;20681:6;20637:72;:::i;:::-;20719;20787:2;20776:9;20772:18;20763:6;20719:72;:::i;:::-;20356:442;;;;;;:::o;20804:180::-;20852:77;20849:1;20842:88;20949:4;20946:1;20939:15;20973:4;20970:1;20963:15;20990:185;21030:1;21047:20;21065:1;21047:20;:::i;:::-;21042:25;;21081:20;21099:1;21081:20;:::i;:::-;21076:25;;21120:1;21110:35;;21125:18;;:::i;:::-;21110:35;21167:1;21164;21160:9;21155:14;;20990:185;;;;:::o;21181:191::-;21221:3;21240:20;21258:1;21240:20;:::i;:::-;21235:25;;21274:20;21292:1;21274:20;:::i;:::-;21269:25;;21317:1;21314;21310:9;21303:16;;21338:3;21335:1;21332:10;21329:36;;;21345:18;;:::i;:::-;21329:36;21181:191;;;;:::o;21378:237::-;21518:34;21514:1;21506:6;21502:14;21495:58;21587:20;21582:2;21574:6;21570:15;21563:45;21378:237;:::o;21621:366::-;21763:3;21784:67;21848:2;21843:3;21784:67;:::i;:::-;21777:74;;21860:93;21949:3;21860:93;:::i;:::-;21978:2;21973:3;21969:12;21962:19;;21621:366;;;:::o;21993:419::-;22159:4;22197:2;22186:9;22182:18;22174:26;;22246:9;22240:4;22236:20;22232:1;22221:9;22217:17;22210:47;22274:131;22400:4;22274:131;:::i;:::-;22266:139;;21993:419;;;:::o;22418:122::-;22491:24;22509:5;22491:24;:::i;:::-;22484:5;22481:35;22471:63;;22530:1;22527;22520:12;22471:63;22418:122;:::o;22546:143::-;22603:5;22634:6;22628:13;22619:22;;22650:33;22677:5;22650:33;:::i;:::-;22546:143;;;;:::o;22695:351::-;22765:6;22814:2;22802:9;22793:7;22789:23;22785:32;22782:119;;;22820:79;;:::i;:::-;22782:119;22940:1;22965:64;23021:7;23012:6;23001:9;22997:22;22965:64;:::i;:::-;22955:74;;22911:128;22695:351;;;;:::o;23052:180::-;23100:77;23097:1;23090:88;23197:4;23194:1;23187:15;23221:4;23218:1;23211:15;23238:141;23287:4;23310:3;23302:11;;23333:3;23330:1;23323:14;23367:4;23364:1;23354:18;23346:26;;23238:141;;;:::o;23385:93::-;23422:6;23469:2;23464;23457:5;23453:14;23449:23;23439:33;;23385:93;;;:::o;23484:107::-;23528:8;23578:5;23572:4;23568:16;23547:37;;23484:107;;;;:::o;23597:393::-;23666:6;23716:1;23704:10;23700:18;23739:97;23769:66;23758:9;23739:97;:::i;:::-;23857:39;23887:8;23876:9;23857:39;:::i;:::-;23845:51;;23929:4;23925:9;23918:5;23914:21;23905:30;;23978:4;23968:8;23964:19;23957:5;23954:30;23944:40;;23673:317;;23597:393;;;;;:::o;23996:142::-;24046:9;24079:53;24097:34;24106:24;24124:5;24106:24;:::i;:::-;24097:34;:::i;:::-;24079:53;:::i;:::-;24066:66;;23996:142;;;:::o;24144:75::-;24187:3;24208:5;24201:12;;24144:75;;;:::o;24225:269::-;24335:39;24366:7;24335:39;:::i;:::-;24396:91;24445:41;24469:16;24445:41;:::i;:::-;24437:6;24430:4;24424:11;24396:91;:::i;:::-;24390:4;24383:105;24301:193;24225:269;;;:::o;24500:73::-;24545:3;24500:73;:::o;24579:189::-;24656:32;;:::i;:::-;24697:65;24755:6;24747;24741:4;24697:65;:::i;:::-;24632:136;24579:189;;:::o;24774:186::-;24834:120;24851:3;24844:5;24841:14;24834:120;;;24905:39;24942:1;24935:5;24905:39;:::i;:::-;24878:1;24871:5;24867:13;24858:22;;24834:120;;;24774:186;;:::o;24966:543::-;25067:2;25062:3;25059:11;25056:446;;;25101:38;25133:5;25101:38;:::i;:::-;25185:29;25203:10;25185:29;:::i;:::-;25175:8;25171:44;25368:2;25356:10;25353:18;25350:49;;;25389:8;25374:23;;25350:49;25412:80;25468:22;25486:3;25468:22;:::i;:::-;25458:8;25454:37;25441:11;25412:80;:::i;:::-;25071:431;;25056:446;24966:543;;;:::o;25515:117::-;25569:8;25619:5;25613:4;25609:16;25588:37;;25515:117;;;;:::o;25638:169::-;25682:6;25715:51;25763:1;25759:6;25751:5;25748:1;25744:13;25715:51;:::i;:::-;25711:56;25796:4;25790;25786:15;25776:25;;25689:118;25638:169;;;;:::o;25812:295::-;25888:4;26034:29;26059:3;26053:4;26034:29;:::i;:::-;26026:37;;26096:3;26093:1;26089:11;26083:4;26080:21;26072:29;;25812:295;;;;:::o;26112:1395::-;26229:37;26262:3;26229:37;:::i;:::-;26331:18;26323:6;26320:30;26317:56;;;26353:18;;:::i;:::-;26317:56;26397:38;26429:4;26423:11;26397:38;:::i;:::-;26482:67;26542:6;26534;26528:4;26482:67;:::i;:::-;26576:1;26600:4;26587:17;;26632:2;26624:6;26621:14;26649:1;26644:618;;;;27306:1;27323:6;27320:77;;;27372:9;27367:3;27363:19;27357:26;27348:35;;27320:77;27423:67;27483:6;27476:5;27423:67;:::i;:::-;27417:4;27410:81;27279:222;26614:887;;26644:618;26696:4;26692:9;26684:6;26680:22;26730:37;26762:4;26730:37;:::i;:::-;26789:1;26803:208;26817:7;26814:1;26811:14;26803:208;;;26896:9;26891:3;26887:19;26881:26;26873:6;26866:42;26947:1;26939:6;26935:14;26925:24;;26994:2;26983:9;26979:18;26966:31;;26840:4;26837:1;26833:12;26828:17;;26803:208;;;27039:6;27030:7;27027:19;27024:179;;;27097:9;27092:3;27088:19;27082:26;27140:48;27182:4;27174:6;27170:17;27159:9;27140:48;:::i;:::-;27132:6;27125:64;27047:156;27024:179;27249:1;27245;27237:6;27233:14;27229:22;27223:4;27216:36;26651:611;;;26614:887;;26204:1303;;;26112:1395;;:::o;27513:98::-;27564:6;27598:5;27592:12;27582:22;;27513:98;;;:::o;27617:147::-;27718:11;27755:3;27740:18;;27617:147;;;;:::o;27770:386::-;27874:3;27902:38;27934:5;27902:38;:::i;:::-;27956:88;28037:6;28032:3;27956:88;:::i;:::-;27949:95;;28053:65;28111:6;28106:3;28099:4;28092:5;28088:16;28053:65;:::i;:::-;28143:6;28138:3;28134:16;28127:23;;27878:278;27770:386;;;;:::o;28162:271::-;28292:3;28314:93;28403:3;28394:6;28314:93;:::i;:::-;28307:100;;28424:3;28417:10;;28162:271;;;;:::o
Swarm Source
ipfs://0eb28ab68cc9710183991df1ff3fffca965c769f4f3908f20da7a39a33a1c8a6
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.