Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 177 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Send_mail | 12135367 | 33 days ago | IN | 0 ETH | 0.00001328 | ||||
Send_mail | 12135136 | 33 days ago | IN | 0 ETH | 0.00001241 | ||||
Send_mail | 12135026 | 33 days ago | IN | 0 ETH | 0.00001203 | ||||
Send_mail | 12131008 | 33 days ago | IN | 0 ETH | 0.00001053 | ||||
Send_mail | 12128152 | 33 days ago | IN | 0 ETH | 0.00000998 | ||||
Send_mail | 12126437 | 33 days ago | IN | 0 ETH | 0.00001086 | ||||
Send_mail | 12126315 | 33 days ago | IN | 0 ETH | 0.00001113 | ||||
Send_mail | 12122960 | 33 days ago | IN | 0 ETH | 0.00001358 | ||||
Send_mail | 12122858 | 33 days ago | IN | 0 ETH | 0.0000144 | ||||
Send_mail | 12121177 | 33 days ago | IN | 0 ETH | 0.00001489 | ||||
Send_mail | 12119519 | 34 days ago | IN | 0 ETH | 0.00001185 | ||||
Send_mail | 12119302 | 34 days ago | IN | 0 ETH | 0.00001119 | ||||
Send_mail | 12103989 | 34 days ago | IN | 0 ETH | 0.00001489 | ||||
Send_mail | 12103806 | 34 days ago | IN | 0 ETH | 0.00001417 | ||||
Send_mail | 12101643 | 34 days ago | IN | 0 ETH | 0.00001738 | ||||
Send_mail | 12101476 | 34 days ago | IN | 0 ETH | 0.00001744 | ||||
Send_mail | 12099871 | 34 days ago | IN | 0 ETH | 0.00001685 | ||||
Send_mail | 12099679 | 34 days ago | IN | 0 ETH | 0.00001698 | ||||
Send_mail | 12096220 | 34 days ago | IN | 0 ETH | 0.00001892 | ||||
Send_mail | 12096146 | 34 days ago | IN | 0 ETH | 0.00001871 | ||||
Send_mail | 12095236 | 34 days ago | IN | 0 ETH | 0.00001636 | ||||
Send_mail | 12087790 | 34 days ago | IN | 0 ETH | 0.00000955 | ||||
Send_mail | 12087553 | 34 days ago | IN | 0 ETH | 0.00000966 | ||||
Send_mail | 12086787 | 34 days ago | IN | 0 ETH | 0.00001015 | ||||
Send_mail | 12086533 | 34 days ago | IN | 0 ETH | 0.0000109 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
13538246 | 8 mins ago | 0 ETH | ||||
13538150 | 11 mins ago | 0 ETH | ||||
13538114 | 12 mins ago | 0 ETH | ||||
13537988 | 17 mins ago | 0 ETH | ||||
13537936 | 19 mins ago | 0 ETH | ||||
13537892 | 20 mins ago | 0 ETH | ||||
13537875 | 21 mins ago | 0 ETH | ||||
13537784 | 24 mins ago | 0 ETH | ||||
13537752 | 25 mins ago | 0 ETH | ||||
13537710 | 26 mins ago | 0 ETH | ||||
13537701 | 27 mins ago | 0 ETH | ||||
13537692 | 27 mins ago | 0 ETH | ||||
13537692 | 27 mins ago | 0 ETH | ||||
13537680 | 27 mins ago | 0 ETH | ||||
13537631 | 29 mins ago | 0 ETH | ||||
13537619 | 29 mins ago | 0 ETH | ||||
13537328 | 39 mins ago | 0 ETH | ||||
13537316 | 40 mins ago | 0 ETH | ||||
13537309 | 40 mins ago | 0 ETH | ||||
13537292 | 41 mins ago | 0 ETH | ||||
13537208 | 43 mins ago | 0 ETH | ||||
13537199 | 44 mins ago | 0 ETH | ||||
13537199 | 44 mins ago | 0 ETH | ||||
13537164 | 45 mins ago | 0 ETH | ||||
13537072 | 48 mins ago | 0 ETH |
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 Name:
Dmail
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at lineascan.build/ on 2023-09-12 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol) // This file was procedurally generated from scripts/generate/templates/StorageSlot.js. pragma solidity ^0.8.0; /** * @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(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._ * _Available since v4.9 for `string`, `bytes`._ */ library StorageSlotUpgradeable { 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-upgradeable/interfaces/IERC1967Upgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol) pragma solidity ^0.8.0; /** * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC. * * _Available since v4.8.3._ */ interface IERC1967Upgradeable { /** * @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); } // File: @openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); } // File: @openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @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 IERC1822ProxiableUpgradeable { /** * @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-upgradeable/utils/AddressUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @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 Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 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 functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _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 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _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() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @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 { require(!_initializing, "Initializable: contract is initializing"); if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } } // File: @openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ */ abstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable { function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { AddressUpgradeable.functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {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 bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; /** * @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. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @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() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @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() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } /** * @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 override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeTo(address newImplementation) public virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } /** * @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, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract 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; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File: @openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File: @openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File: @openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20MetadataUpgradeable is IERC20Upgradeable { /** * @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/token/ERC20/ERC20Upgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @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}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * 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. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @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 { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { 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 override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` 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 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); 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 `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `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. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` 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. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[45] private __gap; } // File: @openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20BurnableUpgradeable is Initializable, ContextUpgradeable, ERC20Upgradeable { function __ERC20Burnable_init() internal onlyInitializing { } function __ERC20Burnable_init_unchained() internal onlyInitializing { } /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: contracts/Dmail.sol pragma solidity ^0.8.18; contract Dmail is Initializable, ERC20Upgradeable, ERC20BurnableUpgradeable, PausableUpgradeable, OwnableUpgradeable, UUPSUpgradeable { event Message( address indexed from, string indexed to, string indexed path ); /// @custom:oz-upgrades-unsafe-allow constructor constructor() { _disableInitializers(); } function initialize() initializer public { __ERC20_init("Dmail Mail Token", "DMT"); __ERC20Burnable_init(); __Pausable_init(); __Ownable_init(); __UUPSUpgradeable_init(); } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function mint(address to, uint256 amount) public onlyOwner { _mint(to, amount); } function send_mail(string memory to, string memory path) public { address owner = _msgSender(); emit Message(owner,to,path); } function _beforeTokenTransfer(address from, address to, uint256 amount) internal whenNotPaused override { super._beforeTokenTransfer(from, to, amount); } function _authorizeUpgrade(address newImplementation) internal onlyOwner override {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"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":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"string","name":"to","type":"string"},{"indexed":true,"internalType":"string","name":"path","type":"string"}],"name":"Message","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"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":"amount","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":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"to","type":"string"},{"internalType":"string","name":"path","type":"string"}],"name":"send_mail","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"amount","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":"amount","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":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60a06040523073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff168152503480156200004457600080fd5b50620000556200005b60201b60201c565b62000205565b600060019054906101000a900460ff1615620000ae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000a590620001a8565b60405180910390fd5b60ff801660008054906101000a900460ff1660ff16146200011f5760ff6000806101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff604051620001169190620001e8565b60405180910390a15b565b600082825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e69746960008201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b60006200019060278362000121565b91506200019d8262000132565b604082019050919050565b60006020820190508181036000830152620001c38162000181565b9050919050565b600060ff82169050919050565b620001e281620001ca565b82525050565b6000602082019050620001ff6000830184620001d7565b92915050565b6080516139a56200023d600039600081816106aa01528181610738015281816108a50152818161093301526109e301526139a56000f3fe6080604052600436106101665760003560e01c80635b7d7482116100d15780638456cb591161008a578063a457c2d711610064578063a457c2d7146104d1578063a9059cbb1461050e578063dd62ed3e1461054b578063f2fde38b1461058857610166565b80638456cb59146104645780638da5cb5b1461047b57806395d89b41146104a657610166565b80635b7d74821461037c5780635c975abb146103a557806370a08231146103d0578063715018a61461040d57806379cc6790146104245780638129fc1c1461044d57610166565b80633950935111610123578063395093511461028f5780633f4ba83a146102cc57806340c10f19146102e357806342966c681461030c5780634f1ef2861461033557806352d1902d1461035157610166565b806306fdde031461016b578063095ea7b31461019657806318160ddd146101d357806323b872dd146101fe578063313ce5671461023b5780633659cfe614610266575b600080fd5b34801561017757600080fd5b506101806105b1565b60405161018d91906122d7565b60405180910390f35b3480156101a257600080fd5b506101bd60048036038101906101b891906123a1565b610643565b6040516101ca91906123fc565b60405180910390f35b3480156101df57600080fd5b506101e8610666565b6040516101f59190612426565b60405180910390f35b34801561020a57600080fd5b5061022560048036038101906102209190612441565b610670565b60405161023291906123fc565b60405180910390f35b34801561024757600080fd5b5061025061069f565b60405161025d91906124b0565b60405180910390f35b34801561027257600080fd5b5061028d600480360381019061028891906124cb565b6106a8565b005b34801561029b57600080fd5b506102b660048036038101906102b191906123a1565b610830565b6040516102c391906123fc565b60405180910390f35b3480156102d857600080fd5b506102e1610867565b005b3480156102ef57600080fd5b5061030a600480360381019061030591906123a1565b610879565b005b34801561031857600080fd5b50610333600480360381019061032e91906124f8565b61088f565b005b61034f600480360381019061034a919061265a565b6108a3565b005b34801561035d57600080fd5b506103666109df565b60405161037391906126cf565b60405180910390f35b34801561038857600080fd5b506103a3600480360381019061039e919061278b565b610a98565b005b3480156103b157600080fd5b506103ba610b18565b6040516103c791906123fc565b60405180910390f35b3480156103dc57600080fd5b506103f760048036038101906103f291906124cb565b610b2f565b6040516104049190612426565b60405180910390f35b34801561041957600080fd5b50610422610b78565b005b34801561043057600080fd5b5061044b600480360381019061044691906123a1565b610b8c565b005b34801561045957600080fd5b50610462610bac565b005b34801561047057600080fd5b50610479610d76565b005b34801561048757600080fd5b50610490610d88565b60405161049d9190612812565b60405180910390f35b3480156104b257600080fd5b506104bb610db2565b6040516104c891906122d7565b60405180910390f35b3480156104dd57600080fd5b506104f860048036038101906104f391906123a1565b610e44565b60405161050591906123fc565b60405180910390f35b34801561051a57600080fd5b50610535600480360381019061053091906123a1565b610ebb565b60405161054291906123fc565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d919061282d565b610ede565b60405161057f9190612426565b60405180910390f35b34801561059457600080fd5b506105af60048036038101906105aa91906124cb565b610f65565b005b6060603680546105c09061289c565b80601f01602080910402602001604051908101604052809291908181526020018280546105ec9061289c565b80156106395780601f1061060e57610100808354040283529160200191610639565b820191906000526020600020905b81548152906001019060200180831161061c57829003601f168201915b5050505050905090565b60008061064e610fe8565b905061065b818585610ff0565b600191505092915050565b6000603554905090565b60008061067b610fe8565b90506106888582856111b9565b610693858585611245565b60019150509392505050565b60006012905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1603610736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072d9061293f565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166107756114be565b73ffffffffffffffffffffffffffffffffffffffff16146107cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c2906129d1565b60405180910390fd5b6107d481611515565b61082d81600067ffffffffffffffff8111156107f3576107f261252f565b5b6040519080825280601f01601f1916602001820160405280156108255781602001600182028036833780820191505090505b506000611520565b50565b60008061083b610fe8565b905061085c81858561084d8589610ede565b6108579190612a20565b610ff0565b600191505092915050565b61086f61168e565b61087761170c565b565b61088161168e565b61088b828261176f565b5050565b6108a061089a610fe8565b826118c6565b50565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1603610931576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109289061293f565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166109706114be565b73ffffffffffffffffffffffffffffffffffffffff16146109c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bd906129d1565b60405180910390fd5b6109cf82611515565b6109db82826001611520565b5050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614610a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6690612ac6565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905090565b6000610aa2610fe8565b905081604051610ab29190612b22565b604051809103902083604051610ac89190612b22565b60405180910390208273ffffffffffffffffffffffffffffffffffffffff167f5c0bf6ba470f83fe17f0b8fd9fdf4799eaeb1b63bbf39e4868fc7e0798e7abeb60405160405180910390a4505050565b6000609760009054906101000a900460ff16905090565b6000603360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b8061168e565b610b8a6000611a95565b565b610b9e82610b98610fe8565b836111b9565b610ba882826118c6565b5050565b60008060019054906101000a900460ff16159050808015610bdd5750600160008054906101000a900460ff1660ff16105b80610c0a5750610bec30611b5b565b158015610c095750600160008054906101000a900460ff1660ff16145b5b610c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4090612bab565b60405180910390fd5b60016000806101000a81548160ff021916908360ff1602179055508015610c86576001600060016101000a81548160ff0219169083151502179055505b610cfa6040518060400160405280601081526020017f446d61696c204d61696c20546f6b656e000000000000000000000000000000008152506040518060400160405280600381526020017f444d540000000000000000000000000000000000000000000000000000000000815250611b7e565b610d02611bdb565b610d0a611c2c565b610d12611c85565b610d1a611cde565b8015610d735760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051610d6a9190612c10565b60405180910390a15b50565b610d7e61168e565b610d86611d2f565b565b600060c960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060378054610dc19061289c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ded9061289c565b8015610e3a5780601f10610e0f57610100808354040283529160200191610e3a565b820191906000526020600020905b815481529060010190602001808311610e1d57829003601f168201915b5050505050905090565b600080610e4f610fe8565b90506000610e5d8286610ede565b905083811015610ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9990612c9d565b60405180910390fd5b610eaf8286868403610ff0565b60019250505092915050565b600080610ec6610fe8565b9050610ed3818585611245565b600191505092915050565b6000603460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610f6d61168e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd390612d2f565b60405180910390fd5b610fe581611a95565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361105f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105690612dc1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c590612e53565b60405180910390fd5b80603460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516111ac9190612426565b60405180910390a3505050565b60006111c58484610ede565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461123f5781811015611231576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122890612ebf565b60405180910390fd5b61123e8484848403610ff0565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ab90612f51565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131a90612fe3565b60405180910390fd5b61132e838383611d92565b6000603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156113b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ac90613075565b60405180910390fd5b818103603360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114a59190612426565b60405180910390a36114b8848484611daa565b50505050565b60006114ec7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b611daf565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61151d61168e565b50565b61154c7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd914360001b611db9565b60000160009054906101000a900460ff16156115705761156b83611dc3565b611689565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156115d857506040513d601f19601f820116820180604052508101906115d591906130c1565b60015b611617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160e90613160565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b811461167c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611673906131f2565b60405180910390fd5b50611688838383611e7c565b5b505050565b611696610fe8565b73ffffffffffffffffffffffffffffffffffffffff166116b4610d88565b73ffffffffffffffffffffffffffffffffffffffff161461170a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117019061325e565b60405180910390fd5b565b611714611ea8565b6000609760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611758610fe8565b6040516117659190612812565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d5906132ca565b60405180910390fd5b6117ea60008383611d92565b80603560008282546117fc9190612a20565b9250508190555080603360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118ae9190612426565b60405180910390a36118c260008383611daa565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192c9061335c565b60405180910390fd5b61194182600083611d92565b6000603360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf906133ee565b60405180910390fd5b818103603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081603560008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a7c9190612426565b60405180910390a3611a9083600084611daa565b505050565b600060c960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160c960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16611bcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc490613480565b60405180910390fd5b611bd78282611ef1565b5050565b600060019054906101000a900460ff16611c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2190613480565b60405180910390fd5b565b600060019054906101000a900460ff16611c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7290613480565b60405180910390fd5b611c83611f64565b565b600060019054906101000a900460ff16611cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccb90613480565b60405180910390fd5b611cdc611fd0565b565b600060019054906101000a900460ff16611d2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2490613480565b60405180910390fd5b565b611d37612031565b6001609760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611d7b610fe8565b604051611d889190612812565b60405180910390a1565b611d9a612031565b611da583838361207b565b505050565b505050565b6000819050919050565b6000819050919050565b611dcc81611b5b565b611e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0290613512565b60405180910390fd5b80611e387f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b611daf565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611e8583612080565b600082511180611e925750805b15611ea357611ea183836120cf565b505b505050565b611eb0610b18565b611eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee69061357e565b60405180910390fd5b565b600060019054906101000a900460ff16611f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3790613480565b60405180910390fd5b8160369081611f4f9190613740565b508060379081611f5f9190613740565b505050565b600060019054906101000a900460ff16611fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611faa90613480565b60405180910390fd5b6000609760006101000a81548160ff021916908315150217905550565b600060019054906101000a900460ff1661201f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201690613480565b60405180910390fd5b61202f61202a610fe8565b611a95565b565b612039610b18565b15612079576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120709061385e565b60405180910390fd5b565b505050565b61208981611dc3565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b60606120f48383604051806060016040528060278152602001613949602791396120fc565b905092915050565b60606000808573ffffffffffffffffffffffffffffffffffffffff168560405161212691906138c5565b600060405180830381855af49150503d8060008114612161576040519150601f19603f3d011682016040523d82523d6000602084013e612166565b606091505b509150915061217786838387612182565b925050509392505050565b606083156121e45760008351036121dc5761219c85611b5b565b6121db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d290613928565b60405180910390fd5b5b8290506121ef565b6121ee83836121f7565b5b949350505050565b60008251111561220a5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223e91906122d7565b60405180910390fd5b600081519050919050565b600082825260208201905092915050565b60005b83811015612281578082015181840152602081019050612266565b60008484015250505050565b6000601f19601f8301169050919050565b60006122a982612247565b6122b38185612252565b93506122c3818560208601612263565b6122cc8161228d565b840191505092915050565b600060208201905081810360008301526122f1818461229e565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123388261230d565b9050919050565b6123488161232d565b811461235357600080fd5b50565b6000813590506123658161233f565b92915050565b6000819050919050565b61237e8161236b565b811461238957600080fd5b50565b60008135905061239b81612375565b92915050565b600080604083850312156123b8576123b7612303565b5b60006123c685828601612356565b92505060206123d78582860161238c565b9150509250929050565b60008115159050919050565b6123f6816123e1565b82525050565b600060208201905061241160008301846123ed565b92915050565b6124208161236b565b82525050565b600060208201905061243b6000830184612417565b92915050565b60008060006060848603121561245a57612459612303565b5b600061246886828701612356565b935050602061247986828701612356565b925050604061248a8682870161238c565b9150509250925092565b600060ff82169050919050565b6124aa81612494565b82525050565b60006020820190506124c560008301846124a1565b92915050565b6000602082840312156124e1576124e0612303565b5b60006124ef84828501612356565b91505092915050565b60006020828403121561250e5761250d612303565b5b600061251c8482850161238c565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6125678261228d565b810181811067ffffffffffffffff821117156125865761258561252f565b5b80604052505050565b60006125996122f9565b90506125a5828261255e565b919050565b600067ffffffffffffffff8211156125c5576125c461252f565b5b6125ce8261228d565b9050602081019050919050565b82818337600083830152505050565b60006125fd6125f8846125aa565b61258f565b9050828152602081018484840111156126195761261861252a565b5b6126248482856125db565b509392505050565b600082601f83011261264157612640612525565b5b81356126518482602086016125ea565b91505092915050565b6000806040838503121561267157612670612303565b5b600061267f85828601612356565b925050602083013567ffffffffffffffff8111156126a05761269f612308565b5b6126ac8582860161262c565b9150509250929050565b6000819050919050565b6126c9816126b6565b82525050565b60006020820190506126e460008301846126c0565b92915050565b600067ffffffffffffffff8211156127055761270461252f565b5b61270e8261228d565b9050602081019050919050565b600061272e612729846126ea565b61258f565b90508281526020810184848401111561274a5761274961252a565b5b6127558482856125db565b509392505050565b600082601f83011261277257612771612525565b5b813561278284826020860161271b565b91505092915050565b600080604083850312156127a2576127a1612303565b5b600083013567ffffffffffffffff8111156127c0576127bf612308565b5b6127cc8582860161275d565b925050602083013567ffffffffffffffff8111156127ed576127ec612308565b5b6127f98582860161275d565b9150509250929050565b61280c8161232d565b82525050565b60006020820190506128276000830184612803565b92915050565b6000806040838503121561284457612843612303565b5b600061285285828601612356565b925050602061286385828601612356565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806128b457607f821691505b6020821081036128c7576128c661286d565b5b50919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060008201527f64656c656761746563616c6c0000000000000000000000000000000000000000602082015250565b6000612929602c83612252565b9150612934826128cd565b604082019050919050565b600060208201905081810360008301526129588161291c565b9050919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060008201527f6163746976652070726f78790000000000000000000000000000000000000000602082015250565b60006129bb602c83612252565b91506129c68261295f565b604082019050919050565b600060208201905081810360008301526129ea816129ae565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a2b8261236b565b9150612a368361236b565b9250828201905080821115612a4e57612a4d6129f1565b5b92915050565b7f555550535570677261646561626c653a206d757374206e6f742062652063616c60008201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000602082015250565b6000612ab0603883612252565b9150612abb82612a54565b604082019050919050565b60006020820190508181036000830152612adf81612aa3565b9050919050565b600081905092915050565b6000612afc82612247565b612b068185612ae6565b9350612b16818560208601612263565b80840191505092915050565b6000612b2e8284612af1565b915081905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000612b95602e83612252565b9150612ba082612b39565b604082019050919050565b60006020820190508181036000830152612bc481612b88565b9050919050565b6000819050919050565b6000819050919050565b6000612bfa612bf5612bf084612bcb565b612bd5565b612494565b9050919050565b612c0a81612bdf565b82525050565b6000602082019050612c256000830184612c01565b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612c87602583612252565b9150612c9282612c2b565b604082019050919050565b60006020820190508181036000830152612cb681612c7a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612d19602683612252565b9150612d2482612cbd565b604082019050919050565b60006020820190508181036000830152612d4881612d0c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612dab602483612252565b9150612db682612d4f565b604082019050919050565b60006020820190508181036000830152612dda81612d9e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e3d602283612252565b9150612e4882612de1565b604082019050919050565b60006020820190508181036000830152612e6c81612e30565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612ea9601d83612252565b9150612eb482612e73565b602082019050919050565b60006020820190508181036000830152612ed881612e9c565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612f3b602583612252565b9150612f4682612edf565b604082019050919050565b60006020820190508181036000830152612f6a81612f2e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612fcd602383612252565b9150612fd882612f71565b604082019050919050565b60006020820190508181036000830152612ffc81612fc0565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061305f602683612252565b915061306a82613003565b604082019050919050565b6000602082019050818103600083015261308e81613052565b9050919050565b61309e816126b6565b81146130a957600080fd5b50565b6000815190506130bb81613095565b92915050565b6000602082840312156130d7576130d6612303565b5b60006130e5848285016130ac565b91505092915050565b7f45524331393637557067726164653a206e657720696d706c656d656e7461746960008201527f6f6e206973206e6f742055555053000000000000000000000000000000000000602082015250565b600061314a602e83612252565b9150613155826130ee565b604082019050919050565b600060208201905081810360008301526131798161313d565b9050919050565b7f45524331393637557067726164653a20756e737570706f727465642070726f7860008201527f6961626c65555549440000000000000000000000000000000000000000000000602082015250565b60006131dc602983612252565b91506131e782613180565b604082019050919050565b6000602082019050818103600083015261320b816131cf565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613248602083612252565b915061325382613212565b602082019050919050565b600060208201905081810360008301526132778161323b565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006132b4601f83612252565b91506132bf8261327e565b602082019050919050565b600060208201905081810360008301526132e3816132a7565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613346602183612252565b9150613351826132ea565b604082019050919050565b6000602082019050818103600083015261337581613339565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006133d8602283612252565b91506133e38261337c565b604082019050919050565b60006020820190508181036000830152613407816133cb565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b600061346a602b83612252565b91506134758261340e565b604082019050919050565b600060208201905081810360008301526134998161345d565b9050919050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b60006134fc602d83612252565b9150613507826134a0565b604082019050919050565b6000602082019050818103600083015261352b816134ef565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613568601483612252565b915061357382613532565b602082019050919050565b600060208201905081810360008301526135978161355b565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826135c3565b61360a86836135c3565b95508019841693508086168417925050509392505050565b600061363d6136386136338461236b565b612bd5565b61236b565b9050919050565b6000819050919050565b61365783613622565b61366b61366382613644565b8484546135d0565b825550505050565b600090565b613680613673565b61368b81848461364e565b505050565b5b818110156136af576136a4600082613678565b600181019050613691565b5050565b601f8211156136f4576136c58161359e565b6136ce846135b3565b810160208510156136dd578190505b6136f16136e9856135b3565b830182613690565b50505b505050565b600082821c905092915050565b6000613717600019846008026136f9565b1980831691505092915050565b60006137308383613706565b9150826002028217905092915050565b61374982612247565b67ffffffffffffffff8111156137625761376161252f565b5b61376c825461289c565b6137778282856136b3565b600060209050601f8311600181146137aa5760008415613798578287015190505b6137a28582613724565b86555061380a565b601f1984166137b88661359e565b60005b828110156137e0578489015182556001820191506020850194506020810190506137bb565b868310156137fd57848901516137f9601f891682613706565b8355505b6001600288020188555050505b505050505050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613848601083612252565b915061385382613812565b602082019050919050565b600060208201905081810360008301526138778161383b565b9050919050565b600081519050919050565b600081905092915050565b600061389f8261387e565b6138a98185613889565b93506138b9818560208601612263565b80840191505092915050565b60006138d18284613894565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613912601d83612252565b915061391d826138dc565b602082019050919050565b6000602082019050818103600083015261394181613905565b905091905056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ada24e0abf9f1e20949e60d9c55d9bcf2698c87949a4b980eb41348fcd6c328364736f6c63430008120033
Deployed Bytecode
0x6080604052600436106101665760003560e01c80635b7d7482116100d15780638456cb591161008a578063a457c2d711610064578063a457c2d7146104d1578063a9059cbb1461050e578063dd62ed3e1461054b578063f2fde38b1461058857610166565b80638456cb59146104645780638da5cb5b1461047b57806395d89b41146104a657610166565b80635b7d74821461037c5780635c975abb146103a557806370a08231146103d0578063715018a61461040d57806379cc6790146104245780638129fc1c1461044d57610166565b80633950935111610123578063395093511461028f5780633f4ba83a146102cc57806340c10f19146102e357806342966c681461030c5780634f1ef2861461033557806352d1902d1461035157610166565b806306fdde031461016b578063095ea7b31461019657806318160ddd146101d357806323b872dd146101fe578063313ce5671461023b5780633659cfe614610266575b600080fd5b34801561017757600080fd5b506101806105b1565b60405161018d91906122d7565b60405180910390f35b3480156101a257600080fd5b506101bd60048036038101906101b891906123a1565b610643565b6040516101ca91906123fc565b60405180910390f35b3480156101df57600080fd5b506101e8610666565b6040516101f59190612426565b60405180910390f35b34801561020a57600080fd5b5061022560048036038101906102209190612441565b610670565b60405161023291906123fc565b60405180910390f35b34801561024757600080fd5b5061025061069f565b60405161025d91906124b0565b60405180910390f35b34801561027257600080fd5b5061028d600480360381019061028891906124cb565b6106a8565b005b34801561029b57600080fd5b506102b660048036038101906102b191906123a1565b610830565b6040516102c391906123fc565b60405180910390f35b3480156102d857600080fd5b506102e1610867565b005b3480156102ef57600080fd5b5061030a600480360381019061030591906123a1565b610879565b005b34801561031857600080fd5b50610333600480360381019061032e91906124f8565b61088f565b005b61034f600480360381019061034a919061265a565b6108a3565b005b34801561035d57600080fd5b506103666109df565b60405161037391906126cf565b60405180910390f35b34801561038857600080fd5b506103a3600480360381019061039e919061278b565b610a98565b005b3480156103b157600080fd5b506103ba610b18565b6040516103c791906123fc565b60405180910390f35b3480156103dc57600080fd5b506103f760048036038101906103f291906124cb565b610b2f565b6040516104049190612426565b60405180910390f35b34801561041957600080fd5b50610422610b78565b005b34801561043057600080fd5b5061044b600480360381019061044691906123a1565b610b8c565b005b34801561045957600080fd5b50610462610bac565b005b34801561047057600080fd5b50610479610d76565b005b34801561048757600080fd5b50610490610d88565b60405161049d9190612812565b60405180910390f35b3480156104b257600080fd5b506104bb610db2565b6040516104c891906122d7565b60405180910390f35b3480156104dd57600080fd5b506104f860048036038101906104f391906123a1565b610e44565b60405161050591906123fc565b60405180910390f35b34801561051a57600080fd5b50610535600480360381019061053091906123a1565b610ebb565b60405161054291906123fc565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d919061282d565b610ede565b60405161057f9190612426565b60405180910390f35b34801561059457600080fd5b506105af60048036038101906105aa91906124cb565b610f65565b005b6060603680546105c09061289c565b80601f01602080910402602001604051908101604052809291908181526020018280546105ec9061289c565b80156106395780601f1061060e57610100808354040283529160200191610639565b820191906000526020600020905b81548152906001019060200180831161061c57829003601f168201915b5050505050905090565b60008061064e610fe8565b905061065b818585610ff0565b600191505092915050565b6000603554905090565b60008061067b610fe8565b90506106888582856111b9565b610693858585611245565b60019150509392505050565b60006012905090565b7f000000000000000000000000564477025731ee7197eecf2c4a0d0106cc3e457273ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1603610736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072d9061293f565b60405180910390fd5b7f000000000000000000000000564477025731ee7197eecf2c4a0d0106cc3e457273ffffffffffffffffffffffffffffffffffffffff166107756114be565b73ffffffffffffffffffffffffffffffffffffffff16146107cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c2906129d1565b60405180910390fd5b6107d481611515565b61082d81600067ffffffffffffffff8111156107f3576107f261252f565b5b6040519080825280601f01601f1916602001820160405280156108255781602001600182028036833780820191505090505b506000611520565b50565b60008061083b610fe8565b905061085c81858561084d8589610ede565b6108579190612a20565b610ff0565b600191505092915050565b61086f61168e565b61087761170c565b565b61088161168e565b61088b828261176f565b5050565b6108a061089a610fe8565b826118c6565b50565b7f000000000000000000000000564477025731ee7197eecf2c4a0d0106cc3e457273ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1603610931576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109289061293f565b60405180910390fd5b7f000000000000000000000000564477025731ee7197eecf2c4a0d0106cc3e457273ffffffffffffffffffffffffffffffffffffffff166109706114be565b73ffffffffffffffffffffffffffffffffffffffff16146109c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bd906129d1565b60405180910390fd5b6109cf82611515565b6109db82826001611520565b5050565b60007f000000000000000000000000564477025731ee7197eecf2c4a0d0106cc3e457273ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614610a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6690612ac6565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905090565b6000610aa2610fe8565b905081604051610ab29190612b22565b604051809103902083604051610ac89190612b22565b60405180910390208273ffffffffffffffffffffffffffffffffffffffff167f5c0bf6ba470f83fe17f0b8fd9fdf4799eaeb1b63bbf39e4868fc7e0798e7abeb60405160405180910390a4505050565b6000609760009054906101000a900460ff16905090565b6000603360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b8061168e565b610b8a6000611a95565b565b610b9e82610b98610fe8565b836111b9565b610ba882826118c6565b5050565b60008060019054906101000a900460ff16159050808015610bdd5750600160008054906101000a900460ff1660ff16105b80610c0a5750610bec30611b5b565b158015610c095750600160008054906101000a900460ff1660ff16145b5b610c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4090612bab565b60405180910390fd5b60016000806101000a81548160ff021916908360ff1602179055508015610c86576001600060016101000a81548160ff0219169083151502179055505b610cfa6040518060400160405280601081526020017f446d61696c204d61696c20546f6b656e000000000000000000000000000000008152506040518060400160405280600381526020017f444d540000000000000000000000000000000000000000000000000000000000815250611b7e565b610d02611bdb565b610d0a611c2c565b610d12611c85565b610d1a611cde565b8015610d735760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051610d6a9190612c10565b60405180910390a15b50565b610d7e61168e565b610d86611d2f565b565b600060c960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060378054610dc19061289c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ded9061289c565b8015610e3a5780601f10610e0f57610100808354040283529160200191610e3a565b820191906000526020600020905b815481529060010190602001808311610e1d57829003601f168201915b5050505050905090565b600080610e4f610fe8565b90506000610e5d8286610ede565b905083811015610ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9990612c9d565b60405180910390fd5b610eaf8286868403610ff0565b60019250505092915050565b600080610ec6610fe8565b9050610ed3818585611245565b600191505092915050565b6000603460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610f6d61168e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd390612d2f565b60405180910390fd5b610fe581611a95565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361105f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105690612dc1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c590612e53565b60405180910390fd5b80603460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516111ac9190612426565b60405180910390a3505050565b60006111c58484610ede565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461123f5781811015611231576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122890612ebf565b60405180910390fd5b61123e8484848403610ff0565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ab90612f51565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131a90612fe3565b60405180910390fd5b61132e838383611d92565b6000603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156113b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ac90613075565b60405180910390fd5b818103603360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114a59190612426565b60405180910390a36114b8848484611daa565b50505050565b60006114ec7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b611daf565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61151d61168e565b50565b61154c7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd914360001b611db9565b60000160009054906101000a900460ff16156115705761156b83611dc3565b611689565b8273ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156115d857506040513d601f19601f820116820180604052508101906115d591906130c1565b60015b611617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160e90613160565b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b811461167c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611673906131f2565b60405180910390fd5b50611688838383611e7c565b5b505050565b611696610fe8565b73ffffffffffffffffffffffffffffffffffffffff166116b4610d88565b73ffffffffffffffffffffffffffffffffffffffff161461170a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117019061325e565b60405180910390fd5b565b611714611ea8565b6000609760006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611758610fe8565b6040516117659190612812565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d5906132ca565b60405180910390fd5b6117ea60008383611d92565b80603560008282546117fc9190612a20565b9250508190555080603360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118ae9190612426565b60405180910390a36118c260008383611daa565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192c9061335c565b60405180910390fd5b61194182600083611d92565b6000603360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf906133ee565b60405180910390fd5b818103603360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081603560008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a7c9190612426565b60405180910390a3611a9083600084611daa565b505050565b600060c960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160c960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16611bcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc490613480565b60405180910390fd5b611bd78282611ef1565b5050565b600060019054906101000a900460ff16611c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2190613480565b60405180910390fd5b565b600060019054906101000a900460ff16611c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7290613480565b60405180910390fd5b611c83611f64565b565b600060019054906101000a900460ff16611cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccb90613480565b60405180910390fd5b611cdc611fd0565b565b600060019054906101000a900460ff16611d2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2490613480565b60405180910390fd5b565b611d37612031565b6001609760006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611d7b610fe8565b604051611d889190612812565b60405180910390a1565b611d9a612031565b611da583838361207b565b505050565b505050565b6000819050919050565b6000819050919050565b611dcc81611b5b565b611e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0290613512565b60405180910390fd5b80611e387f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b611daf565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611e8583612080565b600082511180611e925750805b15611ea357611ea183836120cf565b505b505050565b611eb0610b18565b611eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee69061357e565b60405180910390fd5b565b600060019054906101000a900460ff16611f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3790613480565b60405180910390fd5b8160369081611f4f9190613740565b508060379081611f5f9190613740565b505050565b600060019054906101000a900460ff16611fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611faa90613480565b60405180910390fd5b6000609760006101000a81548160ff021916908315150217905550565b600060019054906101000a900460ff1661201f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201690613480565b60405180910390fd5b61202f61202a610fe8565b611a95565b565b612039610b18565b15612079576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120709061385e565b60405180910390fd5b565b505050565b61208981611dc3565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b60606120f48383604051806060016040528060278152602001613949602791396120fc565b905092915050565b60606000808573ffffffffffffffffffffffffffffffffffffffff168560405161212691906138c5565b600060405180830381855af49150503d8060008114612161576040519150601f19603f3d011682016040523d82523d6000602084013e612166565b606091505b509150915061217786838387612182565b925050509392505050565b606083156121e45760008351036121dc5761219c85611b5b565b6121db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d290613928565b60405180910390fd5b5b8290506121ef565b6121ee83836121f7565b5b949350505050565b60008251111561220a5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223e91906122d7565b60405180910390fd5b600081519050919050565b600082825260208201905092915050565b60005b83811015612281578082015181840152602081019050612266565b60008484015250505050565b6000601f19601f8301169050919050565b60006122a982612247565b6122b38185612252565b93506122c3818560208601612263565b6122cc8161228d565b840191505092915050565b600060208201905081810360008301526122f1818461229e565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123388261230d565b9050919050565b6123488161232d565b811461235357600080fd5b50565b6000813590506123658161233f565b92915050565b6000819050919050565b61237e8161236b565b811461238957600080fd5b50565b60008135905061239b81612375565b92915050565b600080604083850312156123b8576123b7612303565b5b60006123c685828601612356565b92505060206123d78582860161238c565b9150509250929050565b60008115159050919050565b6123f6816123e1565b82525050565b600060208201905061241160008301846123ed565b92915050565b6124208161236b565b82525050565b600060208201905061243b6000830184612417565b92915050565b60008060006060848603121561245a57612459612303565b5b600061246886828701612356565b935050602061247986828701612356565b925050604061248a8682870161238c565b9150509250925092565b600060ff82169050919050565b6124aa81612494565b82525050565b60006020820190506124c560008301846124a1565b92915050565b6000602082840312156124e1576124e0612303565b5b60006124ef84828501612356565b91505092915050565b60006020828403121561250e5761250d612303565b5b600061251c8482850161238c565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6125678261228d565b810181811067ffffffffffffffff821117156125865761258561252f565b5b80604052505050565b60006125996122f9565b90506125a5828261255e565b919050565b600067ffffffffffffffff8211156125c5576125c461252f565b5b6125ce8261228d565b9050602081019050919050565b82818337600083830152505050565b60006125fd6125f8846125aa565b61258f565b9050828152602081018484840111156126195761261861252a565b5b6126248482856125db565b509392505050565b600082601f83011261264157612640612525565b5b81356126518482602086016125ea565b91505092915050565b6000806040838503121561267157612670612303565b5b600061267f85828601612356565b925050602083013567ffffffffffffffff8111156126a05761269f612308565b5b6126ac8582860161262c565b9150509250929050565b6000819050919050565b6126c9816126b6565b82525050565b60006020820190506126e460008301846126c0565b92915050565b600067ffffffffffffffff8211156127055761270461252f565b5b61270e8261228d565b9050602081019050919050565b600061272e612729846126ea565b61258f565b90508281526020810184848401111561274a5761274961252a565b5b6127558482856125db565b509392505050565b600082601f83011261277257612771612525565b5b813561278284826020860161271b565b91505092915050565b600080604083850312156127a2576127a1612303565b5b600083013567ffffffffffffffff8111156127c0576127bf612308565b5b6127cc8582860161275d565b925050602083013567ffffffffffffffff8111156127ed576127ec612308565b5b6127f98582860161275d565b9150509250929050565b61280c8161232d565b82525050565b60006020820190506128276000830184612803565b92915050565b6000806040838503121561284457612843612303565b5b600061285285828601612356565b925050602061286385828601612356565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806128b457607f821691505b6020821081036128c7576128c661286d565b5b50919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060008201527f64656c656761746563616c6c0000000000000000000000000000000000000000602082015250565b6000612929602c83612252565b9150612934826128cd565b604082019050919050565b600060208201905081810360008301526129588161291c565b9050919050565b7f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060008201527f6163746976652070726f78790000000000000000000000000000000000000000602082015250565b60006129bb602c83612252565b91506129c68261295f565b604082019050919050565b600060208201905081810360008301526129ea816129ae565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a2b8261236b565b9150612a368361236b565b9250828201905080821115612a4e57612a4d6129f1565b5b92915050565b7f555550535570677261646561626c653a206d757374206e6f742062652063616c60008201527f6c6564207468726f7567682064656c656761746563616c6c0000000000000000602082015250565b6000612ab0603883612252565b9150612abb82612a54565b604082019050919050565b60006020820190508181036000830152612adf81612aa3565b9050919050565b600081905092915050565b6000612afc82612247565b612b068185612ae6565b9350612b16818560208601612263565b80840191505092915050565b6000612b2e8284612af1565b915081905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000612b95602e83612252565b9150612ba082612b39565b604082019050919050565b60006020820190508181036000830152612bc481612b88565b9050919050565b6000819050919050565b6000819050919050565b6000612bfa612bf5612bf084612bcb565b612bd5565b612494565b9050919050565b612c0a81612bdf565b82525050565b6000602082019050612c256000830184612c01565b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612c87602583612252565b9150612c9282612c2b565b604082019050919050565b60006020820190508181036000830152612cb681612c7a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612d19602683612252565b9150612d2482612cbd565b604082019050919050565b60006020820190508181036000830152612d4881612d0c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612dab602483612252565b9150612db682612d4f565b604082019050919050565b60006020820190508181036000830152612dda81612d9e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e3d602283612252565b9150612e4882612de1565b604082019050919050565b60006020820190508181036000830152612e6c81612e30565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612ea9601d83612252565b9150612eb482612e73565b602082019050919050565b60006020820190508181036000830152612ed881612e9c565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612f3b602583612252565b9150612f4682612edf565b604082019050919050565b60006020820190508181036000830152612f6a81612f2e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612fcd602383612252565b9150612fd882612f71565b604082019050919050565b60006020820190508181036000830152612ffc81612fc0565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061305f602683612252565b915061306a82613003565b604082019050919050565b6000602082019050818103600083015261308e81613052565b9050919050565b61309e816126b6565b81146130a957600080fd5b50565b6000815190506130bb81613095565b92915050565b6000602082840312156130d7576130d6612303565b5b60006130e5848285016130ac565b91505092915050565b7f45524331393637557067726164653a206e657720696d706c656d656e7461746960008201527f6f6e206973206e6f742055555053000000000000000000000000000000000000602082015250565b600061314a602e83612252565b9150613155826130ee565b604082019050919050565b600060208201905081810360008301526131798161313d565b9050919050565b7f45524331393637557067726164653a20756e737570706f727465642070726f7860008201527f6961626c65555549440000000000000000000000000000000000000000000000602082015250565b60006131dc602983612252565b91506131e782613180565b604082019050919050565b6000602082019050818103600083015261320b816131cf565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613248602083612252565b915061325382613212565b602082019050919050565b600060208201905081810360008301526132778161323b565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006132b4601f83612252565b91506132bf8261327e565b602082019050919050565b600060208201905081810360008301526132e3816132a7565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613346602183612252565b9150613351826132ea565b604082019050919050565b6000602082019050818103600083015261337581613339565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b60006133d8602283612252565b91506133e38261337c565b604082019050919050565b60006020820190508181036000830152613407816133cb565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b600061346a602b83612252565b91506134758261340e565b604082019050919050565b600060208201905081810360008301526134998161345d565b9050919050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b60006134fc602d83612252565b9150613507826134a0565b604082019050919050565b6000602082019050818103600083015261352b816134ef565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613568601483612252565b915061357382613532565b602082019050919050565b600060208201905081810360008301526135978161355b565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826135c3565b61360a86836135c3565b95508019841693508086168417925050509392505050565b600061363d6136386136338461236b565b612bd5565b61236b565b9050919050565b6000819050919050565b61365783613622565b61366b61366382613644565b8484546135d0565b825550505050565b600090565b613680613673565b61368b81848461364e565b505050565b5b818110156136af576136a4600082613678565b600181019050613691565b5050565b601f8211156136f4576136c58161359e565b6136ce846135b3565b810160208510156136dd578190505b6136f16136e9856135b3565b830182613690565b50505b505050565b600082821c905092915050565b6000613717600019846008026136f9565b1980831691505092915050565b60006137308383613706565b9150826002028217905092915050565b61374982612247565b67ffffffffffffffff8111156137625761376161252f565b5b61376c825461289c565b6137778282856136b3565b600060209050601f8311600181146137aa5760008415613798578287015190505b6137a28582613724565b86555061380a565b601f1984166137b88661359e565b60005b828110156137e0578489015182556001820191506020850194506020810190506137bb565b868310156137fd57848901516137f9601f891682613706565b8355505b6001600288020188555050505b505050505050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613848601083612252565b915061385382613812565b602082019050919050565b600060208201905081810360008301526138778161383b565b9050919050565b600081519050919050565b600081905092915050565b600061389f8261387e565b6138a98185613889565b93506138b9818560208601612263565b80840191505092915050565b60006138d18284613894565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613912601d83612252565b915061391d826138dc565b602082019050919050565b6000602082019050818103600083015261394181613905565b905091905056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ada24e0abf9f1e20949e60d9c55d9bcf2698c87949a4b980eb41348fcd6c328364736f6c63430008120033
Deployed Bytecode Sourcemap
61649:1341:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48593:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50953:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49722:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51734:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49564:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33186:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52404:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62328:65;;;;;;;;;;;;;:::i;:::-;;62401:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60696:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33715:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32792:133;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62504:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41219:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49893:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38213:103;;;;;;;;;;;;;:::i;:::-;;61106:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62029:222;;;;;;;;;;;;;:::i;:::-;;62259:61;;;;;;;;;;;;;:::i;:::-;;37572:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48812:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53145:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50226:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50482:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38471:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48593:100;48647:13;48680:5;48673:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48593:100;:::o;50953:201::-;51036:4;51053:13;51069:12;:10;:12::i;:::-;51053:28;;51092:32;51101:5;51108:7;51117:6;51092:8;:32::i;:::-;51142:4;51135:11;;;50953:201;;;;:::o;49722:108::-;49783:7;49810:12;;49803:19;;49722:108;:::o;51734:261::-;51831:4;51848:15;51866:12;:10;:12::i;:::-;51848:30;;51889:38;51905:4;51911:7;51920:6;51889:15;:38::i;:::-;51938:27;51948:4;51954:2;51958:6;51938:9;:27::i;:::-;51983:4;51976:11;;;51734:261;;;;;:::o;49564:93::-;49622:5;49647:2;49640:9;;49564:93;:::o;33186:198::-;31662:6;31645:23;;31653:4;31645:23;;;31637:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;31760:6;31736:30;;:20;:18;:20::i;:::-;:30;;;31728:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;33268:36:::1;33286:17;33268;:36::i;:::-;33315:61;33337:17;33366:1;33356:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33370:5;33315:21;:61::i;:::-;33186:198:::0;:::o;52404:238::-;52492:4;52509:13;52525:12;:10;:12::i;:::-;52509:28;;52548:64;52557:5;52564:7;52601:10;52573:25;52583:5;52590:7;52573:9;:25::i;:::-;:38;;;;:::i;:::-;52548:8;:64::i;:::-;52630:4;52623:11;;;52404:238;;;;:::o;62328:65::-;37458:13;:11;:13::i;:::-;62375:10:::1;:8;:10::i;:::-;62328:65::o:0;62401:95::-;37458:13;:11;:13::i;:::-;62471:17:::1;62477:2;62481:6;62471:5;:17::i;:::-;62401:95:::0;;:::o;60696:91::-;60752:27;60758:12;:10;:12::i;:::-;60772:6;60752:5;:27::i;:::-;60696:91;:::o;33715:223::-;31662:6;31645:23;;31653:4;31645:23;;;31637:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;31760:6;31736:30;;:20;:18;:20::i;:::-;:30;;;31728:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;33831:36:::1;33849:17;33831;:36::i;:::-;33878:52;33900:17;33919:4;33925;33878:21;:52::i;:::-;33715:223:::0;;:::o;32792:133::-;32870:7;32107:6;32090:23;;32098:4;32090:23;;;32082:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;24204:66:::1;32897:20;;32890:27;;32792:133:::0;:::o;62504:150::-;62580:13;62596:12;:10;:12::i;:::-;62580:28;;62641:4;62624:22;;;;;;:::i;:::-;;;;;;;;62638:2;62624:22;;;;;;:::i;:::-;;;;;;;;62632:5;62624:22;;;;;;;;;;;;62569:85;62504:150;;:::o;41219:86::-;41266:4;41290:7;;;;;;;;;;;41283:14;;41219:86;:::o;49893:127::-;49967:7;49994:9;:18;50004:7;49994:18;;;;;;;;;;;;;;;;49987:25;;49893:127;;;:::o;38213:103::-;37458:13;:11;:13::i;:::-;38278:30:::1;38305:1;38278:18;:30::i;:::-;38213:103::o:0;61106:164::-;61183:46;61199:7;61208:12;:10;:12::i;:::-;61222:6;61183:15;:46::i;:::-;61240:22;61246:7;61255:6;61240:5;:22::i;:::-;61106:164;;:::o;62029:222::-;19631:19;19654:13;;;;;;;;;;;19653:14;19631:36;;19701:14;:34;;;;;19734:1;19719:12;;;;;;;;;;:16;;;19701:34;19700:108;;;;19742:44;19780:4;19742:29;:44::i;:::-;19741:45;:66;;;;;19806:1;19790:12;;;;;;;;;;:17;;;19741:66;19700:108;19678:204;;;;;;;;;;;;:::i;:::-;;;;;;;;;19908:1;19893:12;;:16;;;;;;;;;;;;;;;;;;19924:14;19920:67;;;19971:4;19955:13;;:20;;;;;;;;;;;;;;;;;;19920:67;62081:39:::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;::::0;:12:::1;:39::i;:::-;62131:22;:20;:22::i;:::-;62164:17;:15;:17::i;:::-;62192:16;:14;:16::i;:::-;62219:24;:22;:24::i;:::-;20013:14:::0;20009:102;;;20060:5;20044:13;;:21;;;;;;;;;;;;;;;;;;20085:14;20097:1;20085:14;;;;;;:::i;:::-;;;;;;;;20009:102;19620:498;62029:222::o;62259:61::-;37458:13;:11;:13::i;:::-;62304:8:::1;:6;:8::i;:::-;62259:61::o:0;37572:87::-;37618:7;37645:6;;;;;;;;;;;37638:13;;37572:87;:::o;48812:104::-;48868:13;48901:7;48894:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48812:104;:::o;53145:436::-;53238:4;53255:13;53271:12;:10;:12::i;:::-;53255:28;;53294:24;53321:25;53331:5;53338:7;53321:9;:25::i;:::-;53294:52;;53385:15;53365:16;:35;;53357:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;53478:60;53487:5;53494:7;53522:15;53503:16;:34;53478:8;:60::i;:::-;53569:4;53562:11;;;;53145:436;;;;:::o;50226:193::-;50305:4;50322:13;50338:12;:10;:12::i;:::-;50322:28;;50361;50371:5;50378:2;50382:6;50361:9;:28::i;:::-;50407:4;50400:11;;;50226:193;;;;:::o;50482:151::-;50571:7;50598:11;:18;50610:5;50598:18;;;;;;;;;;;;;;;:27;50617:7;50598:27;;;;;;;;;;;;;;;;50591:34;;50482:151;;;;:::o;38471:201::-;37458:13;:11;:13::i;:::-;38580:1:::1;38560:22;;:8;:22;;::::0;38552:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;38636:28;38655:8;38636:18;:28::i;:::-;38471:201:::0;:::o;35610:98::-;35663:7;35690:10;35683:17;;35610:98;:::o;57138:346::-;57257:1;57240:19;;:5;:19;;;57232:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57338:1;57319:21;;:7;:21;;;57311:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57422:6;57392:11;:18;57404:5;57392:18;;;;;;;;;;;;;;;:27;57411:7;57392:27;;;;;;;;;;;;;;;:36;;;;57460:7;57444:32;;57453:5;57444:32;;;57469:6;57444:32;;;;;;:::i;:::-;;;;;;;;57138:346;;;:::o;57775:419::-;57876:24;57903:25;57913:5;57920:7;57903:9;:25::i;:::-;57876:52;;57963:17;57943:16;:37;57939:248;;58025:6;58005:16;:26;;57997:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58109:51;58118:5;58125:7;58153:6;58134:16;:25;58109:8;:51::i;:::-;57939:248;57865:329;57775:419;;;:::o;54051:806::-;54164:1;54148:18;;:4;:18;;;54140:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54241:1;54227:16;;:2;:16;;;54219:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;54296:38;54317:4;54323:2;54327:6;54296:20;:38::i;:::-;54347:19;54369:9;:15;54379:4;54369:15;;;;;;;;;;;;;;;;54347:37;;54418:6;54403:11;:21;;54395:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;54535:6;54521:11;:20;54503:9;:15;54513:4;54503:15;;;;;;;;;;;;;;;:38;;;;54738:6;54721:9;:13;54731:2;54721:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;54788:2;54773:26;;54782:4;54773:26;;;54792:6;54773:26;;;;;;:::i;:::-;;;;;;;;54812:37;54832:4;54838:2;54842:6;54812:19;:37::i;:::-;54129:728;54051:806;;;:::o;24354:153::-;24407:7;24434:59;24204:66;24472:20;;24434:37;:59::i;:::-;:65;;;;;;;;;;;;24427:72;;24354:153;:::o;62871:116::-;37458:13;:11;:13::i;:::-;62871:116;:::o;25756:958::-;26176:53;23856:66;26214:14;;26176:37;:53::i;:::-;:59;;;;;;;;;;;;26172:535;;;26252:37;26271:17;26252:18;:37::i;:::-;26172:535;;;26355:17;26326:61;;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26322:306;;26556:56;;;;;;;;;;:::i;:::-;;;;;;;;26322:306;24204:66;26448:20;;26440:4;:28;26432:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;26390:140;26642:53;26660:17;26679:4;26685:9;26642:17;:53::i;:::-;26172:535;25756:958;;;:::o;37737:132::-;37812:12;:10;:12::i;:::-;37801:23;;:7;:5;:7::i;:::-;:23;;;37793:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37737:132::o;42074:120::-;41083:16;:14;:16::i;:::-;42143:5:::1;42133:7;;:15;;;;;;;;;;;;;;;;;;42164:22;42173:12;:10;:12::i;:::-;42164:22;;;;;;:::i;:::-;;;;;;;;42074:120::o:0;55144:548::-;55247:1;55228:21;;:7;:21;;;55220:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;55298:49;55327:1;55331:7;55340:6;55298:20;:49::i;:::-;55376:6;55360:12;;:22;;;;;;;:::i;:::-;;;;;;;;55553:6;55531:9;:18;55541:7;55531:18;;;;;;;;;;;;;;;;:28;;;;;;;;;;;55607:7;55586:37;;55603:1;55586:37;;;55616:6;55586:37;;;;;;:::i;:::-;;;;;;;;55636:48;55664:1;55668:7;55677:6;55636:19;:48::i;:::-;55144:548;;:::o;56025:675::-;56128:1;56109:21;;:7;:21;;;56101:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;56181:49;56202:7;56219:1;56223:6;56181:20;:49::i;:::-;56243:22;56268:9;:18;56278:7;56268:18;;;;;;;;;;;;;;;;56243:43;;56323:6;56305:14;:24;;56297:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;56442:6;56425:14;:23;56404:9;:18;56414:7;56404:18;;;;;;;;;;;;;;;:44;;;;56559:6;56543:12;;:22;;;;;;;;;;;56620:1;56594:37;;56603:7;56594:37;;;56624:6;56594:37;;;;;;:::i;:::-;;;;;;;;56644:48;56664:7;56681:1;56685:6;56644:19;:48::i;:::-;56090:610;56025:675;;:::o;38832:191::-;38906:16;38925:6;;;;;;;;;;;38906:25;;38951:8;38942:6;;:17;;;;;;;;;;;;;;;;;;39006:8;38975:40;;38996:8;38975:40;;;;;;;;;;;;38895:128;38832:191;:::o;8108:326::-;8168:4;8425:1;8403:7;:19;;;:23;8396:30;;8108:326;;;:::o;48204:149::-;21774:13;;;;;;;;;;;21766:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;48307:38:::1;48330:5;48337:7;48307:22;:38::i;:::-;48204:149:::0;;:::o;60432:66::-;21774:13;;;;;;;;;;;21766:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;60432:66::o;40389:99::-;21774:13;;;;;;;;;;;21766:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;40453:27:::1;:25;:27::i;:::-;40389:99::o:0;37115:97::-;21774:13;;;;;;;;;;;21766:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;37178:26:::1;:24;:26::i;:::-;37115:97::o:0;30790:68::-;21774:13;;;;;;;;;;;21766:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;30790:68::o;41815:118::-;40824:19;:17;:19::i;:::-;41885:4:::1;41875:7;;:14;;;;;;;;;;;;;;;;;;41905:20;41912:12;:10;:12::i;:::-;41905:20;;;;;;:::i;:::-;;;;;;;;41815:118::o:0;62664:199::-;40824:19;:17;:19::i;:::-;62811:44:::1;62838:4;62844:2;62848:6;62811:26;:44::i;:::-;62664:199:::0;;;:::o;59489:90::-;;;;:::o;2014:195::-;2075:21;2187:4;2177:14;;2014:195;;;:::o;2312:::-;2373:21;2485:4;2475:14;;2312:195;;;:::o;24603:284::-;24685:48;24715:17;24685:29;:48::i;:::-;24677:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;24862:17;24794:59;24204:66;24832:20;;24794:37;:59::i;:::-;:65;;;:85;;;;;;;;;;;;;;;;;;24603:284;:::o;25296:281::-;25405:29;25416:17;25405:10;:29::i;:::-;25463:1;25449:4;:11;:15;:28;;;;25468:9;25449:28;25445:125;;;25494:64;25534:17;25553:4;25494:39;:64::i;:::-;;25445:125;25296:281;;;:::o;41563:108::-;41630:8;:6;:8::i;:::-;41622:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;41563:108::o;48361:162::-;21774:13;;;;;;;;;;;21766:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;48482:5:::1;48474;:13;;;;;;:::i;:::-;;48508:7;48498;:17;;;;;;:::i;:::-;;48361:162:::0;;:::o;40496:97::-;21774:13;;;;;;;;;;;21766:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;40580:5:::1;40570:7;;:15;;;;;;;;;;;;;;;;;;40496:97::o:0;37220:113::-;21774:13;;;;;;;;;;;21766:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;37293:32:::1;37312:12;:10;:12::i;:::-;37293:18;:32::i;:::-;37220:113::o:0;41378:108::-;41449:8;:6;:8::i;:::-;41448:9;41440:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;41378:108::o;58794:91::-;;;;:::o;25000:155::-;25067:37;25086:17;25067:18;:37::i;:::-;25129:17;25120:27;;;;;;;;;;;;25000:155;:::o;13500:200::-;13583:12;13615:77;13636:6;13644:4;13615:77;;;;;;;;;;;;;;;;;:20;:77::i;:::-;13608:84;;13500:200;;;;:::o;13894:332::-;14039:12;14065;14079:23;14106:6;:19;;14126:4;14106:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14064:67;;;;14149:69;14176:6;14184:7;14193:10;14205:12;14149:26;:69::i;:::-;14142:76;;;;13894:332;;;;;:::o;14522:644::-;14707:12;14736:7;14732:427;;;14785:1;14764:10;:17;:22;14760:290;;14982:18;14993:6;14982:10;:18::i;:::-;14974:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;14760:290;15071:10;15064:17;;;;14732:427;15114:33;15122:10;15134:12;15114:7;:33::i;:::-;14522:644;;;;;;;:::o;15708:552::-;15889:1;15869:10;:17;:21;15865:388;;;16101:10;16095:17;16158:15;16145:10;16141:2;16137:19;16130:44;15865:388;16228:12;16221:20;;;;;;;;;;;:::i;:::-;;;;;;;;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:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:619::-;3875:6;3883;3891;3940:2;3928:9;3919:7;3915:23;3911:32;3908:119;;;3946:79;;:::i;:::-;3908:119;4066:1;4091:53;4136:7;4127:6;4116:9;4112:22;4091:53;:::i;:::-;4081:63;;4037:117;4193:2;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4164:118;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3798:619;;;;;:::o;4423:86::-;4458:7;4498:4;4491:5;4487:16;4476:27;;4423:86;;;:::o;4515:112::-;4598:22;4614:5;4598:22;:::i;:::-;4593:3;4586:35;4515:112;;:::o;4633:214::-;4722:4;4760:2;4749:9;4745:18;4737:26;;4773:67;4837:1;4826:9;4822:17;4813:6;4773:67;:::i;:::-;4633:214;;;;:::o;4853:329::-;4912:6;4961:2;4949:9;4940:7;4936:23;4932:32;4929:119;;;4967:79;;:::i;:::-;4929:119;5087:1;5112:53;5157:7;5148:6;5137:9;5133:22;5112:53;:::i;:::-;5102:63;;5058:117;4853:329;;;;:::o;5188:::-;5247:6;5296:2;5284:9;5275:7;5271:23;5267:32;5264:119;;;5302:79;;:::i;:::-;5264:119;5422:1;5447:53;5492:7;5483:6;5472:9;5468:22;5447:53;:::i;:::-;5437:63;;5393:117;5188:329;;;;:::o;5523:117::-;5632:1;5629;5622:12;5646:117;5755:1;5752;5745:12;5769:180;5817:77;5814:1;5807:88;5914:4;5911:1;5904:15;5938:4;5935:1;5928:15;5955:281;6038:27;6060:4;6038:27;:::i;:::-;6030:6;6026:40;6168:6;6156:10;6153:22;6132:18;6120:10;6117:34;6114:62;6111:88;;;6179:18;;:::i;:::-;6111:88;6219:10;6215:2;6208:22;5998:238;5955:281;;:::o;6242:129::-;6276:6;6303:20;;:::i;:::-;6293:30;;6332:33;6360:4;6352:6;6332:33;:::i;:::-;6242:129;;;:::o;6377:307::-;6438:4;6528:18;6520:6;6517:30;6514:56;;;6550:18;;:::i;:::-;6514:56;6588:29;6610:6;6588:29;:::i;:::-;6580:37;;6672:4;6666;6662:15;6654:23;;6377:307;;;:::o;6690:146::-;6787:6;6782:3;6777;6764:30;6828:1;6819:6;6814:3;6810:16;6803:27;6690:146;;;:::o;6842:423::-;6919:5;6944:65;6960:48;7001:6;6960:48;:::i;:::-;6944:65;:::i;:::-;6935:74;;7032:6;7025:5;7018:21;7070:4;7063:5;7059:16;7108:3;7099:6;7094:3;7090:16;7087:25;7084:112;;;7115:79;;:::i;:::-;7084:112;7205:54;7252:6;7247:3;7242;7205:54;:::i;:::-;6925:340;6842:423;;;;;:::o;7284:338::-;7339:5;7388:3;7381:4;7373:6;7369:17;7365:27;7355:122;;7396:79;;:::i;:::-;7355:122;7513:6;7500:20;7538:78;7612:3;7604:6;7597:4;7589:6;7585:17;7538:78;:::i;:::-;7529:87;;7345:277;7284:338;;;;:::o;7628:652::-;7705:6;7713;7762:2;7750:9;7741:7;7737:23;7733:32;7730:119;;;7768:79;;:::i;:::-;7730:119;7888:1;7913:53;7958:7;7949:6;7938:9;7934:22;7913:53;:::i;:::-;7903:63;;7859:117;8043:2;8032:9;8028:18;8015:32;8074:18;8066:6;8063:30;8060:117;;;8096:79;;:::i;:::-;8060:117;8201:62;8255:7;8246:6;8235:9;8231:22;8201:62;:::i;:::-;8191:72;;7986:287;7628:652;;;;;:::o;8286:77::-;8323:7;8352:5;8341:16;;8286:77;;;:::o;8369:118::-;8456:24;8474:5;8456:24;:::i;:::-;8451:3;8444:37;8369:118;;:::o;8493:222::-;8586:4;8624:2;8613:9;8609:18;8601:26;;8637:71;8705:1;8694:9;8690:17;8681:6;8637:71;:::i;:::-;8493:222;;;;:::o;8721:308::-;8783:4;8873:18;8865:6;8862:30;8859:56;;;8895:18;;:::i;:::-;8859:56;8933:29;8955:6;8933:29;:::i;:::-;8925:37;;9017:4;9011;9007:15;8999:23;;8721:308;;;:::o;9035:425::-;9113:5;9138:66;9154:49;9196:6;9154:49;:::i;:::-;9138:66;:::i;:::-;9129:75;;9227:6;9220:5;9213:21;9265:4;9258:5;9254:16;9303:3;9294:6;9289:3;9285:16;9282:25;9279:112;;;9310:79;;:::i;:::-;9279:112;9400:54;9447:6;9442:3;9437;9400:54;:::i;:::-;9119:341;9035:425;;;;;:::o;9480:340::-;9536:5;9585:3;9578:4;9570:6;9566:17;9562:27;9552:122;;9593:79;;:::i;:::-;9552:122;9710:6;9697:20;9735:79;9810:3;9802:6;9795:4;9787:6;9783:17;9735:79;:::i;:::-;9726:88;;9542:278;9480:340;;;;:::o;9826:834::-;9914:6;9922;9971:2;9959:9;9950:7;9946:23;9942:32;9939:119;;;9977:79;;:::i;:::-;9939:119;10125:1;10114:9;10110:17;10097:31;10155:18;10147:6;10144:30;10141:117;;;10177:79;;:::i;:::-;10141:117;10282:63;10337:7;10328:6;10317:9;10313:22;10282:63;:::i;:::-;10272:73;;10068:287;10422:2;10411:9;10407:18;10394:32;10453:18;10445:6;10442:30;10439:117;;;10475:79;;:::i;:::-;10439:117;10580:63;10635:7;10626:6;10615:9;10611:22;10580:63;:::i;:::-;10570:73;;10365:288;9826:834;;;;;:::o;10666:118::-;10753:24;10771:5;10753:24;:::i;:::-;10748:3;10741:37;10666:118;;:::o;10790:222::-;10883:4;10921:2;10910:9;10906:18;10898:26;;10934:71;11002:1;10991:9;10987:17;10978:6;10934:71;:::i;:::-;10790:222;;;;:::o;11018:474::-;11086:6;11094;11143:2;11131:9;11122:7;11118:23;11114:32;11111:119;;;11149:79;;:::i;:::-;11111:119;11269:1;11294:53;11339:7;11330:6;11319:9;11315:22;11294:53;:::i;:::-;11284:63;;11240:117;11396:2;11422:53;11467:7;11458:6;11447:9;11443:22;11422:53;:::i;:::-;11412:63;;11367:118;11018:474;;;;;:::o;11498:180::-;11546:77;11543:1;11536:88;11643:4;11640:1;11633:15;11667:4;11664:1;11657:15;11684:320;11728:6;11765:1;11759:4;11755:12;11745:22;;11812:1;11806:4;11802:12;11833:18;11823:81;;11889:4;11881:6;11877:17;11867:27;;11823:81;11951:2;11943:6;11940:14;11920:18;11917:38;11914:84;;11970:18;;:::i;:::-;11914:84;11735:269;11684:320;;;:::o;12010:231::-;12150:34;12146:1;12138:6;12134:14;12127:58;12219:14;12214:2;12206:6;12202:15;12195:39;12010:231;:::o;12247:366::-;12389:3;12410:67;12474:2;12469:3;12410:67;:::i;:::-;12403:74;;12486:93;12575:3;12486:93;:::i;:::-;12604:2;12599:3;12595:12;12588:19;;12247:366;;;:::o;12619:419::-;12785:4;12823:2;12812:9;12808:18;12800:26;;12872:9;12866:4;12862:20;12858:1;12847:9;12843:17;12836:47;12900:131;13026:4;12900:131;:::i;:::-;12892:139;;12619:419;;;:::o;13044:231::-;13184:34;13180:1;13172:6;13168:14;13161:58;13253:14;13248:2;13240:6;13236:15;13229:39;13044:231;:::o;13281:366::-;13423:3;13444:67;13508:2;13503:3;13444:67;:::i;:::-;13437:74;;13520:93;13609:3;13520:93;:::i;:::-;13638:2;13633:3;13629:12;13622:19;;13281:366;;;:::o;13653:419::-;13819:4;13857:2;13846:9;13842:18;13834:26;;13906:9;13900:4;13896:20;13892:1;13881:9;13877:17;13870:47;13934:131;14060:4;13934:131;:::i;:::-;13926:139;;13653:419;;;:::o;14078:180::-;14126:77;14123:1;14116:88;14223:4;14220:1;14213:15;14247:4;14244:1;14237:15;14264:191;14304:3;14323:20;14341:1;14323:20;:::i;:::-;14318:25;;14357:20;14375:1;14357:20;:::i;:::-;14352:25;;14400:1;14397;14393:9;14386:16;;14421:3;14418:1;14415:10;14412:36;;;14428:18;;:::i;:::-;14412:36;14264:191;;;;:::o;14461:243::-;14601:34;14597:1;14589:6;14585:14;14578:58;14670:26;14665:2;14657:6;14653:15;14646:51;14461:243;:::o;14710:366::-;14852:3;14873:67;14937:2;14932:3;14873:67;:::i;:::-;14866:74;;14949:93;15038:3;14949:93;:::i;:::-;15067:2;15062:3;15058:12;15051:19;;14710:366;;;:::o;15082:419::-;15248:4;15286:2;15275:9;15271:18;15263:26;;15335:9;15329:4;15325:20;15321:1;15310:9;15306:17;15299:47;15363:131;15489:4;15363:131;:::i;:::-;15355:139;;15082:419;;;:::o;15507:148::-;15609:11;15646:3;15631:18;;15507:148;;;;:::o;15661:390::-;15767:3;15795:39;15828:5;15795:39;:::i;:::-;15850:89;15932:6;15927:3;15850:89;:::i;:::-;15843:96;;15948:65;16006:6;16001:3;15994:4;15987:5;15983:16;15948:65;:::i;:::-;16038:6;16033:3;16029:16;16022:23;;15771:280;15661:390;;;;:::o;16057:275::-;16189:3;16211:95;16302:3;16293:6;16211:95;:::i;:::-;16204:102;;16323:3;16316:10;;16057:275;;;;:::o;16338:233::-;16478:34;16474:1;16466:6;16462:14;16455:58;16547:16;16542:2;16534:6;16530:15;16523:41;16338:233;:::o;16577:366::-;16719:3;16740:67;16804:2;16799:3;16740:67;:::i;:::-;16733:74;;16816:93;16905:3;16816:93;:::i;:::-;16934:2;16929:3;16925:12;16918:19;;16577:366;;;:::o;16949:419::-;17115:4;17153:2;17142:9;17138:18;17130:26;;17202:9;17196:4;17192:20;17188:1;17177:9;17173:17;17166:47;17230:131;17356:4;17230:131;:::i;:::-;17222:139;;16949:419;;;:::o;17374:85::-;17419:7;17448:5;17437:16;;17374:85;;;:::o;17465:60::-;17493:3;17514:5;17507:12;;17465:60;;;:::o;17531:154::-;17587:9;17620:59;17636:42;17645:32;17671:5;17645:32;:::i;:::-;17636:42;:::i;:::-;17620:59;:::i;:::-;17607:72;;17531:154;;;:::o;17691:143::-;17784:43;17821:5;17784:43;:::i;:::-;17779:3;17772:56;17691:143;;:::o;17840:234::-;17939:4;17977:2;17966:9;17962:18;17954:26;;17990:77;18064:1;18053:9;18049:17;18040:6;17990:77;:::i;:::-;17840:234;;;;:::o;18080:224::-;18220:34;18216:1;18208:6;18204:14;18197:58;18289:7;18284:2;18276:6;18272:15;18265:32;18080:224;:::o;18310:366::-;18452:3;18473:67;18537:2;18532:3;18473:67;:::i;:::-;18466:74;;18549:93;18638:3;18549:93;:::i;:::-;18667:2;18662:3;18658:12;18651:19;;18310:366;;;:::o;18682:419::-;18848:4;18886:2;18875:9;18871:18;18863:26;;18935:9;18929:4;18925:20;18921:1;18910:9;18906:17;18899:47;18963:131;19089:4;18963:131;:::i;:::-;18955:139;;18682:419;;;:::o;19107:225::-;19247:34;19243:1;19235:6;19231:14;19224:58;19316:8;19311:2;19303:6;19299:15;19292:33;19107:225;:::o;19338:366::-;19480:3;19501:67;19565:2;19560:3;19501:67;:::i;:::-;19494:74;;19577:93;19666:3;19577:93;:::i;:::-;19695:2;19690:3;19686:12;19679:19;;19338:366;;;:::o;19710:419::-;19876:4;19914:2;19903:9;19899:18;19891:26;;19963:9;19957:4;19953:20;19949:1;19938:9;19934:17;19927:47;19991:131;20117:4;19991:131;:::i;:::-;19983:139;;19710:419;;;:::o;20135:223::-;20275:34;20271:1;20263:6;20259:14;20252:58;20344:6;20339:2;20331:6;20327:15;20320:31;20135:223;:::o;20364:366::-;20506:3;20527:67;20591:2;20586:3;20527:67;:::i;:::-;20520:74;;20603:93;20692:3;20603:93;:::i;:::-;20721:2;20716:3;20712:12;20705:19;;20364:366;;;:::o;20736:419::-;20902:4;20940:2;20929:9;20925:18;20917:26;;20989:9;20983:4;20979:20;20975:1;20964:9;20960:17;20953:47;21017:131;21143:4;21017:131;:::i;:::-;21009:139;;20736:419;;;:::o;21161:221::-;21301:34;21297:1;21289:6;21285:14;21278:58;21370:4;21365:2;21357:6;21353:15;21346:29;21161:221;:::o;21388:366::-;21530:3;21551:67;21615:2;21610:3;21551:67;:::i;:::-;21544:74;;21627:93;21716:3;21627:93;:::i;:::-;21745:2;21740:3;21736:12;21729:19;;21388:366;;;:::o;21760:419::-;21926:4;21964:2;21953:9;21949:18;21941:26;;22013:9;22007:4;22003:20;21999:1;21988:9;21984:17;21977:47;22041:131;22167:4;22041:131;:::i;:::-;22033:139;;21760:419;;;:::o;22185:179::-;22325:31;22321:1;22313:6;22309:14;22302:55;22185:179;:::o;22370:366::-;22512:3;22533:67;22597:2;22592:3;22533:67;:::i;:::-;22526:74;;22609:93;22698:3;22609:93;:::i;:::-;22727:2;22722:3;22718:12;22711:19;;22370:366;;;:::o;22742:419::-;22908:4;22946:2;22935:9;22931:18;22923:26;;22995:9;22989:4;22985:20;22981:1;22970:9;22966:17;22959:47;23023:131;23149:4;23023:131;:::i;:::-;23015:139;;22742:419;;;:::o;23167:224::-;23307:34;23303:1;23295:6;23291:14;23284:58;23376:7;23371:2;23363:6;23359:15;23352:32;23167:224;:::o;23397:366::-;23539:3;23560:67;23624:2;23619:3;23560:67;:::i;:::-;23553:74;;23636:93;23725:3;23636:93;:::i;:::-;23754:2;23749:3;23745:12;23738:19;;23397:366;;;:::o;23769:419::-;23935:4;23973:2;23962:9;23958:18;23950:26;;24022:9;24016:4;24012:20;24008:1;23997:9;23993:17;23986:47;24050:131;24176:4;24050:131;:::i;:::-;24042:139;;23769:419;;;:::o;24194:222::-;24334:34;24330:1;24322:6;24318:14;24311:58;24403:5;24398:2;24390:6;24386:15;24379:30;24194:222;:::o;24422:366::-;24564:3;24585:67;24649:2;24644:3;24585:67;:::i;:::-;24578:74;;24661:93;24750:3;24661:93;:::i;:::-;24779:2;24774:3;24770:12;24763:19;;24422:366;;;:::o;24794:419::-;24960:4;24998:2;24987:9;24983:18;24975:26;;25047:9;25041:4;25037:20;25033:1;25022:9;25018:17;25011:47;25075:131;25201:4;25075:131;:::i;:::-;25067:139;;24794:419;;;:::o;25219:225::-;25359:34;25355:1;25347:6;25343:14;25336:58;25428:8;25423:2;25415:6;25411:15;25404:33;25219:225;:::o;25450:366::-;25592:3;25613:67;25677:2;25672:3;25613:67;:::i;:::-;25606:74;;25689:93;25778:3;25689:93;:::i;:::-;25807:2;25802:3;25798:12;25791:19;;25450:366;;;:::o;25822:419::-;25988:4;26026:2;26015:9;26011:18;26003:26;;26075:9;26069:4;26065:20;26061:1;26050:9;26046:17;26039:47;26103:131;26229:4;26103:131;:::i;:::-;26095:139;;25822:419;;;:::o;26247:122::-;26320:24;26338:5;26320:24;:::i;:::-;26313:5;26310:35;26300:63;;26359:1;26356;26349:12;26300:63;26247:122;:::o;26375:143::-;26432:5;26463:6;26457:13;26448:22;;26479:33;26506:5;26479:33;:::i;:::-;26375:143;;;;:::o;26524:351::-;26594:6;26643:2;26631:9;26622:7;26618:23;26614:32;26611:119;;;26649:79;;:::i;:::-;26611:119;26769:1;26794:64;26850:7;26841:6;26830:9;26826:22;26794:64;:::i;:::-;26784:74;;26740:128;26524:351;;;;:::o;26881:233::-;27021:34;27017:1;27009:6;27005:14;26998:58;27090:16;27085:2;27077:6;27073:15;27066:41;26881:233;:::o;27120:366::-;27262:3;27283:67;27347:2;27342:3;27283:67;:::i;:::-;27276:74;;27359:93;27448:3;27359:93;:::i;:::-;27477:2;27472:3;27468:12;27461:19;;27120:366;;;:::o;27492:419::-;27658:4;27696:2;27685:9;27681:18;27673:26;;27745:9;27739:4;27735:20;27731:1;27720:9;27716:17;27709:47;27773:131;27899:4;27773:131;:::i;:::-;27765:139;;27492:419;;;:::o;27917:228::-;28057:34;28053:1;28045:6;28041:14;28034:58;28126:11;28121:2;28113:6;28109:15;28102:36;27917:228;:::o;28151:366::-;28293:3;28314:67;28378:2;28373:3;28314:67;:::i;:::-;28307:74;;28390:93;28479:3;28390:93;:::i;:::-;28508:2;28503:3;28499:12;28492:19;;28151:366;;;:::o;28523:419::-;28689:4;28727:2;28716:9;28712:18;28704:26;;28776:9;28770:4;28766:20;28762:1;28751:9;28747:17;28740:47;28804:131;28930:4;28804:131;:::i;:::-;28796:139;;28523:419;;;:::o;28948:182::-;29088:34;29084:1;29076:6;29072:14;29065:58;28948:182;:::o;29136:366::-;29278:3;29299:67;29363:2;29358:3;29299:67;:::i;:::-;29292:74;;29375:93;29464:3;29375:93;:::i;:::-;29493:2;29488:3;29484:12;29477:19;;29136:366;;;:::o;29508:419::-;29674:4;29712:2;29701:9;29697:18;29689:26;;29761:9;29755:4;29751:20;29747:1;29736:9;29732:17;29725:47;29789:131;29915:4;29789:131;:::i;:::-;29781:139;;29508:419;;;:::o;29933:181::-;30073:33;30069:1;30061:6;30057:14;30050:57;29933:181;:::o;30120:366::-;30262:3;30283:67;30347:2;30342:3;30283:67;:::i;:::-;30276:74;;30359:93;30448:3;30359:93;:::i;:::-;30477:2;30472:3;30468:12;30461:19;;30120:366;;;:::o;30492:419::-;30658:4;30696:2;30685:9;30681:18;30673:26;;30745:9;30739:4;30735:20;30731:1;30720:9;30716:17;30709:47;30773:131;30899:4;30773:131;:::i;:::-;30765:139;;30492:419;;;:::o;30917:220::-;31057:34;31053:1;31045:6;31041:14;31034:58;31126:3;31121:2;31113:6;31109:15;31102:28;30917:220;:::o;31143:366::-;31285:3;31306:67;31370:2;31365:3;31306:67;:::i;:::-;31299:74;;31382:93;31471:3;31382:93;:::i;:::-;31500:2;31495:3;31491:12;31484:19;;31143:366;;;:::o;31515:419::-;31681:4;31719:2;31708:9;31704:18;31696:26;;31768:9;31762:4;31758:20;31754:1;31743:9;31739:17;31732:47;31796:131;31922:4;31796:131;:::i;:::-;31788:139;;31515:419;;;:::o;31940:221::-;32080:34;32076:1;32068:6;32064:14;32057:58;32149:4;32144:2;32136:6;32132:15;32125:29;31940:221;:::o;32167:366::-;32309:3;32330:67;32394:2;32389:3;32330:67;:::i;:::-;32323:74;;32406:93;32495:3;32406:93;:::i;:::-;32524:2;32519:3;32515:12;32508:19;;32167:366;;;:::o;32539:419::-;32705:4;32743:2;32732:9;32728:18;32720:26;;32792:9;32786:4;32782:20;32778:1;32767:9;32763:17;32756:47;32820:131;32946:4;32820:131;:::i;:::-;32812:139;;32539:419;;;:::o;32964:230::-;33104:34;33100:1;33092:6;33088:14;33081:58;33173:13;33168:2;33160:6;33156:15;33149:38;32964:230;:::o;33200:366::-;33342:3;33363:67;33427:2;33422:3;33363:67;:::i;:::-;33356:74;;33439:93;33528:3;33439:93;:::i;:::-;33557:2;33552:3;33548:12;33541:19;;33200:366;;;:::o;33572:419::-;33738:4;33776:2;33765:9;33761:18;33753:26;;33825:9;33819:4;33815:20;33811:1;33800:9;33796:17;33789:47;33853:131;33979:4;33853:131;:::i;:::-;33845:139;;33572:419;;;:::o;33997:232::-;34137:34;34133:1;34125:6;34121:14;34114:58;34206:15;34201:2;34193:6;34189:15;34182:40;33997:232;:::o;34235:366::-;34377:3;34398:67;34462:2;34457:3;34398:67;:::i;:::-;34391:74;;34474:93;34563:3;34474:93;:::i;:::-;34592:2;34587:3;34583:12;34576:19;;34235:366;;;:::o;34607:419::-;34773:4;34811:2;34800:9;34796:18;34788:26;;34860:9;34854:4;34850:20;34846:1;34835:9;34831:17;34824:47;34888:131;35014:4;34888:131;:::i;:::-;34880:139;;34607:419;;;:::o;35032:170::-;35172:22;35168:1;35160:6;35156:14;35149:46;35032:170;:::o;35208:366::-;35350:3;35371:67;35435:2;35430:3;35371:67;:::i;:::-;35364:74;;35447:93;35536:3;35447:93;:::i;:::-;35565:2;35560:3;35556:12;35549:19;;35208:366;;;:::o;35580:419::-;35746:4;35784:2;35773:9;35769:18;35761:26;;35833:9;35827:4;35823:20;35819:1;35808:9;35804:17;35797:47;35861:131;35987:4;35861:131;:::i;:::-;35853:139;;35580:419;;;:::o;36005:141::-;36054:4;36077:3;36069:11;;36100:3;36097:1;36090:14;36134:4;36131:1;36121:18;36113:26;;36005:141;;;:::o;36152:93::-;36189:6;36236:2;36231;36224:5;36220:14;36216:23;36206:33;;36152:93;;;:::o;36251:107::-;36295:8;36345:5;36339:4;36335:16;36314:37;;36251:107;;;;:::o;36364:393::-;36433:6;36483:1;36471:10;36467:18;36506:97;36536:66;36525:9;36506:97;:::i;:::-;36624:39;36654:8;36643:9;36624:39;:::i;:::-;36612:51;;36696:4;36692:9;36685:5;36681:21;36672:30;;36745:4;36735:8;36731:19;36724:5;36721:30;36711:40;;36440:317;;36364:393;;;;;:::o;36763:142::-;36813:9;36846:53;36864:34;36873:24;36891:5;36873:24;:::i;:::-;36864:34;:::i;:::-;36846:53;:::i;:::-;36833:66;;36763:142;;;:::o;36911:75::-;36954:3;36975:5;36968:12;;36911:75;;;:::o;36992:269::-;37102:39;37133:7;37102:39;:::i;:::-;37163:91;37212:41;37236:16;37212:41;:::i;:::-;37204:6;37197:4;37191:11;37163:91;:::i;:::-;37157:4;37150:105;37068:193;36992:269;;;:::o;37267:73::-;37312:3;37267:73;:::o;37346:189::-;37423:32;;:::i;:::-;37464:65;37522:6;37514;37508:4;37464:65;:::i;:::-;37399:136;37346:189;;:::o;37541:186::-;37601:120;37618:3;37611:5;37608:14;37601:120;;;37672:39;37709:1;37702:5;37672:39;:::i;:::-;37645:1;37638:5;37634:13;37625:22;;37601:120;;;37541:186;;:::o;37733:543::-;37834:2;37829:3;37826:11;37823:446;;;37868:38;37900:5;37868:38;:::i;:::-;37952:29;37970:10;37952:29;:::i;:::-;37942:8;37938:44;38135:2;38123:10;38120:18;38117:49;;;38156:8;38141:23;;38117:49;38179:80;38235:22;38253:3;38235:22;:::i;:::-;38225:8;38221:37;38208:11;38179:80;:::i;:::-;37838:431;;37823:446;37733:543;;;:::o;38282:117::-;38336:8;38386:5;38380:4;38376:16;38355:37;;38282:117;;;;:::o;38405:169::-;38449:6;38482:51;38530:1;38526:6;38518:5;38515:1;38511:13;38482:51;:::i;:::-;38478:56;38563:4;38557;38553:15;38543:25;;38456:118;38405:169;;;;:::o;38579:295::-;38655:4;38801:29;38826:3;38820:4;38801:29;:::i;:::-;38793:37;;38863:3;38860:1;38856:11;38850:4;38847:21;38839:29;;38579:295;;;;:::o;38879:1395::-;38996:37;39029:3;38996:37;:::i;:::-;39098:18;39090:6;39087:30;39084:56;;;39120:18;;:::i;:::-;39084:56;39164:38;39196:4;39190:11;39164:38;:::i;:::-;39249:67;39309:6;39301;39295:4;39249:67;:::i;:::-;39343:1;39367:4;39354:17;;39399:2;39391:6;39388:14;39416:1;39411:618;;;;40073:1;40090:6;40087:77;;;40139:9;40134:3;40130:19;40124:26;40115:35;;40087:77;40190:67;40250:6;40243:5;40190:67;:::i;:::-;40184:4;40177:81;40046:222;39381:887;;39411:618;39463:4;39459:9;39451:6;39447:22;39497:37;39529:4;39497:37;:::i;:::-;39556:1;39570:208;39584:7;39581:1;39578:14;39570:208;;;39663:9;39658:3;39654:19;39648:26;39640:6;39633:42;39714:1;39706:6;39702:14;39692:24;;39761:2;39750:9;39746:18;39733:31;;39607:4;39604:1;39600:12;39595:17;;39570:208;;;39806:6;39797:7;39794:19;39791:179;;;39864:9;39859:3;39855:19;39849:26;39907:48;39949:4;39941:6;39937:17;39926:9;39907:48;:::i;:::-;39899:6;39892:64;39814:156;39791:179;40016:1;40012;40004:6;40000:14;39996:22;39990:4;39983:36;39418:611;;;39381:887;;38971:1303;;;38879:1395;;:::o;40280:166::-;40420:18;40416:1;40408:6;40404:14;40397:42;40280:166;:::o;40452:366::-;40594:3;40615:67;40679:2;40674:3;40615:67;:::i;:::-;40608:74;;40691:93;40780:3;40691:93;:::i;:::-;40809:2;40804:3;40800:12;40793:19;;40452:366;;;:::o;40824:419::-;40990:4;41028:2;41017:9;41013:18;41005:26;;41077:9;41071:4;41067:20;41063:1;41052:9;41048:17;41041:47;41105:131;41231:4;41105:131;:::i;:::-;41097:139;;40824:419;;;:::o;41249:98::-;41300:6;41334:5;41328:12;41318:22;;41249:98;;;:::o;41353:147::-;41454:11;41491:3;41476:18;;41353:147;;;;:::o;41506:386::-;41610:3;41638:38;41670:5;41638:38;:::i;:::-;41692:88;41773:6;41768:3;41692:88;:::i;:::-;41685:95;;41789:65;41847:6;41842:3;41835:4;41828:5;41824:16;41789:65;:::i;:::-;41879:6;41874:3;41870:16;41863:23;;41614:278;41506:386;;;;:::o;41898:271::-;42028:3;42050:93;42139:3;42130:6;42050:93;:::i;:::-;42043:100;;42160:3;42153:10;;41898:271;;;;:::o;42175:179::-;42315:31;42311:1;42303:6;42299:14;42292:55;42175:179;:::o;42360:366::-;42502:3;42523:67;42587:2;42582:3;42523:67;:::i;:::-;42516:74;;42599:93;42688:3;42599:93;:::i;:::-;42717:2;42712:3;42708:12;42701:19;;42360:366;;;:::o;42732:419::-;42898:4;42936:2;42925:9;42921:18;42913:26;;42985:9;42979:4;42975:20;42971:1;42960:9;42956:17;42949:47;43013:131;43139:4;43013:131;:::i;:::-;43005:139;;42732:419;;;:::o
Swarm Source
ipfs://ada24e0abf9f1e20949e60d9c55d9bcf2698c87949a4b980eb41348fcd6c3283
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.