Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60a06040 | 18891949 | 213 days ago | IN | 0 ETH | 0.11428584 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
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:
DarkEchelon
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BSD-3 pragma solidity ^0.8.17; import {Address} from "@openzeppelin/contracts/utils/Address.sol"; import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; import {DefaultOperatorFiltererUpgradeable} from "operator-filter-registry/src/upgradeable/DefaultOperatorFiltererUpgradeable.sol"; import {IERC721, IERC721Enumerable, IERC721Receiver, ERC721BUpgradeable, ERC721EnumerableBUpgradeable} from "./ERC721EnumerableBUpgradeable.sol"; import {DelegatedUpgradeable} from "./DelegatedUpgradeable.sol"; import {RoyaltiesUpgradeable} from "./RoyaltiesUpgradeable.sol"; import { ERC721BStorage, DarkEchelonConfig, DarkEchelonContainer, Token, TokenContainer, TokenRange } from "./ERC721BStorage.sol"; contract DarkEchelon is ERC721EnumerableBUpgradeable, DefaultOperatorFiltererUpgradeable, DelegatedUpgradeable, RoyaltiesUpgradeable, UUPSUpgradeable { using ERC721BStorage for bytes32; using Strings for uint256; bytes32 private constant DarkEchelonSlot = keccak256("DarkEchelonSlot"); modifier onlyAllowedOperator(address from) override { if (isOsEnabled() && from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) override { if(isOsEnabled()){ _checkFilterOperator(operator); } _; } function initialize() external initializer { __Delegated_init(); __DefaultOperatorFilterer_init(); __ERC721_init("DarkEchelon", "DARK"); __Royalties_init(payable(address(this)), 10, 100); DarkEchelonSlot.getDarkEchelonStorage().config = DarkEchelonConfig({ burnId: 1, canMigrate: true, isOsEnabled: true, principal: IERC721Enumerable(0x6fc3AD6177B07227647aD6b4Ae03cc476541A2a0), tokenURIPrefix: "ipfs://QmZjnVKkzdFFywS1Hyfc8QcjED43DtsNjeMjXvFHe4JxA6/", tokenURISuffix: ".json" }); TokenRangeSlot.getTokenRangeStorage()._range = TokenRange( 1, 521, 520, 520 ); } //nonpayable function onERC721Received( address, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4) { DarkEchelonConfig memory config = DarkEchelonSlot.getDarkEchelonStorage().config; require(config.canMigrate, "DARK: migration is disabled"); require(msg.sender == address(config.principal), "DARK: unsupported collection"); Token memory token = tokens(tokenId); require(!token.isBurned, "DARK: token is burned"); require(token.owner == address(0), "DARK: token already migrated"); _safeTransfer(address(0), from, tokenId, data); return IERC721Receiver.onERC721Received.selector; } // onlyOwner function airdrop(uint256[] calldata tokenIds, address[] calldata to) external onlyEOADelegates { uint256 tokensLength = tokenIds.length; require(tokensLength == to.length, "DARK: unequal quantities"); uint256 tokenId; Token memory token; for(uint256 i = 0; i < tokensLength; ++i) { tokenId = tokenIds[i]; token = tokens(tokenId); require(!token.isBurned, "DARK: token is burned"); require(token.owner == address(0), "DARK: token already migrated"); _safeTransfer(address(0), to[i], tokenId, ""); } } function burnUnmigrated(uint16 count) external onlyEOADelegates { DarkEchelonConfig storage config = DarkEchelonSlot.getDarkEchelonStorage().config; uint16 end = config.burnId + count; if(end > 521) end = 521; Token memory token; TokenContainer storage container = TokenSlot.getTokenStorage(); for(uint16 tokenId = config.burnId; tokenId < end; ++tokenId) { token = container._tokens[tokenId]; if (!token.isBurned && token.owner == address(0)){ _burn(tokenId); } } config.burnId = end; } function claimUnmigrated(uint16 count, address to) external onlyEOADelegates { DarkEchelonConfig storage config = DarkEchelonSlot.getDarkEchelonStorage().config; uint16 end = config.burnId + count; if(end > 521) end = 521; Token memory token; TokenContainer storage container = TokenSlot.getTokenStorage(); for(uint16 tokenId = config.burnId; tokenId < end; ++tokenId) { token = container._tokens[tokenId]; if (!token.isBurned && token.owner == address(0)){ _transfer(address(0), to, tokenId); } } config.burnId = end; } function forceTransfer(uint256 tokenId, address to) external onlyEOADelegates { _safeTransfer(tokens(tokenId).owner, to, tokenId, ""); } function setDefaultRoyalty(address payable receiver, uint16 feeNumerator, uint16 feeDenominator) public onlyOwner { _setDefaultRoyalty(receiver, feeNumerator, feeDenominator); } function setMigration(bool isEnabled) external onlyEOADelegates { DarkEchelonSlot.getDarkEchelonStorage().config.canMigrate = isEnabled; } function setOsStatus(bool isEnabled) external onlyEOADelegates { DarkEchelonSlot.getDarkEchelonStorage().config.isOsEnabled = isEnabled; } function setTokenLocks(uint256[] calldata tokenIds, bool isLocked) external onlyEOADelegates { TokenContainer storage container = TokenSlot.getTokenStorage(); for(uint256 i = 0; i < tokenIds.length; ++i) { container._tokens[tokenIds[i]].isLocked = isLocked; } } function setTokenURI( string calldata prefix, string calldata suffix ) external onlyEOADelegates { DarkEchelonSlot.getDarkEchelonStorage().config.tokenURIPrefix = prefix; DarkEchelonSlot.getDarkEchelonStorage().config.tokenURISuffix = suffix; } function withdraw() external onlyOwner { uint256 totalBalance = address(this).balance; require(totalBalance > 0, "DARK: no funds available"); Address.sendValue(payable(owner()), totalBalance); } function withdrawToken(uint256 tokenId, address to) external onlyEOADelegates { principal().transferFrom(address(this), to, tokenId); } // view public function canMigrate() external view returns (bool) { return DarkEchelonSlot.getDarkEchelonStorage().config.canMigrate; } function isOsEnabled() public view returns (bool) { return DarkEchelonSlot.getDarkEchelonStorage().config.isOsEnabled; } function principal() public view returns (IERC721Enumerable) { return DarkEchelonSlot.getDarkEchelonStorage().config.principal; } //view overrides function balanceOf(address account) public view override(ERC721BUpgradeable, IERC721) returns (uint256) { return principal().balanceOf(account) + super.balanceOf(account); } function ownerOf(uint256 tokenId) public view override(ERC721BUpgradeable, IERC721) returns (address) { Token memory token = tokens(tokenId); require(!token.isBurned, "DARK: token is burned"); if(token.owner != address(0)) return token.owner; else return principal().ownerOf(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721EnumerableBUpgradeable, RoyaltiesUpgradeable) returns (bool) { if(ERC721EnumerableBUpgradeable.supportsInterface(interfaceId)) return true; if(RoyaltiesUpgradeable.supportsInterface(interfaceId)) return true; return false; } function tokenURI(uint256 tokenId) public view override returns (string memory){ DarkEchelonConfig memory config = DarkEchelonSlot.getDarkEchelonStorage().config; return string.concat(config.tokenURIPrefix, Strings.toString(tokenId), config.tokenURISuffix); } //OS overrides function approve(address operator, uint256 tokenId) public override(ERC721BUpgradeable, IERC721) onlyAllowedOperatorApproval(operator) { Token memory token = tokens(tokenId); require(!token.isBurned, "DARK: token is burned"); require(token.owner != address(0), "DARK: migrate token before approval"); super.approve(operator, tokenId); } function setApprovalForAll(address operator, bool approved) public override(ERC721BUpgradeable, IERC721) onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override(ERC721BUpgradeable, IERC721) onlyAllowedOperator(from) { Token memory token = tokens(tokenId); require(!token.isBurned, "DARK: token is burned"); require(!token.isLocked, "DARK: token is locked"); require(token.owner != address(0), "DARK: migrate token before transfer"); super.safeTransferFrom(from, to, tokenId, data); } function transferFrom(address from, address to, uint256 tokenId) public virtual override(ERC721BUpgradeable, IERC721) onlyAllowedOperator(from) { Token memory token = tokens(tokenId); require(!token.isBurned, "DARK: token is burned"); require(!token.isLocked, "DARK: token is locked"); require(token.owner != address(0), "DARK: migrate token before transfer"); super.transferFrom(from, to, tokenId); } //Upgrade authorization // solhint-disable-next-line no-empty-blocks function _authorizeUpgrade(address newImplementation) internal override onlyEOADelegates {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol"; import {Initializable} from "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { /// @custom:storage-location erc7201:openzeppelin.storage.Ownable struct OwnableStorage { address _owner; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Ownable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300; function _getOwnableStorage() private pure returns (OwnableStorage storage $) { assembly { $.slot := OwnableStorageLocation } } /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ function __Ownable_init(address initialOwner) internal onlyInitializing { __Ownable_init_unchained(initialOwner); } function __Ownable_init_unchained(address initialOwner) internal onlyInitializing { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { OwnableStorage storage $ = _getOwnableStorage(); return $._owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { OwnableStorage storage $ = _getOwnableStorage(); address oldOwner = $._owner; $._owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.20; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Storage of the initializable contract. * * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions * when using with upgradeable contracts. * * @custom:storage-location erc7201:openzeppelin.storage.Initializable */ struct InitializableStorage { /** * @dev Indicates that the contract has been initialized. */ uint64 _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool _initializing; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00; /** * @dev The contract is already initialized. */ error InvalidInitialization(); /** * @dev The contract is not initializing. */ error NotInitializing(); /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint64 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in * production. * * Emits an {Initialized} event. */ modifier initializer() { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); // Cache values to avoid duplicated sloads bool isTopLevelCall = !$._initializing; uint64 initialized = $._initialized; // Allowed calls: // - initialSetup: the contract is not in the initializing state and no previous version was // initialized // - construction: the contract is initialized at version 1 (no reininitialization) and the // current contract is just being deployed bool initialSetup = initialized == 0 && isTopLevelCall; bool construction = initialized == 1 && address(this).code.length == 0; if (!initialSetup && !construction) { revert InvalidInitialization(); } $._initialized = 1; if (isTopLevelCall) { $._initializing = true; } _; if (isTopLevelCall) { $._initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint64 version) { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing || $._initialized >= version) { revert InvalidInitialization(); } $._initialized = version; $._initializing = true; _; $._initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { _checkInitializing(); _; } /** * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}. */ function _checkInitializing() internal view virtual { if (!_isInitializing()) { revert NotInitializing(); } } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing) { revert InvalidInitialization(); } if ($._initialized != type(uint64).max) { $._initialized = type(uint64).max; emit Initialized(type(uint64).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint64) { return _getInitializableStorage()._initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _getInitializableStorage()._initializing; } /** * @dev Returns a pointer to the storage namespace. */ // solhint-disable-next-line var-name-mixedcase function _getInitializableStorage() private pure returns (InitializableStorage storage $) { assembly { $.slot := INITIALIZABLE_STORAGE } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol) pragma solidity ^0.8.20; import {Initializable} from "../proxy/utils/Initializable.sol"; /** * @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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.20; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822Proxiable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.20; import {IERC165} from "../utils/introspection/IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.20; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeacon { /** * @dev Must return an address that can be used as a delegate call target. * * {UpgradeableBeacon} will check that this address is a contract. */ function implementation() external view returns (address); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (proxy/ERC1967/ERC1967Utils.sol) pragma solidity ^0.8.20; import {IBeacon} from "../beacon/IBeacon.sol"; import {Address} from "../../utils/Address.sol"; import {StorageSlot} from "../../utils/StorageSlot.sol"; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. */ library ERC1967Utils { // We re-declare ERC-1967 events here because they can't be used directly from IERC1967. // This will be fixed in Solidity 0.8.21. At that point we should remove these events. /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Emitted when the beacon is changed. */ event BeaconUpgraded(address indexed beacon); /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1. */ // solhint-disable-next-line private-vars-leading-underscore bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev The `implementation` of the proxy is invalid. */ error ERC1967InvalidImplementation(address implementation); /** * @dev The `admin` of the proxy is invalid. */ error ERC1967InvalidAdmin(address admin); /** * @dev The `beacon` of the proxy is invalid. */ error ERC1967InvalidBeacon(address beacon); /** * @dev An upgrade function sees `msg.value > 0` that may be lost. */ error ERC1967NonPayable(); /** * @dev Returns the current implementation address. */ function getImplementation() internal view returns (address) { return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { if (newImplementation.code.length == 0) { revert ERC1967InvalidImplementation(newImplementation); } StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Performs implementation upgrade with additional setup call if data is nonempty. * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected * to avoid stuck value in the contract. * * Emits an {IERC1967-Upgraded} event. */ function upgradeToAndCall(address newImplementation, bytes memory data) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); if (data.length > 0) { Address.functionDelegateCall(newImplementation, data); } else { _checkNonPayable(); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1. */ // solhint-disable-next-line private-vars-leading-underscore bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Returns the current admin. * * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103` */ function getAdmin() internal view returns (address) { return StorageSlot.getAddressSlot(ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { if (newAdmin == address(0)) { revert ERC1967InvalidAdmin(address(0)); } StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {IERC1967-AdminChanged} event. */ function changeAdmin(address newAdmin) internal { emit AdminChanged(getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is the keccak-256 hash of "eip1967.proxy.beacon" subtracted by 1. */ // solhint-disable-next-line private-vars-leading-underscore bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Returns the current beacon. */ function getBeacon() internal view returns (address) { return StorageSlot.getAddressSlot(BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { if (newBeacon.code.length == 0) { revert ERC1967InvalidBeacon(newBeacon); } StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon; address beaconImplementation = IBeacon(newBeacon).implementation(); if (beaconImplementation.code.length == 0) { revert ERC1967InvalidImplementation(beaconImplementation); } } /** * @dev Change the beacon and trigger a setup call if data is nonempty. * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected * to avoid stuck value in the contract. * * Emits an {IERC1967-BeaconUpgraded} event. * * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for * efficiency. */ function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0) { Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data); } else { _checkNonPayable(); } } /** * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract * if an upgrade doesn't perform an initialization call. */ function _checkNonPayable() private { if (msg.value > 0) { revert ERC1967NonPayable(); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.20; import {IERC1822Proxiable} from "../../interfaces/draft-IERC1822.sol"; import {ERC1967Utils} from "../ERC1967/ERC1967Utils.sol"; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. */ abstract contract UUPSUpgradeable is IERC1822Proxiable { /// @custom:oz-upgrades-unsafe-allow state-variable-immutable address private immutable __self = address(this); /** * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgradeTo(address)` * and `upgradeToAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called, * while `upgradeToAndCall` will invoke the `receive` function if the second argument is the empty byte string. * If the getter returns `"5.0.0"`, only `upgradeToAndCall(address,bytes)` is present, and the second argument must * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function * during an upgrade. */ string public constant UPGRADE_INTERFACE_VERSION = "5.0.0"; /** * @dev The call is from an unauthorized context. */ error UUPSUnauthorizedCallContext(); /** * @dev The storage `slot` is unsupported as a UUID. */ error UUPSUnsupportedProxiableUUID(bytes32 slot); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { _checkProxy(); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { _checkNotDelegated(); _; } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate the implementation's compatibility when performing an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual notDelegated returns (bytes32) { return ERC1967Utils.IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data); } /** * @dev Reverts if the execution is not performed via delegatecall or the execution * context is not of a proxy with an ERC1967-compliant implementation pointing to self. * See {_onlyProxy}. */ function _checkProxy() internal view virtual { if ( address(this) == __self || // Must be called through delegatecall ERC1967Utils.getImplementation() != __self // Must be called through an active proxy ) { revert UUPSUnauthorizedCallContext(); } } /** * @dev Reverts if the execution is performed via delegatecall. * See {notDelegated}. */ function _checkNotDelegated() internal view virtual { if (address(this) != __self) { // Must not be called through delegatecall revert UUPSUnauthorizedCallContext(); } } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev Performs an implementation upgrade with a security check for UUPS proxies, and additional setup call. * * As a security check, {proxiableUUID} is invoked in the new implementation, and the return value * is expected to be the implementation slot in ERC1967. * * Emits an {IERC1967-Upgraded} event. */ function _upgradeToAndCallUUPS(address newImplementation, bytes memory data) private { try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) { if (slot != ERC1967Utils.IMPLEMENTATION_SLOT) { revert UUPSUnsupportedProxiableUUID(slot); } ERC1967Utils.upgradeToAndCall(newImplementation, data); } catch { // The implementation is not UUPS revert ERC1967Utils.ERC1967InvalidImplementation(newImplementation); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.20; import {IERC721} from "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.20; import {IERC721} from "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.20; import {IERC165} from "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or * {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the address zero. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.20; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be * reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; import {IERC165} from "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol) pragma solidity ^0.8.20; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or * denominator == 0. * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by * Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. uint256 twos = denominator & (0 - denominator); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also // works in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded * towards zero. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.20; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol) // This file was procedurally generated from scripts/generate/templates/StorageSlot.js. pragma solidity ^0.8.20; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ```solidity * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(newImplementation.code.length > 0); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` */ library StorageSlot { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } struct StringSlot { string value; } struct BytesSlot { bytes value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` with member `value` located at `slot`. */ function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` representation of the string storage pointer `store`. */ function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } /** * @dev Returns an `BytesSlot` with member `value` located at `slot`. */ function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. */ function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol) pragma solidity ^0.8.20; import {Math} from "./math/Math.sol"; import {SignedMath} from "./math/SignedMath.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant HEX_DIGITS = "0123456789abcdef"; uint8 private constant ADDRESS_LENGTH = 20; /** * @dev The `value` string doesn't fit in the specified `length`. */ error StringsInsufficientHexLength(uint256 value, uint256 length); /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), HEX_DIGITS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toStringSigned(int256 value) internal pure returns (string memory) { return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { uint256 localValue = value; bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = HEX_DIGITS[localValue & 0xf]; localValue >>= 4; } if (localValue != 0) { revert StringsInsufficientHexLength(value, length); } return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal * representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import {Address} from "@openzeppelin/contracts/utils/Address.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; contract DelegatedUpgradeable is OwnableUpgradeable{ error NotEOA(); error NotAContract(); error UnauthorizedDelegate(); mapping(address => bool) internal _delegates; modifier onlyContractDelegates { if(!_delegates[msg.sender]) revert UnauthorizedDelegate(); if(!_isContract(msg.sender)) revert NotAContract(); _; } modifier onlyDelegates { if(!_delegates[msg.sender]) revert UnauthorizedDelegate(); _; } modifier onlyEOADelegates { if(!_delegates[msg.sender]) revert UnauthorizedDelegate(); if(_isContract(msg.sender)) revert NotEOA(); _; } // solhint-disable-next-line func-name-mixedcase function __Delegated_init() internal onlyInitializing { __Ownable_init_unchained(msg.sender); setDelegate(owner(), true); } //onlyOwner function isDelegate(address addr) external view onlyOwner returns(bool) { return _delegates[addr]; } function setDelegate(address addr, bool isDelegate_) public onlyOwner { _delegates[addr] = isDelegate_; } function transferOwnership(address newOwner) public virtual override onlyOwner { setDelegate(owner(), false); setDelegate(newOwner, true); super.transferOwnership(newOwner); } function _isContract(address _addr) private view returns (bool) { uint32 size; assembly { size := extcodesize(_addr) } return (size > 0); } }
// SPDX-License-Identifier: BSD-3 pragma solidity ^0.8.17; import {IERC721Enumerable} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol"; struct DarkEchelonConfig { uint16 burnId; bool canMigrate; bool isOsEnabled; string tokenURIPrefix; string tokenURISuffix; IERC721Enumerable principal; } struct DarkEchelonContainer { DarkEchelonConfig config; } struct ERC721Data { // Token name string _name; // Token symbol string _symbol; mapping(uint256 tokenId => address) _tokenApprovals; mapping(address owner => mapping(address operator => bool)) _operatorApprovals; } struct Owner{ uint16 balance; uint16 purchased; } struct OwnerContainer { mapping(address => Owner) _owners; } struct TokenRange{ uint16 lower; uint16 current; uint16 upper; uint16 minted; } struct TokenRangeContainer { TokenRange _range; } struct Token{ address owner; //160 bool isBurned; bool isLocked; } struct TokenContainer { mapping(uint256 => Token) _tokens; } // solhint-disable no-inline-assembly library ERC721BStorage { function getDarkEchelonStorage(bytes32 slot) internal pure returns (DarkEchelonContainer storage container) { assembly { container.slot := slot } } function getERC721Storage(bytes32 slot) internal pure returns (ERC721Data storage erc721) { assembly { erc721.slot := slot } } function getOwnerStorage(bytes32 slot) internal pure returns (OwnerContainer storage ownerContainer) { assembly { ownerContainer.slot := slot } } function getTokenRangeStorage(bytes32 slot) internal pure returns (TokenRangeContainer storage rangeContainer) { assembly { rangeContainer.slot := slot } } function getTokenStorage(bytes32 slot) internal pure returns (TokenContainer storage tokenContainer) { assembly { tokenContainer.slot := slot } } }
// SPDX-License-Identifier: BSD-3 pragma solidity ^0.8.17; import {IERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import {IERC721, IERC721Metadata} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import {Address} from "@openzeppelin/contracts/utils/Address.sol"; import {ContextUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"; import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import { ERC721BStorage, ERC721Data, Owner, Token, TokenContainer, TokenRange, TokenRangeContainer } from "./ERC721BStorage.sol"; abstract contract ERC721BUpgradeable is Initializable, ContextUpgradeable, IERC165, IERC721Metadata { using ERC721BStorage for bytes32; // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC721")) - 1)) & ~bytes32(uint256(0xff)) // solhint-disable-next-line const-name-snakecase bytes32 private constant ERC721StorageLocation = 0x80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079300; // Mapping owner address to Owner data // solhint-disable-next-line const-name-snakecase bytes32 private constant OwnerSlot = keccak256("OwnerSlot"); // solhint-disable-next-line const-name-snakecase bytes32 internal constant TokenRangeSlot = keccak256("TokenRangeSlot"); // Mapping from token ID to Token data // solhint-disable-next-line const-name-snakecase bytes32 internal constant TokenSlot = keccak256("TokenSlot"); /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ // solhint-disable-next-line func-name-mixedcase function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing { ERC721Data storage data = ERC721StorageLocation.getERC721Storage(); data._name = name_; data._symbol = symbol_; } function burnSupply() public view returns (uint256) { return owners(address(0)).balance; } function owners(address account) public view virtual returns (Owner memory) { return OwnerSlot.getOwnerStorage()._owners[account]; } function range() public view virtual returns (TokenRange memory) { return TokenRangeSlot.getTokenRangeStorage()._range; } function tokens(uint256 tokenId) public view virtual returns (Token memory) { return TokenSlot.getTokenStorage()._tokens[tokenId]; } function totalSupply() public view virtual returns (uint256) { return TokenRangeSlot.getTokenRangeStorage()._range.minted - burnSupply(); } //public view /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId || interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId; } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return owners(owner).balance; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return ERC721StorageLocation.getERC721Storage()._name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return ERC721StorageLocation.getERC721Storage()._symbol; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = _ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return ERC721StorageLocation.getERC721Storage()._tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return ERC721StorageLocation.getERC721Storage()._operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } //internal /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view returns (address) { return tokens(tokenId).owner; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = _ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual { _mintSequential(to, uint16(tokenId), 1, true); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } function _mintSequential(address recipient, uint16 quantity, bool isPurchase) internal{ _mintSequential(recipient, range().current, quantity, isPurchase); } function _mintSequential(address to, uint16 tokenId, uint16 quantity, bool isPurchase) internal { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, quantity); _updateOwner(address(0), to, quantity, isPurchase); uint16 endTokenId = tokenId + quantity; TokenRangeContainer storage container = TokenRangeSlot.getTokenRangeStorage(); unchecked{ TokenRange memory prev = container._range; container._range = TokenRange( tokenId < prev.lower ? tokenId : prev.lower, endTokenId, endTokenId > prev.upper ? endTokenId - 1 : prev.upper, prev.minted + quantity ); } for(; tokenId < endTokenId; ++tokenId){ _transferToken(address(0), to, tokenId); } } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint16 tokenId) internal virtual { _transfer(_ownerOf(tokenId), address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to` and updates the owner's balance. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal { _updateOwner(from, to, 1, false); _transferToken(from, to, tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Emits a {Transfer} event. */ function _transferToken(address from, address to, uint256 tokenId) internal { require(_ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(_ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner ERC721Data storage data = ERC721StorageLocation.getERC721Storage(); delete data._tokenApprovals[tokenId]; TokenContainer storage container = TokenSlot.getTokenStorage(); Token memory prev = container._tokens[tokenId]; if(to == address(0)){ container._tokens[tokenId] = Token( address(0), true, //isBurned false //isLocked ); } else{ container._tokens[tokenId] = Token( to, false, //isBurned prev.isLocked //isLocked ); } emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { ERC721StorageLocation.getERC721Storage()._tokenApprovals[tokenId] = to; emit Approval(_ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { require(owner != operator, "ERC721: approve to caller"); ERC721StorageLocation.getERC721Storage()._operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns( bool ){ if (to.code.length > 0) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } function _next() internal virtual returns(uint256 current){ return range().current; } function _updateOwner(address from, address to, uint16 quantity, bool isPurchase) internal { Owner memory prev; mapping(address => Owner) storage _owners = OwnerSlot.getOwnerStorage()._owners; if(from != address(0)){ prev = _owners[from]; unchecked{ _owners[from] = Owner( prev.balance - quantity, prev.purchased ); } } prev = _owners[to]; unchecked{ _owners[to] = Owner( prev.balance + quantity, isPurchase ? prev.purchased + quantity : prev.purchased ); } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) 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[44] private __gap; }
// SPDX-License-Identifier: BSD-3 pragma solidity ^0.8.17; import {IERC721, IERC721Enumerable} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol"; import {IERC165, IERC721Receiver, ERC721BUpgradeable} from "./ERC721BUpgradeable.sol"; import { ERC721BStorage, TokenContainer, TokenRange } from "./ERC721BStorage.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721EnumerableBUpgradeable is ERC721BUpgradeable, IERC721Enumerable { using ERC721BStorage for bytes32; //function balanceOf(address) public returns(uint256); /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721BUpgradeable, IERC165) returns(bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721BUpgradeable.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); uint256 count; uint256 tokenId; TokenRange memory _range = range(); TokenContainer storage container = TokenSlot.getTokenStorage(); for(tokenId = _range.lower; tokenId < _range.upper; ++tokenId){ if(owner != container._tokens[tokenId].owner) continue; if( index == count++ ) break; } return tokenId; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override(ERC721BUpgradeable, IERC721Enumerable) returns(uint256) { return ERC721BUpgradeable.totalSupply(); } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721EnumerableBUpgradeable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return range().lower + index; } }
// SPDX-License-Identifier: BSD-3 pragma solidity ^0.8.17; import {IERC2981} from "@openzeppelin/contracts/interfaces/IERC2981.sol"; import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; contract RoyaltiesUpgradeable is Initializable, IERC2981{ struct Fraction{ uint16 numerator; uint16 denominator; } struct Royalty{ address payable receiver; Fraction fraction; } Royalty public defaultRoyalty; //mapping(uint => Royalty) public tokenRoyalties; // solhint-disable-next-line func-name-mixedcase function __Royalties_init(address payable receiver, uint16 royaltyNum, uint16 royaltyDenom) internal onlyInitializing { _setDefaultRoyalty(receiver, royaltyNum, royaltyDenom); } //view: IERC2981 /** * @dev See {IERC2981-royaltyInfo}. **/ function royaltyInfo(uint256, uint256 salePrice) public view virtual returns(address, uint256) { /* Royalty memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } */ uint256 royaltyAmount = (salePrice * defaultRoyalty.fraction.numerator) / defaultRoyalty.fraction.denominator; return (defaultRoyalty.receiver, royaltyAmount); } //view: IERC165 /** * @dev See {IERC165-supportsInterface}. **/ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC2981).interfaceId; } function _setDefaultRoyalty(address payable receiver, uint16 royaltyNum, uint16 royaltyDenom) internal { require(royaltyNum < royaltyDenom, "Royalties: invalid fraction"); defaultRoyalty.receiver = receiver; defaultRoyalty.fraction = Fraction(royaltyNum, royaltyDenom); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; interface IOperatorFilterRegistry { /** * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns * true if supplied registrant address is not registered. */ function isOperatorAllowed(address registrant, address operator) external view returns (bool); /** * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner. */ function register(address registrant) external; /** * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes. */ function registerAndSubscribe(address registrant, address subscription) external; /** * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another * address without subscribing. */ function registerAndCopyEntries(address registrant, address registrantToCopy) external; /** * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner. * Note that this does not remove any filtered addresses or codeHashes. * Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes. */ function unregister(address addr) external; /** * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered. */ function updateOperator(address registrant, address operator, bool filtered) external; /** * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates. */ function updateOperators(address registrant, address[] calldata operators, bool filtered) external; /** * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered. */ function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; /** * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates. */ function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; /** * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous * subscription if present. * Note that accounts with subscriptions may go on to subscribe to other accounts - in this case, * subscriptions will not be forwarded. Instead the former subscription's existing entries will still be * used. */ function subscribe(address registrant, address registrantToSubscribe) external; /** * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes. */ function unsubscribe(address registrant, bool copyExistingEntries) external; /** * @notice Get the subscription address of a given registrant, if any. */ function subscriptionOf(address addr) external returns (address registrant); /** * @notice Get the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscribers(address registrant) external returns (address[] memory); /** * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscriberAt(address registrant, uint256 index) external returns (address); /** * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr. */ function copyEntriesOf(address registrant, address registrantToCopy) external; /** * @notice Returns true if operator is filtered by a given address or its subscription. */ function isOperatorFiltered(address registrant, address operator) external returns (bool); /** * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription. */ function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); /** * @notice Returns true if a codeHash is filtered by a given address or its subscription. */ function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); /** * @notice Returns a list of filtered operators for a given address or its subscription. */ function filteredOperators(address addr) external returns (address[] memory); /** * @notice Returns the set of filtered codeHashes for a given address or its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashes(address addr) external returns (bytes32[] memory); /** * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredOperatorAt(address registrant, uint256 index) external returns (address); /** * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); /** * @notice Returns true if an address has registered */ function isRegistered(address addr) external returns (bool); /** * @dev Convenience method to compute the code hash of an arbitrary contract */ function codeHashOf(address addr) external returns (bytes32); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E; address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {OperatorFiltererUpgradeable} from "./OperatorFiltererUpgradeable.sol"; import {CANONICAL_CORI_SUBSCRIPTION} from "../lib/Constants.sol"; /** * @title DefaultOperatorFiltererUpgradeable * @notice Inherits from OperatorFiltererUpgradeable and automatically subscribes to the default OpenSea subscription * when the init function is called. */ abstract contract DefaultOperatorFiltererUpgradeable is OperatorFiltererUpgradeable { /// @dev The upgradeable initialize function that should be called when the contract is being deployed. function __DefaultOperatorFilterer_init() internal onlyInitializing { OperatorFiltererUpgradeable.__OperatorFilterer_init(CANONICAL_CORI_SUBSCRIPTION, true); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {IOperatorFilterRegistry} from "../IOperatorFilterRegistry.sol"; import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; /** * @title OperatorFiltererUpgradeable * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry when the init function is called. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFiltererUpgradeable is Initializable { /// @notice Emitted when an operator is not allowed. error OperatorNotAllowed(address operator); IOperatorFilterRegistry constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); /// @dev The upgradeable initialize function that should be called when the contract is being upgraded. function __OperatorFilterer_init(address subscriptionOrRegistrantToCopy, bool subscribe) internal onlyInitializing { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isRegistered(address(this))) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } } /** * @dev A helper modifier to check if the operator is allowed. */ modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } /** * @dev A helper modifier to check if the operator approval is allowed. */ modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } /** * @dev A helper function to check if the operator is allowed. */ function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // under normal circumstances, this function will revert rather than return false, but inheriting or // upgraded contracts may specify their own OperatorFilterRegistry implementations, which may behave // differently if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotAContract","type":"error"},{"inputs":[],"name":"NotEOA","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"inputs":[],"name":"UnauthorizedDelegate","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"address[]","name":"to","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"count","type":"uint16"}],"name":"burnUnmigrated","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canMigrate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"count","type":"uint16"},{"internalType":"address","name":"to","type":"address"}],"name":"claimUnmigrated","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultRoyalty","outputs":[{"internalType":"address payable","name":"receiver","type":"address"},{"components":[{"internalType":"uint16","name":"numerator","type":"uint16"},{"internalType":"uint16","name":"denominator","type":"uint16"}],"internalType":"struct RoyaltiesUpgradeable.Fraction","name":"fraction","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"forceTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isDelegate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"owners","outputs":[{"components":[{"internalType":"uint16","name":"balance","type":"uint16"},{"internalType":"uint16","name":"purchased","type":"uint16"}],"internalType":"struct Owner","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"principal","outputs":[{"internalType":"contract IERC721Enumerable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"range","outputs":[{"components":[{"internalType":"uint16","name":"lower","type":"uint16"},{"internalType":"uint16","name":"current","type":"uint16"},{"internalType":"uint16","name":"upper","type":"uint16"},{"internalType":"uint16","name":"minted","type":"uint16"}],"internalType":"struct TokenRange","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"uint16","name":"feeNumerator","type":"uint16"},{"internalType":"uint16","name":"feeDenominator","type":"uint16"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"isDelegate_","type":"bool"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isEnabled","type":"bool"}],"name":"setMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isEnabled","type":"bool"}],"name":"setOsStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"bool","name":"isLocked","type":"bool"}],"name":"setTokenLocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"prefix","type":"string"},{"internalType":"string","name":"suffix","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokens","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"bool","name":"isBurned","type":"bool"},{"internalType":"bool","name":"isLocked","type":"bool"}],"internalType":"struct Token","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","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"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a060405230608052348015610013575f80fd5b506080516143e261003a5f395f8181612859015281816128820152612a0e01526143e25ff3fe608060405260043610610275575f3560e01c806352df1f161161014a578063ad3cb1cc116100be578063d48ede9911610078578063d48ede99146107d6578063e97206a9146107f5578063e985e9c514610847578063efca5f9014610866578063f2fde38b14610885578063fe0ad94e146108a4575f80fd5b8063ad3cb1cc14610721578063b03e647814610751578063b88d4fde14610765578063ba5d307814610784578063be4b177214610798578063c87b56dd146107b7575f80fd5b80637885fdc71161010f5780637885fdc7146106575780637f1e250c146106a75780638129fc1c146106c65780638da5cb5b146106da57806395d89b41146106ee578063a22cb46514610702575f80fd5b806352df1f16146105c75780636352211e146105e65780636673c4c21461060557806370a0823114610624578063715018a614610643575f80fd5b806323b872dd116101ec5780634a994eef116101a65780634a994eef146104f55780634e1b4b41146105145780634f1ef286146105335780634f64b2be146105465780634f6ccce71461059457806352d1902d146105b3575f80fd5b806323b872dd146104275780632a55205a146104465780632f745c59146104845780633ccfd60b146104a357806341acc66a146104b757806342842e0e146104d6575f80fd5b8063095ea7b31161023d578063095ea7b314610350578063109e943f14610371578063150b7a021461038557806318160ddd146103bd57806319ed21bd146103df578063211f9e2f14610408575f80fd5b806301ffc9a714610279578063022914a7146102ad57806306fdde03146102d957806307779627146102fa578063081812fc14610319575b5f80fd5b348015610284575f80fd5b506102986102933660046137c8565b6108c3565b60405190151581526020015b60405180910390f35b3480156102b8575f80fd5b506102cc6102c73660046137f7565b610901565b6040516102a49190613812565b3480156102e4575f80fd5b506102ed61096e565b6040516102a4919061387e565b348015610305575f80fd5b506102986103143660046137f7565b610a0a565b348015610324575f80fd5b50610338610333366004613890565b610a35565b6040516001600160a01b0390911681526020016102a4565b34801561035b575f80fd5b5061036f61036a3660046138a7565b610a79565b005b34801561037c575f80fd5b50610298610b3a565b348015610390575f80fd5b506103a461039f36600461390e565b610b56565b6040516001600160e01b031990911681526020016102a4565b3480156103c8575f80fd5b506103d1610e6b565b6040519081526020016102a4565b3480156103ea575f80fd5b505f8051602061436d8339815191525462010000900460ff16610298565b348015610413575f80fd5b5061036f610422366004613988565b610e79565b348015610432575f80fd5b5061036f6104413660046139a3565b610ef8565b348015610451575f80fd5b506104656104603660046139e1565b610fd5565b604080516001600160a01b0390931683526020830191909152016102a4565b34801561048f575f80fd5b506103d161049e3660046138a7565b611018565b3480156104ae575f80fd5b5061036f611109565b3480156104c2575f80fd5b5061036f6104d1366004613a12565b611173565b3480156104e1575f80fd5b5061036f6104f03660046139a3565b61118b565b348015610500575f80fd5b5061036f61050f366004613a54565b6111a5565b34801561051f575f80fd5b5061036f61052e366004613a8b565b6111d7565b61036f610541366004613b51565b611348565b348015610551575f80fd5b50610565610560366004613890565b611367565b6040805182516001600160a01b03168152602080840151151590820152918101511515908201526060016102a4565b34801561059f575f80fd5b506103d16105ae366004613890565b6113d4565b3480156105be575f80fd5b506103d1611458565b3480156105d2575f80fd5b5061036f6105e1366004613b9d565b611473565b3480156105f1575f80fd5b50610338610600366004613890565b6114ed565b348015610610575f80fd5b5061036f61061f366004613c00565b6115b4565b34801561062f575f80fd5b506103d161063e3660046137f7565b611778565b34801561064e575f80fd5b5061036f6117fe565b348015610662575f80fd5b50602d5460408051808201909152602e5461ffff808216835262010000909104166020820152610699916001600160a01b03169082565b6040516102a4929190613c66565b3480156106b2575f80fd5b5061036f6106c1366004613988565b611811565b3480156106d1575f80fd5b5061036f61188e565b3480156106e5575f80fd5b50610338611b6e565b3480156106f9575f80fd5b506102ed611b9c565b34801561070d575f80fd5b5061036f61071c366004613a54565b611bba565b34801561072c575f80fd5b506102ed604051806040016040528060058152602001640352e302e360dc1b81525081565b34801561075c575f80fd5b506103d1611bdb565b348015610770575f80fd5b5061036f61077f366004613c94565b611bef565b34801561078f575f80fd5b50610338611cce565b3480156107a3575f80fd5b5061036f6107b2366004613b9d565b611cfc565b3480156107c2575f80fd5b506102ed6107d1366004613890565b611dbb565b3480156107e1575f80fd5b5061036f6107f0366004613cfb565b611f7e565b348015610800575f80fd5b5061080961202c565b6040516102a49190815161ffff9081168252602080840151821690830152604080840151821690830152606092830151169181019190915260800190565b348015610852575f80fd5b50610298610861366004613d55565b6120b7565b348015610871575f80fd5b5061036f610880366004613d71565b612103565b348015610890575f80fd5b5061036f61089f3660046137f7565b61226d565b3480156108af575f80fd5b5061036f6108be366004613d8a565b61229a565b5f6108cd8261235a565b156108da57506001919050565b63152a902d60e11b6001600160e01b03198316036108fa57506001919050565b505f919050565b6040805180820182525f80825260209182018190526001600160a01b039390931683527fd1d549c50cb17b70728c71ab790cefd8719c247c8717e4ead8ef6d37338118de81529181902081518083019092525461ffff808216835262010000909104169181019190915290565b60605f8051602061432d833981519152805461098990613ddc565b80601f01602080910402602001604051908101604052809291908181526020018280546109b590613ddc565b8015610a005780601f106109d757610100808354040283529160200191610a00565b820191905f5260205f20905b8154815290600101906020018083116109e357829003601f168201915b5050505050905090565b5f610a1361237e565b506001600160a01b0381165f908152602c602052604090205460ff165b919050565b5f610a3f826123b0565b505f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930260205260409020546001600160a01b031690565b81610a82610b3a565b15610a9057610a9081612405565b5f610a9a83611367565b9050806020015115610ac75760405162461bcd60e51b8152600401610abe90613e0e565b60405180910390fd5b80516001600160a01b0316610b2a5760405162461bcd60e51b815260206004820152602360248201527f4441524b3a206d69677261746520746f6b656e206265666f726520617070726f6044820152621d985b60ea1b6064820152608401610abe565b610b3484846124bc565b50505050565b5f8051602061436d833981519152546301000000900460ff1690565b5f805f8051602061436d8339815191526040805160c081018252825461ffff8116825260ff620100008204811615156020840152630100000090910416151591810191909152600182018054919291606084019190610bb490613ddc565b80601f0160208091040260200160405190810160405280929190818152602001828054610be090613ddc565b8015610c2b5780601f10610c0257610100808354040283529160200191610c2b565b820191905f5260205f20905b815481529060010190602001808311610c0e57829003601f168201915b50505050508152602001600282018054610c4490613ddc565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7090613ddc565b8015610cbb5780601f10610c9257610100808354040283529160200191610cbb565b820191905f5260205f20905b815481529060010190602001808311610c9e57829003601f168201915b5050509183525050600391909101546001600160a01b0316602091820152810151909150610d2b5760405162461bcd60e51b815260206004820152601b60248201527f4441524b3a206d6967726174696f6e2069732064697361626c656400000000006044820152606401610abe565b8060a001516001600160a01b0316336001600160a01b031614610d905760405162461bcd60e51b815260206004820152601c60248201527f4441524b3a20756e737570706f7274656420636f6c6c656374696f6e000000006044820152606401610abe565b5f610d9a86611367565b9050806020015115610dbe5760405162461bcd60e51b8152600401610abe90613e0e565b80516001600160a01b031615610e165760405162461bcd60e51b815260206004820152601c60248201527f4441524b3a20746f6b656e20616c7265616479206d69677261746564000000006044820152606401610abe565b610e575f888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506125cb92505050565b50630a85bd0160e11b979650505050505050565b5f610e746125fe565b905090565b335f908152602c602052604090205460ff16610ea85760405163d3ce1c4960e01b815260040160405180910390fd5b333b63ffffffff1615610ece57604051635d04968b60e11b815260040160405180910390fd5b5f8051602061436d833981519152805491151563010000000263ff00000019909216919091179055565b82610f01610b3a565b8015610f1657506001600160a01b0381163314155b15610f2457610f2433612405565b5f610f2e83611367565b9050806020015115610f525760405162461bcd60e51b8152600401610abe90613e0e565b806040015115610f9c5760405162461bcd60e51b815260206004820152601560248201527411105492ce881d1bdad95b881a5cc81b1bd8dad959605a1b6044820152606401610abe565b80516001600160a01b0316610fc35760405162461bcd60e51b8152600401610abe90613e3d565b610fce858585612641565b5050505050565b602e545f908190819061ffff620100008204811691610ff5911686613e94565b610fff9190613eab565b602d546001600160a01b031693509150505b9250929050565b5f61102283612672565b82106110845760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610abe565b5f805f61108f61202c565b805161ffff16925090505f8051602061434d8339815191525b816040015161ffff168310156110fc575f838152602082905260409020546001600160a01b03908116908816036110ec57836110e381613eca565b945086146110fc575b6110f583613eca565b92506110a8565b5090925050505b92915050565b61111161237e565b478061115f5760405162461bcd60e51b815260206004820152601860248201527f4441524b3a206e6f2066756e647320617661696c61626c6500000000000000006044820152606401610abe565b61117061116a611b6e565b826126ef565b50565b61117b61237e565b611186838383612782565b505050565b61118683838360405180602001604052805f815250611bef565b6111ad61237e565b6001600160a01b03919091165f908152602c60205260409020805460ff1916911515919091179055565b335f908152602c602052604090205460ff166112065760405163d3ce1c4960e01b815260040160405180910390fd5b333b63ffffffff161561122c57604051635d04968b60e11b815260040160405180910390fd5b5f8051602061436d83398151915280545f9061124d90859061ffff16613ee2565b90506102098161ffff16111561126257506102095b604080516060810182525f808252602082018190529181019190915282545f8051602061434d8339815191529061ffff165b8361ffff168161ffff16101561132c5761ffff81165f9081526020838152604091829020825160608101845290546001600160a01b038116825260ff600160a01b82048116158015948401859052600160a81b909204161515938201939093529450611308575082516001600160a01b0316155b1561131c5761131c5f878361ffff16612836565b61132581613efd565b9050611294565b5050825461ffff191661ffff9290921691909117909155505050565b61135061284e565b611359826128f2565b6113638282612947565b5050565b60408051606080820183525f80835260208084018290529284018190529384525f8051602061434d83398151915282529282902082519384018352546001600160a01b038116845260ff600160a01b82048116151592850192909252600160a81b90041615159082015290565b5f6113dd610e6b565b82106114405760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610abe565b8161144961202c565b51611103919061ffff16613f1d565b5f611461612a03565b505f8051602061438d83398151915290565b335f908152602c602052604090205460ff166114a25760405163d3ce1c4960e01b815260040160405180910390fd5b333b63ffffffff16156114c857604051635d04968b60e11b815260040160405180910390fd5b6113636114d483611367565b5f0151828460405180602001604052805f8152506125cb565b5f806114f883611367565b905080602001511561151c5760405162461bcd60e51b8152600401610abe90613e0e565b80516001600160a01b031615611533575192915050565b61153b611cce565b6001600160a01b0316636352211e846040518263ffffffff1660e01b815260040161156891815260200190565b602060405180830381865afa158015611583573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115a79190613f30565b9392505050565b50919050565b335f908152602c602052604090205460ff166115e35760405163d3ce1c4960e01b815260040160405180910390fd5b333b63ffffffff161561160957604051635d04968b60e11b815260040160405180910390fd5b828181146116595760405162461bcd60e51b815260206004820152601860248201527f4441524b3a20756e657175616c207175616e74697469657300000000000000006044820152606401610abe565b604080516060810182525f808252602082018190529181018290525f5b8381101561176e5787878281811061169057611690613f4b565b9050602002013592506116a283611367565b91508160200151156116c65760405162461bcd60e51b8152600401610abe90613e0e565b81516001600160a01b03161561171e5760405162461bcd60e51b815260206004820152601c60248201527f4441524b3a20746f6b656e20616c7265616479206d69677261746564000000006044820152606401610abe565b61175e5f87878481811061173457611734613f4b565b905060200201602081019061174991906137f7565b8560405180602001604052805f8152506125cb565b61176781613eca565b9050611676565b5050505050505050565b5f61178282612672565b61178a611cce565b6040516370a0823160e01b81526001600160a01b03858116600483015291909116906370a0823190602401602060405180830381865afa1580156117d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117f49190613f5f565b6111039190613f1d565b61180661237e565b61180f5f612a4c565b565b335f908152602c602052604090205460ff166118405760405163d3ce1c4960e01b815260040160405180910390fd5b333b63ffffffff161561186657604051635d04968b60e11b815260040160405180910390fd5b5f8051602061436d8339815191528054911515620100000262ff000019909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156118d25750825b90505f826001600160401b031660011480156118ed5750303b155b9050811580156118fb575080155b156119195760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561194357845460ff60401b1916600160401b1785555b61194b612abc565b611953612adf565b61199c6040518060400160405280600b81526020016a2230b935a2b1b432b637b760a91b815250604051806040016040528060048152602001634441524b60e01b815250612b06565b6119a930600a6064612b36565b6040518060c00160405280600161ffff1681526020016001151581526020016001151581526020016040518060600160405280603681526020016142f76036913981526040805180820182526005815264173539b7b760d91b602080830191909152830152736fc3ad6177b07227647ad6b4ae03cc476541a2a09101525f8051602061436d8339815191528151815460208401516040850151151563010000000263ff00000019911515620100000262ffffff1990931661ffff90941693909317919091171617815560608201516001820190611a869082613fbb565b5060808201516002820190611a9b9082613fbb565b5060a09190910151600390910180546001600160a01b0319166001600160a01b0390921691909117905560408051608081018252600181526102096020820152610208918101829052606001527fead6704f656d3a38c0b7700b43fa151cf27b0450adbb879534a80410b452bb8c805467ffffffffffffffff19166702080208020900011790558315610fce57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15050505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b60605f8051602061432d833981519152600101805461098990613ddc565b81611bc3610b3a565b15611bd157611bd181612405565b6111868383612b3e565b5f611be55f610901565b5161ffff16919050565b83611bf8610b3a565b8015611c0d57506001600160a01b0381163314155b15611c1b57611c1b33612405565b5f611c2584611367565b9050806020015115611c495760405162461bcd60e51b8152600401610abe90613e0e565b806040015115611c935760405162461bcd60e51b815260206004820152601560248201527411105492ce881d1bdad95b881a5cc81b1bd8dad959605a1b6044820152606401610abe565b80516001600160a01b0316611cba5760405162461bcd60e51b8152600401610abe90613e3d565b611cc686868686612b49565b505050505050565b7fd57a40a6a9e22c4bf4ea3cc9234a2b791b8912a049565b293e719bcd084bd0ce546001600160a01b031690565b335f908152602c602052604090205460ff16611d2b5760405163d3ce1c4960e01b815260040160405180910390fd5b333b63ffffffff1615611d5157604051635d04968b60e11b815260040160405180910390fd5b611d59611cce565b6040516323b872dd60e01b81523060048201526001600160a01b0383811660248301526044820185905291909116906323b872dd906064015b5f604051808303815f87803b158015611da9575f80fd5b505af1158015611cc6573d5f803e3d5ffd5b60605f5f8051602061436d8339815191526040805160c081018252825461ffff8116825260ff620100008204811615156020840152630100000090910416151591810191909152600182018054919291606084019190611e1a90613ddc565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4690613ddc565b8015611e915780601f10611e6857610100808354040283529160200191611e91565b820191905f5260205f20905b815481529060010190602001808311611e7457829003601f168201915b50505050508152602001600282018054611eaa90613ddc565b80601f0160208091040260200160405190810160405280929190818152602001828054611ed690613ddc565b8015611f215780601f10611ef857610100808354040283529160200191611f21565b820191905f5260205f20905b815481529060010190602001808311611f0457829003601f168201915b5050509183525050600391909101546001600160a01b03166020909101526060810151909150611f5084612b7b565b8260800151604051602001611f6793929190614076565b604051602081830303815290604052915050919050565b335f908152602c602052604090205460ff16611fad5760405163d3ce1c4960e01b815260040160405180910390fd5b333b63ffffffff1615611fd357604051635d04968b60e11b815260040160405180910390fd5b7fd57a40a6a9e22c4bf4ea3cc9234a2b791b8912a049565b293e719bcd084bd0cc611fff8486836140b8565b507fd57a40a6a9e22c4bf4ea3cc9234a2b791b8912a049565b293e719bcd084bd0cd610fce8284836140b8565b604080516080810182525f8082526020820181905291810182905260608101919091527fead6704f656d3a38c0b7700b43fa151cf27b0450adbb879534a80410b452bb8c60408051608081018252915461ffff808216845262010000820481166020850152640100000000820481169284019290925266010000000000009004166060820152919050565b6001600160a01b039182165f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793036020908152604080832093909416825291909152205460ff1690565b335f908152602c602052604090205460ff166121325760405163d3ce1c4960e01b815260040160405180910390fd5b333b63ffffffff161561215857604051635d04968b60e11b815260040160405180910390fd5b5f8051602061436d83398151915280545f9061217990849061ffff16613ee2565b90506102098161ffff16111561218e57506102095b604080516060810182525f808252602082018190529181019190915282545f8051602061434d8339815191529061ffff165b8361ffff168161ffff1610156122525761ffff81165f9081526020838152604091829020825160608101845290546001600160a01b038116825260ff600160a01b82048116158015948401859052600160a81b909204161515938201939093529450612234575082516001600160a01b0316155b156122425761224281612c0a565b61224b81613efd565b90506121c0565b5050825461ffff191661ffff92909216919091179091555050565b61227561237e565b612286612280611b6e565b5f6111a5565b6122918160016111a5565b61117081612c25565b335f908152602c602052604090205460ff166122c95760405163d3ce1c4960e01b815260040160405180910390fd5b333b63ffffffff16156122ef57604051635d04968b60e11b815260040160405180910390fd5b5f8051602061434d8339815191525f5b83811015610fce5782825f87878581811061231c5761231c613f4b565b9050602002013581526020019081526020015f205f0160156101000a81548160ff0219169083151502179055508061235390613eca565b90506122ff565b5f6001600160e01b0319821663780e9d6360e01b1480611103575061110382612c5f565b33612387611b6e565b6001600160a01b03161461180f5760405163118cdaa760e01b8152336004820152602401610abe565b6123b981612caf565b6111705760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610abe565b6daaeb6d7670e522a718067333cd4e3b1561117057604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612470573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124949190614172565b61117057604051633b79c77360e21b81526001600160a01b0382166004820152602401610abe565b5f6124c682612ccb565b9050806001600160a01b0316836001600160a01b0316036125335760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610abe565b336001600160a01b038216148061254f575061254f81336120b7565b6125c15760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610abe565b6111868383612cdc565b6125d6848484612836565b6125e284848484612d68565b610b345760405162461bcd60e51b8152600401610abe9061418d565b5f612607611bdb565b7fead6704f656d3a38c0b7700b43fa151cf27b0450adbb879534a80410b452bb8c54610e7491906601000000000000900461ffff166141df565b61264b3382612e66565b6126675760405162461bcd60e51b8152600401610abe906141f2565b611186838383612836565b5f6001600160a01b0382166126db5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610abe565b6126e482610901565b5161ffff1692915050565b804710156127125760405163cd78605960e01b8152306004820152602401610abe565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461275b576040519150601f19603f3d011682016040523d82523d5f602084013e612760565b606091505b505090508061118657604051630a12f52160e11b815260040160405180910390fd5b8061ffff168261ffff16106127d95760405162461bcd60e51b815260206004820152601b60248201527f526f79616c746965733a20696e76616c6964206672616374696f6e00000000006044820152606401610abe565b602d80546001600160a01b039094166001600160a01b0319909416939093179092556040805180820190915261ffff918216808252929091166020909101819052602e80546201000090920263ffffffff19909216909217179055565b612843838360015f612ec3565b611186838383613031565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806128d457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166128c85f8051602061438d833981519152546001600160a01b031690565b6001600160a01b031614155b1561180f5760405163703e46dd60e11b815260040160405180910390fd5b335f908152602c602052604090205460ff166129215760405163d3ce1c4960e01b815260040160405180910390fd5b333b63ffffffff161561117057604051635d04968b60e11b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156129a1575060408051601f3d908101601f1916820190925261299e91810190613f5f565b60015b6129c957604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610abe565b5f8051602061438d83398151915281146129f957604051632a87526960e21b815260048101829052602401610abe565b611186838361327d565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461180f5760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b612ac46132d2565b612acd3361331b565b61180f612ad8611b6e565b60016111a5565b612ae76132d2565b61180f733cc6cdda760b79bafa08df41ecfa224f810dceb66001613323565b612b0e6132d2565b5f8051602061432d83398151915280612b278482613fbb565b5060018101610b348382613fbb565b61117b6132d2565b611363338383613476565b612b533383612e66565b612b6f5760405162461bcd60e51b8152600401610abe906141f2565b610b34848484846125cb565b60605f612b8783613563565b60010190505f816001600160401b03811115612ba557612ba5613ab5565b6040519080825280601f01601f191660200182016040528015612bcf576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084612bd957509392505050565b611170612c1a8261ffff16612ccb565b5f8361ffff16612836565b612c2d61237e565b6001600160a01b038116612c5657604051631e4fbdf760e01b81525f6004820152602401610abe565b61117081612a4c565b5f6001600160e01b031982166301ffc9a760e01b1480612c8f57506001600160e01b031982166380ac58cd60e01b145b8061110357506001600160e01b03198216635b5e139f60e01b1492915050565b5f80612cba83612ccb565b6001600160a01b0316141592915050565b5f612cd582611367565b5192915050565b5f8181527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793026020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612d2f82612ccb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f6001600160a01b0384163b15612e5a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612dab90339089908890889060040161423f565b6020604051808303815f875af1925050508015612de5575060408051601f3d908101601f19168201909252612de29181019061427b565b60015b612e40573d808015612e12576040519150601f19603f3d011682016040523d82523d5f602084013e612e17565b606091505b5080515f03612e385760405162461bcd60e51b8152600401610abe9061418d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612e5e565b5060015b949350505050565b5f80612e7183612ccb565b9050806001600160a01b0316846001600160a01b03161480612e985750612e9881856120b7565b80612e5e5750836001600160a01b0316612eb184610a35565b6001600160a01b031614949350505050565b604080518082019091525f80825260208201527fd1d549c50cb17b70728c71ab790cefd8719c247c8717e4ead8ef6d37338118de6001600160a01b03861615612f84576001600160a01b0386165f8181526020838152604080832081518083018352815461ffff8082168352620100008083048216848801908152865180880190975284518e900383168752518216868801908152989097529488905292519551841690940263ffffffff1990921694909216939093179290921790915591505b6001600160a01b0385165f908152602082815260409182902082518084018452905461ffff8082168352620100009091048116828401528351808501909452815188011683529350810184612fdd578360200151612fe5565b858460200151015b61ffff9081169091526001600160a01b039096165f9081526020928352604090208151815492909301518716620100000263ffffffff1990921692909616919091171790935550505050565b826001600160a01b031661304482612ccb565b6001600160a01b03161461306a5760405162461bcd60e51b8152600401610abe90614296565b826001600160a01b031661307d82612ccb565b6001600160a01b0316146130a35760405162461bcd60e51b8152600401610abe90614296565b5f8181527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793026020908152604080832080546001600160a01b03191690555f8051602061434d83398151915280835292819020815160608101835290546001600160a01b03808216835260ff600160a01b83048116151595840195909552600160a81b9091049093161515918101919091525f8051602061432d833981519152929185166131c157604080516060810182525f80825260016020808401918252838501838152898452908790529390912091518254915193511515600160a81b0260ff60a81b19941515600160a01b026001600160a81b03199093166001600160a01b0392909216919091179190911792909216919091179055613237565b604080516060810182526001600160a01b0380881682525f60208084018281528686015115158587019081528a8452918890529490912092518354945191511515600160a81b0260ff60a81b19921515600160a01b026001600160a81b0319909616919093161793909317929092169190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611cc6565b6132868261363a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156132ca57611186828261369d565b61136361370f565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661180f57604051631afcd79f60e31b815260040160405180910390fd5b612c2d6132d2565b61332b6132d2565b6daaeb6d7670e522a718067333cd4e3b156113635760405163c3c5a54760e01b81523060048201526daaeb6d7670e522a718067333cd4e9063c3c5a547906024016020604051808303815f875af1158015613388573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133ac9190614172565b6113635780156133f657604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe90604401611d92565b6001600160a01b038216156134455760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401611d92565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401611d92565b816001600160a01b0316836001600160a01b0316036134d75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610abe565b6001600160a01b038381165f8181527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793036020908152604080832094871680845294825291829020805460ff1916861515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106135a15772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106135cd576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106135eb57662386f26fc10000830492506010015b6305f5e1008310613603576305f5e100830492506008015b612710831061361757612710830492506004015b60648310613629576064830492506002015b600a83106111035760010192915050565b806001600160a01b03163b5f0361366f57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610abe565b5f8051602061438d83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516136b991906142db565b5f60405180830381855af49150503d805f81146136f1576040519150601f19603f3d011682016040523d82523d5f602084013e6136f6565b606091505b509150915061370685838361372e565b95945050505050565b341561180f5760405163b398979f60e01b815260040160405180910390fd5b6060826137435761373e8261378a565b6115a7565b815115801561375a57506001600160a01b0384163b155b1561378357604051639996b31560e01b81526001600160a01b0385166004820152602401610abe565b5092915050565b80511561379a5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6001600160e01b031981168114611170575f80fd5b5f602082840312156137d8575f80fd5b81356115a7816137b3565b6001600160a01b0381168114611170575f80fd5b5f60208284031215613807575f80fd5b81356115a7816137e3565b604081016111038284805161ffff908116835260209182015116910152565b5f5b8381101561384b578181015183820152602001613833565b50505f910152565b5f815180845261386a816020860160208601613831565b601f01601f19169290920160200192915050565b602081525f6115a76020830184613853565b5f602082840312156138a0575f80fd5b5035919050565b5f80604083850312156138b8575f80fd5b82356138c3816137e3565b946020939093013593505050565b5f8083601f8401126138e1575f80fd5b5081356001600160401b038111156138f7575f80fd5b602083019150836020828501011115611011575f80fd5b5f805f805f60808688031215613922575f80fd5b853561392d816137e3565b9450602086013561393d816137e3565b93506040860135925060608601356001600160401b0381111561395e575f80fd5b61396a888289016138d1565b969995985093965092949392505050565b8015158114611170575f80fd5b5f60208284031215613998575f80fd5b81356115a78161397b565b5f805f606084860312156139b5575f80fd5b83356139c0816137e3565b925060208401356139d0816137e3565b929592945050506040919091013590565b5f80604083850312156139f2575f80fd5b50508035926020909101359150565b803561ffff81168114610a30575f80fd5b5f805f60608486031215613a24575f80fd5b8335613a2f816137e3565b9250613a3d60208501613a01565b9150613a4b60408501613a01565b90509250925092565b5f8060408385031215613a65575f80fd5b8235613a70816137e3565b91506020830135613a808161397b565b809150509250929050565b5f8060408385031215613a9c575f80fd5b613aa583613a01565b91506020830135613a80816137e3565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112613ad8575f80fd5b81356001600160401b0380821115613af257613af2613ab5565b604051601f8301601f19908116603f01168101908282118183101715613b1a57613b1a613ab5565b81604052838152866020858801011115613b32575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f8060408385031215613b62575f80fd5b8235613b6d816137e3565b915060208301356001600160401b03811115613b87575f80fd5b613b9385828601613ac9565b9150509250929050565b5f8060408385031215613bae575f80fd5b823591506020830135613a80816137e3565b5f8083601f840112613bd0575f80fd5b5081356001600160401b03811115613be6575f80fd5b6020830191508360208260051b8501011115611011575f80fd5b5f805f8060408587031215613c13575f80fd5b84356001600160401b0380821115613c29575f80fd5b613c3588838901613bc0565b90965094506020870135915080821115613c4d575f80fd5b50613c5a87828801613bc0565b95989497509550505050565b6001600160a01b0383168152606081016115a76020830184805161ffff908116835260209182015116910152565b5f805f8060808587031215613ca7575f80fd5b8435613cb2816137e3565b93506020850135613cc2816137e3565b92506040850135915060608501356001600160401b03811115613ce3575f80fd5b613cef87828801613ac9565b91505092959194509250565b5f805f8060408587031215613d0e575f80fd5b84356001600160401b0380821115613d24575f80fd5b613d30888389016138d1565b90965094506020870135915080821115613d48575f80fd5b50613c5a878288016138d1565b5f8060408385031215613d66575f80fd5b8235613aa5816137e3565b5f60208284031215613d81575f80fd5b6115a782613a01565b5f805f60408486031215613d9c575f80fd5b83356001600160401b03811115613db1575f80fd5b613dbd86828701613bc0565b9094509250506020840135613dd18161397b565b809150509250925092565b600181811c90821680613df057607f821691505b6020821081036115ae57634e487b7160e01b5f52602260045260245ffd5b60208082526015908201527411105492ce881d1bdad95b881a5cc8189d5c9b9959605a1b604082015260600190565b60208082526023908201527f4441524b3a206d69677261746520746f6b656e206265666f7265207472616e736040820152623332b960e91b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761110357611103613e80565b5f82613ec557634e487b7160e01b5f52601260045260245ffd5b500490565b5f60018201613edb57613edb613e80565b5060010190565b61ffff81811683821601908082111561378357613783613e80565b5f61ffff808316818103613f1357613f13613e80565b6001019392505050565b8082018082111561110357611103613e80565b5f60208284031215613f40575f80fd5b81516115a7816137e3565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613f6f575f80fd5b5051919050565b601f821115611186575f81815260208120601f850160051c81016020861015613f9c5750805b601f850160051c820191505b81811015611cc657828155600101613fa8565b81516001600160401b03811115613fd457613fd4613ab5565b613fe881613fe28454613ddc565b84613f76565b602080601f83116001811461401b575f84156140045750858301515b5f19600386901b1c1916600185901b178555611cc6565b5f85815260208120601f198616915b828110156140495788860151825594840194600190910190840161402a565b508582101561406657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8451614087818460208901613831565b84519083019061409b818360208901613831565b84519101906140ae818360208801613831565b0195945050505050565b6001600160401b038311156140cf576140cf613ab5565b6140e3836140dd8354613ddc565b83613f76565b5f601f841160018114614114575f85156140fd5750838201355b5f19600387901b1c1916600186901b178355610fce565b5f83815260209020601f19861690835b828110156141445786850135825560209485019460019092019101614124565b5086821015614160575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f60208284031215614182575f80fd5b81516115a78161397b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b8181038181111561110357611103613e80565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061427190830184613853565b9695505050505050565b5f6020828403121561428b575f80fd5b81516115a7816137b3565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b5f82516142ec818460208701613831565b919091019291505056fe697066733a2f2f516d5a6a6e564b6b7a64464679775331487966633851636a454434334474734e6a654d6a5876464865344a7841362f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793003d95531756980564e07517b9d40d29e8cbf6ab6fc2eca0652231d729b9c74c3ad57a40a6a9e22c4bf4ea3cc9234a2b791b8912a049565b293e719bcd084bd0cb360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212207887d3853c6df0bc4dc1d79ebb9f9fffc455bf97a4a855c6b18568518b0c21ca64736f6c63430008140033
Deployed Bytecode
0x608060405260043610610275575f3560e01c806352df1f161161014a578063ad3cb1cc116100be578063d48ede9911610078578063d48ede99146107d6578063e97206a9146107f5578063e985e9c514610847578063efca5f9014610866578063f2fde38b14610885578063fe0ad94e146108a4575f80fd5b8063ad3cb1cc14610721578063b03e647814610751578063b88d4fde14610765578063ba5d307814610784578063be4b177214610798578063c87b56dd146107b7575f80fd5b80637885fdc71161010f5780637885fdc7146106575780637f1e250c146106a75780638129fc1c146106c65780638da5cb5b146106da57806395d89b41146106ee578063a22cb46514610702575f80fd5b806352df1f16146105c75780636352211e146105e65780636673c4c21461060557806370a0823114610624578063715018a614610643575f80fd5b806323b872dd116101ec5780634a994eef116101a65780634a994eef146104f55780634e1b4b41146105145780634f1ef286146105335780634f64b2be146105465780634f6ccce71461059457806352d1902d146105b3575f80fd5b806323b872dd146104275780632a55205a146104465780632f745c59146104845780633ccfd60b146104a357806341acc66a146104b757806342842e0e146104d6575f80fd5b8063095ea7b31161023d578063095ea7b314610350578063109e943f14610371578063150b7a021461038557806318160ddd146103bd57806319ed21bd146103df578063211f9e2f14610408575f80fd5b806301ffc9a714610279578063022914a7146102ad57806306fdde03146102d957806307779627146102fa578063081812fc14610319575b5f80fd5b348015610284575f80fd5b506102986102933660046137c8565b6108c3565b60405190151581526020015b60405180910390f35b3480156102b8575f80fd5b506102cc6102c73660046137f7565b610901565b6040516102a49190613812565b3480156102e4575f80fd5b506102ed61096e565b6040516102a4919061387e565b348015610305575f80fd5b506102986103143660046137f7565b610a0a565b348015610324575f80fd5b50610338610333366004613890565b610a35565b6040516001600160a01b0390911681526020016102a4565b34801561035b575f80fd5b5061036f61036a3660046138a7565b610a79565b005b34801561037c575f80fd5b50610298610b3a565b348015610390575f80fd5b506103a461039f36600461390e565b610b56565b6040516001600160e01b031990911681526020016102a4565b3480156103c8575f80fd5b506103d1610e6b565b6040519081526020016102a4565b3480156103ea575f80fd5b505f8051602061436d8339815191525462010000900460ff16610298565b348015610413575f80fd5b5061036f610422366004613988565b610e79565b348015610432575f80fd5b5061036f6104413660046139a3565b610ef8565b348015610451575f80fd5b506104656104603660046139e1565b610fd5565b604080516001600160a01b0390931683526020830191909152016102a4565b34801561048f575f80fd5b506103d161049e3660046138a7565b611018565b3480156104ae575f80fd5b5061036f611109565b3480156104c2575f80fd5b5061036f6104d1366004613a12565b611173565b3480156104e1575f80fd5b5061036f6104f03660046139a3565b61118b565b348015610500575f80fd5b5061036f61050f366004613a54565b6111a5565b34801561051f575f80fd5b5061036f61052e366004613a8b565b6111d7565b61036f610541366004613b51565b611348565b348015610551575f80fd5b50610565610560366004613890565b611367565b6040805182516001600160a01b03168152602080840151151590820152918101511515908201526060016102a4565b34801561059f575f80fd5b506103d16105ae366004613890565b6113d4565b3480156105be575f80fd5b506103d1611458565b3480156105d2575f80fd5b5061036f6105e1366004613b9d565b611473565b3480156105f1575f80fd5b50610338610600366004613890565b6114ed565b348015610610575f80fd5b5061036f61061f366004613c00565b6115b4565b34801561062f575f80fd5b506103d161063e3660046137f7565b611778565b34801561064e575f80fd5b5061036f6117fe565b348015610662575f80fd5b50602d5460408051808201909152602e5461ffff808216835262010000909104166020820152610699916001600160a01b03169082565b6040516102a4929190613c66565b3480156106b2575f80fd5b5061036f6106c1366004613988565b611811565b3480156106d1575f80fd5b5061036f61188e565b3480156106e5575f80fd5b50610338611b6e565b3480156106f9575f80fd5b506102ed611b9c565b34801561070d575f80fd5b5061036f61071c366004613a54565b611bba565b34801561072c575f80fd5b506102ed604051806040016040528060058152602001640352e302e360dc1b81525081565b34801561075c575f80fd5b506103d1611bdb565b348015610770575f80fd5b5061036f61077f366004613c94565b611bef565b34801561078f575f80fd5b50610338611cce565b3480156107a3575f80fd5b5061036f6107b2366004613b9d565b611cfc565b3480156107c2575f80fd5b506102ed6107d1366004613890565b611dbb565b3480156107e1575f80fd5b5061036f6107f0366004613cfb565b611f7e565b348015610800575f80fd5b5061080961202c565b6040516102a49190815161ffff9081168252602080840151821690830152604080840151821690830152606092830151169181019190915260800190565b348015610852575f80fd5b50610298610861366004613d55565b6120b7565b348015610871575f80fd5b5061036f610880366004613d71565b612103565b348015610890575f80fd5b5061036f61089f3660046137f7565b61226d565b3480156108af575f80fd5b5061036f6108be366004613d8a565b61229a565b5f6108cd8261235a565b156108da57506001919050565b63152a902d60e11b6001600160e01b03198316036108fa57506001919050565b505f919050565b6040805180820182525f80825260209182018190526001600160a01b039390931683527fd1d549c50cb17b70728c71ab790cefd8719c247c8717e4ead8ef6d37338118de81529181902081518083019092525461ffff808216835262010000909104169181019190915290565b60605f8051602061432d833981519152805461098990613ddc565b80601f01602080910402602001604051908101604052809291908181526020018280546109b590613ddc565b8015610a005780601f106109d757610100808354040283529160200191610a00565b820191905f5260205f20905b8154815290600101906020018083116109e357829003601f168201915b5050505050905090565b5f610a1361237e565b506001600160a01b0381165f908152602c602052604090205460ff165b919050565b5f610a3f826123b0565b505f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930260205260409020546001600160a01b031690565b81610a82610b3a565b15610a9057610a9081612405565b5f610a9a83611367565b9050806020015115610ac75760405162461bcd60e51b8152600401610abe90613e0e565b60405180910390fd5b80516001600160a01b0316610b2a5760405162461bcd60e51b815260206004820152602360248201527f4441524b3a206d69677261746520746f6b656e206265666f726520617070726f6044820152621d985b60ea1b6064820152608401610abe565b610b3484846124bc565b50505050565b5f8051602061436d833981519152546301000000900460ff1690565b5f805f8051602061436d8339815191526040805160c081018252825461ffff8116825260ff620100008204811615156020840152630100000090910416151591810191909152600182018054919291606084019190610bb490613ddc565b80601f0160208091040260200160405190810160405280929190818152602001828054610be090613ddc565b8015610c2b5780601f10610c0257610100808354040283529160200191610c2b565b820191905f5260205f20905b815481529060010190602001808311610c0e57829003601f168201915b50505050508152602001600282018054610c4490613ddc565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7090613ddc565b8015610cbb5780601f10610c9257610100808354040283529160200191610cbb565b820191905f5260205f20905b815481529060010190602001808311610c9e57829003601f168201915b5050509183525050600391909101546001600160a01b0316602091820152810151909150610d2b5760405162461bcd60e51b815260206004820152601b60248201527f4441524b3a206d6967726174696f6e2069732064697361626c656400000000006044820152606401610abe565b8060a001516001600160a01b0316336001600160a01b031614610d905760405162461bcd60e51b815260206004820152601c60248201527f4441524b3a20756e737570706f7274656420636f6c6c656374696f6e000000006044820152606401610abe565b5f610d9a86611367565b9050806020015115610dbe5760405162461bcd60e51b8152600401610abe90613e0e565b80516001600160a01b031615610e165760405162461bcd60e51b815260206004820152601c60248201527f4441524b3a20746f6b656e20616c7265616479206d69677261746564000000006044820152606401610abe565b610e575f888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506125cb92505050565b50630a85bd0160e11b979650505050505050565b5f610e746125fe565b905090565b335f908152602c602052604090205460ff16610ea85760405163d3ce1c4960e01b815260040160405180910390fd5b333b63ffffffff1615610ece57604051635d04968b60e11b815260040160405180910390fd5b5f8051602061436d833981519152805491151563010000000263ff00000019909216919091179055565b82610f01610b3a565b8015610f1657506001600160a01b0381163314155b15610f2457610f2433612405565b5f610f2e83611367565b9050806020015115610f525760405162461bcd60e51b8152600401610abe90613e0e565b806040015115610f9c5760405162461bcd60e51b815260206004820152601560248201527411105492ce881d1bdad95b881a5cc81b1bd8dad959605a1b6044820152606401610abe565b80516001600160a01b0316610fc35760405162461bcd60e51b8152600401610abe90613e3d565b610fce858585612641565b5050505050565b602e545f908190819061ffff620100008204811691610ff5911686613e94565b610fff9190613eab565b602d546001600160a01b031693509150505b9250929050565b5f61102283612672565b82106110845760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610abe565b5f805f61108f61202c565b805161ffff16925090505f8051602061434d8339815191525b816040015161ffff168310156110fc575f838152602082905260409020546001600160a01b03908116908816036110ec57836110e381613eca565b945086146110fc575b6110f583613eca565b92506110a8565b5090925050505b92915050565b61111161237e565b478061115f5760405162461bcd60e51b815260206004820152601860248201527f4441524b3a206e6f2066756e647320617661696c61626c6500000000000000006044820152606401610abe565b61117061116a611b6e565b826126ef565b50565b61117b61237e565b611186838383612782565b505050565b61118683838360405180602001604052805f815250611bef565b6111ad61237e565b6001600160a01b03919091165f908152602c60205260409020805460ff1916911515919091179055565b335f908152602c602052604090205460ff166112065760405163d3ce1c4960e01b815260040160405180910390fd5b333b63ffffffff161561122c57604051635d04968b60e11b815260040160405180910390fd5b5f8051602061436d83398151915280545f9061124d90859061ffff16613ee2565b90506102098161ffff16111561126257506102095b604080516060810182525f808252602082018190529181019190915282545f8051602061434d8339815191529061ffff165b8361ffff168161ffff16101561132c5761ffff81165f9081526020838152604091829020825160608101845290546001600160a01b038116825260ff600160a01b82048116158015948401859052600160a81b909204161515938201939093529450611308575082516001600160a01b0316155b1561131c5761131c5f878361ffff16612836565b61132581613efd565b9050611294565b5050825461ffff191661ffff9290921691909117909155505050565b61135061284e565b611359826128f2565b6113638282612947565b5050565b60408051606080820183525f80835260208084018290529284018190529384525f8051602061434d83398151915282529282902082519384018352546001600160a01b038116845260ff600160a01b82048116151592850192909252600160a81b90041615159082015290565b5f6113dd610e6b565b82106114405760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610abe565b8161144961202c565b51611103919061ffff16613f1d565b5f611461612a03565b505f8051602061438d83398151915290565b335f908152602c602052604090205460ff166114a25760405163d3ce1c4960e01b815260040160405180910390fd5b333b63ffffffff16156114c857604051635d04968b60e11b815260040160405180910390fd5b6113636114d483611367565b5f0151828460405180602001604052805f8152506125cb565b5f806114f883611367565b905080602001511561151c5760405162461bcd60e51b8152600401610abe90613e0e565b80516001600160a01b031615611533575192915050565b61153b611cce565b6001600160a01b0316636352211e846040518263ffffffff1660e01b815260040161156891815260200190565b602060405180830381865afa158015611583573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115a79190613f30565b9392505050565b50919050565b335f908152602c602052604090205460ff166115e35760405163d3ce1c4960e01b815260040160405180910390fd5b333b63ffffffff161561160957604051635d04968b60e11b815260040160405180910390fd5b828181146116595760405162461bcd60e51b815260206004820152601860248201527f4441524b3a20756e657175616c207175616e74697469657300000000000000006044820152606401610abe565b604080516060810182525f808252602082018190529181018290525f5b8381101561176e5787878281811061169057611690613f4b565b9050602002013592506116a283611367565b91508160200151156116c65760405162461bcd60e51b8152600401610abe90613e0e565b81516001600160a01b03161561171e5760405162461bcd60e51b815260206004820152601c60248201527f4441524b3a20746f6b656e20616c7265616479206d69677261746564000000006044820152606401610abe565b61175e5f87878481811061173457611734613f4b565b905060200201602081019061174991906137f7565b8560405180602001604052805f8152506125cb565b61176781613eca565b9050611676565b5050505050505050565b5f61178282612672565b61178a611cce565b6040516370a0823160e01b81526001600160a01b03858116600483015291909116906370a0823190602401602060405180830381865afa1580156117d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117f49190613f5f565b6111039190613f1d565b61180661237e565b61180f5f612a4c565b565b335f908152602c602052604090205460ff166118405760405163d3ce1c4960e01b815260040160405180910390fd5b333b63ffffffff161561186657604051635d04968b60e11b815260040160405180910390fd5b5f8051602061436d8339815191528054911515620100000262ff000019909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156118d25750825b90505f826001600160401b031660011480156118ed5750303b155b9050811580156118fb575080155b156119195760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561194357845460ff60401b1916600160401b1785555b61194b612abc565b611953612adf565b61199c6040518060400160405280600b81526020016a2230b935a2b1b432b637b760a91b815250604051806040016040528060048152602001634441524b60e01b815250612b06565b6119a930600a6064612b36565b6040518060c00160405280600161ffff1681526020016001151581526020016001151581526020016040518060600160405280603681526020016142f76036913981526040805180820182526005815264173539b7b760d91b602080830191909152830152736fc3ad6177b07227647ad6b4ae03cc476541a2a09101525f8051602061436d8339815191528151815460208401516040850151151563010000000263ff00000019911515620100000262ffffff1990931661ffff90941693909317919091171617815560608201516001820190611a869082613fbb565b5060808201516002820190611a9b9082613fbb565b5060a09190910151600390910180546001600160a01b0319166001600160a01b0390921691909117905560408051608081018252600181526102096020820152610208918101829052606001527fead6704f656d3a38c0b7700b43fa151cf27b0450adbb879534a80410b452bb8c805467ffffffffffffffff19166702080208020900011790558315610fce57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15050505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b60605f8051602061432d833981519152600101805461098990613ddc565b81611bc3610b3a565b15611bd157611bd181612405565b6111868383612b3e565b5f611be55f610901565b5161ffff16919050565b83611bf8610b3a565b8015611c0d57506001600160a01b0381163314155b15611c1b57611c1b33612405565b5f611c2584611367565b9050806020015115611c495760405162461bcd60e51b8152600401610abe90613e0e565b806040015115611c935760405162461bcd60e51b815260206004820152601560248201527411105492ce881d1bdad95b881a5cc81b1bd8dad959605a1b6044820152606401610abe565b80516001600160a01b0316611cba5760405162461bcd60e51b8152600401610abe90613e3d565b611cc686868686612b49565b505050505050565b7fd57a40a6a9e22c4bf4ea3cc9234a2b791b8912a049565b293e719bcd084bd0ce546001600160a01b031690565b335f908152602c602052604090205460ff16611d2b5760405163d3ce1c4960e01b815260040160405180910390fd5b333b63ffffffff1615611d5157604051635d04968b60e11b815260040160405180910390fd5b611d59611cce565b6040516323b872dd60e01b81523060048201526001600160a01b0383811660248301526044820185905291909116906323b872dd906064015b5f604051808303815f87803b158015611da9575f80fd5b505af1158015611cc6573d5f803e3d5ffd5b60605f5f8051602061436d8339815191526040805160c081018252825461ffff8116825260ff620100008204811615156020840152630100000090910416151591810191909152600182018054919291606084019190611e1a90613ddc565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4690613ddc565b8015611e915780601f10611e6857610100808354040283529160200191611e91565b820191905f5260205f20905b815481529060010190602001808311611e7457829003601f168201915b50505050508152602001600282018054611eaa90613ddc565b80601f0160208091040260200160405190810160405280929190818152602001828054611ed690613ddc565b8015611f215780601f10611ef857610100808354040283529160200191611f21565b820191905f5260205f20905b815481529060010190602001808311611f0457829003601f168201915b5050509183525050600391909101546001600160a01b03166020909101526060810151909150611f5084612b7b565b8260800151604051602001611f6793929190614076565b604051602081830303815290604052915050919050565b335f908152602c602052604090205460ff16611fad5760405163d3ce1c4960e01b815260040160405180910390fd5b333b63ffffffff1615611fd357604051635d04968b60e11b815260040160405180910390fd5b7fd57a40a6a9e22c4bf4ea3cc9234a2b791b8912a049565b293e719bcd084bd0cc611fff8486836140b8565b507fd57a40a6a9e22c4bf4ea3cc9234a2b791b8912a049565b293e719bcd084bd0cd610fce8284836140b8565b604080516080810182525f8082526020820181905291810182905260608101919091527fead6704f656d3a38c0b7700b43fa151cf27b0450adbb879534a80410b452bb8c60408051608081018252915461ffff808216845262010000820481166020850152640100000000820481169284019290925266010000000000009004166060820152919050565b6001600160a01b039182165f9081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793036020908152604080832093909416825291909152205460ff1690565b335f908152602c602052604090205460ff166121325760405163d3ce1c4960e01b815260040160405180910390fd5b333b63ffffffff161561215857604051635d04968b60e11b815260040160405180910390fd5b5f8051602061436d83398151915280545f9061217990849061ffff16613ee2565b90506102098161ffff16111561218e57506102095b604080516060810182525f808252602082018190529181019190915282545f8051602061434d8339815191529061ffff165b8361ffff168161ffff1610156122525761ffff81165f9081526020838152604091829020825160608101845290546001600160a01b038116825260ff600160a01b82048116158015948401859052600160a81b909204161515938201939093529450612234575082516001600160a01b0316155b156122425761224281612c0a565b61224b81613efd565b90506121c0565b5050825461ffff191661ffff92909216919091179091555050565b61227561237e565b612286612280611b6e565b5f6111a5565b6122918160016111a5565b61117081612c25565b335f908152602c602052604090205460ff166122c95760405163d3ce1c4960e01b815260040160405180910390fd5b333b63ffffffff16156122ef57604051635d04968b60e11b815260040160405180910390fd5b5f8051602061434d8339815191525f5b83811015610fce5782825f87878581811061231c5761231c613f4b565b9050602002013581526020019081526020015f205f0160156101000a81548160ff0219169083151502179055508061235390613eca565b90506122ff565b5f6001600160e01b0319821663780e9d6360e01b1480611103575061110382612c5f565b33612387611b6e565b6001600160a01b03161461180f5760405163118cdaa760e01b8152336004820152602401610abe565b6123b981612caf565b6111705760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610abe565b6daaeb6d7670e522a718067333cd4e3b1561117057604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612470573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124949190614172565b61117057604051633b79c77360e21b81526001600160a01b0382166004820152602401610abe565b5f6124c682612ccb565b9050806001600160a01b0316836001600160a01b0316036125335760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610abe565b336001600160a01b038216148061254f575061254f81336120b7565b6125c15760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610abe565b6111868383612cdc565b6125d6848484612836565b6125e284848484612d68565b610b345760405162461bcd60e51b8152600401610abe9061418d565b5f612607611bdb565b7fead6704f656d3a38c0b7700b43fa151cf27b0450adbb879534a80410b452bb8c54610e7491906601000000000000900461ffff166141df565b61264b3382612e66565b6126675760405162461bcd60e51b8152600401610abe906141f2565b611186838383612836565b5f6001600160a01b0382166126db5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610abe565b6126e482610901565b5161ffff1692915050565b804710156127125760405163cd78605960e01b8152306004820152602401610abe565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461275b576040519150601f19603f3d011682016040523d82523d5f602084013e612760565b606091505b505090508061118657604051630a12f52160e11b815260040160405180910390fd5b8061ffff168261ffff16106127d95760405162461bcd60e51b815260206004820152601b60248201527f526f79616c746965733a20696e76616c6964206672616374696f6e00000000006044820152606401610abe565b602d80546001600160a01b039094166001600160a01b0319909416939093179092556040805180820190915261ffff918216808252929091166020909101819052602e80546201000090920263ffffffff19909216909217179055565b612843838360015f612ec3565b611186838383613031565b306001600160a01b037f000000000000000000000000c1cce4ca4aeec32edccae3eb1d024fb29733c1881614806128d457507f000000000000000000000000c1cce4ca4aeec32edccae3eb1d024fb29733c1886001600160a01b03166128c85f8051602061438d833981519152546001600160a01b031690565b6001600160a01b031614155b1561180f5760405163703e46dd60e11b815260040160405180910390fd5b335f908152602c602052604090205460ff166129215760405163d3ce1c4960e01b815260040160405180910390fd5b333b63ffffffff161561117057604051635d04968b60e11b815260040160405180910390fd5b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156129a1575060408051601f3d908101601f1916820190925261299e91810190613f5f565b60015b6129c957604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610abe565b5f8051602061438d83398151915281146129f957604051632a87526960e21b815260048101829052602401610abe565b611186838361327d565b306001600160a01b037f000000000000000000000000c1cce4ca4aeec32edccae3eb1d024fb29733c188161461180f5760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b612ac46132d2565b612acd3361331b565b61180f612ad8611b6e565b60016111a5565b612ae76132d2565b61180f733cc6cdda760b79bafa08df41ecfa224f810dceb66001613323565b612b0e6132d2565b5f8051602061432d83398151915280612b278482613fbb565b5060018101610b348382613fbb565b61117b6132d2565b611363338383613476565b612b533383612e66565b612b6f5760405162461bcd60e51b8152600401610abe906141f2565b610b34848484846125cb565b60605f612b8783613563565b60010190505f816001600160401b03811115612ba557612ba5613ab5565b6040519080825280601f01601f191660200182016040528015612bcf576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084612bd957509392505050565b611170612c1a8261ffff16612ccb565b5f8361ffff16612836565b612c2d61237e565b6001600160a01b038116612c5657604051631e4fbdf760e01b81525f6004820152602401610abe565b61117081612a4c565b5f6001600160e01b031982166301ffc9a760e01b1480612c8f57506001600160e01b031982166380ac58cd60e01b145b8061110357506001600160e01b03198216635b5e139f60e01b1492915050565b5f80612cba83612ccb565b6001600160a01b0316141592915050565b5f612cd582611367565b5192915050565b5f8181527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793026020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612d2f82612ccb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f6001600160a01b0384163b15612e5a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612dab90339089908890889060040161423f565b6020604051808303815f875af1925050508015612de5575060408051601f3d908101601f19168201909252612de29181019061427b565b60015b612e40573d808015612e12576040519150601f19603f3d011682016040523d82523d5f602084013e612e17565b606091505b5080515f03612e385760405162461bcd60e51b8152600401610abe9061418d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612e5e565b5060015b949350505050565b5f80612e7183612ccb565b9050806001600160a01b0316846001600160a01b03161480612e985750612e9881856120b7565b80612e5e5750836001600160a01b0316612eb184610a35565b6001600160a01b031614949350505050565b604080518082019091525f80825260208201527fd1d549c50cb17b70728c71ab790cefd8719c247c8717e4ead8ef6d37338118de6001600160a01b03861615612f84576001600160a01b0386165f8181526020838152604080832081518083018352815461ffff8082168352620100008083048216848801908152865180880190975284518e900383168752518216868801908152989097529488905292519551841690940263ffffffff1990921694909216939093179290921790915591505b6001600160a01b0385165f908152602082815260409182902082518084018452905461ffff8082168352620100009091048116828401528351808501909452815188011683529350810184612fdd578360200151612fe5565b858460200151015b61ffff9081169091526001600160a01b039096165f9081526020928352604090208151815492909301518716620100000263ffffffff1990921692909616919091171790935550505050565b826001600160a01b031661304482612ccb565b6001600160a01b03161461306a5760405162461bcd60e51b8152600401610abe90614296565b826001600160a01b031661307d82612ccb565b6001600160a01b0316146130a35760405162461bcd60e51b8152600401610abe90614296565b5f8181527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793026020908152604080832080546001600160a01b03191690555f8051602061434d83398151915280835292819020815160608101835290546001600160a01b03808216835260ff600160a01b83048116151595840195909552600160a81b9091049093161515918101919091525f8051602061432d833981519152929185166131c157604080516060810182525f80825260016020808401918252838501838152898452908790529390912091518254915193511515600160a81b0260ff60a81b19941515600160a01b026001600160a81b03199093166001600160a01b0392909216919091179190911792909216919091179055613237565b604080516060810182526001600160a01b0380881682525f60208084018281528686015115158587019081528a8452918890529490912092518354945191511515600160a81b0260ff60a81b19921515600160a01b026001600160a81b0319909616919093161793909317929092169190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611cc6565b6132868261363a565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156132ca57611186828261369d565b61136361370f565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661180f57604051631afcd79f60e31b815260040160405180910390fd5b612c2d6132d2565b61332b6132d2565b6daaeb6d7670e522a718067333cd4e3b156113635760405163c3c5a54760e01b81523060048201526daaeb6d7670e522a718067333cd4e9063c3c5a547906024016020604051808303815f875af1158015613388573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133ac9190614172565b6113635780156133f657604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe90604401611d92565b6001600160a01b038216156134455760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401611d92565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401611d92565b816001600160a01b0316836001600160a01b0316036134d75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610abe565b6001600160a01b038381165f8181527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793036020908152604080832094871680845294825291829020805460ff1916861515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106135a15772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106135cd576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106135eb57662386f26fc10000830492506010015b6305f5e1008310613603576305f5e100830492506008015b612710831061361757612710830492506004015b60648310613629576064830492506002015b600a83106111035760010192915050565b806001600160a01b03163b5f0361366f57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610abe565b5f8051602061438d83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516136b991906142db565b5f60405180830381855af49150503d805f81146136f1576040519150601f19603f3d011682016040523d82523d5f602084013e6136f6565b606091505b509150915061370685838361372e565b95945050505050565b341561180f5760405163b398979f60e01b815260040160405180910390fd5b6060826137435761373e8261378a565b6115a7565b815115801561375a57506001600160a01b0384163b155b1561378357604051639996b31560e01b81526001600160a01b0385166004820152602401610abe565b5092915050565b80511561379a5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6001600160e01b031981168114611170575f80fd5b5f602082840312156137d8575f80fd5b81356115a7816137b3565b6001600160a01b0381168114611170575f80fd5b5f60208284031215613807575f80fd5b81356115a7816137e3565b604081016111038284805161ffff908116835260209182015116910152565b5f5b8381101561384b578181015183820152602001613833565b50505f910152565b5f815180845261386a816020860160208601613831565b601f01601f19169290920160200192915050565b602081525f6115a76020830184613853565b5f602082840312156138a0575f80fd5b5035919050565b5f80604083850312156138b8575f80fd5b82356138c3816137e3565b946020939093013593505050565b5f8083601f8401126138e1575f80fd5b5081356001600160401b038111156138f7575f80fd5b602083019150836020828501011115611011575f80fd5b5f805f805f60808688031215613922575f80fd5b853561392d816137e3565b9450602086013561393d816137e3565b93506040860135925060608601356001600160401b0381111561395e575f80fd5b61396a888289016138d1565b969995985093965092949392505050565b8015158114611170575f80fd5b5f60208284031215613998575f80fd5b81356115a78161397b565b5f805f606084860312156139b5575f80fd5b83356139c0816137e3565b925060208401356139d0816137e3565b929592945050506040919091013590565b5f80604083850312156139f2575f80fd5b50508035926020909101359150565b803561ffff81168114610a30575f80fd5b5f805f60608486031215613a24575f80fd5b8335613a2f816137e3565b9250613a3d60208501613a01565b9150613a4b60408501613a01565b90509250925092565b5f8060408385031215613a65575f80fd5b8235613a70816137e3565b91506020830135613a808161397b565b809150509250929050565b5f8060408385031215613a9c575f80fd5b613aa583613a01565b91506020830135613a80816137e3565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112613ad8575f80fd5b81356001600160401b0380821115613af257613af2613ab5565b604051601f8301601f19908116603f01168101908282118183101715613b1a57613b1a613ab5565b81604052838152866020858801011115613b32575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f8060408385031215613b62575f80fd5b8235613b6d816137e3565b915060208301356001600160401b03811115613b87575f80fd5b613b9385828601613ac9565b9150509250929050565b5f8060408385031215613bae575f80fd5b823591506020830135613a80816137e3565b5f8083601f840112613bd0575f80fd5b5081356001600160401b03811115613be6575f80fd5b6020830191508360208260051b8501011115611011575f80fd5b5f805f8060408587031215613c13575f80fd5b84356001600160401b0380821115613c29575f80fd5b613c3588838901613bc0565b90965094506020870135915080821115613c4d575f80fd5b50613c5a87828801613bc0565b95989497509550505050565b6001600160a01b0383168152606081016115a76020830184805161ffff908116835260209182015116910152565b5f805f8060808587031215613ca7575f80fd5b8435613cb2816137e3565b93506020850135613cc2816137e3565b92506040850135915060608501356001600160401b03811115613ce3575f80fd5b613cef87828801613ac9565b91505092959194509250565b5f805f8060408587031215613d0e575f80fd5b84356001600160401b0380821115613d24575f80fd5b613d30888389016138d1565b90965094506020870135915080821115613d48575f80fd5b50613c5a878288016138d1565b5f8060408385031215613d66575f80fd5b8235613aa5816137e3565b5f60208284031215613d81575f80fd5b6115a782613a01565b5f805f60408486031215613d9c575f80fd5b83356001600160401b03811115613db1575f80fd5b613dbd86828701613bc0565b9094509250506020840135613dd18161397b565b809150509250925092565b600181811c90821680613df057607f821691505b6020821081036115ae57634e487b7160e01b5f52602260045260245ffd5b60208082526015908201527411105492ce881d1bdad95b881a5cc8189d5c9b9959605a1b604082015260600190565b60208082526023908201527f4441524b3a206d69677261746520746f6b656e206265666f7265207472616e736040820152623332b960e91b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761110357611103613e80565b5f82613ec557634e487b7160e01b5f52601260045260245ffd5b500490565b5f60018201613edb57613edb613e80565b5060010190565b61ffff81811683821601908082111561378357613783613e80565b5f61ffff808316818103613f1357613f13613e80565b6001019392505050565b8082018082111561110357611103613e80565b5f60208284031215613f40575f80fd5b81516115a7816137e3565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613f6f575f80fd5b5051919050565b601f821115611186575f81815260208120601f850160051c81016020861015613f9c5750805b601f850160051c820191505b81811015611cc657828155600101613fa8565b81516001600160401b03811115613fd457613fd4613ab5565b613fe881613fe28454613ddc565b84613f76565b602080601f83116001811461401b575f84156140045750858301515b5f19600386901b1c1916600185901b178555611cc6565b5f85815260208120601f198616915b828110156140495788860151825594840194600190910190840161402a565b508582101561406657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8451614087818460208901613831565b84519083019061409b818360208901613831565b84519101906140ae818360208801613831565b0195945050505050565b6001600160401b038311156140cf576140cf613ab5565b6140e3836140dd8354613ddc565b83613f76565b5f601f841160018114614114575f85156140fd5750838201355b5f19600387901b1c1916600186901b178355610fce565b5f83815260209020601f19861690835b828110156141445786850135825560209485019460019092019101614124565b5086821015614160575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f60208284031215614182575f80fd5b81516115a78161397b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b8181038181111561110357611103613e80565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061427190830184613853565b9695505050505050565b5f6020828403121561428b575f80fd5b81516115a7816137b3565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b5f82516142ec818460208701613831565b919091019291505056fe697066733a2f2f516d5a6a6e564b6b7a64464679775331487966633851636a454434334474734e6a654d6a5876464865344a7841362f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793003d95531756980564e07517b9d40d29e8cbf6ab6fc2eca0652231d729b9c74c3ad57a40a6a9e22c4bf4ea3cc9234a2b791b8912a049565b293e719bcd084bd0cb360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212207887d3853c6df0bc4dc1d79ebb9f9fffc455bf97a4a855c6b18568518b0c21ca64736f6c63430008140033
Deployed Bytecode Sourcemap
839:8407:19:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7010:326;;;;;;;;;;-1:-1:-1;7010:326:19;;;;;:::i;:::-;;:::i;:::-;;;565:14:29;;558:22;540:41;;528:2;513:18;7010:326:19;;;;;;;;2103:138:22;;;;;;;;;;-1:-1:-1;2103:138:22;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3560:133::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1035:106:20:-;;;;;;;;;;-1:-1:-1;1035:106:20;;;;;:::i;:::-;;:::i;4356:198:22:-;;;;;;;;;;-1:-1:-1;4356:198:22;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2524:32:29;;;2506:51;;2494:2;2479:18;4356:198:22;2360:203:29;7631:355:19;;;;;;;;;;-1:-1:-1;7631:355:19;;;;;:::i;:::-;;:::i;:::-;;6217:126;;;;;;;;;;;;;:::i;2136:659::-;;;;;;;;;;-1:-1:-1;2136:659:19;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;;4161:33:29;;;4143:52;;4131:2;4116:18;2136:659:19;3999:202:29;1736:158:23;;;;;;;;;;;;;:::i;:::-;;;4352:25:29;;;4340:2;4325:18;1736:158:23;4206:177:29;6087:126:19;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;6151:57:19;;;;;;6087:126;;5010:144;;;;;;;;;;-1:-1:-1;5010:144:19;;;;;:::i;:::-;;:::i;8652:424::-;;;;;;;;;;-1:-1:-1;8652:424:19;;;;;:::i;:::-;;:::i;836:428:24:-;;;;;;;;;;-1:-1:-1;836:428:24;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5663:32:29;;;5645:51;;5727:2;5712:18;;5705:34;;;;5618:18;836:428:24;5471:274:29;1099:574:23;;;;;;;;;;-1:-1:-1;1099:574:23;;;;;:::i;:::-;;:::i;5711:208:19:-;;;;;;;;;;;;;:::i;4675:183::-;;;;;;;;;;-1:-1:-1;4675:183:19;;;;;:::i;:::-;;:::i;5409:143:22:-;;;;;;;;;;-1:-1:-1;5409:143:22;;;;;:::i;:::-;;:::i;1145:111:20:-;;;;;;;;;;-1:-1:-1;1145:111:20;;;;;:::i;:::-;;:::i;3936:589:19:-;;;;;;;;;;-1:-1:-1;3936:589:19;;;;;:::i;:::-;;:::i;3892:214:7:-;;;;;;:::i;:::-;;:::i;2376:138:22:-;;;;;;;;;;-1:-1:-1;2376:138:22;;;;;:::i;:::-;;:::i;:::-;;;;8558:13:29;;-1:-1:-1;;;;;8554:39:29;8536:58;;8664:4;8652:17;;;8646:24;8639:32;8632:40;8610:20;;;8603:70;8731:17;;;8725:24;8718:32;8711:40;8689:20;;;8682:70;8524:2;8509:18;2376:138:22;8344:414:29;1958:236:23;;;;;;;;;;-1:-1:-1;1958:236:23;;;;;:::i;:::-;;:::i;3439:134:7:-;;;;;;;;;;;;;:::i;4529:142:19:-;;;;;;;;;;-1:-1:-1;4529:142:19;;;;;:::i;:::-;;:::i;6689:317::-;;;;;;;;;;-1:-1:-1;6689:317:19;;;;;:::i;:::-;;:::i;2815:557::-;;;;;;;;;;-1:-1:-1;2815:557:19;;;;;:::i;:::-;;:::i;6506:179::-;;;;;;;;;;-1:-1:-1;6506:179:19;;;;;:::i;:::-;;:::i;3155:101:0:-;;;;;;;;;;;;;:::i;440:29:24:-;;;;;;;;;;-1:-1:-1;440:29:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;440:29:24;;;;;;;;;;;;:::i;4862:144:19:-;;;;;;;;;;-1:-1:-1;4862:144:19;;;;;:::i;:::-;;:::i;1454:662::-;;;;;;;;;;;;;:::i;2441:144:0:-;;;;;;;;;;;;;:::i;3749:137:22:-;;;;;;;;;;;;;:::i;7990:197:19:-;;;;;;;;;;-1:-1:-1;7990:197:19;;;;;:::i;:::-;;:::i;1708:58:7:-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1708:58:7;;;;;2003:96:22;;;;;;;;;;;;;:::i;8191:457:19:-;;;;;;;;;;-1:-1:-1;8191:457:19;;;;;:::i;:::-;;:::i;6347:135::-;;;;;;;;;;;;;:::i;5923:141::-;;;;;;;;;;-1:-1:-1;5923:141:19;;;;;:::i;:::-;;:::i;7340:269::-;;;;;;;;;;-1:-1:-1;7340:269:19;;;;;:::i;:::-;;:::i;5443:264::-;;;;;;;;;;-1:-1:-1;5443:264:19;;;;;:::i;:::-;;:::i;2245:127:22:-;;;;;;;;;;;;;:::i;:::-;;;;;;12657:13:29;;12620:6;12653:22;;;12635:41;;12736:4;12724:17;;;12718:24;12714:33;;12692:20;;;12685:63;12808:4;12796:17;;;12790:24;12786:33;;12764:20;;;12757:63;12880:4;12868:17;;;12862:24;12858:33;12836:20;;;12829:63;;;;12597:3;12582:19;;12407:491;4818:197:22;;;;;;;;;;-1:-1:-1;4818:197:22;;;;;:::i;:::-;;:::i;3376:556:19:-;;;;;;;;;;-1:-1:-1;3376:556:19;;;;;:::i;:::-;;:::i;1260:189:20:-;;;;;;;;;;-1:-1:-1;1260:189:20;;;;;:::i;:::-;;:::i;5158:281:19:-;;;;;;;;;;-1:-1:-1;5158:281:19;;;;;:::i;:::-;;:::i;7010:326::-;7139:4;7154:59;7201:11;7154:46;:59::i;:::-;7151:81;;;-1:-1:-1;7228:4:19;;7010:326;-1:-1:-1;7010:326:19:o;7151:81::-;-1:-1:-1;;;;;;;;;1438:41:24;;;7239:73:19;;-1:-1:-1;7308:4:19;;7010:326;-1:-1:-1;7010:326:19:o;7239:73::-;-1:-1:-1;7326:5:19;;7010:326;-1:-1:-1;7010:326:19:o;2103:138:22:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;2192:44:22;;;;;;1305:22;2192:44;;;;;;2185:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;2103:138::o;3560:133::-;3614:13;-1:-1:-1;;;;;;;;;;;3635:53:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3560:133;:::o;1035:106:20:-;1101:4;2334:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;;1120:16:20;::::1;;::::0;;;:10:::1;:16;::::0;;;;;::::1;;2357:1:0;1035:106:20::0;;;:::o;4356:198:22:-;4432:7;4447:23;4462:7;4447:14;:23::i;:::-;-1:-1:-1;4484:65:22;;;;:56;:65;;;;;;-1:-1:-1;;;;;4484:65:22;;4356:198::o;7631:355:19:-;7756:8;1379:13;:11;:13::i;:::-;1376:62;;;1401:30;1422:8;1401:20;:30::i;:::-;7772:18:::1;7793:15;7800:7;7793:6;:15::i;:::-;7772:36;;7823:5;:14;;;7822:15;7814:49;;;;-1:-1:-1::0;;;7814:49:19::1;;;;;;;:::i;:::-;;;;;;;;;7877:11:::0;;-1:-1:-1;;;;;7877:25:19::1;7869:73;;;::::0;-1:-1:-1;;;7869:73:19;;14993:2:29;7869:73:19::1;::::0;::::1;14975:21:29::0;15032:2;15012:18;;;15005:30;15071:34;15051:18;;;15044:62;-1:-1:-1;;;15122:18:29;;;15115:33;15165:19;;7869:73:19::1;14791:399:29::0;7869:73:19::1;7949:32;7963:8;7973:7;7949:13;:32::i;:::-;7766:220;7631:355:::0;;;:::o;6217:126::-;-1:-1:-1;;;;;;;;;;;6280:58:19;;;;;;;6217:126::o;2136:659::-;2269:6;;-1:-1:-1;;;;;;;;;;;2283:80:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2317:46;2283:80;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2283:80:19;;;-1:-1:-1;;2283:80:19;;;;;;-1:-1:-1;;;;;2283:80:19;;;;;;2378:17;;;2283:80;;-1:-1:-1;2370:57:19;;;;-1:-1:-1;;;2370:57:19;;15397:2:29;2370:57:19;;;15379:21:29;15436:2;15416:18;;;15409:30;15475:29;15455:18;;;15448:57;15522:18;;2370:57:19;15195:351:29;2370:57:19;2463:6;:16;;;-1:-1:-1;;;;;2441:39:19;:10;-1:-1:-1;;;;;2441:39:19;;2433:80;;;;-1:-1:-1;;;2433:80:19;;15753:2:29;2433:80:19;;;15735:21:29;15792:2;15772:18;;;15765:30;15831;15811:18;;;15804:58;15879:18;;2433:80:19;15551:352:29;2433:80:19;2520:18;2541:15;2548:7;2541:6;:15::i;:::-;2520:36;;2571:5;:14;;;2570:15;2562:49;;;;-1:-1:-1;;;2562:49:19;;;;;;;:::i;:::-;2625:11;;-1:-1:-1;;;;;2625:25:19;;2617:66;;;;-1:-1:-1;;;2617:66:19;;16110:2:29;2617:66:19;;;16092:21:29;16149:2;16129:18;;;16122:30;16188;16168:18;;;16161:58;16236:18;;2617:66:19;15908:352:29;2617:66:19;2690:46;2712:1;2716:4;2722:7;2731:4;;2690:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2690:13:19;;-1:-1:-1;;;2690:46:19:i;:::-;-1:-1:-1;;;;2749:41:19;2136:659;-1:-1:-1;;;;;;;2136:659:19:o;1736:158:23:-;1835:7;1857:32;:30;:32::i;:::-;1850:39;;1736:158;:::o;5010:144:19:-;724:10:20;713:22;;;;:10;:22;;;;;;;;709:57;;744:22;;-1:-1:-1;;;744:22:20;;;;;;;;;;;709:57;787:10;1565:18;1602:8;;;772:43;;807:8;;-1:-1:-1;;;807:8:20;;;;;;;;;;;772:43;-1:-1:-1;;;;;;;;;;;5079:70:19;;;::::1;;::::0;::::1;-1:-1:-1::0;;5079:70:19;;::::1;::::0;;;::::1;::::0;;5010:144::o;8652:424::-;8790:4;1207:13;:11;:13::i;:::-;:35;;;;-1:-1:-1;;;;;;1224:18:19;;1232:10;1224:18;;1207:35;1203:88;;;1252:32;1273:10;1252:20;:32::i;:::-;8802:18:::1;8823:15;8830:7;8823:6;:15::i;:::-;8802:36;;8853:5;:14;;;8852:15;8844:49;;;;-1:-1:-1::0;;;8844:49:19::1;;;;;;;:::i;:::-;8908:5;:14;;;8907:15;8899:49;;;::::0;-1:-1:-1;;;8899:49:19;;16467:2:29;8899:49:19::1;::::0;::::1;16449:21:29::0;16506:2;16486:18;;;16479:30;-1:-1:-1;;;16525:18:29;;;16518:51;16586:18;;8899:49:19::1;16265:345:29::0;8899:49:19::1;8962:11:::0;;-1:-1:-1;;;;;8962:25:19::1;8954:73;;;;-1:-1:-1::0;;;8954:73:19::1;;;;;;;:::i;:::-;9034:37;9053:4;9059:2;9063:7;9034:18;:37::i;:::-;8796:280;8652:424:::0;;;;:::o;836:428:24:-;1171:23;:35;913:7;;;;;;1171:35;;;;;;;1122:45;;1134:33;1122:9;:45;:::i;:::-;1121:85;;;;:::i;:::-;1220:14;:23;-1:-1:-1;;;;;1220:23:24;;-1:-1:-1;1097:109:24;-1:-1:-1;;836:428:24;;;;;;:::o;1099:574:23:-;1196:7;1227:35;1256:5;1227:28;:35::i;:::-;1219:5;:43;1211:99;;;;-1:-1:-1;;;1211:99:23;;17880:2:29;1211:99:23;;;17862:21:29;17919:2;17899:18;;;17892:30;17958:34;17938:18;;;17931:62;-1:-1:-1;;;18009:18:29;;;18002:41;18060:19;;1211:99:23;17678:407:29;1211:99:23;1317:13;1336:15;1357:24;1384:7;:5;:7::i;:::-;1479:12;;1469:22;;;-1:-1:-1;1357:34:23;-1:-1:-1;;;;;;;;;;;;1465:184:23;1503:6;:12;;;1493:22;;:7;:22;1465:184;;;1547:17;:26;;;;;;;;;;:32;-1:-1:-1;;;;;1547:32:23;;;1538:41;;;;1589:8;1535:62;1619:7;;;;:::i;:::-;;-1:-1:-1;1606:36:23;;1637:5;1606:36;;1517:9;;;:::i;:::-;;;1465:184;;;-1:-1:-1;1661:7:23;;-1:-1:-1;;;1099:574:23;;;;;:::o;5711:208:19:-;2334:13:0;:11;:13::i;:::-;5779:21:19::1;5814:16:::0;5806:53:::1;;;::::0;-1:-1:-1;;;5806:53:19;;18432:2:29;5806:53:19::1;::::0;::::1;18414:21:29::0;18471:2;18451:18;;;18444:30;18510:26;18490:18;;;18483:54;18554:18;;5806:53:19::1;18230:348:29::0;5806:53:19::1;5865:49;5891:7;:5;:7::i;:::-;5901:12;5865:17;:49::i;:::-;5750:169;5711:208::o:0;4675:183::-;2334:13:0;:11;:13::i;:::-;4795:58:19::1;4814:8;4824:12;4838:14;4795:18;:58::i;:::-;4675:183:::0;;;:::o;5409:143:22:-;5508:39;5525:4;5531:2;5535:7;5508:39;;;;;;;;;;;;:16;:39::i;1145:111:20:-;2334:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;1221:16:20;;;::::1;;::::0;;;:10:::1;:16;::::0;;;;:30;;-1:-1:-1;;1221:30:20::1;::::0;::::1;;::::0;;;::::1;::::0;;1145:111::o;3936:589:19:-;724:10:20;713:22;;;;:10;:22;;;;;;;;709:57;;744:22;;-1:-1:-1;;;744:22:20;;;;;;;;;;;709:57;787:10;1565:18;1602:8;;;772:43;;807:8;;-1:-1:-1;;;807:8:20;;;;;;;;;;;772:43;-1:-1:-1;;;;;;;;;;;4120:13:19;;4019:32:::1;::::0;4120:21:::1;::::0;4136:5;;4120:13:::1;;:21;:::i;:::-;4107:34;;4156:3;4150;:9;;;4147:29;;;-1:-1:-1::0;4173:3:19::1;4147:29;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;;4296:13:19;;-1:-1:-1;;;;;;;;;;;1590:22:22;4296:13:19::1;;4275:220;4321:3;4311:13;;:7;:13;;;4275:220;;;4353:26;::::0;::::1;:17;:26:::0;;;::::1;::::0;;;;;;;;4345:34;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;4345:34:19;::::1;::::0;;::::1;-1:-1:-1::0;;;4345:34:19;::::1;::::0;::::1;;::::0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;4345:34:19;;::::1;;;;::::0;;;;;;;;-1:-1:-1;4391:44:19::1;;-1:-1:-1::0;4410:11:19;;-1:-1:-1;;;;;4410:25:19::1;::::0;4391:44:::1;4387:102;;;4446:34;4464:1;4468:2;4472:7;4446:34;;:9;:34::i;:::-;4326:9;::::0;::::1;:::i;:::-;;;4275:220;;;-1:-1:-1::0;;4501:19:19;;-1:-1:-1;;4501:19:19::1;;::::0;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;3936:589:19:o;3892:214:7:-;2542:13;:11;:13::i;:::-;4007:36:::1;4025:17;4007;:36::i;:::-;4053:46;4075:17;4094:4;4053:21;:46::i;:::-;3892:214:::0;;:::o;2376:138:22:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;2465:44:22;;;-1:-1:-1;;;;;;;;;;;2465:44:22;;;;;;2458:51;;;;;;;;-1:-1:-1;;;;;2458:51:22;;;;;-1:-1:-1;;;2458:51:22;;;;;;;;;;;;;-1:-1:-1;;;2458:51:22;;;;;;;;;;2376:138::o;1958:236:23:-;2033:7;2064:42;:40;:42::i;:::-;2056:5;:50;2048:107;;;;-1:-1:-1;;;2048:107:23;;19160:2:29;2048:107:23;;;19142:21:29;19199:2;19179:18;;;19172:30;19238:34;19218:18;;;19211:62;-1:-1:-1;;;19289:18:29;;;19282:42;19341:19;;2048:107:23;18958:408:29;2048:107:23;2184:5;2168:7;:5;:7::i;:::-;:13;:21;;;;;;:::i;3439:134:7:-;3508:7;2813:20;:18;:20::i;:::-;-1:-1:-1;;;;;;;;;;;;3439:134:7;:::o;4529:142:19:-;724:10:20;713:22;;;;:10;:22;;;;;;;;709:57;;744:22;;-1:-1:-1;;;744:22:20;;;;;;;;;;;709:57;787:10;1565:18;1602:8;;;772:43;;807:8;;-1:-1:-1;;;807:8:20;;;;;;;;;;;772:43;4613:53:19::1;4627:15;4634:7;4627:6;:15::i;:::-;:21;;;4650:2;4654:7;4613:53;;;;;;;;;;;::::0;:13:::1;:53::i;6689:317::-:0;6782:7;6797:18;6818:15;6825:7;6818:6;:15::i;:::-;6797:36;;6848:5;:14;;;6847:15;6839:49;;;;-1:-1:-1;;;6839:49:19;;;;;;;:::i;:::-;6898:11;;-1:-1:-1;;;;;6898:25:19;;6895:106;;6938:11;;6689:317;-1:-1:-1;;6689:317:19:o;6895:106::-;6973:11;:9;:11::i;:::-;-1:-1:-1;;;;;6973:19:19;;6993:7;6973:28;;;;;;;;;;;;;4352:25:29;;4340:2;4325:18;;4206:177;6973:28:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6966:35;6689:317;-1:-1:-1;;;6689:317:19:o;6895:106::-;6791:215;6689:317;;;:::o;2815:557::-;724:10:20;713:22;;;;:10;:22;;;;;;;;709:57;;744:22;;-1:-1:-1;;;744:22:20;;;;;;;;;;;709:57;787:10;1565:18;1602:8;;;772:43;;807:8;;-1:-1:-1;;;807:8:20;;;;;;;;;;;772:43;2939:8:19;2968:25;;::::1;2960:62;;;::::0;-1:-1:-1;;;2960:62:19;;19959:2:29;2960:62:19::1;::::0;::::1;19941:21:29::0;19998:2;19978:18;;;19971:30;20037:26;20017:18;;;20010:54;20081:18;;2960:62:19::1;19757:348:29::0;2960:62:19::1;-1:-1:-1::0;;;;;;;;3029:15:19::1;-1:-1:-1::0;;;;;;;;;;;;;;;3078:9:19::1;3074:294;3097:12;3093:1;:16;3074:294;;;3134:8;;3143:1;3134:11;;;;;;;:::i;:::-;;;;;;;3124:21;;3162:15;3169:7;3162:6;:15::i;:::-;3154:23;;3194:5;:14;;;3193:15;3185:49;;;;-1:-1:-1::0;;;3185:49:19::1;;;;;;;:::i;:::-;3250:11:::0;;-1:-1:-1;;;;;3250:25:19::1;::::0;3242:66:::1;;;::::0;-1:-1:-1;;;3242:66:19;;16110:2:29;3242:66:19::1;::::0;::::1;16092:21:29::0;16149:2;16129:18;;;16122:30;16188;16168:18;;;16161:58;16236:18;;3242:66:19::1;15908:352:29::0;3242:66:19::1;3316:45;3338:1;3342:2;;3345:1;3342:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;3349:7;3316:45;;;;;;;;;;;::::0;:13:::1;:45::i;:::-;3111:3;::::0;::::1;:::i;:::-;;;3074:294;;;;2910:462;;;2815:557:::0;;;;:::o;6506:179::-;6601:7;6656:24;6672:7;6656:15;:24::i;:::-;6623:11;:9;:11::i;:::-;:30;;-1:-1:-1;;;6623:30:19;;-1:-1:-1;;;;;2524:32:29;;;6623:30:19;;;2506:51:29;6623:21:19;;;;;;;2479:18:29;;6623:30:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;;;:::i;3155:101:0:-;2334:13;:11;:13::i;:::-;3219:30:::1;3246:1;3219:18;:30::i;:::-;3155:101::o:0;4862:144:19:-;724:10:20;713:22;;;;:10;:22;;;;;;;;709:57;;744:22;;-1:-1:-1;;;744:22:20;;;;;;;;;;;709:57;787:10;1565:18;1602:8;;;772:43;;807:8;;-1:-1:-1;;;807:8:20;;;;;;;;;;;772:43;-1:-1:-1;;;;;;;;;;;4932:69:19;;;::::1;;::::0;::::1;-1:-1:-1::0;;4932:69:19;;::::1;::::0;;;::::1;::::0;;4862:144::o;1454:662::-;8870:21:1;4302:15;;-1:-1:-1;;;4302:15:1;;;;4301:16;;-1:-1:-1;;;;;4348:14:1;4158:30;4726:16;;:34;;;;;4746:14;4726:34;4706:54;;4770:17;4790:11;-1:-1:-1;;;;;4790:16:1;4805:1;4790:16;:50;;;;-1:-1:-1;4818:4:1;4810:25;:30;4790:50;4770:70;;4856:12;4855:13;:30;;;;;4873:12;4872:13;4855:30;4851:91;;;4908:23;;-1:-1:-1;;;4908:23:1;;;;;;;;;;;4851:91;4951:18;;-1:-1:-1;;4951:18:1;4968:1;4951:18;;;4979:67;;;;5013:22;;-1:-1:-1;;;;5013:22:1;-1:-1:-1;;;5013:22:1;;;4979:67;1503:18:19::1;:16;:18::i;:::-;1527:32;:30;:32::i;:::-;1565:36;;;;;;;;;;;;;;-1:-1:-1::0;;;1565:36:19::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;1565:36:19::1;;::::0;:13:::1;:36::i;:::-;1607:49;1640:4;1648:2;1652:3;1607:16;:49::i;:::-;1717:282;;;;;;;;1751:1;1717:282;;;;;;1772:4;1717:282;;;;;;1797:4;1717:282;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;1717:282:19::1;::::0;;::::1;::::0;;;;;::::1;::::0;1838:42:::1;1717:282:::0;;;-1:-1:-1;;;;;;;;;;;1668:331:19;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;;::::0;::::1;-1:-1:-1::0;;1668:331:19;::::1;;::::0;::::1;-1:-1:-1::0;;1668:331:19;;;::::1;::::0;;::::1;::::0;;;;;;;::::1;;;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;1668:331:19::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;1668:331:19::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;1668:331:19::1;-1:-1:-1::0;;;;;1668:331:19;;::::1;::::0;;;::::1;::::0;;2053:58:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;2053:58:19;;2080:3:::1;2053:58;::::0;::::1;::::0;2091:3:::1;2053:58:::0;;;;;;-1:-1:-1;2053:58:19;;1427:27:22::1;2006:105:19::0;;-1:-1:-1;;2006:105:19;;;;;5066:101:1;;;;5100:23;;-1:-1:-1;;;;5100:23:1;;;5142:14;;-1:-1:-1;22788:50:29;;5142:14:1;;22776:2:29;22761:18;5142:14:1;;;;;;;4092:1081;;;;;1454:662:19:o;2441:144:0:-;1313:22;2570:8;-1:-1:-1;;;;;2570:8:0;;2441:144::o;3749:137:22:-;3805:13;-1:-1:-1;;;;;;;;;;;3833:48:22;;3826:55;;;;;:::i;7990:197:19:-;8123:8;1379:13;:11;:13::i;:::-;1376:62;;;1401:30;1422:8;1401:20;:30::i;:::-;8139:43:::1;8163:8;8173;8139:23;:43::i;2003:96:22:-:0;2046:7;2068:18;2083:1;2068:6;:18::i;:::-;:26;2061:33;;;2003:96;-1:-1:-1;2003:96:22:o;8191:457:19:-;8352:4;1207:13;:11;:13::i;:::-;:35;;;;-1:-1:-1;;;;;;1224:18:19;;1232:10;1224:18;;1207:35;1203:88;;;1252:32;1273:10;1252:20;:32::i;:::-;8364:18:::1;8385:15;8392:7;8385:6;:15::i;:::-;8364:36;;8415:5;:14;;;8414:15;8406:49;;;;-1:-1:-1::0;;;8406:49:19::1;;;;;;;:::i;:::-;8470:5;:14;;;8469:15;8461:49;;;::::0;-1:-1:-1;;;8461:49:19;;16467:2:29;8461:49:19::1;::::0;::::1;16449:21:29::0;16506:2;16486:18;;;16479:30;-1:-1:-1;;;16525:18:29;;;16518:51;16586:18;;8461:49:19::1;16265:345:29::0;8461:49:19::1;8524:11:::0;;-1:-1:-1;;;;;8524:25:19::1;8516:73;;;;-1:-1:-1::0;;;8516:73:19::1;;;;;;;:::i;:::-;8596:47;8619:4;8625:2;8629:7;8638:4;8596:22;:47::i;:::-;8358:290;8191:457:::0;;;;;:::o;6347:135::-;6421:56;;-1:-1:-1;;;;;6421:56:19;;6347:135::o;5923:141::-;724:10:20;713:22;;;;:10;:22;;;;;;;;709:57;;744:22;;-1:-1:-1;;;744:22:20;;;;;;;;;;;709:57;787:10;1565:18;1602:8;;;772:43;;807:8;;-1:-1:-1;;;807:8:20;;;;;;;;;;;772:43;6007:11:19::1;:9;:11::i;:::-;:52;::::0;-1:-1:-1;;;6007:52:19;;6040:4:::1;6007:52;::::0;::::1;23089:34:29::0;-1:-1:-1;;;;;23159:15:29;;;23139:18;;;23132:43;23191:18;;;23184:34;;;6007:24:19;;;::::1;::::0;::::1;::::0;23024:18:29;;6007:52:19::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;7340:269:::0;7405:13;7425:31;-1:-1:-1;;;;;;;;;;;7425:80:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7459:46;7425:80;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7425:80:19;;;-1:-1:-1;;7425:80:19;;;;;;-1:-1:-1;;;;;7425:80:19;;;;;;7532:21;;;;7425:80;;-1:-1:-1;7555:25:19;7572:7;7555:16;:25::i;:::-;7582:6;:21;;;7518:86;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7511:93;;;7340:269;;;:::o;5443:264::-;724:10:20;713:22;;;;:10;:22;;;;;;;;709:57;;744:22;;-1:-1:-1;;;744:22:20;;;;;;;;;;;709:57;787:10;1565:18;1602:8;;;772:43;;807:8;;-1:-1:-1;;;807:8:20;;;;;;;;;;;772:43;5556:61:19;:70:::1;5620:6:::0;;5556:61;:70:::1;:::i;:::-;-1:-1:-1::0;5632:61:19;:70:::1;5696:6:::0;;5632:61;:70:::1;:::i;2245:127:22:-:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1427:27:22;2316:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2245:127;-1:-1:-1;2245:127:22:o;4818:197::-;-1:-1:-1;;;;;4934:66:22;;;4915:4;4934:66;;;:59;:66;;;;;;;;:76;;;;;;;;;;;;;;;4818:197::o;3376:556:19:-;724:10:20;713:22;;;;:10;:22;;;;;;;;709:57;;744:22;;-1:-1:-1;;;744:22:20;;;;;;;;;;;709:57;787:10;1565:18;1602:8;;;772:43;;807:8;;-1:-1:-1;;;807:8:20;;;;;;;;;;;772:43;-1:-1:-1;;;;;;;;;;;3547:13:19;;3446:32:::1;::::0;3547:21:::1;::::0;3563:5;;3547:13:::1;;:21;:::i;:::-;3534:34;;3583:3;3577;:9;;;3574:29;;;-1:-1:-1::0;3600:3:19::1;3574:29;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;;3723:13:19;;-1:-1:-1;;;;;;;;;;;1590:22:22;3723:13:19::1;;3702:200;3748:3;3738:13;;:7;:13;;;3702:200;;;3780:26;::::0;::::1;:17;:26:::0;;;::::1;::::0;;;;;;;;3772:34;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;3772:34:19;::::1;::::0;;::::1;-1:-1:-1::0;;;3772:34:19;::::1;::::0;::::1;;::::0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;3772:34:19;;::::1;;;;::::0;;;;;;;;-1:-1:-1;3818:44:19::1;;-1:-1:-1::0;3837:11:19;;-1:-1:-1;;;;;3837:25:19::1;::::0;3818:44:::1;3814:82;;;3873:14;3879:7;3873:5;:14::i;:::-;3753:9;::::0;::::1;:::i;:::-;;;3702:200;;;-1:-1:-1::0;;3908:19:19;;-1:-1:-1;;3908:19:19::1;;::::0;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;3376:556:19:o;1260:189:20:-;2334:13:0;:11;:13::i;:::-;1345:27:20::1;1357:7;:5;:7::i;:::-;1366:5;1345:11;:27::i;:::-;1378;1390:8;1400:4;1378:11;:27::i;:::-;1411:33;1435:8;1411:23;:33::i;5158:281:19:-:0;724:10:20;713:22;;;;:10;:22;;;;;;;;709:57;;744:22;;-1:-1:-1;;;744:22:20;;;;;;;;;;;709:57;787:10;1565:18;1602:8;;;772:43;;807:8;;-1:-1:-1;;;807:8:20;;;;;;;;;;;772:43;-1:-1:-1;;;;;;;;;;;5257:32:19::1;5325:110;5344:19:::0;;::::1;5325:110;;;5420:8:::0;5378:9;:17:::1;5396:8:::0;;5405:1;5396:11;;::::1;;;;;:::i;:::-;;;;;;;5378:30;;;;;;;;;;;:39;;;:50;;;;;;;;;;;;;;;;;;5365:3;;;;:::i;:::-;;;5325:110;;795:233:23::0;908:4;-1:-1:-1;;;;;;927:50:23;;-1:-1:-1;;;927:50:23;;:96;;;987:36;1011:11;987:23;:36::i;2658:162:0:-;966:10:2;2717:7:0;:5;:7::i;:::-;-1:-1:-1;;;;;2717:23:0;;2713:101;;2763:40;;-1:-1:-1;;;2763:40:0;;966:10:2;2763:40:0;;;2506:51:29;2479:18;;2763:40:0;2360:203:29;12700:127:22;12777:16;12785:7;12777;:16::i;:::-;12769:53;;;;-1:-1:-1;;;12769:53:22;;25350:2:29;12769:53:22;;;25332:21:29;25389:2;25369:18;;;25362:30;25428:26;25408:18;;;25401:54;25472:18;;12769:53:22;25148:348:29;3057:665:28;1056:42;3246:45;:49;3242:474;;3569:67;;-1:-1:-1;;;3569:67:28;;3620:4;3569:67;;;25713:34:29;-1:-1:-1;;;;;25783:15:29;;25763:18;;;25756:43;1056:42:28;;3569;;25648:18:29;;3569:67:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3564:142;;3663:28;;-1:-1:-1;;;3663:28:28;;-1:-1:-1;;;;;2524:32:29;;3663:28:28;;;2506:51:29;2479:18;;3663:28:28;2360:203:29;3937:366:22;4013:13;4029:17;4038:7;4029:8;:17::i;:::-;4013:33;;4066:5;-1:-1:-1;;;;;4060:11:22;:2;-1:-1:-1;;;;;4060:11:22;;4052:57;;;;-1:-1:-1;;;4052:57:22;;26262:2:29;4052:57:22;;;26244:21:29;26301:2;26281:18;;;26274:30;26340:34;26320:18;;;26313:62;-1:-1:-1;;;26391:18:29;;;26384:31;26432:19;;4052:57:22;26060:397:29;4052:57:22;966:10:2;-1:-1:-1;;;;;4131:21:22;;;;:62;;-1:-1:-1;4156:37:22;4173:5;966:10:2;4818:197:22;:::i;4156:37::-;4116:154;;;;-1:-1:-1;;;4116:154:22;;26664:2:29;4116:154:22;;;26646:21:29;26703:2;26683:18;;;26676:30;26742:34;26722:18;;;26715:62;26813:31;26793:18;;;26786:59;26862:19;;4116:154:22;26462:425:29;4116:154:22;4277:21;4286:2;4290:7;4277:8;:21::i;6720:257::-;6828:28;6838:4;6844:2;6848:7;6828:9;:28::i;:::-;6870:47;6893:4;6899:2;6903:7;6912:4;6870:22;:47::i;:::-;6862:110;;;;-1:-1:-1;;;6862:110:22;;;;;;;:::i;2518:145::-;2570:7;2646:12;:10;:12::i;:::-;1427:27;2592:51;:66;;;:51;;;;;:66;:::i;5069:282::-;5220:41;966:10:2;5253:7:22;5220:18;:41::i;:::-;5212:99;;;;-1:-1:-1;;;5212:99:22;;;;;;;:::i;:::-;5318:28;5328:4;5334:2;5338:7;5318:9;:28::i;3053:199::-;3125:7;-1:-1:-1;;;;;3148:19:22;;3140:73;;;;-1:-1:-1;;;3140:73:22;;28060:2:29;3140:73:22;;;28042:21:29;28099:2;28079:18;;;28072:30;28138:34;28118:18;;;28111:62;-1:-1:-1;;;28189:18:29;;;28182:39;28238:19;;3140:73:22;27858:405:29;3140:73:22;3226:13;3233:5;3226:6;:13::i;:::-;:21;3219:28;;;3053:199;-1:-1:-1;;3053:199:22:o;1531:331:12:-;1640:6;1616:21;:30;1612:109;;;1669:41;;-1:-1:-1;;;1669:41:12;;1704:4;1669:41;;;2506:51:29;2479:18;;1669:41:12;2360:203:29;1612:109:12;1732:12;1750:9;-1:-1:-1;;;;;1750:14:12;1772:6;1750:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1731:52;;;1798:7;1793:63;;1828:17;;-1:-1:-1;;;1828:17:12;;;;;;;;;;;1488:285:24;1618:12;1605:25;;:10;:25;;;1597:65;;;;-1:-1:-1;;;1597:65:24;;28680:2:29;1597:65:24;;;28662:21:29;28719:2;28699:18;;;28692:30;28758:29;28738:18;;;28731:57;28805:18;;1597:65:24;28478:351:29;1597:65:24;1668:14;:34;;-1:-1:-1;;;;;1668:34:24;;;-1:-1:-1;;;;;;1668:34:24;;;;;;;;;;1734;;;;;;;;;;;;;;;;;;;;;;;;;;;1708:23;:60;;;;;;-1:-1:-1;;1708:60:24;;;;;;;;;1488:285::o;10533:153:22:-;10610:32;10623:4;10629:2;10633:1;10636:5;10610:12;:32::i;:::-;10648:33;10663:4;10669:2;10673:7;10648:14;:33::i;4333:312:7:-;4413:4;-1:-1:-1;;;;;4422:6:7;4405:23;;;:120;;;4519:6;-1:-1:-1;;;;;4483:42:7;:32;-1:-1:-1;;;;;;;;;;;2035:53:5;-1:-1:-1;;;;;2035:53:5;;1957:138;4483:32:7;-1:-1:-1;;;;;4483:42:7;;;4405:120;4388:251;;;4599:29;;-1:-1:-1;;;4599:29:7;;;;;;;;;;;9153:91:19;724:10:20;713:22;;;;:10;:22;;;;;;;;709:57;;744:22;;-1:-1:-1;;;744:22:20;;;;;;;;;;;709:57;787:10;1565:18;1602:8;;;772:43;;807:8;;-1:-1:-1;;;807:8:20;;;;;;;;;;;5786:538:7;5903:17;-1:-1:-1;;;;;5885:50:7;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5885:52:7;;;;;;;;-1:-1:-1;;5885:52:7;;;;;;;;;;;;:::i;:::-;;;5881:437;;6247:60;;-1:-1:-1;;;6247:60:7;;-1:-1:-1;;;;;2524:32:29;;6247:60:7;;;2506:51:29;2479:18;;6247:60:7;2360:203:29;5881:437:7;-1:-1:-1;;;;;;;;;;;5979:40:7;;5975:120;;6046:34;;-1:-1:-1;;;6046:34:7;;;;;4352:25:29;;;4325:18;;6046:34:7;4206:177:29;5975:120:7;6108:54;6138:17;6157:4;6108:29;:54::i;4762:213::-;4836:4;-1:-1:-1;;;;;4845:6:7;4828:23;;4824:145;;4929:29;;-1:-1:-1;;;4929:29:7;;;;;;;;;;;3774:248:0;1313:22;3923:8;;-1:-1:-1;;;;;;3941:19:0;;-1:-1:-1;;;;;3941:19:0;;;;;;;;3975:40;;3923:8;;;;;3975:40;;3847:24;;3975:40;3837:185;;3774:248;:::o;884:133:20:-;6931:20:1;:18;:20::i;:::-;944:36:20::1;969:10;944:24;:36::i;:::-;986:26;998:7;:5;:7::i;:::-;1007:4;986:11;:26::i;619:171:27:-:0;6931:20:1;:18;:20::i;:::-;697:86:27::1;211:42:26;778:4:27;697:51;:86::i;1776:223:22:-:0;6931:20:1;:18;:20::i;:::-;-1:-1:-1;;;;;;;;;;;1104:66:22;1948:18:::1;1961:5:::0;1104:66;1948:18:::1;:::i;:::-;-1:-1:-1::0;1972:12:22::1;::::0;::::1;:22;1987:7:::0;1972:12;:22:::1;:::i;578:183:24:-:0;6931:20:1;:18;:20::i;4613:147:22:-;4703:52;966:10:2;4736:8:22;4746;4703:18;:52::i;5616:267::-;5742:41;966:10:2;5775:7:22;5742:18;:41::i;:::-;5734:99;;;;-1:-1:-1;;;5734:99:22;;;;;;;:::i;:::-;5840:38;5854:4;5860:2;5864:7;5873:4;5840:13;:38::i;637:698:14:-;693:13;742:14;759:17;770:5;759:10;:17::i;:::-;779:1;759:21;742:38;;794:20;828:6;-1:-1:-1;;;;;817:18:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:18:14;-1:-1:-1;794:41:14;-1:-1:-1;955:28:14;;;971:2;955:28;1010:282;-1:-1:-1;;1041:5:14;-1:-1:-1;;;1175:2:14;1164:14;;1159:32;1041:5;1146:46;1236:2;1227:11;;;-1:-1:-1;1256:21:14;1010:282;1256:21;-1:-1:-1;1312:6:14;637:698;-1:-1:-1;;;637:698:14:o;10209:108:22:-;10263:49;10273:17;10282:7;10273:17;;:8;:17::i;:::-;10300:1;10304:7;10263:49;;:9;:49::i;3405:215:0:-;2334:13;:11;:13::i;:::-;-1:-1:-1;;;;;3489:22:0;::::1;3485:91;;3534:31;::::0;-1:-1:-1;;;3534:31:0;;3562:1:::1;3534:31;::::0;::::1;2506:51:29::0;2479:18;;3534:31:0::1;2360:203:29::0;3485:91:0::1;3585:28;3604:8;3585:18;:28::i;2739:263:22:-:0;2824:4;-1:-1:-1;;;;;;2849:40:22;;-1:-1:-1;;;2849:40:22;;:90;;-1:-1:-1;;;;;;;2899:40:22;;-1:-1:-1;;;2899:40:22;2849:90;:148;;;-1:-1:-1;;;;;;;2949:48:22;;-1:-1:-1;;;2949:48:22;2836:161;2739:263;-1:-1:-1;;2739:263:22:o;7469:120::-;7534:4;;7553:17;7562:7;7553:8;:17::i;:::-;-1:-1:-1;;;;;7553:31:22;;;;7469:120;-1:-1:-1;;7469:120:22:o;7078:106::-;7136:7;7158:15;7165:7;7158:6;:15::i;:::-;:21;;7078:106;-1:-1:-1;;7078:106:22:o;12000:196::-;12070:65;;;;:56;:65;;;;;:70;;-1:-1:-1;;;;;;12070:70:22;-1:-1:-1;;;;;12070:70:22;;;;;;;;:65;;12160:17;12070:65;12160:8;:17::i;:::-;-1:-1:-1;;;;;12151:40:22;;;;;;;;;;;12000:196;;:::o;13357:707::-;13488:4;-1:-1:-1;;;;;13504:14:22;;;:18;13500:560;;13536:71;;-1:-1:-1;;;13536:71:22;;-1:-1:-1;;;;;13536:36:22;;;;;:71;;966:10:2;;13587:4:22;;13593:7;;13602:4;;13536:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13536:71:22;;;;;;;;-1:-1:-1;;13536:71:22;;;;;;;;;;;;:::i;:::-;;;13532:490;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13752:6;:13;13769:1;13752:18;13748:266;;13784:60;;-1:-1:-1;;;13784:60:22;;;;;;;:::i;13748:266::-;13984:6;13978:13;13969:6;13965:2;13961:15;13954:38;13532:490;-1:-1:-1;;;;;;13649:51:22;-1:-1:-1;;;13649:51:22;;-1:-1:-1;13642:58:22;;13500:560;-1:-1:-1;14049:4:22;13500:560;13357:707;;;;;;:::o;7731:245::-;7824:4;7836:13;7852:17;7861:7;7852:8;:17::i;:::-;7836:33;;7894:5;-1:-1:-1;;;;;7883:16:22;:7;-1:-1:-1;;;;;7883:16:22;;:52;;;;7903:32;7920:5;7927:7;7903:16;:32::i;:::-;7883:87;;;;7963:7;-1:-1:-1;;;;;7939:31:22;:20;7951:7;7939:11;:20::i;:::-;-1:-1:-1;;;;;7939:31:22;;7875:96;7731:245;-1:-1:-1;;;;7731:245:22:o;14164:573::-;-1:-1:-1;;;;;;;;;;;;;;;;;1305:22:22;-1:-1:-1;;;;;14373:18:22;;;14370:184;;-1:-1:-1;;;;;14407:13:22;;;;;;;;;;;;;;14400:20;;;;;;;;;;;;;;;;;;;;;;;;;;;14463:76;;;;;;;;14480:12;;:23;;;14463:76;;;;14515:14;14463:76;;;;;;;;14447:13;;;;;;;;:92;;;;;;;;;-1:-1:-1;;14447:92:22;;;;;;;;;;;;;;;;;;14400:20;-1:-1:-1;14370:184:22;-1:-1:-1;;;;;14567:11:22;;;;;;;;;;;;;;;14560:18;;;;;;;;;;;;;;;;;;;;;;;;;14615:111;;;;;;;;14630:12;;:23;;14615:111;;;14560:18;-1:-1:-1;14615:111:22;;14663:10;:55;;14704:4;:14;;;14663:55;;;14693:8;14676:4;:14;;;:25;14663:55;14615:111;;;;;;;-1:-1:-1;;;;;14601:11:22;;;;;;;;;;;;;;:125;;;;;;;;;;;;;-1:-1:-1;;14601:125:22;;;;;;;;;;;;;;;-1:-1:-1;;;;14164:573:22:o;10869:1031::-;10980:4;-1:-1:-1;;;;;10959:25:22;:17;10968:7;10959:8;:17::i;:::-;-1:-1:-1;;;;;10959:25:22;;10951:75;;;;-1:-1:-1;;;10951:75:22;;;;;;;:::i;:::-;11188:4;-1:-1:-1;;;;;11167:25:22;:17;11176:7;11167:8;:17::i;:::-;-1:-1:-1;;;;;11167:25:22;;11159:75;;;;-1:-1:-1;;;11159:75:22;;;;;;;:::i;:::-;11288:23;11367:29;;;:20;:29;;;;;;;;11360:36;;-1:-1:-1;;;;;;11360:36:22;;;-1:-1:-1;;;;;;;;;;;11491:26:22;;;;;;;11471:46;;;;;;;;;-1:-1:-1;;;;;11471:46:22;;;;;;-1:-1:-1;;;11471:46:22;;;;;;;;;;;;;-1:-1:-1;;;11471:46:22;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1104:66:22;1590:22;11526:16;;11523:286;;11580:84;;;;;;;;-1:-1:-1;11580:84:22;;;11615:4;11580:84;;;;;;;;;;;;;11551:26;;;;;;;;;;;:113;;;;;;;;;;-1:-1:-1;;;11551:113:22;-1:-1:-1;;;;11551:113:22;;;-1:-1:-1;;;11551:113:22;-1:-1:-1;;;;;;11551:113:22;;;-1:-1:-1;;;;;11551:113:22;;;;;;;;;;;;;;;;;;;;;;11523:286;;;11717:85;;;;;;;;-1:-1:-1;;;;;11717:85:22;;;;;-1:-1:-1;11717:85:22;;;;;;;11770:13;;;;11717:85;;;;;;;;11688:26;;;;;;;;;;;:114;;;;;;;;;;-1:-1:-1;;;11688:114:22;-1:-1:-1;;;;11688:114:22;;;-1:-1:-1;;;11688:114:22;-1:-1:-1;;;;;;11688:114:22;;;;;;;;;;;;;;;;;;;;;;11523:286;11839:7;11835:2;-1:-1:-1;;;;;11820:27:22;11829:4;-1:-1:-1;;;;;11820:27:22;;;;;;;;;;;11854:41;7631:355:19;2779:335:5;2870:37;2889:17;2870:18;:37::i;:::-;2922:27;;-1:-1:-1;;;;;2922:27:5;;;;;;;;2964:11;;:15;2960:148;;2995:53;3024:17;3043:4;2995:28;:53::i;2960:148::-;3079:18;:16;:18::i;7084:141:1:-;8870:21;8560:40;-1:-1:-1;;;8560:40:1;;;;7146:73;;7191:17;;-1:-1:-1;;;7191:17:1;;;;;;;;;;;1980:235:0;6931:20:1;:18;:20::i;1214:1091:28:-;6931:20:1;:18;:20::i;:::-;1056:42:28::1;1643:45;:49:::0;1639:660:::1;;1713:52;::::0;-1:-1:-1;;;1713:52:28;;1759:4:::1;1713:52;::::0;::::1;2506:51:29::0;1056:42:28::1;::::0;1713:37:::1;::::0;2479:18:29;;1713:52:28::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1708:581;;1789:9;1785:490;;;1822:92;::::0;-1:-1:-1;;;1822:92:28;;1876:4:::1;1822:92;::::0;::::1;25713:34:29::0;-1:-1:-1;;;;;25783:15:29;;25763:18;;;25756:43;1056:42:28::1;::::0;1822:45:::1;::::0;25648:18:29;;1822:92:28::1;25501:304:29::0;1785:490:28::1;-1:-1:-1::0;;;;;1965:44:28;::::1;::::0;1961:296:::1;;2037:94;::::0;-1:-1:-1;;;2037:94:28;;2093:4:::1;2037:94;::::0;::::1;25713:34:29::0;-1:-1:-1;;;;;25783:15:29;;25763:18;;;25756:43;1056:42:28::1;::::0;2037:47:::1;::::0;25648:18:29;;2037:94:28::1;25501:304:29::0;1961:296:28::1;2186:48;::::0;-1:-1:-1;;;2186:48:28;;2228:4:::1;2186:48;::::0;::::1;2506:51:29::0;1056:42:28::1;::::0;2186:33:::1;::::0;2479:18:29;;2186:48:28::1;2360:203:29::0;12320:304:22;12436:8;-1:-1:-1;;;;;12427:17:22;:5;-1:-1:-1;;;;;12427:17:22;;12419:55;;;;-1:-1:-1;;;12419:55:22;;30379:2:29;12419:55:22;;;30361:21:29;30418:2;30398:18;;;30391:30;30457:27;30437:18;;;30430:55;30502:18;;12419:55:22;30177:349:29;12419:55:22;-1:-1:-1;;;;;12480:66:22;;;;;;;:59;:66;;;;;;;;:76;;;;;;;;;;;;;:87;;-1:-1:-1;;12480:87:22;;;;;;;;;;12578:41;;540::29;;;12578::22;;;;;;;;;;;;12320:304;;;:::o;12214:916:17:-;12267:7;;-1:-1:-1;;;12342:17:17;;12338:103;;-1:-1:-1;;;12379:17:17;;;-1:-1:-1;12424:2:17;12414:12;12338:103;12467:8;12458:5;:17;12454:103;;12504:8;12495:17;;;-1:-1:-1;12540:2:17;12530:12;12454:103;12583:8;12574:5;:17;12570:103;;12620:8;12611:17;;;-1:-1:-1;12656:2:17;12646:12;12570:103;12699:7;12690:5;:16;12686:100;;12735:7;12726:16;;;-1:-1:-1;12770:1:17;12760:11;12686:100;12812:7;12803:5;:16;12799:100;;12848:7;12839:16;;;-1:-1:-1;12883:1:17;12873:11;12799:100;12925:7;12916:5;:16;12912:100;;12961:7;12952:16;;;-1:-1:-1;12996:1:17;12986:11;12912:100;13038:7;13029:5;:16;13025:66;;13075:1;13065:11;13117:6;12214:916;-1:-1:-1;;12214:916:17:o;2186:281:5:-;2263:17;-1:-1:-1;;;;;2263:29:5;;2296:1;2263:34;2259:119;;2320:47;;-1:-1:-1;;;2320:47:5;;-1:-1:-1;;;;;2524:32:29;;2320:47:5;;;2506:51:29;2479:18;;2320:47:5;2360:203:29;2259:119:5;-1:-1:-1;;;;;;;;;;;2387:73:5;;-1:-1:-1;;;;;;2387:73:5;-1:-1:-1;;;;;2387:73:5;;;;;;;;;;2186:281::o;4106:253:12:-;4189:12;4214;4228:23;4255:6;-1:-1:-1;;;;;4255:19:12;4275:4;4255:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4213:67;;;;4297:55;4324:6;4332:7;4341:10;4297:26;:55::i;:::-;4290:62;4106:253;-1:-1:-1;;;;;4106:253:12:o;6598:122:5:-;6648:9;:13;6644:70;;6684:19;;-1:-1:-1;;;6684:19:5;;;;;;;;;;;4625:582:12;4769:12;4798:7;4793:408;;4821:19;4829:10;4821:7;:19::i;:::-;4793:408;;;5045:17;;:22;:49;;;;-1:-1:-1;;;;;;5071:18:12;;;:23;5045:49;5041:119;;;5121:24;;-1:-1:-1;;;5121:24:12;;-1:-1:-1;;;;;2524:32:29;;5121:24:12;;;2506:51:29;2479:18;;5121:24:12;2360:203:29;5041:119:12;-1:-1:-1;5180:10:12;4625:582;-1:-1:-1;;4625:582:12:o;5743:516::-;5874:17;;:21;5870:383;;6102:10;6096:17;6158:15;6145:10;6141:2;6137:19;6130:44;5870:383;6225:17;;-1:-1:-1;;;6225:17:12;;;;;;;;;;;14:131:29;-1:-1:-1;;;;;;88:32:29;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:131::-;-1:-1:-1;;;;;667:31:29;;657:42;;647:70;;713:1;710;703:12;728:247;787:6;840:2;828:9;819:7;815:23;811:32;808:52;;;856:1;853;846:12;808:52;895:9;882:23;914:31;939:5;914:31;:::i;1174:240::-;1354:2;1339:18;;1366:42;1343:9;1390:6;1080:12;;1049:6;1076:21;;;1064:34;;1151:4;1140:16;;;1134:23;1130:32;1114:14;;1107:56;980:189;1419:250;1504:1;1514:113;1528:6;1525:1;1522:13;1514:113;;;1604:11;;;1598:18;1585:11;;;1578:39;1550:2;1543:10;1514:113;;;-1:-1:-1;;1661:1:29;1643:16;;1636:27;1419:250::o;1674:271::-;1716:3;1754:5;1748:12;1781:6;1776:3;1769:19;1797:76;1866:6;1859:4;1854:3;1850:14;1843:4;1836:5;1832:16;1797:76;:::i;:::-;1927:2;1906:15;-1:-1:-1;;1902:29:29;1893:39;;;;1934:4;1889:50;;1674:271;-1:-1:-1;;1674:271:29:o;1950:220::-;2099:2;2088:9;2081:21;2062:4;2119:45;2160:2;2149:9;2145:18;2137:6;2119:45;:::i;2175:180::-;2234:6;2287:2;2275:9;2266:7;2262:23;2258:32;2255:52;;;2303:1;2300;2293:12;2255:52;-1:-1:-1;2326:23:29;;2175:180;-1:-1:-1;2175:180:29:o;2568:315::-;2636:6;2644;2697:2;2685:9;2676:7;2672:23;2668:32;2665:52;;;2713:1;2710;2703:12;2665:52;2752:9;2739:23;2771:31;2796:5;2771:31;:::i;:::-;2821:5;2873:2;2858:18;;;;2845:32;;-1:-1:-1;;;2568:315:29:o;2888:347::-;2939:8;2949:6;3003:3;2996:4;2988:6;2984:17;2980:27;2970:55;;3021:1;3018;3011:12;2970:55;-1:-1:-1;3044:20:29;;-1:-1:-1;;;;;3076:30:29;;3073:50;;;3119:1;3116;3109:12;3073:50;3156:4;3148:6;3144:17;3132:29;;3208:3;3201:4;3192:6;3184;3180:19;3176:30;3173:39;3170:59;;;3225:1;3222;3215:12;3240:754;3337:6;3345;3353;3361;3369;3422:3;3410:9;3401:7;3397:23;3393:33;3390:53;;;3439:1;3436;3429:12;3390:53;3478:9;3465:23;3497:31;3522:5;3497:31;:::i;:::-;3547:5;-1:-1:-1;3604:2:29;3589:18;;3576:32;3617:33;3576:32;3617:33;:::i;:::-;3669:7;-1:-1:-1;3723:2:29;3708:18;;3695:32;;-1:-1:-1;3778:2:29;3763:18;;3750:32;-1:-1:-1;;;;;3794:30:29;;3791:50;;;3837:1;3834;3827:12;3791:50;3876:58;3926:7;3917:6;3906:9;3902:22;3876:58;:::i;:::-;3240:754;;;;-1:-1:-1;3240:754:29;;-1:-1:-1;3953:8:29;;3850:84;3240:754;-1:-1:-1;;;3240:754:29:o;4388:118::-;4474:5;4467:13;4460:21;4453:5;4450:32;4440:60;;4496:1;4493;4486:12;4511:241;4567:6;4620:2;4608:9;4599:7;4595:23;4591:32;4588:52;;;4636:1;4633;4626:12;4588:52;4675:9;4662:23;4694:28;4716:5;4694:28;:::i;4757:456::-;4834:6;4842;4850;4903:2;4891:9;4882:7;4878:23;4874:32;4871:52;;;4919:1;4916;4909:12;4871:52;4958:9;4945:23;4977:31;5002:5;4977:31;:::i;:::-;5027:5;-1:-1:-1;5084:2:29;5069:18;;5056:32;5097:33;5056:32;5097:33;:::i;:::-;4757:456;;5149:7;;-1:-1:-1;;;5203:2:29;5188:18;;;;5175:32;;4757:456::o;5218:248::-;5286:6;5294;5347:2;5335:9;5326:7;5322:23;5318:32;5315:52;;;5363:1;5360;5353:12;5315:52;-1:-1:-1;;5386:23:29;;;5456:2;5441:18;;;5428:32;;-1:-1:-1;5218:248:29:o;5750:159::-;5817:20;;5877:6;5866:18;;5856:29;;5846:57;;5899:1;5896;5889:12;5914:399;5997:6;6005;6013;6066:2;6054:9;6045:7;6041:23;6037:32;6034:52;;;6082:1;6079;6072:12;6034:52;6121:9;6108:23;6140:31;6165:5;6140:31;:::i;:::-;6190:5;-1:-1:-1;6214:37:29;6247:2;6232:18;;6214:37;:::i;:::-;6204:47;;6270:37;6303:2;6292:9;6288:18;6270:37;:::i;:::-;6260:47;;5914:399;;;;;:::o;6318:382::-;6383:6;6391;6444:2;6432:9;6423:7;6419:23;6415:32;6412:52;;;6460:1;6457;6450:12;6412:52;6499:9;6486:23;6518:31;6543:5;6518:31;:::i;:::-;6568:5;-1:-1:-1;6625:2:29;6610:18;;6597:32;6638:30;6597:32;6638:30;:::i;:::-;6687:7;6677:17;;;6318:382;;;;;:::o;6705:319::-;6772:6;6780;6833:2;6821:9;6812:7;6808:23;6804:32;6801:52;;;6849:1;6846;6839:12;6801:52;6872:28;6890:9;6872:28;:::i;:::-;6862:38;;6950:2;6939:9;6935:18;6922:32;6963:31;6988:5;6963:31;:::i;7029:127::-;7090:10;7085:3;7081:20;7078:1;7071:31;7121:4;7118:1;7111:15;7145:4;7142:1;7135:15;7161:718;7203:5;7256:3;7249:4;7241:6;7237:17;7233:27;7223:55;;7274:1;7271;7264:12;7223:55;7310:6;7297:20;-1:-1:-1;;;;;7373:2:29;7369;7366:10;7363:36;;;7379:18;;:::i;:::-;7454:2;7448:9;7422:2;7508:13;;-1:-1:-1;;7504:22:29;;;7528:2;7500:31;7496:40;7484:53;;;7552:18;;;7572:22;;;7549:46;7546:72;;;7598:18;;:::i;:::-;7638:10;7634:2;7627:22;7673:2;7665:6;7658:18;7719:3;7712:4;7707:2;7699:6;7695:15;7691:26;7688:35;7685:55;;;7736:1;7733;7726:12;7685:55;7800:2;7793:4;7785:6;7781:17;7774:4;7766:6;7762:17;7749:54;7847:1;7840:4;7835:2;7827:6;7823:15;7819:26;7812:37;7867:6;7858:15;;;;;;7161:718;;;;:::o;7884:455::-;7961:6;7969;8022:2;8010:9;8001:7;7997:23;7993:32;7990:52;;;8038:1;8035;8028:12;7990:52;8077:9;8064:23;8096:31;8121:5;8096:31;:::i;:::-;8146:5;-1:-1:-1;8202:2:29;8187:18;;8174:32;-1:-1:-1;;;;;8218:30:29;;8215:50;;;8261:1;8258;8251:12;8215:50;8284:49;8325:7;8316:6;8305:9;8301:22;8284:49;:::i;:::-;8274:59;;;7884:455;;;;;:::o;8945:315::-;9013:6;9021;9074:2;9062:9;9053:7;9049:23;9045:32;9042:52;;;9090:1;9087;9080:12;9042:52;9126:9;9113:23;9103:33;;9186:2;9175:9;9171:18;9158:32;9199:31;9224:5;9199:31;:::i;9265:367::-;9328:8;9338:6;9392:3;9385:4;9377:6;9373:17;9369:27;9359:55;;9410:1;9407;9400:12;9359:55;-1:-1:-1;9433:20:29;;-1:-1:-1;;;;;9465:30:29;;9462:50;;;9508:1;9505;9498:12;9462:50;9545:4;9537:6;9533:17;9521:29;;9605:3;9598:4;9588:6;9585:1;9581:14;9573:6;9569:27;9565:38;9562:47;9559:67;;;9622:1;9619;9612:12;9637:773;9759:6;9767;9775;9783;9836:2;9824:9;9815:7;9811:23;9807:32;9804:52;;;9852:1;9849;9842:12;9804:52;9892:9;9879:23;-1:-1:-1;;;;;9962:2:29;9954:6;9951:14;9948:34;;;9978:1;9975;9968:12;9948:34;10017:70;10079:7;10070:6;10059:9;10055:22;10017:70;:::i;:::-;10106:8;;-1:-1:-1;9991:96:29;-1:-1:-1;10194:2:29;10179:18;;10166:32;;-1:-1:-1;10210:16:29;;;10207:36;;;10239:1;10236;10229:12;10207:36;;10278:72;10342:7;10331:8;10320:9;10316:24;10278:72;:::i;:::-;9637:773;;;;-1:-1:-1;10369:8:29;-1:-1:-1;;;;9637:773:29:o;10415:359::-;-1:-1:-1;;;;;10675:32:29;;10657:51;;10645:2;10630:18;;10717:51;10764:2;10749:18;;10741:6;1080:12;;1049:6;1076:21;;;1064:34;;1151:4;1140:16;;;1134:23;1130:32;1114:14;;1107:56;980:189;10779:665;10874:6;10882;10890;10898;10951:3;10939:9;10930:7;10926:23;10922:33;10919:53;;;10968:1;10965;10958:12;10919:53;11007:9;10994:23;11026:31;11051:5;11026:31;:::i;:::-;11076:5;-1:-1:-1;11133:2:29;11118:18;;11105:32;11146:33;11105:32;11146:33;:::i;:::-;11198:7;-1:-1:-1;11252:2:29;11237:18;;11224:32;;-1:-1:-1;11307:2:29;11292:18;;11279:32;-1:-1:-1;;;;;11323:30:29;;11320:50;;;11366:1;11363;11356:12;11320:50;11389:49;11430:7;11421:6;11410:9;11406:22;11389:49;:::i;:::-;11379:59;;;10779:665;;;;;;;:::o;11683:719::-;11775:6;11783;11791;11799;11852:2;11840:9;11831:7;11827:23;11823:32;11820:52;;;11868:1;11865;11858:12;11820:52;11908:9;11895:23;-1:-1:-1;;;;;11978:2:29;11970:6;11967:14;11964:34;;;11994:1;11991;11984:12;11964:34;12033:58;12083:7;12074:6;12063:9;12059:22;12033:58;:::i;:::-;12110:8;;-1:-1:-1;12007:84:29;-1:-1:-1;12198:2:29;12183:18;;12170:32;;-1:-1:-1;12214:16:29;;;12211:36;;;12243:1;12240;12233:12;12211:36;;12282:60;12334:7;12323:8;12312:9;12308:24;12282:60;:::i;12903:388::-;12971:6;12979;13032:2;13020:9;13011:7;13007:23;13003:32;13000:52;;;13048:1;13045;13038:12;13000:52;13087:9;13074:23;13106:31;13131:5;13106:31;:::i;13296:184::-;13354:6;13407:2;13395:9;13386:7;13382:23;13378:32;13375:52;;;13423:1;13420;13413:12;13375:52;13446:28;13464:9;13446:28;:::i;13485:566::-;13577:6;13585;13593;13646:2;13634:9;13625:7;13621:23;13617:32;13614:52;;;13662:1;13659;13652:12;13614:52;13702:9;13689:23;-1:-1:-1;;;;;13727:6:29;13724:30;13721:50;;;13767:1;13764;13757:12;13721:50;13806:70;13868:7;13859:6;13848:9;13844:22;13806:70;:::i;:::-;13895:8;;-1:-1:-1;13780:96:29;-1:-1:-1;;13980:2:29;13965:18;;13952:32;13993:28;13952:32;13993:28;:::i;:::-;14040:5;14030:15;;;13485:566;;;;;:::o;14056:380::-;14135:1;14131:12;;;;14178;;;14199:61;;14253:4;14245:6;14241:17;14231:27;;14199:61;14306:2;14298:6;14295:14;14275:18;14272:38;14269:161;;14352:10;14347:3;14343:20;14340:1;14333:31;14387:4;14384:1;14377:15;14415:4;14412:1;14405:15;14441:345;14643:2;14625:21;;;14682:2;14662:18;;;14655:30;-1:-1:-1;;;14716:2:29;14701:18;;14694:51;14777:2;14762:18;;14441:345::o;16615:399::-;16817:2;16799:21;;;16856:2;16836:18;;;16829:30;16895:34;16890:2;16875:18;;16868:62;-1:-1:-1;;;16961:2:29;16946:18;;16939:33;17004:3;16989:19;;16615:399::o;17019:127::-;17080:10;17075:3;17071:20;17068:1;17061:31;17111:4;17108:1;17101:15;17135:4;17132:1;17125:15;17151:168;17224:9;;;17255;;17272:15;;;17266:22;;17252:37;17242:71;;17293:18;;:::i;17456:217::-;17496:1;17522;17512:132;;17566:10;17561:3;17557:20;17554:1;17547:31;17601:4;17598:1;17591:15;17629:4;17626:1;17619:15;17512:132;-1:-1:-1;17658:9:29;;17456:217::o;18090:135::-;18129:3;18150:17;;;18147:43;;18170:18;;:::i;:::-;-1:-1:-1;18217:1:29;18206:13;;18090:135::o;18583:168::-;18650:6;18676:10;;;18688;;;18672:27;;18711:11;;;18708:37;;;18725:18;;:::i;18756:197::-;18794:3;18822:6;18863:2;18856:5;18852:14;18890:2;18881:7;18878:15;18875:41;;18896:18;;:::i;:::-;18945:1;18932:15;;18756:197;-1:-1:-1;;;18756:197:29:o;19371:125::-;19436:9;;;19457:10;;;19454:36;;;19470:18;;:::i;19501:251::-;19571:6;19624:2;19612:9;19603:7;19599:23;19595:32;19592:52;;;19640:1;19637;19630:12;19592:52;19672:9;19666:16;19691:31;19716:5;19691:31;:::i;20110:127::-;20171:10;20166:3;20162:20;20159:1;20152:31;20202:4;20199:1;20192:15;20226:4;20223:1;20216:15;20242:184;20312:6;20365:2;20353:9;20344:7;20340:23;20336:32;20333:52;;;20381:1;20378;20371:12;20333:52;-1:-1:-1;20404:16:29;;20242:184;-1:-1:-1;20242:184:29:o;20557:545::-;20659:2;20654:3;20651:11;20648:448;;;20695:1;20720:5;20716:2;20709:17;20765:4;20761:2;20751:19;20835:2;20823:10;20819:19;20816:1;20812:27;20806:4;20802:38;20871:4;20859:10;20856:20;20853:47;;;-1:-1:-1;20894:4:29;20853:47;20949:2;20944:3;20940:12;20937:1;20933:20;20927:4;20923:31;20913:41;;21004:82;21022:2;21015:5;21012:13;21004:82;;;21067:17;;;21048:1;21037:13;21004:82;;21278:1352;21404:3;21398:10;-1:-1:-1;;;;;21423:6:29;21420:30;21417:56;;;21453:18;;:::i;:::-;21482:97;21572:6;21532:38;21564:4;21558:11;21532:38;:::i;:::-;21526:4;21482:97;:::i;:::-;21634:4;;21698:2;21687:14;;21715:1;21710:663;;;;22417:1;22434:6;22431:89;;;-1:-1:-1;22486:19:29;;;22480:26;22431:89;-1:-1:-1;;21235:1:29;21231:11;;;21227:24;21223:29;21213:40;21259:1;21255:11;;;21210:57;22533:81;;21680:944;;21710:663;20504:1;20497:14;;;20541:4;20528:18;;-1:-1:-1;;21746:20:29;;;21864:236;21878:7;21875:1;21872:14;21864:236;;;21967:19;;;21961:26;21946:42;;22059:27;;;;22027:1;22015:14;;;;21894:19;;21864:236;;;21868:3;22128:6;22119:7;22116:19;22113:201;;;22189:19;;;22183:26;-1:-1:-1;;22272:1:29;22268:14;;;22284:3;22264:24;22260:37;22256:42;22241:58;22226:74;;22113:201;-1:-1:-1;;;;;22360:1:29;22344:14;;;22340:22;22327:36;;-1:-1:-1;21278:1352:29:o;23229:703::-;23456:3;23494:6;23488:13;23510:66;23569:6;23564:3;23557:4;23549:6;23545:17;23510:66;:::i;:::-;23639:13;;23598:16;;;;23661:70;23639:13;23598:16;23708:4;23696:17;;23661:70;:::i;:::-;23798:13;;23753:20;;;23820:70;23798:13;23753:20;23867:4;23855:17;;23820:70;:::i;:::-;23906:20;;23229:703;-1:-1:-1;;;;;23229:703:29:o;23937:1206::-;-1:-1:-1;;;;;24056:3:29;24053:27;24050:53;;;24083:18;;:::i;:::-;24112:94;24202:3;24162:38;24194:4;24188:11;24162:38;:::i;:::-;24156:4;24112:94;:::i;:::-;24232:1;24257:2;24252:3;24249:11;24274:1;24269:616;;;;24929:1;24946:3;24943:93;;;-1:-1:-1;25002:19:29;;;24989:33;24943:93;-1:-1:-1;;21235:1:29;21231:11;;;21227:24;21223:29;21213:40;21259:1;21255:11;;;21210:57;25049:78;;24242:895;;24269:616;20504:1;20497:14;;;20541:4;20528:18;;-1:-1:-1;;24305:17:29;;;24406:9;24428:229;24442:7;24439:1;24436:14;24428:229;;;24531:19;;;24518:33;24503:49;;24638:4;24623:20;;;;24591:1;24579:14;;;;24458:12;24428:229;;;24432:3;24685;24676:7;24673:16;24670:159;;;24809:1;24805:6;24799:3;24793;24790:1;24786:11;24782:21;24778:34;24774:39;24761:9;24756:3;24752:19;24739:33;24735:79;24727:6;24720:95;24670:159;;;24872:1;24866:3;24863:1;24859:11;24855:19;24849:4;24842:33;24242:895;;23937:1206;;;:::o;25810:245::-;25877:6;25930:2;25918:9;25909:7;25905:23;25901:32;25898:52;;;25946:1;25943;25936:12;25898:52;25978:9;25972:16;25997:28;26019:5;25997:28;:::i;26892:414::-;27094:2;27076:21;;;27133:2;27113:18;;;27106:30;27172:34;27167:2;27152:18;;27145:62;-1:-1:-1;;;27238:2:29;27223:18;;27216:48;27296:3;27281:19;;26892:414::o;27311:128::-;27378:9;;;27399:11;;;27396:37;;;27413:18;;:::i;27444:409::-;27646:2;27628:21;;;27685:2;27665:18;;;27658:30;27724:34;27719:2;27704:18;;27697:62;-1:-1:-1;;;27790:2:29;27775:18;;27768:43;27843:3;27828:19;;27444:409::o;29023:489::-;-1:-1:-1;;;;;29292:15:29;;;29274:34;;29344:15;;29339:2;29324:18;;29317:43;29391:2;29376:18;;29369:34;;;29439:3;29434:2;29419:18;;29412:31;;;29217:4;;29460:46;;29486:19;;29478:6;29460:46;:::i;:::-;29452:54;29023:489;-1:-1:-1;;;;;;29023:489:29:o;29517:249::-;29586:6;29639:2;29627:9;29618:7;29614:23;29610:32;29607:52;;;29655:1;29652;29645:12;29607:52;29687:9;29681:16;29706:30;29730:5;29706:30;:::i;29771:401::-;29973:2;29955:21;;;30012:2;29992:18;;;29985:30;30051:34;30046:2;30031:18;;30024:62;-1:-1:-1;;;30117:2:29;30102:18;;30095:35;30162:3;30147:19;;29771:401::o;30531:287::-;30660:3;30698:6;30692:13;30714:66;30773:6;30768:3;30761:4;30753:6;30749:17;30714:66;:::i;:::-;30796:16;;;;;30531:287;-1:-1:-1;;30531:287:29:o
Swarm Source
ipfs://7887d3853c6df0bc4dc1d79ebb9f9fffc455bf97a4a855c6b18568518b0c21ca
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.