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 | 16043652 | 681 days ago | IN | 0 ETH | 0.051271 |
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:
ERC1155CollectionAssetsImpl
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-25 */ // Sources flattened with hardhat v2.10.2 https://hardhat.org // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/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.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Internal function that returns the initialized version. Returns `_initialized` */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Internal function that returns the initialized version. Returns `_initializing` */ function _isInitializing() internal view returns (bool) { return _initializing; } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @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 IERC165Upgradeable { /** * @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); } // File @openzeppelin/contracts-upgradeable/token/ERC1155/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File @openzeppelin/contracts-upgradeable/token/ERC1155/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155ReceiverUpgradeable is IERC165Upgradeable { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts-upgradeable/token/ERC1155/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURIUpgradeable is IERC1155Upgradeable { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @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); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC1155/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC1155Upgradeable, IERC1155MetadataURIUpgradeable { using AddressUpgradeable for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ function __ERC1155_init(string memory uri_) internal onlyInitializing { __ERC1155_init_unchained(uri_); } function __ERC1155_init_unchained(string memory uri_) internal onlyInitializing { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC1155Upgradeable).interfaceId || interfaceId == type(IERC1155MetadataURIUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @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, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155ReceiverUpgradeable(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155ReceiverUpgradeable.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155ReceiverUpgradeable(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155ReceiverUpgradeable.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } /** * @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[47] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC1155/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/extensions/ERC1155Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC1155} that allows token holders to destroy both their * own tokens and those that they have been approved to use. * * _Available since v3.1._ */ abstract contract ERC1155BurnableUpgradeable is Initializable, ERC1155Upgradeable { function __ERC1155Burnable_init() internal onlyInitializing { } function __ERC1155Burnable_init_unchained() internal onlyInitializing { } function burn( address account, uint256 id, uint256 value ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not token owner or approved" ); _burn(account, id, value); } function burnBatch( address account, uint256[] memory ids, uint256[] memory values ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not token owner or approved" ); _burnBatch(account, ids, values); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/interfaces/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @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. * * _Available since v4.5._ */ interface IERC2981Upgradeable is IERC165Upgradeable { /** * @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); } // File @openzeppelin/contracts-upgradeable/security/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/security/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File contracts/utils/abstracts/TeamMembersUpgradeable.sol pragma solidity ^0.8.7; abstract contract TeamMembersUpgradeable is OwnableUpgradeable { mapping(address => bool) private members; function addTeamMember(address _address) public onlyOwner { require(_address != address(0)); members[_address] = true; } function removeTeamMember(address _address) public onlyOwner { require(_address != address(0)); delete members[_address]; } function isTeamMember(address _address) public view returns (bool) { return members[_address] == true; } modifier onlyTeamOrOwner() { require(owner() == _msgSender() || isTeamMember(_msgSender())); _; } } // File contracts/utils/abstracts/WithdrawableUpgradeable.sol pragma solidity ^0.8.7; abstract contract WithdrawableUpgradeable is TeamMembersUpgradeable { address internal constant _OM = 0x460Fd5059E7301680fA53E63bbBF7272E643e89C; mapping(address => uint256) internal _shares; address[] internal _payees; function __WithdrawableUpgradeable_init(uint256 _commission) internal onlyInitializing { setupCommission(_commission); } function setupCommission(uint256 _commission) internal { _shares[_OM] = _commission; _shares[owner()] = 1000 - _commission; _payees.push(_OM); _payees.push(owner()); } function setCommission(uint256 _val1) public { require(msg.sender == _OM, "IA"); uint256 diff = _shares[_OM] - _val1; _shares[_OM] = _val1; _shares[_payees[1]] += diff; } function updateWithdrawSplit( address[] memory _addresses, uint256[] memory _fees ) public onlyTeamOrOwner { for (uint256 i = 1; i < _payees.length; i++) { delete _shares[_payees[i]]; } _payees = new address[](_addresses.length + 1); _payees[0] = _OM; for (uint256 i = 0; i < _addresses.length; i++) { _shares[_addresses[i]] = _fees[i]; _payees[i + 1] = _addresses[i]; } } function getWithdrawSplit() public view returns (address[] memory, uint256[] memory) { uint256[] memory values = new uint256[](_payees.length); for (uint256 i = 0; i < _payees.length; i++) { values[i] = _shares[_payees[i]]; } return (_payees, values); } function withdraw() external payable { uint256 balance = address(this).balance; if (balance > 0) { for (uint256 i = 0; i < _payees.length; i++) { uint256 split = _shares[_payees[i]]; uint256 value = ((split * balance) / 1000); AddressUpgradeable.sendValue(payable(_payees[i]), value); } } } function withdrawToken(address _to, address _erc20) external onlyTeamOrOwner { IERC20Upgradeable token = IERC20Upgradeable(_erc20); uint256 tokenBalance = token.balanceOf(address(this)); token.transfer(_to, tokenBalance); } } // File contracts/IERC1155CollectionAssets.sol pragma solidity ^0.8.7; interface IERC1155CollectionAssets { struct Token { string uri; uint256 maxSupply; uint256 minted; uint32 maxPerWallet; bool closed; bool nonTradeable; } struct Recipient { address wallet; uint256 fee; } } // File contracts/utils/abstracts/WithRoyaltyUpgradeable.sol abstract contract WithRoyaltyUpgradeable is IERC1155CollectionAssets, TeamMembersUpgradeable { address internal recipient; uint256 internal recipientFee; mapping(uint256 => Recipient) internal _perTokenRoyalty; function __WithRoyaltyUpgradeable_init() internal onlyInitializing {} function updateRoyalty(address _recipient, uint256 _fee) public onlyTeamOrOwner { recipient = _recipient; recipientFee = _fee; } function updateTokenRoyalty( uint256 tokenId, address _recipient, uint256 _fee ) public onlyTeamOrOwner { _perTokenRoyalty[tokenId] = Recipient(_recipient, _fee); } } // File @openzeppelin/contracts-upgradeable/utils/math/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library MathUpgradeable { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @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 up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (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; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 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. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); 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 (rounding == Rounding.Up && 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 down. * * 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 + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * 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 + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * 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 + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * 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 10, 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 + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = MathUpgradeable.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), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, MathUpgradeable.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) { 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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); 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); } } // File @openzeppelin/contracts-upgradeable/utils/cryptography/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSAUpgradeable { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", StringsUpgradeable.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File @openzeppelin/contracts-upgradeable/utils/cryptography/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol) pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ * * @custom:storage-size 52 */ abstract contract EIP712Upgradeable is Initializable { /* solhint-disable var-name-mixedcase */ bytes32 private _HASHED_NAME; bytes32 private _HASHED_VERSION; bytes32 private constant _TYPE_HASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ function __EIP712_init(string memory name, string memory version) internal onlyInitializing { __EIP712_init_unchained(name, version); } function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash()); } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSAUpgradeable.toTypedDataHash(_domainSeparatorV4(), structHash); } /** * @dev The hash of the name parameter for the EIP712 domain. * * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs * are a concern. */ function _EIP712NameHash() internal virtual view returns (bytes32) { return _HASHED_NAME; } /** * @dev The hash of the version parameter for the EIP712 domain. * * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs * are a concern. */ function _EIP712VersionHash() internal virtual view returns (bytes32) { return _HASHED_VERSION; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/cryptography/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; // EIP-712 is Final as of 2022-08-11. This file is deprecated. // File contracts/utils/abstracts/SignatureMintableUpgradeable.sol pragma solidity ^0.8.7; abstract contract SignatureMintableUpgradeable is EIP712Upgradeable { using ECDSAUpgradeable for bytes32; struct MintTokenSignature { address to; uint256[] tokenIds; uint256[] counts; uint256 cost; address currency; // ETH or ERC20 uint128 expiresAt; bytes32 nonce; } address public signerAddress; bytes32 internal constant TYPEHASH = keccak256( "MintTokenSignature(address to,uint256[] tokenIds,uint256[] counts,uint256 cost,address currency,uint128 expiresAt,bytes32 nonce)" ); /// @dev Mapping from mint request UID => whether the mint request is processed. mapping(bytes32 => bool) internal _nonces; mapping(address => mapping(uint256 => uint256)) _minted; function __SignatureMintableUpgradeable_init(address _signerAddress) internal onlyInitializing { __EIP712_init("SignatureMintableUpgradeable", "1"); signerAddress = _signerAddress; } modifier withValidSignature( MintTokenSignature calldata _req, bytes calldata _signature ) { require(!_nonces[_req.nonce], "DS"); require(block.timestamp < _req.expiresAt, "ES"); _nonces[_req.nonce] = true; (bool success, address signer) = verify(_req, _signature); require(success, "IS"); _; } function getMintedTokenOwnerCount(address _wallet, uint256 tokenId) public view returns (uint256) { return _minted[_wallet][tokenId]; } function getMintedTokensOwnerCount(address _wallet, uint256[] memory tokenIds) public view returns (uint256[] memory) { uint256[] memory mints = new uint256[](tokenIds.length); for (uint256 i = 0; i < mints.length; i++) { mints[i] = getMintedTokenOwnerCount(_wallet, tokenIds[i]); } return mints; } function verify(MintTokenSignature calldata _req, bytes calldata _signature) private view returns (bool success, address signer) { signer = _recoverAddress(_req, _signature); return (signer == signerAddress, signer); } function _recoverAddress( MintTokenSignature calldata _req, bytes calldata _signature ) private view returns (address) { bytes32 digest = _hashTypedDataV4( keccak256( abi.encode( TYPEHASH, _req.to, keccak256(abi.encodePacked(_req.tokenIds)), keccak256(abi.encodePacked(_req.counts)), _req.cost, _req.currency, _req.expiresAt, _req.nonce ) ) ); return ECDSAUpgradeable.recover(digest, _signature); } } // File contracts/utils/abstracts/ERC1155AssetSupplyUpgradeable.sol pragma solidity ^0.8.7; abstract contract ERC1155AssetSupplyUpgradeable is IERC1155CollectionAssets, TeamMembersUpgradeable { uint256 internal _nextTokenIndex; mapping(uint256 => Token) internal _tokens; function addToken(Token memory _token) public onlyTeamOrOwner { _tokens[_nextTokenIndex] = _token; _nextTokenIndex = _nextTokenIndex + 1; } function addTokens(Token[] memory tokens) public onlyTeamOrOwner { for (uint256 i = 0; i < tokens.length; i++) { addToken(tokens[i]); } } function updateToken(uint256 _tokenId, Token memory _token) public onlyTeamOrOwner { require(exists(_tokenId), "Token does not exist"); require( _token.maxSupply >= _tokens[_tokenId].minted, "Cannot reduce total supply" ); require(_token.minted == _tokens[_tokenId].minted, "Cannot change supply"); _tokens[_tokenId] = _token; } function updateTokens(uint256[] memory tokenIds, Token[] memory tokens) public onlyTeamOrOwner { for (uint256 i = 0; i < tokens.length; i++) { updateToken(tokenIds[i], tokens[i]); } } function getToken(uint256 _tokenId) public view returns (Token memory) { require(exists(_tokenId), "Token does not exist"); return _tokens[_tokenId]; } function getTokenByIds(uint256[] memory ids) public view returns (Token[] memory) { Token[] memory tokens = new Token[](ids.length); for (uint256 i = 0; i < ids.length; i++) { tokens[i] = _tokens[ids[i]]; } return tokens; } function getTokens() public view returns (Token[] memory) { Token[] memory tokens = new Token[](_nextTokenIndex); for (uint256 i = 0; i < _nextTokenIndex; i++) { tokens[i] = _tokens[i]; } return tokens; } function getTokenCount() public view returns (uint256) { return _nextTokenIndex; } function exists(uint256 _tokenId) public view returns (bool) { return _tokenId < _nextTokenIndex; } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File contracts/utils/filters/IOperatorFilterRegistry.sol pragma solidity ^0.8.7; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator( address registrant, address operator, bool filtered ) external; function updateOperators( address registrant, address[] calldata operators, bool filtered ) external; function updateCodeHash( address registrant, bytes32 codehash, bool filtered ) external; function updateCodeHashes( address registrant, bytes32[] calldata codeHashes, bool filtered ) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } // File contracts/utils/filters/OperatorFiltererUpgradeable.sol pragma solidity ^0.8.7; abstract contract OperatorFiltererUpgradeable is Initializable { error OperatorNotAllowed(address operator); IOperatorFilterRegistry constant operatorFilterRegistry = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); 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(operatorFilterRegistry).code.length > 0) { if (!operatorFilterRegistry.isRegistered(address(this))) { if (subscribe) { operatorFilterRegistry.registerAndSubscribe( address(this), subscriptionOrRegistrantToCopy ); } else { if (subscriptionOrRegistrantToCopy != address(0)) { operatorFilterRegistry.registerAndCopyEntries( address(this), subscriptionOrRegistrantToCopy ); } else { operatorFilterRegistry.register(address(this)); } } } } } modifier onlyAllowedOperator(address from) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(operatorFilterRegistry).code.length > 0) { // 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) { _; return; } if ( !operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender) ) { revert OperatorNotAllowed(msg.sender); } } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(operatorFilterRegistry).code.length > 0) { if (!operatorFilterRegistry.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } _; } } // File contracts/utils/filters/DefaultOperatorFiltererUpgradeable.sol pragma solidity ^0.8.7; abstract contract DefaultOperatorFiltererUpgradeable is OperatorFiltererUpgradeable { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); function __DefaultOperatorFilterer_init() internal onlyInitializing { OperatorFiltererUpgradeable.__OperatorFilterer_init( DEFAULT_SUBSCRIPTION, true ); } } // File contracts/ERC1155CollectionAssets.sol pragma solidity ^0.8.7; contract ERC1155CollectionAssets is OwnableUpgradeable, ReentrancyGuardUpgradeable, IERC2981Upgradeable, ERC1155BurnableUpgradeable, TeamMembersUpgradeable, ERC1155AssetSupplyUpgradeable, WithdrawableUpgradeable, WithRoyaltyUpgradeable, SignatureMintableUpgradeable, DefaultOperatorFiltererUpgradeable { uint256 public tokenDefaultMaxPerWallet; function __ERC1155CollectionAssets_init( address _signerAddress, uint256 _commission ) internal onlyInitializing { __ERC1155_init(""); __Ownable_init(); __ERC1155Burnable_init(); __SignatureMintableUpgradeable_init(_signerAddress); __WithdrawableUpgradeable_init(_commission); __DefaultOperatorFilterer_init(); } function updateSigner(address _signerAddress) public onlyOwner { signerAddress = _signerAddress; } function updateDefaultMaxPerWallet(uint256 _maxPerWallet) public onlyTeamOrOwner { tokenDefaultMaxPerWallet = _maxPerWallet; } function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal override(ERC1155Upgradeable) { for (uint256 i = 0; i < ids.length; i++) { Token memory token = getToken(ids[i]); if (from != address(0)) { require(!token.nonTradeable, "Can't be traded"); } if (from == address(0)) { require(!token.closed, "Token closed"); uint256 maxPerWallet = token.maxPerWallet; if (maxPerWallet == 0) { maxPerWallet = tokenDefaultMaxPerWallet; } _minted[to][ids[i]] = _minted[to][ids[i]] + amounts[i]; require(_minted[to][ids[i]] <= maxPerWallet, "Max per wallet reached"); _tokens[ids[i]].minted = token.minted + amounts[i]; } } super._beforeTokenTransfer(operator, from, to, ids, amounts, data); } modifier beforeMint(MintTokenSignature calldata mintToken) { require(mintToken.to == msg.sender, "Can't mint to other than yourself"); if (mintToken.currency == address(this)) { require(msg.value >= mintToken.cost, "Must send total price"); } else { IERC20 erc20 = IERC20(mintToken.currency); erc20.transferFrom(msg.sender, address(this), mintToken.cost); } uint256 size = mintToken.tokenIds.length; for (uint256 i = 0; i < size; i++) { Token memory _token = getToken(mintToken.tokenIds[i]); require( _token.minted + mintToken.counts[i] <= _token.maxSupply, "Max supply reached" ); } _; } function supportsInterface(bytes4 interfaceId) public view override(ERC1155Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC2981Upgradeable).interfaceId || super.supportsInterface(interfaceId); } function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view override returns (address receiver, uint256 royaltyAmount) { Recipient memory recipientOverride = _perTokenRoyalty[_tokenId]; if (recipientOverride.fee > 0) { return ( recipientOverride.wallet, (_salePrice * recipientOverride.fee) / 1000 ); } else { return (recipient, (_salePrice * recipientFee) / 1000); } } function uri(uint256 _tokenId) public view override returns (string memory) { return string(abi.encodePacked(_tokens[_tokenId].uri)); } function airdrop( address[] memory _recipients, uint256[] memory _tokenIds, uint256[] memory _amount ) public onlyTeamOrOwner { require(_recipients.length == _amount.length); require(_tokenIds.length == _amount.length); for (uint256 i = 0; i < _amount.length; i++) { _mint(_recipients[i], _tokenIds[i], _amount[i], ""); } } function signMint( MintTokenSignature calldata mintToken, bytes calldata signature ) public payable nonReentrant withValidSignature(mintToken, signature) beforeMint(mintToken) { _mintBatch(mintToken.to, mintToken.tokenIds, mintToken.counts, ""); } function tokensOfOwner(address _address) public view returns (uint256[] memory) { require(exists(0), "No passes exist"); uint256[] memory balances = new uint256[](getTokenCount()); for (uint256 i = 0; i < getTokenCount(); i++) { uint256 balanceOfToken = balanceOf(_address, i); balances[i] = balanceOfToken; } return balances; } function safeTransferFrom( address from, address to, uint256 tokenId, uint256 amount, bytes memory data ) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, amount, data); } function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override onlyAllowedOperator(from) { super.safeBatchTransferFrom(from, to, ids, amounts, data); } } // File @openzeppelin/contracts-upgradeable/interfaces/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822ProxiableUpgradeable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); } // File @openzeppelin/contracts-upgradeable/proxy/beacon/[email protected] // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol) pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ``` * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 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 } } } // File @openzeppelin/contracts-upgradeable/proxy/ERC1967/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ * * @custom:oz-upgrades-unsafe-allow delegatecall */ abstract contract ERC1967UpgradeUpgradeable is Initializable { function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall( address newImplementation, bytes memory data, bool forceCall ) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { _functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS( address newImplementation, bytes memory data, bool forceCall ) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Emitted when the beacon is upgraded. */ event BeaconUpgraded(address indexed beacon); /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall( address newBeacon, bytes memory data, bool forceCall ) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function _functionDelegateCall(address target, bytes memory data) private returns (bytes memory) { require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed"); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate the implementation's compatibility when performing an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeTo(address newImplementation) external virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File contracts/ERC1155CollectionAssetsImpl.sol contract ERC1155CollectionAssetsImpl is ERC1155CollectionAssets, UUPSUpgradeable { function initialize(address _signerAddress, uint256 _commission) public initializer { __ERC1155CollectionAssets_init(_signerAddress, _commission); } function _authorizeUpgrade(address) internal override onlyOwner {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addTeamMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"minted","type":"uint256"},{"internalType":"uint32","name":"maxPerWallet","type":"uint32"},{"internalType":"bool","name":"closed","type":"bool"},{"internalType":"bool","name":"nonTradeable","type":"bool"}],"internalType":"struct IERC1155CollectionAssets.Token","name":"_token","type":"tuple"}],"name":"addToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"minted","type":"uint256"},{"internalType":"uint32","name":"maxPerWallet","type":"uint32"},{"internalType":"bool","name":"closed","type":"bool"},{"internalType":"bool","name":"nonTradeable","type":"bool"}],"internalType":"struct IERC1155CollectionAssets.Token[]","name":"tokens","type":"tuple[]"}],"name":"addTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getMintedTokenOwnerCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"getMintedTokensOwnerCount","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getToken","outputs":[{"components":[{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"minted","type":"uint256"},{"internalType":"uint32","name":"maxPerWallet","type":"uint32"},{"internalType":"bool","name":"closed","type":"bool"},{"internalType":"bool","name":"nonTradeable","type":"bool"}],"internalType":"struct IERC1155CollectionAssets.Token","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"getTokenByIds","outputs":[{"components":[{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"minted","type":"uint256"},{"internalType":"uint32","name":"maxPerWallet","type":"uint32"},{"internalType":"bool","name":"closed","type":"bool"},{"internalType":"bool","name":"nonTradeable","type":"bool"}],"internalType":"struct IERC1155CollectionAssets.Token[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokens","outputs":[{"components":[{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"minted","type":"uint256"},{"internalType":"uint32","name":"maxPerWallet","type":"uint32"},{"internalType":"bool","name":"closed","type":"bool"},{"internalType":"bool","name":"nonTradeable","type":"bool"}],"internalType":"struct IERC1155CollectionAssets.Token[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWithdrawSplit","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_signerAddress","type":"address"},{"internalType":"uint256","name":"_commission","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isTeamMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeTeamMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","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":"uint256","name":"amount","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":"uint256","name":"_val1","type":"uint256"}],"name":"setCommission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"counts","type":"uint256[]"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint128","name":"expiresAt","type":"uint128"},{"internalType":"bytes32","name":"nonce","type":"bytes32"}],"internalType":"struct SignatureMintableUpgradeable.MintTokenSignature","name":"mintToken","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"signMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"signerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenDefaultMaxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerWallet","type":"uint256"}],"name":"updateDefaultMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"updateRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signerAddress","type":"address"}],"name":"updateSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"components":[{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"minted","type":"uint256"},{"internalType":"uint32","name":"maxPerWallet","type":"uint32"},{"internalType":"bool","name":"closed","type":"bool"},{"internalType":"bool","name":"nonTradeable","type":"bool"}],"internalType":"struct IERC1155CollectionAssets.Token","name":"_token","type":"tuple"}],"name":"updateToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"updateTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"components":[{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"minted","type":"uint256"},{"internalType":"uint32","name":"maxPerWallet","type":"uint32"},{"internalType":"bool","name":"closed","type":"bool"},{"internalType":"bool","name":"nonTradeable","type":"bool"}],"internalType":"struct IERC1155CollectionAssets.Token[]","name":"tokens","type":"tuple[]"}],"name":"updateTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_fees","type":"uint256[]"}],"name":"updateWithdrawSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_erc20","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523060601b60805234801561001757600080fd5b5060805160601c615c296200005360003960008181610ede01528181610f1e015281816114ba015281816114fa01526115890152615c296000f3fe60806040526004361061027c5760003560e01c80636e05ec401161014f578063be8e43ee116100c1578063f1615e611161007a578063f1615e6114610819578063f242432a14610839578063f2fde38b14610859578063f5298aca14610879578063f5ca4dfd14610899578063fe70aaea146108bc57600080fd5b8063be8e43ee14610730578063cd6dc68714610750578063cf0de7dd14610770578063e4b50cb814610783578063e985e9c5146107b0578063eafc98a0146107f957600080fd5b80638da5cb5b116101135780638da5cb5b1461065e578063a22cb4651461067c578063a7ecd37e1461069c578063aa6ca808146106bc578063b7e3968c146106d1578063bbe9f99d146106f157600080fd5b80636e05ec40146105af578063715018a6146105f357806378a8956714610608578063828a29a01461061e5780638462151c1461063e57600080fd5b80633aeac4e1116101f35780634f1ef286116101ac5780634f1ef286146104eb5780634f558e79146104fe57806352d1902d146105215780635969b44b146105365780635b7633d0146105565780636b20c4541461058f57600080fd5b80633aeac4e11461043f5780633ccfd60b1461045f5780633eb2b5ad1461046757806344ab23fc146104875780634cb3f4b1146104b45780634e1273f4146104cb57600080fd5b80631bf2907b116102455780631bf2907b146103535780632a55205a146103735780632eb2c2d6146103b2578063345ba790146103d2578063355e6b43146103ff5780633659cfe61461041f57600080fd5b8062fdd58e1461028157806301ffc9a7146102b45780630e89341c146102e457806314eba0261461031157806319350ea214610333575b600080fd5b34801561028d57600080fd5b506102a161029c366004614e7c565b6108dc565b6040519081526020015b60405180910390f35b3480156102c057600080fd5b506102d46102cf36600461507f565b610974565b60405190151581526020016102ab565b3480156102f057600080fd5b506103046102ff3660046151b4565b61099f565b6040516102ab91906155a5565b34801561031d57600080fd5b5061033161032c366004614be7565b6109d9565b005b34801561033f57600080fd5b5061033161034e3660046151cd565b610a16565b34801561035f57600080fd5b5061033161036e366004614f32565b610a85565b34801561037f57600080fd5b5061039361038e36600461523e565b610b51565b604080516001600160a01b0390931683526020830191909152016102ab565b3480156103be57600080fd5b506103316103cd366004614c35565b610bdb565b3480156103de57600080fd5b506103f26103ed366004614d42565b610cca565b6040516102ab919061556d565b34801561040b57600080fd5b5061033161041a3660046151b4565b610d9d565b34801561042b57600080fd5b5061033161043a366004614be7565b610ed3565b34801561044b57600080fd5b5061033161045a366004614c02565b610fb3565b6103316110e2565b34801561047357600080fd5b50610331610482366004614be7565b61119d565b34801561049357600080fd5b506104a76104a2366004614fbc565b6111dd565b6040516102ab919061550b565b3480156104c057600080fd5b506102a161016c5481565b3480156104d757600080fd5b506103f26104e6366004614ed9565b61138e565b6103316104f9366004614e39565b6114af565b34801561050a57600080fd5b506102d46105193660046151b4565b61012e541190565b34801561052d57600080fd5b506102a161157c565b34801561054257600080fd5b506103316105513660046151b4565b611630565b34801561056257600080fd5b5061016954610577906001600160a01b031681565b6040516001600160a01b0390911681526020016102ab565b34801561059b57600080fd5b506103316105aa366004614d8f565b61165c565b3480156105bb57600080fd5b506102a16105ca366004614e7c565b6001600160a01b0391909116600090815261016b60209081526040808320938352929052205490565b3480156105ff57600080fd5b506103316116a4565b34801561061457600080fd5b5061012e546102a1565b34801561062a57600080fd5b50610331610639366004614ff0565b6116b8565b34801561064a57600080fd5b506103f2610659366004614be7565b611738565b34801561066a57600080fd5b506033546001600160a01b0316610577565b34801561068857600080fd5b50610331610697366004614e02565b611821565b3480156106a857600080fd5b506103316106b7366004614be7565b61182c565b3480156106c857600080fd5b506104a7611857565b3480156106dd57600080fd5b506103316106ec366004614f80565b6119ec565b3480156106fd57600080fd5b506102d461070c366004614be7565b6001600160a01b0316600090815261012d602052604090205460ff16151560011490565b34801561073c57600080fd5b5061033161074b366004614ed9565b611a52565b34801561075c57600080fd5b5061033161076b366004614e7c565b611c6a565b61033161077e3660046150b9565b611d7e565b34801561078f57600080fd5b506107a361079e3660046151b4565b612194565b6040516102ab91906158d0565b3480156107bc57600080fd5b506102d46107cb366004614c02565b6001600160a01b03918216600090815260ca6020908152604080832093909416825291909152205460ff1690565b34801561080557600080fd5b50610331610814366004615202565b6122e5565b34801561082557600080fd5b50610331610834366004615157565b6124ad565b34801561084557600080fd5b50610331610854366004614cde565b61257d565b34801561086557600080fd5b50610331610874366004614be7565b61265f565b34801561088557600080fd5b50610331610894366004614ea6565b6126d5565b3480156108a557600080fd5b506108ae612718565b6040516102ab9291906154ab565b3480156108c857600080fd5b506103316108d7366004614e7c565b61284e565b60006001600160a01b03831661094c5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b50600090815260c9602090815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b0319821663152a902d60e11b148061099957506109998261289c565b92915050565b600081815261012f602090815260409182902091516060926109c39290910161536c565b6040516020818303038152906040529050919050565b6109e16128ec565b6001600160a01b0381166109f457600080fd5b6001600160a01b0316600090815261012d60205260409020805460ff19169055565b6033546001600160a01b0316331480610a335750610a333361070c565b610a3c57600080fd5b6040805180820182526001600160a01b0393841681526020808201938452600095865261013490529320925183546001600160a01b031916921691909117825551600190910155565b6033546001600160a01b0316331480610aa25750610aa23361070c565b610aab57600080fd5b8051835114610ab957600080fd5b8051825114610ac757600080fd5b60005b8151811015610b4b57610b39848281518110610ae857610ae8615ab8565b6020026020010151848381518110610b0257610b02615ab8565b6020026020010151848481518110610b1c57610b1c615ab8565b602002602001015160405180602001604052806000815250612946565b80610b4381615a71565b915050610aca565b50505050565b600082815261013460209081526040808320815180830190925280546001600160a01b0316825260010154918101829052829115610bb257805160208201516103e890610b9e9087615989565b610ba89190615967565b9250925050610bd4565b61013254610133546001600160a01b03909116906103e890610b9e9087615989565b9250929050565b846daaeb6d7670e522a718067333cd4e3b15610cb5576001600160a01b038116331415610c1457610c0f8686868686612a31565b610cc2565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b158015610c5e57600080fd5b505afa158015610c72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c969190615049565b610cb557604051633b79c77360e21b8152336004820152602401610943565b610cc28686868686612a31565b505050505050565b6060600082516001600160401b03811115610ce757610ce7615ace565b604051908082528060200260200182016040528015610d10578160200160208202803683370190505b50905060005b8151811015610d9557610d6685858381518110610d3557610d35615ab8565b60200260200101516001600160a01b0391909116600090815261016b60209081526040808320938352929052205490565b828281518110610d7857610d78615ab8565b602090810291909101015280610d8d81615a71565b915050610d16565b509392505050565b3373460fd5059e7301680fa53e63bbbf7272e643e89c14610de55760405162461bcd60e51b8152602060048201526002602482015261494160f01b6044820152606401610943565b73460fd5059e7301680fa53e63bbbf7272e643e89c60009081526101306020527f143005e0d6cc229cd04e5837c386768020090f1de0f4e679878cf05e31921e3554610e329083906159a8565b73460fd5059e7301680fa53e63bbbf7272e643e89c600090815261013060208190527f143005e0d6cc229cd04e5837c386768020090f1de0f4e679878cf05e31921e35859055610131805493945084939192916001908110610e9657610e96615ab8565b60009182526020808320909101546001600160a01b0316835282019290925260400181208054909190610eca90849061594f565b90915550505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610f1c5760405162461bcd60e51b815260040161094390615644565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610f65600080516020615bad833981519152546001600160a01b031690565b6001600160a01b031614610f8b5760405162461bcd60e51b8152600401610943906156de565b610f9481612a76565b60408051600080825260208201909252610fb091839190612a7e565b50565b6033546001600160a01b0316331480610fd05750610fd03361070c565b610fd957600080fd5b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a082319060240160206040518083038186803b15801561101d57600080fd5b505afa158015611031573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110559190615066565b60405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390529192509083169063a9059cbb90604401602060405180830381600087803b1580156110a357600080fd5b505af11580156110b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110db9190615049565b5050505050565b478015610fb05760005b610131548110156111995760006101306000610131848154811061111257611112615ab8565b60009182526020808320909101546001600160a01b0316835282019290925260400181205491506103e86111468584615989565b6111509190615967565b9050611184610131848154811061116957611169615ab8565b6000918252602090912001546001600160a01b031682612bf8565b5050808061119190615a71565b9150506110ec565b5050565b6111a56128ec565b6001600160a01b0381166111b857600080fd5b6001600160a01b0316600090815261012d60205260409020805460ff19166001179055565b6060600082516001600160401b038111156111fa576111fa615ace565b60405190808252806020026020018201604052801561123357816020015b6112206147d6565b8152602001906001900390816112185790505b50905060005b83518110156113875761012f600085838151811061125957611259615ab8565b602002602001015181526020019081526020016000206040518060c001604052908160008201805461128a906159eb565b80601f01602080910402602001604051908101604052809291908181526020018280546112b6906159eb565b80156113035780601f106112d857610100808354040283529160200191611303565b820191906000526020600020905b8154815290600101906020018083116112e657829003601f168201915b5050509183525050600182015460208201526002820154604082015260039091015463ffffffff8116606083015260ff6401000000008204811615156080840152600160281b90910416151560a090910152825183908390811061136957611369615ab8565b6020026020010181905250808061137f90615a71565b915050611239565b5092915050565b606081518351146113f35760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610943565b600083516001600160401b0381111561140e5761140e615ace565b604051908082528060200260200182016040528015611437578160200160208202803683370190505b50905060005b8451811015610d955761148285828151811061145b5761145b615ab8565b602002602001015185838151811061147557611475615ab8565b60200260200101516108dc565b82828151811061149457611494615ab8565b60209081029190910101526114a881615a71565b905061143d565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156114f85760405162461bcd60e51b815260040161094390615644565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611541600080516020615bad833981519152546001600160a01b031690565b6001600160a01b0316146115675760405162461bcd60e51b8152600401610943906156de565b61157082612a76565b61119982826001612a7e565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461161c5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610943565b50600080516020615bad8339815191525b90565b6033546001600160a01b031633148061164d575061164d3361070c565b61165657600080fd5b61016c55565b6001600160a01b038316331480611678575061167883336107cb565b6116945760405162461bcd60e51b815260040161094390615690565b61169f838383612d11565b505050565b6116ac6128ec565b6116b66000612eb0565b565b6033546001600160a01b03163314806116d557506116d53361070c565b6116de57600080fd5b60005b815181101561169f576117268382815181106116ff576116ff615ab8565b602002602001015183838151811061171957611719615ab8565b60200260200101516122e5565b8061173081615a71565b9150506116e1565b6060611747600061012e541190565b6117855760405162461bcd60e51b815260206004820152600f60248201526e139bc81c185cdcd95cc8195e1a5cdd608a1b6044820152606401610943565b600061179161012e5490565b6001600160401b038111156117a8576117a8615ace565b6040519080825280602002602001820160405280156117d1578160200160208202803683370190505b50905060005b61012e548110156113875760006117ee85836108dc565b90508083838151811061180357611803615ab8565b6020908102919091010152508061181981615a71565b9150506117d7565b611199338383612f02565b6118346128ec565b61016980546001600160a01b0319166001600160a01b0392909216919091179055565b6060600061012e546001600160401b0381111561187657611876615ace565b6040519080825280602002602001820160405280156118af57816020015b61189c6147d6565b8152602001906001900390816118945790505b50905060005b61012e548110156119e657600081815261012f602052604090819020815160c081019092528054829082906118e9906159eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611915906159eb565b80156119625780601f1061193757610100808354040283529160200191611962565b820191906000526020600020905b81548152906001019060200180831161194557829003601f168201915b5050509183525050600182015460208201526002820154604082015260039091015463ffffffff8116606083015260ff6401000000008204811615156080840152600160281b90910416151560a09091015282518390839081106119c8576119c8615ab8565b602002602001018190525080806119de90615a71565b9150506118b5565b50919050565b6033546001600160a01b0316331480611a095750611a093361070c565b611a1257600080fd5b60005b815181101561119957611a40828281518110611a3357611a33615ab8565b60200260200101516124ad565b80611a4a81615a71565b915050611a15565b6033546001600160a01b0316331480611a6f5750611a6f3361070c565b611a7857600080fd5b60015b61013154811015611ad65761013060006101318381548110611a9f57611a9f615ab8565b60009182526020808320909101546001600160a01b0316835282019290925260400181205580611ace81615a71565b915050611a7b565b508151611ae490600161594f565b6001600160401b03811115611afb57611afb615ace565b604051908082528060200260200182016040528015611b24578160200160208202803683370190505b508051611b3a9161013191602090910190614816565b5073460fd5059e7301680fa53e63bbbf7272e643e89c610131600081548110611b6557611b65615ab8565b6000918252602082200180546001600160a01b0319166001600160a01b0393909316929092179091555b825181101561169f57818181518110611baa57611baa615ab8565b60200260200101516101306000858481518110611bc957611bc9615ab8565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550828181518110611c0757611c07615ab8565b6020026020010151610131826001611c1f919061594f565b81548110611c2f57611c2f615ab8565b600091825260209091200180546001600160a01b0319166001600160a01b039290921691909117905580611c6281615a71565b915050611b8f565b600054610100900460ff1615808015611c8a5750600054600160ff909116105b80611ca45750303b158015611ca4575060005460ff166001145b611d075760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610943565b6000805460ff191660011790558015611d2a576000805461ff0019166101001790555b611d348383612fe3565b801561169f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b611d8661304c565b60c0830135600090815261016a602052604090205483908390839060ff1615611dd65760405162461bcd60e51b8152602060048201526002602482015261445360f01b6044820152606401610943565b611de660c0840160a0850161518b565b6001600160801b03164210611e225760405162461bcd60e51b8152602060048201526002602482015261455360f01b6044820152606401610943565b60c0830135600090815261016a60205260408120805460ff1916600117905580611e4d8585856130a6565b9150915081611e835760405162461bcd60e51b8152602060048201526002602482015261495360f01b6044820152606401610943565b8733611e926020830183614be7565b6001600160a01b031614611ef25760405162461bcd60e51b815260206004820152602160248201527f43616e2774206d696e7420746f206f74686572207468616e20796f757273656c6044820152603360f91b6064820152608401610943565b30611f0360a0830160808401614be7565b6001600160a01b03161415611f63578060600135341015611f5e5760405162461bcd60e51b81526020600482015260156024820152744d7573742073656e6420746f74616c20707269636560581b6044820152606401610943565b612004565b6000611f7560a0830160808401614be7565b6040516323b872dd60e01b8152336004820152306024820152606084013560448201529091506001600160a01b038216906323b872dd90606401602060405180830381600087803b158015611fc957600080fd5b505af1158015611fdd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120019190615049565b50505b600061201360208301836158e3565b9050905060005b818110156120e157600061205061203460208601866158e3565b8481811061204457612044615ab8565b90506020020135612194565b602081015190915061206560408601866158e3565b8481811061207557612075615ab8565b90506020020135826040015161208b919061594f565b11156120ce5760405162461bcd60e51b815260206004820152601260248201527113585e081cdd5c1c1b1e481c995858da195960721b6044820152606401610943565b50806120d981615a71565b91505061201a565b506121836120f260208c018c614be7565b6120ff60208d018d6158e3565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061213e9250505060408e018e6158e3565b808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250604080516020810190915290815292506130d2915050565b5050505050505061169f6001606555565b61219c6147d6565b6121a88261012e541190565b6121eb5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610943565b600082815261012f602052604090819020815160c08101909252805482908290612214906159eb565b80601f0160208091040260200160405190810160405280929190818152602001828054612240906159eb565b801561228d5780601f106122625761010080835404028352916020019161228d565b820191906000526020600020905b81548152906001019060200180831161227057829003601f168201915b5050509183525050600182015460208201526002820154604082015260039091015463ffffffff8116606083015260ff6401000000008204811615156080840152600160281b90910416151560a09091015292915050565b6033546001600160a01b031633148061230257506123023361070c565b61230b57600080fd5b6123178261012e541190565b61235a5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610943565b600082815261012f60209081526040909120600201549082015110156123c25760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f742072656475636520746f74616c20737570706c790000000000006044820152606401610943565b600082815261012f60205260409081902060020154908201511461241f5760405162461bcd60e51b815260206004820152601460248201527343616e6e6f74206368616e676520737570706c7960601b6044820152606401610943565b600082815261012f6020908152604090912082518051849361244592849291019061487b565b506020820151600182015560408201516002820155606082015160039091018054608084015160a0909401511515600160281b0265ff0000000000199415156401000000000264ffffffffff1990921663ffffffff9094169390931717929092161790555050565b6033546001600160a01b03163314806124ca57506124ca3361070c565b6124d357600080fd5b61012e54600090815261012f602090815260409091208251805184936124fd92849291019061487b565b50602082015160018083019190915560408301516002830155606083015160039092018054608085015160a0909501511515600160281b0265ff0000000000199515156401000000000264ffffffffff1990921663ffffffff9095169490941717939093169190911790915561012e546125769161594f565b61012e5550565b846daaeb6d7670e522a718067333cd4e3b15612652576001600160a01b0381163314156125b157610c0f868686868661322d565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b1580156125fb57600080fd5b505afa15801561260f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126339190615049565b61265257604051633b79c77360e21b8152336004820152602401610943565b610cc2868686868661322d565b6126676128ec565b6001600160a01b0381166126cc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610943565b610fb081612eb0565b6001600160a01b0383163314806126f157506126f183336107cb565b61270d5760405162461bcd60e51b815260040161094390615690565b61169f838383613272565b6060806000610131805490506001600160401b0381111561273b5761273b615ace565b604051908082528060200260200182016040528015612764578160200160208202803683370190505b50905060005b610131548110156127e4576101306000610131838154811061278e5761278e615ab8565b60009182526020808320909101546001600160a01b0316835282019290925260400190205482518390839081106127c7576127c7615ab8565b6020908102919091010152806127dc81615a71565b91505061276a565b50610131818180548060200260200160405190810160405280929190818152602001828054801561283e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612820575b5050505050915092509250509091565b6033546001600160a01b031633148061286b575061286b3361070c565b61287457600080fd5b61013280546001600160a01b0319166001600160a01b03939093169290921790915561013355565b60006001600160e01b03198216636cdb3d1360e11b14806128cd57506001600160e01b031982166303a24d0760e21b145b8061099957506301ffc9a760e01b6001600160e01b0319831614610999565b6033546001600160a01b031633146116b65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610943565b6001600160a01b03841661296c5760405162461bcd60e51b81526004016109439061588f565b3360006129788561338e565b905060006129858561338e565b9050612996836000898585896133d9565b600086815260c9602090815260408083206001600160a01b038b168452909152812080548792906129c890849061594f565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612a2883600089898989613693565b50505050505050565b6001600160a01b038516331480612a4d5750612a4d85336107cb565b612a695760405162461bcd60e51b815260040161094390615690565b6110db85858585856137fe565b610fb06128ec565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615612ab15761169f836139a3565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b815260040160206040518083038186803b158015612aea57600080fd5b505afa925050508015612b1a575060408051601f3d908101601f19168201909252612b1791810190615066565b60015b612b7d5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610943565b600080516020615bad8339815191528114612bec5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610943565b5061169f838383613a3f565b80471015612c485760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610943565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612c95576040519150601f19603f3d011682016040523d82523d6000602084013e612c9a565b606091505b505090508061169f5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610943565b6001600160a01b038316612d375760405162461bcd60e51b81526004016109439061576f565b8051825114612d585760405162461bcd60e51b815260040161094390615847565b6000339050612d7b818560008686604051806020016040528060008152506133d9565b60005b8351811015612e43576000848281518110612d9b57612d9b615ab8565b602002602001015190506000848381518110612db957612db9615ab8565b602090810291909101810151600084815260c9835260408082206001600160a01b038c168352909352919091205490915081811015612e0a5760405162461bcd60e51b815260040161094390615600565b600092835260c9602090815260408085206001600160a01b038b1686529091529092209103905580612e3b81615a71565b915050612d7e565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612e94929190615580565b60405180910390a4604080516020810190915260009052610b4b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612f765760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610943565b6001600160a01b03838116600081815260ca6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b600054610100900460ff1661300a5760405162461bcd60e51b8152600401610943906157fc565b61302260405180602001604052806000815250613a64565b61302a613a94565b613032613ac3565b61303b82613aea565b61304481613b69565b611199613b99565b6002606554141561309f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610943565b6002606555565b6000806130b4858585613bdf565b610169546001600160a01b0380831691161492509050935093915050565b6001600160a01b0384166130f85760405162461bcd60e51b81526004016109439061588f565b81518351146131195760405162461bcd60e51b815260040161094390615847565b33613129816000878787876133d9565b60005b84518110156131c55783818151811061314757613147615ab8565b602002602001015160c9600087848151811061316557613165615ab8565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546131ad919061594f565b909155508190506131bd81615a71565b91505061312c565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051613216929190615580565b60405180910390a46110db81600087878787613d66565b6001600160a01b038516331480613249575061324985336107cb565b6132655760405162461bcd60e51b815260040161094390615690565b6110db8585858585613e30565b6001600160a01b0383166132985760405162461bcd60e51b81526004016109439061576f565b3360006132a48461338e565b905060006132b18461338e565b90506132d1838760008585604051806020016040528060008152506133d9565b600085815260c9602090815260408083206001600160a01b038a168452909152902054848110156133145760405162461bcd60e51b815260040161094390615600565b600086815260c9602090815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052612a28565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106133c8576133c8615ab8565b602090810291909101015292915050565b60005b835181101561368d5760006134098583815181106133fc576133fc615ab8565b6020026020010151612194565b90506001600160a01b0387161561345e578060a001511561345e5760405162461bcd60e51b815260206004820152600f60248201526e10d85b89dd081899481d1c98591959608a1b6044820152606401610943565b6001600160a01b03871661367a578060800151156134ad5760405162461bcd60e51b815260206004820152600c60248201526b151bdad95b8818db1bdcd95960a21b6044820152606401610943565b606081015163ffffffff16806134c3575061016c545b8483815181106134d5576134d5615ab8565b602002602001015161016b6000896001600160a01b03166001600160a01b03168152602001908152602001600020600088868151811061351757613517615ab8565b6020026020010151815260200190815260200160002054613538919061594f565b6001600160a01b038816600090815261016b60205260408120885190919089908790811061356857613568615ab8565b60200260200101518152602001908152602001600020819055508061016b6000896001600160a01b03166001600160a01b0316815260200190815260200160002060008886815181106135bd576135bd615ab8565b6020026020010151815260200190815260200160002054111561361b5760405162461bcd60e51b815260206004820152601660248201527513585e081c195c881dd85b1b195d081c995858da195960521b6044820152606401610943565b84838151811061362d5761362d615ab8565b60200260200101518260400151613644919061594f565b61012f600088868151811061365b5761365b615ab8565b6020026020010151815260200190815260200160002060020181905550505b508061368581615a71565b9150506133dc565b50610cc2565b6001600160a01b0384163b15610cc25760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906136d79089908990889088908890600401615466565b602060405180830381600087803b1580156136f157600080fd5b505af1925050508015613721575060408051601f3d908101601f1916820190925261371e9181019061509c565b60015b6137ce5761372d615ae4565b806308c379a014156137675750613742615aff565b8061374d5750613769565b8060405162461bcd60e51b815260040161094391906155a5565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610943565b6001600160e01b0319811663f23a6e6160e01b14612a285760405162461bcd60e51b8152600401610943906155b8565b815183511461381f5760405162461bcd60e51b815260040161094390615847565b6001600160a01b0384166138455760405162461bcd60e51b81526004016109439061572a565b336138548187878787876133d9565b60005b845181101561393d57600085828151811061387457613874615ab8565b60200260200101519050600085838151811061389257613892615ab8565b602090810291909101810151600084815260c9835260408082206001600160a01b038e1683529093529190912054909150818110156138e35760405162461bcd60e51b8152600401610943906157b2565b600083815260c9602090815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061392290849061594f565b925050819055505050508061393690615a71565b9050613857565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161398d929190615580565b60405180910390a4610cc2818787878787613d66565b6001600160a01b0381163b613a105760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610943565b600080516020615bad83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b613a4883613f6c565b600082511180613a555750805b1561169f57610b4b8383613fac565b600054610100900460ff16613a8b5760405162461bcd60e51b8152600401610943906157fc565b610fb0816140a0565b600054610100900460ff16613abb5760405162461bcd60e51b8152600401610943906157fc565b6116b66140d0565b600054610100900460ff166116b65760405162461bcd60e51b8152600401610943906157fc565b600054610100900460ff16613b115760405162461bcd60e51b8152600401610943906157fc565b6118346040518060400160405280601c81526020017f5369676e61747572654d696e7461626c655570677261646561626c6500000000815250604051806040016040528060018152602001603160f81b815250614100565b600054610100900460ff16613b905760405162461bcd60e51b8152600401610943906157fc565b610fb081614131565b600054610100900460ff16613bc05760405162461bcd60e51b8152600401610943906157fc565b6116b6733cc6cdda760b79bafa08df41ecfa224f810dceb66001614253565b600080613d197fdc7b98b1fb602ba66d1c447096944bfb9b9847b29b786cd3ba224b10fcac45c4613c136020880188614be7565b613c2060208901896158e3565b604051602001613c31929190615324565b60405160208183030381529060405280519060200120888060400190613c5791906158e3565b604051602001613c68929190615324565b60408051601f19818403018152919052805160209091012060608a0135613c9560a08c0160808d01614be7565b613ca560c08d0160a08e0161518b565b6040805160208101989098526001600160a01b03968716908801526060870194909452608086019290925260a085015290911660c0808401919091526001600160801b0390911660e08301528701356101008201526101200160405160208183030381529060405280519060200120614416565b9050613d5b8185858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061446492505050565b9150505b9392505050565b6001600160a01b0384163b15610cc25760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190613daa9089908990889088908890600401615408565b602060405180830381600087803b158015613dc457600080fd5b505af1925050508015613df4575060408051601f3d908101601f19168201909252613df19181019061509c565b60015b613e005761372d615ae4565b6001600160e01b0319811663bc197c8160e01b14612a285760405162461bcd60e51b8152600401610943906155b8565b6001600160a01b038416613e565760405162461bcd60e51b81526004016109439061572a565b336000613e628561338e565b90506000613e6f8561338e565b9050613e7f8389898585896133d9565b600086815260c9602090815260408083206001600160a01b038c16845290915290205485811015613ec25760405162461bcd60e51b8152600401610943906157b2565b600087815260c9602090815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290613f0190849061594f565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4613f61848a8a8a8a8a613693565b505050505050505050565b613f75816139a3565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6140145760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610943565b600080846001600160a01b03168460405161402f9190615350565b600060405180830381855af49150503d806000811461406a576040519150601f19603f3d011682016040523d82523d6000602084013e61406f565b606091505b50915091506140978282604051806060016040528060278152602001615bcd60279139614480565b95945050505050565b600054610100900460ff166140c75760405162461bcd60e51b8152600401610943906157fc565b610fb081614499565b600054610100900460ff166140f75760405162461bcd60e51b8152600401610943906157fc565b6116b633612eb0565b600054610100900460ff166141275760405162461bcd60e51b8152600401610943906157fc565b61119982826144ac565b73460fd5059e7301680fa53e63bbbf7272e643e89c6000526101306020527f143005e0d6cc229cd04e5837c386768020090f1de0f4e679878cf05e31921e3581905561417f816103e86159a8565b61013060006141966033546001600160a01b031690565b6001600160a01b0316815260208101919091526040016000908120919091556101318054600181018255918190527fbd987ad6ccdb7c7567f7335ea839f95dc944431abcf935b6924f70215963db7390910180546001600160a01b03191673460fd5059e7301680fa53e63bbbf7272e643e89c17905561421e6033546001600160a01b031690565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905550565b600054610100900460ff1661427a5760405162461bcd60e51b8152600401610943906157fc565b6daaeb6d7670e522a718067333cd4e3b156111995760405163c3c5a54760e01b81523060048201526daaeb6d7670e522a718067333cd4e9063c3c5a54790602401602060405180830381600087803b1580156142d557600080fd5b505af11580156142e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061430d9190615049565b61119957801561438157604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b15801561436d57600080fd5b505af1158015610cc2573d6000803e3d6000fd5b6001600160a01b038216156143d05760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401614353565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b15801561436d57600080fd5b60006109996144236144ef565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006144738585614571565b91509150610d95816145b4565b6060831561448f575081613d5f565b613d5f8383614702565b80516111999060cb90602084019061487b565b600054610100900460ff166144d35760405162461bcd60e51b8152600401610943906157fc565b8151602092830120815191909201206101359190915561013655565b600061456c7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61451f6101355490565b610136546040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b905090565b6000808251604114156145a85760208301516040840151606085015160001a61459c87828585614712565b94509450505050610bd4565b50600090506002610bd4565b60008160048111156145c8576145c8615aa2565b14156145d15750565b60018160048111156145e5576145e5615aa2565b14156146335760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610943565b600281600481111561464757614647615aa2565b14156146955760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610943565b60038160048111156146a9576146a9615aa2565b1415610fb05760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610943565b81511561374d5781518083602001fd5b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561474957506000905060036147cd565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561479d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147c6576000600192509250506147cd565b9150600090505b94509492505050565b6040518060c00160405280606081526020016000815260200160008152602001600063ffffffff1681526020016000151581526020016000151581525090565b82805482825590600052602060002090810192821561486b579160200282015b8281111561486b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614836565b506148779291506148ef565b5090565b828054614887906159eb565b90600052602060002090601f0160209004810192826148a9576000855561486b565b82601f106148c257805160ff191683800117855561486b565b8280016001018555821561486b579182015b8281111561486b5782518255916020019190600101906148d4565b5b8082111561487757600081556001016148f0565b60006001600160401b0383111561491d5761491d615ace565b604051614934601f8501601f191660200182615a45565b80915083815284848401111561494957600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b038116811461497857600080fd5b919050565b600082601f83011261498e57600080fd5b8135602061499b8261592c565b6040516149a88282615a45565b8381528281019150858301600585901b870184018810156149c857600080fd5b60005b858110156149ee576149dc82614961565b845292840192908401906001016149cb565b5090979650505050505050565b600082601f830112614a0c57600080fd5b81356020614a198261592c565b604051614a268282615a45565b8381528281019150858301600585901b87018401881015614a4657600080fd5b6000805b86811015614a885782356001600160401b03811115614a67578283fd5b614a758b88838d0101614b2b565b8652509385019391850191600101614a4a565b509198975050505050505050565b600082601f830112614aa757600080fd5b81356020614ab48261592c565b604051614ac18282615a45565b8381528281019150858301600585901b87018401881015614ae157600080fd5b60005b858110156149ee57813584529284019290840190600101614ae4565b803561497881615b88565b600082601f830112614b1c57600080fd5b613d5f83833560208501614904565b600060c08284031215614b3d57600080fd5b604051614b4981615a20565b80915082356001600160401b03811115614b6257600080fd5b8301601f81018513614b7357600080fd5b614b8285823560208401614904565b8252506020830135602082015260408301356040820152614ba560608401614bd3565b6060820152614bb660808401614b00565b6080820152614bc760a08401614b00565b60a08201525092915050565b803563ffffffff8116811461497857600080fd5b600060208284031215614bf957600080fd5b613d5f82614961565b60008060408385031215614c1557600080fd5b614c1e83614961565b9150614c2c60208401614961565b90509250929050565b600080600080600060a08688031215614c4d57600080fd5b614c5686614961565b9450614c6460208701614961565b935060408601356001600160401b0380821115614c8057600080fd5b614c8c89838a01614a96565b94506060880135915080821115614ca257600080fd5b614cae89838a01614a96565b93506080880135915080821115614cc457600080fd5b50614cd188828901614b0b565b9150509295509295909350565b600080600080600060a08688031215614cf657600080fd5b614cff86614961565b9450614d0d60208701614961565b9350604086013592506060860135915060808601356001600160401b03811115614d3657600080fd5b614cd188828901614b0b565b60008060408385031215614d5557600080fd5b614d5e83614961565b915060208301356001600160401b03811115614d7957600080fd5b614d8585828601614a96565b9150509250929050565b600080600060608486031215614da457600080fd5b614dad84614961565b925060208401356001600160401b0380821115614dc957600080fd5b614dd587838801614a96565b93506040860135915080821115614deb57600080fd5b50614df886828701614a96565b9150509250925092565b60008060408385031215614e1557600080fd5b614e1e83614961565b91506020830135614e2e81615b88565b809150509250929050565b60008060408385031215614e4c57600080fd5b614e5583614961565b915060208301356001600160401b03811115614e7057600080fd5b614d8585828601614b0b565b60008060408385031215614e8f57600080fd5b614e9883614961565b946020939093013593505050565b600080600060608486031215614ebb57600080fd5b614ec484614961565b95602085013595506040909401359392505050565b60008060408385031215614eec57600080fd5b82356001600160401b0380821115614f0357600080fd5b614f0f8683870161497d565b93506020850135915080821115614f2557600080fd5b50614d8585828601614a96565b600080600060608486031215614f4757600080fd5b83356001600160401b0380821115614f5e57600080fd5b614f6a8783880161497d565b94506020860135915080821115614dc957600080fd5b600060208284031215614f9257600080fd5b81356001600160401b03811115614fa857600080fd5b614fb4848285016149fb565b949350505050565b600060208284031215614fce57600080fd5b81356001600160401b03811115614fe457600080fd5b614fb484828501614a96565b6000806040838503121561500357600080fd5b82356001600160401b038082111561501a57600080fd5b61502686838701614a96565b9350602085013591508082111561503c57600080fd5b50614d85858286016149fb565b60006020828403121561505b57600080fd5b8151613d5f81615b88565b60006020828403121561507857600080fd5b5051919050565b60006020828403121561509157600080fd5b8135613d5f81615b96565b6000602082840312156150ae57600080fd5b8151613d5f81615b96565b6000806000604084860312156150ce57600080fd5b83356001600160401b03808211156150e557600080fd5b9085019060e082880312156150f957600080fd5b9093506020850135908082111561510f57600080fd5b818601915086601f83011261512357600080fd5b81358181111561513257600080fd5b87602082850101111561514457600080fd5b6020830194508093505050509250925092565b60006020828403121561516957600080fd5b81356001600160401b0381111561517f57600080fd5b614fb484828501614b2b565b60006020828403121561519d57600080fd5b81356001600160801b0381168114613d5f57600080fd5b6000602082840312156151c657600080fd5b5035919050565b6000806000606084860312156151e257600080fd5b833592506151f260208501614961565b9150604084013590509250925092565b6000806040838503121561521557600080fd5b8235915060208301356001600160401b0381111561523257600080fd5b614d8585828601614b2b565b6000806040838503121561525157600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b8381101561529057815187529582019590820190600101615274565b509495945050505050565b600081518084526152b38160208601602086016159bf565b601f01601f19169290920160200192915050565b6000815160c084526152dc60c085018261529b565b9050602083015160208501526040830151604085015263ffffffff606084015116606085015260808301511515608085015260a0830151151560a08501528091505092915050565b60006001600160fb1b0383111561533a57600080fd5b8260051b80858437600092019182525092915050565b600082516153628184602087016159bf565b9190910192915050565b600080835481600182811c91508083168061538857607f831692505b60208084108214156153a857634e487b7160e01b86526022600452602486fd5b8180156153bc57600181146153cd576153fa565b60ff198616895284890196506153fa565b60008a81526020902060005b868110156153f25781548b8201529085019083016153d9565b505084890196505b509498975050505050505050565b6001600160a01b0386811682528516602082015260a06040820181905260009061543490830186615260565b82810360608401526154468186615260565b9050828103608084015261545a818561529b565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906154a09083018461529b565b979650505050505050565b604080825283519082018190526000906020906060840190828701845b828110156154ed5781516001600160a01b0316845292840192908401906001016154c8565b505050838103828501526155018186615260565b9695505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561556057603f1988860301845261554e8583516152c7565b94509285019290850190600101615532565b5092979650505050505050565b602081526000613d5f6020830184615260565b6040815260006155936040830185615260565b8281036020840152613d5b8185615260565b602081526000613d5f602083018461529b565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b602081526000613d5f60208301846152c7565b6000808335601e198436030181126158fa57600080fd5b8301803591506001600160401b0382111561591457600080fd5b6020019150600581901b3603821315610bd457600080fd5b60006001600160401b0382111561594557615945615ace565b5060051b60200190565b6000821982111561596257615962615a8c565b500190565b60008261598457634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156159a3576159a3615a8c565b500290565b6000828210156159ba576159ba615a8c565b500390565b60005b838110156159da5781810151838201526020016159c2565b83811115610b4b5750506000910152565b600181811c908216806159ff57607f821691505b602082108114156119e657634e487b7160e01b600052602260045260246000fd5b60c081018181106001600160401b0382111715615a3f57615a3f615ace565b60405250565b601f8201601f191681016001600160401b0381118282101715615a6a57615a6a615ace565b6040525050565b6000600019821415615a8557615a85615a8c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d111561162d5760046000803e5060005160e01c90565b600060443d1015615b0d5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715615b3c57505050505090565b8285019150815181811115615b545750505050505090565b843d8701016020828501011115615b6e5750505050505090565b615b7d60208286010187615a45565b509095945050505050565b8015158114610fb057600080fd5b6001600160e01b031981168114610fb057600080fdfe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212206de29b804151cc564f24c4079c8f1d41232f3c5eb67fb86f0daa4174e700fae264736f6c63430008070033
Deployed Bytecode
0x60806040526004361061027c5760003560e01c80636e05ec401161014f578063be8e43ee116100c1578063f1615e611161007a578063f1615e6114610819578063f242432a14610839578063f2fde38b14610859578063f5298aca14610879578063f5ca4dfd14610899578063fe70aaea146108bc57600080fd5b8063be8e43ee14610730578063cd6dc68714610750578063cf0de7dd14610770578063e4b50cb814610783578063e985e9c5146107b0578063eafc98a0146107f957600080fd5b80638da5cb5b116101135780638da5cb5b1461065e578063a22cb4651461067c578063a7ecd37e1461069c578063aa6ca808146106bc578063b7e3968c146106d1578063bbe9f99d146106f157600080fd5b80636e05ec40146105af578063715018a6146105f357806378a8956714610608578063828a29a01461061e5780638462151c1461063e57600080fd5b80633aeac4e1116101f35780634f1ef286116101ac5780634f1ef286146104eb5780634f558e79146104fe57806352d1902d146105215780635969b44b146105365780635b7633d0146105565780636b20c4541461058f57600080fd5b80633aeac4e11461043f5780633ccfd60b1461045f5780633eb2b5ad1461046757806344ab23fc146104875780634cb3f4b1146104b45780634e1273f4146104cb57600080fd5b80631bf2907b116102455780631bf2907b146103535780632a55205a146103735780632eb2c2d6146103b2578063345ba790146103d2578063355e6b43146103ff5780633659cfe61461041f57600080fd5b8062fdd58e1461028157806301ffc9a7146102b45780630e89341c146102e457806314eba0261461031157806319350ea214610333575b600080fd5b34801561028d57600080fd5b506102a161029c366004614e7c565b6108dc565b6040519081526020015b60405180910390f35b3480156102c057600080fd5b506102d46102cf36600461507f565b610974565b60405190151581526020016102ab565b3480156102f057600080fd5b506103046102ff3660046151b4565b61099f565b6040516102ab91906155a5565b34801561031d57600080fd5b5061033161032c366004614be7565b6109d9565b005b34801561033f57600080fd5b5061033161034e3660046151cd565b610a16565b34801561035f57600080fd5b5061033161036e366004614f32565b610a85565b34801561037f57600080fd5b5061039361038e36600461523e565b610b51565b604080516001600160a01b0390931683526020830191909152016102ab565b3480156103be57600080fd5b506103316103cd366004614c35565b610bdb565b3480156103de57600080fd5b506103f26103ed366004614d42565b610cca565b6040516102ab919061556d565b34801561040b57600080fd5b5061033161041a3660046151b4565b610d9d565b34801561042b57600080fd5b5061033161043a366004614be7565b610ed3565b34801561044b57600080fd5b5061033161045a366004614c02565b610fb3565b6103316110e2565b34801561047357600080fd5b50610331610482366004614be7565b61119d565b34801561049357600080fd5b506104a76104a2366004614fbc565b6111dd565b6040516102ab919061550b565b3480156104c057600080fd5b506102a161016c5481565b3480156104d757600080fd5b506103f26104e6366004614ed9565b61138e565b6103316104f9366004614e39565b6114af565b34801561050a57600080fd5b506102d46105193660046151b4565b61012e541190565b34801561052d57600080fd5b506102a161157c565b34801561054257600080fd5b506103316105513660046151b4565b611630565b34801561056257600080fd5b5061016954610577906001600160a01b031681565b6040516001600160a01b0390911681526020016102ab565b34801561059b57600080fd5b506103316105aa366004614d8f565b61165c565b3480156105bb57600080fd5b506102a16105ca366004614e7c565b6001600160a01b0391909116600090815261016b60209081526040808320938352929052205490565b3480156105ff57600080fd5b506103316116a4565b34801561061457600080fd5b5061012e546102a1565b34801561062a57600080fd5b50610331610639366004614ff0565b6116b8565b34801561064a57600080fd5b506103f2610659366004614be7565b611738565b34801561066a57600080fd5b506033546001600160a01b0316610577565b34801561068857600080fd5b50610331610697366004614e02565b611821565b3480156106a857600080fd5b506103316106b7366004614be7565b61182c565b3480156106c857600080fd5b506104a7611857565b3480156106dd57600080fd5b506103316106ec366004614f80565b6119ec565b3480156106fd57600080fd5b506102d461070c366004614be7565b6001600160a01b0316600090815261012d602052604090205460ff16151560011490565b34801561073c57600080fd5b5061033161074b366004614ed9565b611a52565b34801561075c57600080fd5b5061033161076b366004614e7c565b611c6a565b61033161077e3660046150b9565b611d7e565b34801561078f57600080fd5b506107a361079e3660046151b4565b612194565b6040516102ab91906158d0565b3480156107bc57600080fd5b506102d46107cb366004614c02565b6001600160a01b03918216600090815260ca6020908152604080832093909416825291909152205460ff1690565b34801561080557600080fd5b50610331610814366004615202565b6122e5565b34801561082557600080fd5b50610331610834366004615157565b6124ad565b34801561084557600080fd5b50610331610854366004614cde565b61257d565b34801561086557600080fd5b50610331610874366004614be7565b61265f565b34801561088557600080fd5b50610331610894366004614ea6565b6126d5565b3480156108a557600080fd5b506108ae612718565b6040516102ab9291906154ab565b3480156108c857600080fd5b506103316108d7366004614e7c565b61284e565b60006001600160a01b03831661094c5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b50600090815260c9602090815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b0319821663152a902d60e11b148061099957506109998261289c565b92915050565b600081815261012f602090815260409182902091516060926109c39290910161536c565b6040516020818303038152906040529050919050565b6109e16128ec565b6001600160a01b0381166109f457600080fd5b6001600160a01b0316600090815261012d60205260409020805460ff19169055565b6033546001600160a01b0316331480610a335750610a333361070c565b610a3c57600080fd5b6040805180820182526001600160a01b0393841681526020808201938452600095865261013490529320925183546001600160a01b031916921691909117825551600190910155565b6033546001600160a01b0316331480610aa25750610aa23361070c565b610aab57600080fd5b8051835114610ab957600080fd5b8051825114610ac757600080fd5b60005b8151811015610b4b57610b39848281518110610ae857610ae8615ab8565b6020026020010151848381518110610b0257610b02615ab8565b6020026020010151848481518110610b1c57610b1c615ab8565b602002602001015160405180602001604052806000815250612946565b80610b4381615a71565b915050610aca565b50505050565b600082815261013460209081526040808320815180830190925280546001600160a01b0316825260010154918101829052829115610bb257805160208201516103e890610b9e9087615989565b610ba89190615967565b9250925050610bd4565b61013254610133546001600160a01b03909116906103e890610b9e9087615989565b9250929050565b846daaeb6d7670e522a718067333cd4e3b15610cb5576001600160a01b038116331415610c1457610c0f8686868686612a31565b610cc2565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b158015610c5e57600080fd5b505afa158015610c72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c969190615049565b610cb557604051633b79c77360e21b8152336004820152602401610943565b610cc28686868686612a31565b505050505050565b6060600082516001600160401b03811115610ce757610ce7615ace565b604051908082528060200260200182016040528015610d10578160200160208202803683370190505b50905060005b8151811015610d9557610d6685858381518110610d3557610d35615ab8565b60200260200101516001600160a01b0391909116600090815261016b60209081526040808320938352929052205490565b828281518110610d7857610d78615ab8565b602090810291909101015280610d8d81615a71565b915050610d16565b509392505050565b3373460fd5059e7301680fa53e63bbbf7272e643e89c14610de55760405162461bcd60e51b8152602060048201526002602482015261494160f01b6044820152606401610943565b73460fd5059e7301680fa53e63bbbf7272e643e89c60009081526101306020527f143005e0d6cc229cd04e5837c386768020090f1de0f4e679878cf05e31921e3554610e329083906159a8565b73460fd5059e7301680fa53e63bbbf7272e643e89c600090815261013060208190527f143005e0d6cc229cd04e5837c386768020090f1de0f4e679878cf05e31921e35859055610131805493945084939192916001908110610e9657610e96615ab8565b60009182526020808320909101546001600160a01b0316835282019290925260400181208054909190610eca90849061594f565b90915550505050565b306001600160a01b037f00000000000000000000000012b52a7e0d26bdab7f9324bb6600b4298fcf5263161415610f1c5760405162461bcd60e51b815260040161094390615644565b7f00000000000000000000000012b52a7e0d26bdab7f9324bb6600b4298fcf52636001600160a01b0316610f65600080516020615bad833981519152546001600160a01b031690565b6001600160a01b031614610f8b5760405162461bcd60e51b8152600401610943906156de565b610f9481612a76565b60408051600080825260208201909252610fb091839190612a7e565b50565b6033546001600160a01b0316331480610fd05750610fd03361070c565b610fd957600080fd5b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a082319060240160206040518083038186803b15801561101d57600080fd5b505afa158015611031573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110559190615066565b60405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390529192509083169063a9059cbb90604401602060405180830381600087803b1580156110a357600080fd5b505af11580156110b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110db9190615049565b5050505050565b478015610fb05760005b610131548110156111995760006101306000610131848154811061111257611112615ab8565b60009182526020808320909101546001600160a01b0316835282019290925260400181205491506103e86111468584615989565b6111509190615967565b9050611184610131848154811061116957611169615ab8565b6000918252602090912001546001600160a01b031682612bf8565b5050808061119190615a71565b9150506110ec565b5050565b6111a56128ec565b6001600160a01b0381166111b857600080fd5b6001600160a01b0316600090815261012d60205260409020805460ff19166001179055565b6060600082516001600160401b038111156111fa576111fa615ace565b60405190808252806020026020018201604052801561123357816020015b6112206147d6565b8152602001906001900390816112185790505b50905060005b83518110156113875761012f600085838151811061125957611259615ab8565b602002602001015181526020019081526020016000206040518060c001604052908160008201805461128a906159eb565b80601f01602080910402602001604051908101604052809291908181526020018280546112b6906159eb565b80156113035780601f106112d857610100808354040283529160200191611303565b820191906000526020600020905b8154815290600101906020018083116112e657829003601f168201915b5050509183525050600182015460208201526002820154604082015260039091015463ffffffff8116606083015260ff6401000000008204811615156080840152600160281b90910416151560a090910152825183908390811061136957611369615ab8565b6020026020010181905250808061137f90615a71565b915050611239565b5092915050565b606081518351146113f35760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610943565b600083516001600160401b0381111561140e5761140e615ace565b604051908082528060200260200182016040528015611437578160200160208202803683370190505b50905060005b8451811015610d955761148285828151811061145b5761145b615ab8565b602002602001015185838151811061147557611475615ab8565b60200260200101516108dc565b82828151811061149457611494615ab8565b60209081029190910101526114a881615a71565b905061143d565b306001600160a01b037f00000000000000000000000012b52a7e0d26bdab7f9324bb6600b4298fcf52631614156114f85760405162461bcd60e51b815260040161094390615644565b7f00000000000000000000000012b52a7e0d26bdab7f9324bb6600b4298fcf52636001600160a01b0316611541600080516020615bad833981519152546001600160a01b031690565b6001600160a01b0316146115675760405162461bcd60e51b8152600401610943906156de565b61157082612a76565b61119982826001612a7e565b6000306001600160a01b037f00000000000000000000000012b52a7e0d26bdab7f9324bb6600b4298fcf5263161461161c5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610943565b50600080516020615bad8339815191525b90565b6033546001600160a01b031633148061164d575061164d3361070c565b61165657600080fd5b61016c55565b6001600160a01b038316331480611678575061167883336107cb565b6116945760405162461bcd60e51b815260040161094390615690565b61169f838383612d11565b505050565b6116ac6128ec565b6116b66000612eb0565b565b6033546001600160a01b03163314806116d557506116d53361070c565b6116de57600080fd5b60005b815181101561169f576117268382815181106116ff576116ff615ab8565b602002602001015183838151811061171957611719615ab8565b60200260200101516122e5565b8061173081615a71565b9150506116e1565b6060611747600061012e541190565b6117855760405162461bcd60e51b815260206004820152600f60248201526e139bc81c185cdcd95cc8195e1a5cdd608a1b6044820152606401610943565b600061179161012e5490565b6001600160401b038111156117a8576117a8615ace565b6040519080825280602002602001820160405280156117d1578160200160208202803683370190505b50905060005b61012e548110156113875760006117ee85836108dc565b90508083838151811061180357611803615ab8565b6020908102919091010152508061181981615a71565b9150506117d7565b611199338383612f02565b6118346128ec565b61016980546001600160a01b0319166001600160a01b0392909216919091179055565b6060600061012e546001600160401b0381111561187657611876615ace565b6040519080825280602002602001820160405280156118af57816020015b61189c6147d6565b8152602001906001900390816118945790505b50905060005b61012e548110156119e657600081815261012f602052604090819020815160c081019092528054829082906118e9906159eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611915906159eb565b80156119625780601f1061193757610100808354040283529160200191611962565b820191906000526020600020905b81548152906001019060200180831161194557829003601f168201915b5050509183525050600182015460208201526002820154604082015260039091015463ffffffff8116606083015260ff6401000000008204811615156080840152600160281b90910416151560a09091015282518390839081106119c8576119c8615ab8565b602002602001018190525080806119de90615a71565b9150506118b5565b50919050565b6033546001600160a01b0316331480611a095750611a093361070c565b611a1257600080fd5b60005b815181101561119957611a40828281518110611a3357611a33615ab8565b60200260200101516124ad565b80611a4a81615a71565b915050611a15565b6033546001600160a01b0316331480611a6f5750611a6f3361070c565b611a7857600080fd5b60015b61013154811015611ad65761013060006101318381548110611a9f57611a9f615ab8565b60009182526020808320909101546001600160a01b0316835282019290925260400181205580611ace81615a71565b915050611a7b565b508151611ae490600161594f565b6001600160401b03811115611afb57611afb615ace565b604051908082528060200260200182016040528015611b24578160200160208202803683370190505b508051611b3a9161013191602090910190614816565b5073460fd5059e7301680fa53e63bbbf7272e643e89c610131600081548110611b6557611b65615ab8565b6000918252602082200180546001600160a01b0319166001600160a01b0393909316929092179091555b825181101561169f57818181518110611baa57611baa615ab8565b60200260200101516101306000858481518110611bc957611bc9615ab8565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550828181518110611c0757611c07615ab8565b6020026020010151610131826001611c1f919061594f565b81548110611c2f57611c2f615ab8565b600091825260209091200180546001600160a01b0319166001600160a01b039290921691909117905580611c6281615a71565b915050611b8f565b600054610100900460ff1615808015611c8a5750600054600160ff909116105b80611ca45750303b158015611ca4575060005460ff166001145b611d075760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610943565b6000805460ff191660011790558015611d2a576000805461ff0019166101001790555b611d348383612fe3565b801561169f576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b611d8661304c565b60c0830135600090815261016a602052604090205483908390839060ff1615611dd65760405162461bcd60e51b8152602060048201526002602482015261445360f01b6044820152606401610943565b611de660c0840160a0850161518b565b6001600160801b03164210611e225760405162461bcd60e51b8152602060048201526002602482015261455360f01b6044820152606401610943565b60c0830135600090815261016a60205260408120805460ff1916600117905580611e4d8585856130a6565b9150915081611e835760405162461bcd60e51b8152602060048201526002602482015261495360f01b6044820152606401610943565b8733611e926020830183614be7565b6001600160a01b031614611ef25760405162461bcd60e51b815260206004820152602160248201527f43616e2774206d696e7420746f206f74686572207468616e20796f757273656c6044820152603360f91b6064820152608401610943565b30611f0360a0830160808401614be7565b6001600160a01b03161415611f63578060600135341015611f5e5760405162461bcd60e51b81526020600482015260156024820152744d7573742073656e6420746f74616c20707269636560581b6044820152606401610943565b612004565b6000611f7560a0830160808401614be7565b6040516323b872dd60e01b8152336004820152306024820152606084013560448201529091506001600160a01b038216906323b872dd90606401602060405180830381600087803b158015611fc957600080fd5b505af1158015611fdd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120019190615049565b50505b600061201360208301836158e3565b9050905060005b818110156120e157600061205061203460208601866158e3565b8481811061204457612044615ab8565b90506020020135612194565b602081015190915061206560408601866158e3565b8481811061207557612075615ab8565b90506020020135826040015161208b919061594f565b11156120ce5760405162461bcd60e51b815260206004820152601260248201527113585e081cdd5c1c1b1e481c995858da195960721b6044820152606401610943565b50806120d981615a71565b91505061201a565b506121836120f260208c018c614be7565b6120ff60208d018d6158e3565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061213e9250505060408e018e6158e3565b808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250604080516020810190915290815292506130d2915050565b5050505050505061169f6001606555565b61219c6147d6565b6121a88261012e541190565b6121eb5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610943565b600082815261012f602052604090819020815160c08101909252805482908290612214906159eb565b80601f0160208091040260200160405190810160405280929190818152602001828054612240906159eb565b801561228d5780601f106122625761010080835404028352916020019161228d565b820191906000526020600020905b81548152906001019060200180831161227057829003601f168201915b5050509183525050600182015460208201526002820154604082015260039091015463ffffffff8116606083015260ff6401000000008204811615156080840152600160281b90910416151560a09091015292915050565b6033546001600160a01b031633148061230257506123023361070c565b61230b57600080fd5b6123178261012e541190565b61235a5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610943565b600082815261012f60209081526040909120600201549082015110156123c25760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f742072656475636520746f74616c20737570706c790000000000006044820152606401610943565b600082815261012f60205260409081902060020154908201511461241f5760405162461bcd60e51b815260206004820152601460248201527343616e6e6f74206368616e676520737570706c7960601b6044820152606401610943565b600082815261012f6020908152604090912082518051849361244592849291019061487b565b506020820151600182015560408201516002820155606082015160039091018054608084015160a0909401511515600160281b0265ff0000000000199415156401000000000264ffffffffff1990921663ffffffff9094169390931717929092161790555050565b6033546001600160a01b03163314806124ca57506124ca3361070c565b6124d357600080fd5b61012e54600090815261012f602090815260409091208251805184936124fd92849291019061487b565b50602082015160018083019190915560408301516002830155606083015160039092018054608085015160a0909501511515600160281b0265ff0000000000199515156401000000000264ffffffffff1990921663ffffffff9095169490941717939093169190911790915561012e546125769161594f565b61012e5550565b846daaeb6d7670e522a718067333cd4e3b15612652576001600160a01b0381163314156125b157610c0f868686868661322d565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b1580156125fb57600080fd5b505afa15801561260f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126339190615049565b61265257604051633b79c77360e21b8152336004820152602401610943565b610cc2868686868661322d565b6126676128ec565b6001600160a01b0381166126cc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610943565b610fb081612eb0565b6001600160a01b0383163314806126f157506126f183336107cb565b61270d5760405162461bcd60e51b815260040161094390615690565b61169f838383613272565b6060806000610131805490506001600160401b0381111561273b5761273b615ace565b604051908082528060200260200182016040528015612764578160200160208202803683370190505b50905060005b610131548110156127e4576101306000610131838154811061278e5761278e615ab8565b60009182526020808320909101546001600160a01b0316835282019290925260400190205482518390839081106127c7576127c7615ab8565b6020908102919091010152806127dc81615a71565b91505061276a565b50610131818180548060200260200160405190810160405280929190818152602001828054801561283e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612820575b5050505050915092509250509091565b6033546001600160a01b031633148061286b575061286b3361070c565b61287457600080fd5b61013280546001600160a01b0319166001600160a01b03939093169290921790915561013355565b60006001600160e01b03198216636cdb3d1360e11b14806128cd57506001600160e01b031982166303a24d0760e21b145b8061099957506301ffc9a760e01b6001600160e01b0319831614610999565b6033546001600160a01b031633146116b65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610943565b6001600160a01b03841661296c5760405162461bcd60e51b81526004016109439061588f565b3360006129788561338e565b905060006129858561338e565b9050612996836000898585896133d9565b600086815260c9602090815260408083206001600160a01b038b168452909152812080548792906129c890849061594f565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612a2883600089898989613693565b50505050505050565b6001600160a01b038516331480612a4d5750612a4d85336107cb565b612a695760405162461bcd60e51b815260040161094390615690565b6110db85858585856137fe565b610fb06128ec565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615612ab15761169f836139a3565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b815260040160206040518083038186803b158015612aea57600080fd5b505afa925050508015612b1a575060408051601f3d908101601f19168201909252612b1791810190615066565b60015b612b7d5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610943565b600080516020615bad8339815191528114612bec5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610943565b5061169f838383613a3f565b80471015612c485760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610943565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612c95576040519150601f19603f3d011682016040523d82523d6000602084013e612c9a565b606091505b505090508061169f5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610943565b6001600160a01b038316612d375760405162461bcd60e51b81526004016109439061576f565b8051825114612d585760405162461bcd60e51b815260040161094390615847565b6000339050612d7b818560008686604051806020016040528060008152506133d9565b60005b8351811015612e43576000848281518110612d9b57612d9b615ab8565b602002602001015190506000848381518110612db957612db9615ab8565b602090810291909101810151600084815260c9835260408082206001600160a01b038c168352909352919091205490915081811015612e0a5760405162461bcd60e51b815260040161094390615600565b600092835260c9602090815260408085206001600160a01b038b1686529091529092209103905580612e3b81615a71565b915050612d7e565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612e94929190615580565b60405180910390a4604080516020810190915260009052610b4b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415612f765760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610943565b6001600160a01b03838116600081815260ca6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b600054610100900460ff1661300a5760405162461bcd60e51b8152600401610943906157fc565b61302260405180602001604052806000815250613a64565b61302a613a94565b613032613ac3565b61303b82613aea565b61304481613b69565b611199613b99565b6002606554141561309f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610943565b6002606555565b6000806130b4858585613bdf565b610169546001600160a01b0380831691161492509050935093915050565b6001600160a01b0384166130f85760405162461bcd60e51b81526004016109439061588f565b81518351146131195760405162461bcd60e51b815260040161094390615847565b33613129816000878787876133d9565b60005b84518110156131c55783818151811061314757613147615ab8565b602002602001015160c9600087848151811061316557613165615ab8565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546131ad919061594f565b909155508190506131bd81615a71565b91505061312c565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051613216929190615580565b60405180910390a46110db81600087878787613d66565b6001600160a01b038516331480613249575061324985336107cb565b6132655760405162461bcd60e51b815260040161094390615690565b6110db8585858585613e30565b6001600160a01b0383166132985760405162461bcd60e51b81526004016109439061576f565b3360006132a48461338e565b905060006132b18461338e565b90506132d1838760008585604051806020016040528060008152506133d9565b600085815260c9602090815260408083206001600160a01b038a168452909152902054848110156133145760405162461bcd60e51b815260040161094390615600565b600086815260c9602090815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052612a28565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106133c8576133c8615ab8565b602090810291909101015292915050565b60005b835181101561368d5760006134098583815181106133fc576133fc615ab8565b6020026020010151612194565b90506001600160a01b0387161561345e578060a001511561345e5760405162461bcd60e51b815260206004820152600f60248201526e10d85b89dd081899481d1c98591959608a1b6044820152606401610943565b6001600160a01b03871661367a578060800151156134ad5760405162461bcd60e51b815260206004820152600c60248201526b151bdad95b8818db1bdcd95960a21b6044820152606401610943565b606081015163ffffffff16806134c3575061016c545b8483815181106134d5576134d5615ab8565b602002602001015161016b6000896001600160a01b03166001600160a01b03168152602001908152602001600020600088868151811061351757613517615ab8565b6020026020010151815260200190815260200160002054613538919061594f565b6001600160a01b038816600090815261016b60205260408120885190919089908790811061356857613568615ab8565b60200260200101518152602001908152602001600020819055508061016b6000896001600160a01b03166001600160a01b0316815260200190815260200160002060008886815181106135bd576135bd615ab8565b6020026020010151815260200190815260200160002054111561361b5760405162461bcd60e51b815260206004820152601660248201527513585e081c195c881dd85b1b195d081c995858da195960521b6044820152606401610943565b84838151811061362d5761362d615ab8565b60200260200101518260400151613644919061594f565b61012f600088868151811061365b5761365b615ab8565b6020026020010151815260200190815260200160002060020181905550505b508061368581615a71565b9150506133dc565b50610cc2565b6001600160a01b0384163b15610cc25760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906136d79089908990889088908890600401615466565b602060405180830381600087803b1580156136f157600080fd5b505af1925050508015613721575060408051601f3d908101601f1916820190925261371e9181019061509c565b60015b6137ce5761372d615ae4565b806308c379a014156137675750613742615aff565b8061374d5750613769565b8060405162461bcd60e51b815260040161094391906155a5565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610943565b6001600160e01b0319811663f23a6e6160e01b14612a285760405162461bcd60e51b8152600401610943906155b8565b815183511461381f5760405162461bcd60e51b815260040161094390615847565b6001600160a01b0384166138455760405162461bcd60e51b81526004016109439061572a565b336138548187878787876133d9565b60005b845181101561393d57600085828151811061387457613874615ab8565b60200260200101519050600085838151811061389257613892615ab8565b602090810291909101810151600084815260c9835260408082206001600160a01b038e1683529093529190912054909150818110156138e35760405162461bcd60e51b8152600401610943906157b2565b600083815260c9602090815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061392290849061594f565b925050819055505050508061393690615a71565b9050613857565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161398d929190615580565b60405180910390a4610cc2818787878787613d66565b6001600160a01b0381163b613a105760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610943565b600080516020615bad83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b613a4883613f6c565b600082511180613a555750805b1561169f57610b4b8383613fac565b600054610100900460ff16613a8b5760405162461bcd60e51b8152600401610943906157fc565b610fb0816140a0565b600054610100900460ff16613abb5760405162461bcd60e51b8152600401610943906157fc565b6116b66140d0565b600054610100900460ff166116b65760405162461bcd60e51b8152600401610943906157fc565b600054610100900460ff16613b115760405162461bcd60e51b8152600401610943906157fc565b6118346040518060400160405280601c81526020017f5369676e61747572654d696e7461626c655570677261646561626c6500000000815250604051806040016040528060018152602001603160f81b815250614100565b600054610100900460ff16613b905760405162461bcd60e51b8152600401610943906157fc565b610fb081614131565b600054610100900460ff16613bc05760405162461bcd60e51b8152600401610943906157fc565b6116b6733cc6cdda760b79bafa08df41ecfa224f810dceb66001614253565b600080613d197fdc7b98b1fb602ba66d1c447096944bfb9b9847b29b786cd3ba224b10fcac45c4613c136020880188614be7565b613c2060208901896158e3565b604051602001613c31929190615324565b60405160208183030381529060405280519060200120888060400190613c5791906158e3565b604051602001613c68929190615324565b60408051601f19818403018152919052805160209091012060608a0135613c9560a08c0160808d01614be7565b613ca560c08d0160a08e0161518b565b6040805160208101989098526001600160a01b03968716908801526060870194909452608086019290925260a085015290911660c0808401919091526001600160801b0390911660e08301528701356101008201526101200160405160208183030381529060405280519060200120614416565b9050613d5b8185858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061446492505050565b9150505b9392505050565b6001600160a01b0384163b15610cc25760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190613daa9089908990889088908890600401615408565b602060405180830381600087803b158015613dc457600080fd5b505af1925050508015613df4575060408051601f3d908101601f19168201909252613df19181019061509c565b60015b613e005761372d615ae4565b6001600160e01b0319811663bc197c8160e01b14612a285760405162461bcd60e51b8152600401610943906155b8565b6001600160a01b038416613e565760405162461bcd60e51b81526004016109439061572a565b336000613e628561338e565b90506000613e6f8561338e565b9050613e7f8389898585896133d9565b600086815260c9602090815260408083206001600160a01b038c16845290915290205485811015613ec25760405162461bcd60e51b8152600401610943906157b2565b600087815260c9602090815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290613f0190849061594f565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4613f61848a8a8a8a8a613693565b505050505050505050565b613f75816139a3565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6140145760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610943565b600080846001600160a01b03168460405161402f9190615350565b600060405180830381855af49150503d806000811461406a576040519150601f19603f3d011682016040523d82523d6000602084013e61406f565b606091505b50915091506140978282604051806060016040528060278152602001615bcd60279139614480565b95945050505050565b600054610100900460ff166140c75760405162461bcd60e51b8152600401610943906157fc565b610fb081614499565b600054610100900460ff166140f75760405162461bcd60e51b8152600401610943906157fc565b6116b633612eb0565b600054610100900460ff166141275760405162461bcd60e51b8152600401610943906157fc565b61119982826144ac565b73460fd5059e7301680fa53e63bbbf7272e643e89c6000526101306020527f143005e0d6cc229cd04e5837c386768020090f1de0f4e679878cf05e31921e3581905561417f816103e86159a8565b61013060006141966033546001600160a01b031690565b6001600160a01b0316815260208101919091526040016000908120919091556101318054600181018255918190527fbd987ad6ccdb7c7567f7335ea839f95dc944431abcf935b6924f70215963db7390910180546001600160a01b03191673460fd5059e7301680fa53e63bbbf7272e643e89c17905561421e6033546001600160a01b031690565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905550565b600054610100900460ff1661427a5760405162461bcd60e51b8152600401610943906157fc565b6daaeb6d7670e522a718067333cd4e3b156111995760405163c3c5a54760e01b81523060048201526daaeb6d7670e522a718067333cd4e9063c3c5a54790602401602060405180830381600087803b1580156142d557600080fd5b505af11580156142e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061430d9190615049565b61119957801561438157604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b15801561436d57600080fd5b505af1158015610cc2573d6000803e3d6000fd5b6001600160a01b038216156143d05760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401614353565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b15801561436d57600080fd5b60006109996144236144ef565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006144738585614571565b91509150610d95816145b4565b6060831561448f575081613d5f565b613d5f8383614702565b80516111999060cb90602084019061487b565b600054610100900460ff166144d35760405162461bcd60e51b8152600401610943906157fc565b8151602092830120815191909201206101359190915561013655565b600061456c7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61451f6101355490565b610136546040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b905090565b6000808251604114156145a85760208301516040840151606085015160001a61459c87828585614712565b94509450505050610bd4565b50600090506002610bd4565b60008160048111156145c8576145c8615aa2565b14156145d15750565b60018160048111156145e5576145e5615aa2565b14156146335760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610943565b600281600481111561464757614647615aa2565b14156146955760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610943565b60038160048111156146a9576146a9615aa2565b1415610fb05760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610943565b81511561374d5781518083602001fd5b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561474957506000905060036147cd565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561479d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147c6576000600192509250506147cd565b9150600090505b94509492505050565b6040518060c00160405280606081526020016000815260200160008152602001600063ffffffff1681526020016000151581526020016000151581525090565b82805482825590600052602060002090810192821561486b579160200282015b8281111561486b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614836565b506148779291506148ef565b5090565b828054614887906159eb565b90600052602060002090601f0160209004810192826148a9576000855561486b565b82601f106148c257805160ff191683800117855561486b565b8280016001018555821561486b579182015b8281111561486b5782518255916020019190600101906148d4565b5b8082111561487757600081556001016148f0565b60006001600160401b0383111561491d5761491d615ace565b604051614934601f8501601f191660200182615a45565b80915083815284848401111561494957600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b038116811461497857600080fd5b919050565b600082601f83011261498e57600080fd5b8135602061499b8261592c565b6040516149a88282615a45565b8381528281019150858301600585901b870184018810156149c857600080fd5b60005b858110156149ee576149dc82614961565b845292840192908401906001016149cb565b5090979650505050505050565b600082601f830112614a0c57600080fd5b81356020614a198261592c565b604051614a268282615a45565b8381528281019150858301600585901b87018401881015614a4657600080fd5b6000805b86811015614a885782356001600160401b03811115614a67578283fd5b614a758b88838d0101614b2b565b8652509385019391850191600101614a4a565b509198975050505050505050565b600082601f830112614aa757600080fd5b81356020614ab48261592c565b604051614ac18282615a45565b8381528281019150858301600585901b87018401881015614ae157600080fd5b60005b858110156149ee57813584529284019290840190600101614ae4565b803561497881615b88565b600082601f830112614b1c57600080fd5b613d5f83833560208501614904565b600060c08284031215614b3d57600080fd5b604051614b4981615a20565b80915082356001600160401b03811115614b6257600080fd5b8301601f81018513614b7357600080fd5b614b8285823560208401614904565b8252506020830135602082015260408301356040820152614ba560608401614bd3565b6060820152614bb660808401614b00565b6080820152614bc760a08401614b00565b60a08201525092915050565b803563ffffffff8116811461497857600080fd5b600060208284031215614bf957600080fd5b613d5f82614961565b60008060408385031215614c1557600080fd5b614c1e83614961565b9150614c2c60208401614961565b90509250929050565b600080600080600060a08688031215614c4d57600080fd5b614c5686614961565b9450614c6460208701614961565b935060408601356001600160401b0380821115614c8057600080fd5b614c8c89838a01614a96565b94506060880135915080821115614ca257600080fd5b614cae89838a01614a96565b93506080880135915080821115614cc457600080fd5b50614cd188828901614b0b565b9150509295509295909350565b600080600080600060a08688031215614cf657600080fd5b614cff86614961565b9450614d0d60208701614961565b9350604086013592506060860135915060808601356001600160401b03811115614d3657600080fd5b614cd188828901614b0b565b60008060408385031215614d5557600080fd5b614d5e83614961565b915060208301356001600160401b03811115614d7957600080fd5b614d8585828601614a96565b9150509250929050565b600080600060608486031215614da457600080fd5b614dad84614961565b925060208401356001600160401b0380821115614dc957600080fd5b614dd587838801614a96565b93506040860135915080821115614deb57600080fd5b50614df886828701614a96565b9150509250925092565b60008060408385031215614e1557600080fd5b614e1e83614961565b91506020830135614e2e81615b88565b809150509250929050565b60008060408385031215614e4c57600080fd5b614e5583614961565b915060208301356001600160401b03811115614e7057600080fd5b614d8585828601614b0b565b60008060408385031215614e8f57600080fd5b614e9883614961565b946020939093013593505050565b600080600060608486031215614ebb57600080fd5b614ec484614961565b95602085013595506040909401359392505050565b60008060408385031215614eec57600080fd5b82356001600160401b0380821115614f0357600080fd5b614f0f8683870161497d565b93506020850135915080821115614f2557600080fd5b50614d8585828601614a96565b600080600060608486031215614f4757600080fd5b83356001600160401b0380821115614f5e57600080fd5b614f6a8783880161497d565b94506020860135915080821115614dc957600080fd5b600060208284031215614f9257600080fd5b81356001600160401b03811115614fa857600080fd5b614fb4848285016149fb565b949350505050565b600060208284031215614fce57600080fd5b81356001600160401b03811115614fe457600080fd5b614fb484828501614a96565b6000806040838503121561500357600080fd5b82356001600160401b038082111561501a57600080fd5b61502686838701614a96565b9350602085013591508082111561503c57600080fd5b50614d85858286016149fb565b60006020828403121561505b57600080fd5b8151613d5f81615b88565b60006020828403121561507857600080fd5b5051919050565b60006020828403121561509157600080fd5b8135613d5f81615b96565b6000602082840312156150ae57600080fd5b8151613d5f81615b96565b6000806000604084860312156150ce57600080fd5b83356001600160401b03808211156150e557600080fd5b9085019060e082880312156150f957600080fd5b9093506020850135908082111561510f57600080fd5b818601915086601f83011261512357600080fd5b81358181111561513257600080fd5b87602082850101111561514457600080fd5b6020830194508093505050509250925092565b60006020828403121561516957600080fd5b81356001600160401b0381111561517f57600080fd5b614fb484828501614b2b565b60006020828403121561519d57600080fd5b81356001600160801b0381168114613d5f57600080fd5b6000602082840312156151c657600080fd5b5035919050565b6000806000606084860312156151e257600080fd5b833592506151f260208501614961565b9150604084013590509250925092565b6000806040838503121561521557600080fd5b8235915060208301356001600160401b0381111561523257600080fd5b614d8585828601614b2b565b6000806040838503121561525157600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b8381101561529057815187529582019590820190600101615274565b509495945050505050565b600081518084526152b38160208601602086016159bf565b601f01601f19169290920160200192915050565b6000815160c084526152dc60c085018261529b565b9050602083015160208501526040830151604085015263ffffffff606084015116606085015260808301511515608085015260a0830151151560a08501528091505092915050565b60006001600160fb1b0383111561533a57600080fd5b8260051b80858437600092019182525092915050565b600082516153628184602087016159bf565b9190910192915050565b600080835481600182811c91508083168061538857607f831692505b60208084108214156153a857634e487b7160e01b86526022600452602486fd5b8180156153bc57600181146153cd576153fa565b60ff198616895284890196506153fa565b60008a81526020902060005b868110156153f25781548b8201529085019083016153d9565b505084890196505b509498975050505050505050565b6001600160a01b0386811682528516602082015260a06040820181905260009061543490830186615260565b82810360608401526154468186615260565b9050828103608084015261545a818561529b565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906154a09083018461529b565b979650505050505050565b604080825283519082018190526000906020906060840190828701845b828110156154ed5781516001600160a01b0316845292840192908401906001016154c8565b505050838103828501526155018186615260565b9695505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561556057603f1988860301845261554e8583516152c7565b94509285019290850190600101615532565b5092979650505050505050565b602081526000613d5f6020830184615260565b6040815260006155936040830185615260565b8281036020840152613d5b8185615260565b602081526000613d5f602083018461529b565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b602081526000613d5f60208301846152c7565b6000808335601e198436030181126158fa57600080fd5b8301803591506001600160401b0382111561591457600080fd5b6020019150600581901b3603821315610bd457600080fd5b60006001600160401b0382111561594557615945615ace565b5060051b60200190565b6000821982111561596257615962615a8c565b500190565b60008261598457634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156159a3576159a3615a8c565b500290565b6000828210156159ba576159ba615a8c565b500390565b60005b838110156159da5781810151838201526020016159c2565b83811115610b4b5750506000910152565b600181811c908216806159ff57607f821691505b602082108114156119e657634e487b7160e01b600052602260045260246000fd5b60c081018181106001600160401b0382111715615a3f57615a3f615ace565b60405250565b601f8201601f191681016001600160401b0381118282101715615a6a57615a6a615ace565b6040525050565b6000600019821415615a8557615a85615a8c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d111561162d5760046000803e5060005160e01c90565b600060443d1015615b0d5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715615b3c57505050505090565b8285019150815181811115615b545750505050505090565b843d8701016020828501011115615b6e5750505050505090565b615b7d60208286010187615a45565b509095945050505050565b8015158114610fb057600080fd5b6001600160e01b031981168114610fb057600080fdfe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212206de29b804151cc564f24c4079c8f1d41232f3c5eb67fb86f0daa4174e700fae264736f6c63430008070033
Deployed Bytecode Sourcemap
129611:337:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32540:230;;;;;;;;;;-1:-1:-1;32540:230:0;;;;;:::i;:::-;;:::i;:::-;;;24508:25:1;;;24496:2;24481:18;32540:230:0;;;;;;;;110036:272;;;;;;;;;;-1:-1:-1;110036:272:0;;;;;:::i;:::-;;:::i;:::-;;;24335:14:1;;24328:22;24310:41;;24298:2;24283:18;110036:272:0;24170:187:1;110787:143:0;;;;;;;;;;-1:-1:-1;110787:143:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;60942:138::-;;;;;;;;;;-1:-1:-1;60942:138:0;;;;;:::i;:::-;;:::i;:::-;;64426:190;;;;;;;;;;-1:-1:-1;64426:190:0;;;;;:::i;:::-;;:::i;110936:373::-;;;;;;;;;;-1:-1:-1;110936:373:0;;;;;:::i;:::-;;:::i;110314:467::-;;;;;;;;;;-1:-1:-1;110314:467:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;21670:32:1;;;21652:51;;21734:2;21719:18;;21712:34;;;;21625:18;110314:467:0;21478:274:1;112261::0;;;;;;;;;;-1:-1:-1;112261:274:0;;;;;:::i;:::-;;:::i;95759:346::-;;;;;;;;;;-1:-1:-1;95759:346:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;61996:193::-;;;;;;;;;;-1:-1:-1;61996:193:0;;;;;:::i;:::-;;:::i;128076:200::-;;;;;;;;;;-1:-1:-1;128076:200:0;;;;;:::i;:::-;;:::i;63302:241::-;;;;;;;;;;-1:-1:-1;63302:241:0;;;;;:::i;:::-;;:::i;62947:349::-;;;:::i;60803:133::-;;;;;;;;;;-1:-1:-1;60803:133:0;;;;;:::i;:::-;;:::i;98324:273::-;;;;;;;;;;-1:-1:-1;98324:273:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;107705:39::-;;;;;;;;;;;;;;;;32936:524;;;;;;;;;;-1:-1:-1;32936:524:0;;;;;:::i;:::-;;:::i;128535:225::-;;;;;;:::i;:::-;;:::i;98941:107::-;;;;;;;;;;-1:-1:-1;98941:107:0;;;;;:::i;:::-;99027:15;;-1:-1:-1;99016:26:0;98941:107;127754:133;;;;;;;;;;;;;:::i;108227:147::-;;;;;;;;;;-1:-1:-1;108227:147:0;;;;;:::i;:::-;;:::i;94599:28::-;;;;;;;;;;-1:-1:-1;94599:28:0;;;;-1:-1:-1;;;;;94599:28:0;;;;;;-1:-1:-1;;;;;19349:32:1;;;19331:51;;19319:2;19304:18;94599:28:0;19185:203:1;49413:358:0;;;;;;;;;;-1:-1:-1;49413:358:0;;;;;:::i;:::-;;:::i;95592:161::-;;;;;;;;;;-1:-1:-1;95592:161:0;;;;;:::i;:::-;-1:-1:-1;;;;;95722:16:0;;;;95696:7;95722:16;;;:7;:16;;;;;;;;:25;;;;;;;;;95592:161;18914:103;;;;;;;;;;;;;:::i;98845:90::-;;;;;;;;;;-1:-1:-1;98914:15:0;;98845:90;;97932:216;;;;;;;;;;-1:-1:-1;97932:216:0;;;;;:::i;:::-;;:::i;111617:388::-;;;;;;;;;;-1:-1:-1;111617:388:0;;;;;:::i;:::-;;:::i;18266:87::-;;;;;;;;;;-1:-1:-1;18339:6:0;;-1:-1:-1;;;;;18339:6:0;18266:87;;33533:155;;;;;;;;;;-1:-1:-1;33533:155:0;;;;;:::i;:::-;;:::i;108115:106::-;;;;;;;;;;-1:-1:-1;108115:106:0;;;;;:::i;:::-;;:::i;98603:236::-;;;;;;;;;;;;;:::i;97380:157::-;;;;;;;;;;-1:-1:-1;97380:157:0;;;;;:::i;:::-;;:::i;61086:112::-;;;;;;;;;;-1:-1:-1;61086:112:0;;;;;:::i;:::-;-1:-1:-1;;;;;61167:17:0;61147:4;61167:17;;;:7;:17;;;;;;;;:25;;:17;:25;;61086:112;62195:439;;;;;;;;;;-1:-1:-1;62195:439:0;;;;;:::i;:::-;;:::i;129704:169::-;;;;;;;;;;-1:-1:-1;129704:169:0;;;;;:::i;:::-;;:::i;111315:296::-;;;;;;:::i;:::-;;:::i;98154:164::-;;;;;;;;;;-1:-1:-1;98154:164:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;33760:168::-;;;;;;;;;;-1:-1:-1;33760:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;33883:27:0;;;33859:4;33883:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;33760:168;97543:383;;;;;;;;;;-1:-1:-1;97543:383:0;;;;;:::i;:::-;;:::i;97222:152::-;;;;;;;;;;-1:-1:-1;97222:152:0;;;;;:::i;:::-;;:::i;112011:244::-;;;;;;;;;;-1:-1:-1;112011:244:0;;;;;:::i;:::-;;:::i;19172:201::-;;;;;;;;;;-1:-1:-1;19172:201:0;;;;;:::i;:::-;;:::i;49079:326::-;;;;;;;;;;-1:-1:-1;49079:326:0;;;;;:::i;:::-;;:::i;62640:301::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;64266:154::-;;;;;;;;;;-1:-1:-1;64266:154:0;;;;;:::i;:::-;;:::i;32540:230::-;32626:7;-1:-1:-1;;;;;32654:21:0;;32646:76;;;;-1:-1:-1;;;32646:76:0;;30275:2:1;32646:76:0;;;30257:21:1;30314:2;30294:18;;;30287:30;30353:34;30333:18;;;30326:62;-1:-1:-1;;;30404:18:1;;;30397:40;30454:19;;32646:76:0;;;;;;;;;-1:-1:-1;32740:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;32740:22:0;;;;;;;;;;;;32540:230::o;110036:272::-;110173:4;-1:-1:-1;;;;;;110203:52:0;;-1:-1:-1;;;110203:52:0;;:99;;;110266:36;110290:11;110266:23;:36::i;:::-;110189:113;110036:272;-1:-1:-1;;110036:272:0:o;110787:143::-;110901:17;;;;:7;:17;;;;;;;;;110884:39;;110848:13;;110884:39;;110901:17;;110884:39;;:::i;:::-;;;;;;;;;;;;;110870:54;;110787:143;;;:::o;60942:138::-;18152:13;:11;:13::i;:::-;-1:-1:-1;;;;;61018:22:0;::::1;61010:31;;;::::0;::::1;;-1:-1:-1::0;;;;;61057:17:0::1;;::::0;;;:7:::1;:17;::::0;;;;61050:24;;-1:-1:-1;;61050:24:0::1;::::0;;60942:138::o;64426:190::-;18339:6;;-1:-1:-1;;;;;18339:6:0;16380:10;61246:23;;:53;;-1:-1:-1;61273:26:0;16380:10;61086:112;:::i;61273:26::-;61238:62;;;;;;64583:27:::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;64583:27:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;64555:25:0;;;:16:::1;:25:::0;;;;:55;;;;-1:-1:-1;;;;;;64555:55:0::1;::::0;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;64555:55:0;;::::1;::::0;64426:190::o;110936:373::-;18339:6;;-1:-1:-1;;;;;18339:6:0;16380:10;61246:23;;:53;;-1:-1:-1;61273:26:0;16380:10;61086:112;:::i;61273:26::-;61238:62;;;;;;111117:7:::1;:14;111095:11;:18;:36;111087:45;;;::::0;::::1;;111167:7;:14;111147:9;:16;:34;111139:43;;;::::0;::::1;;111196:9;111191:113;111215:7;:14;111211:1;:18;111191:113;;;111245:51;111251:11;111263:1;111251:14;;;;;;;;:::i;:::-;;;;;;;111267:9;111277:1;111267:12;;;;;;;;:::i;:::-;;;;;;;111281:7;111289:1;111281:10;;;;;;;;:::i;:::-;;;;;;;111245:51;;;;;;;;;;;::::0;:5:::1;:51::i;:::-;111231:3:::0;::::1;::::0;::::1;:::i;:::-;;;;111191:113;;;;110936:373:::0;;;:::o;110314:467::-;110425:16;110513:26;;;:16;:26;;;;;;;;110476:63;;;;;;;;;;-1:-1:-1;;;;;110476:63:0;;;;;;;;;;;;110425:16;;110550:25;110546:230;;110604:24;;110653:21;;;;110678:4;;110640:34;;:10;:34;:::i;:::-;110639:43;;;;:::i;:::-;110586:105;;;;;;;110546:230;110722:9;;110747:12;;-1:-1:-1;;;;;110722:9:0;;;;110763:4;;110734:25;;:10;:25;:::i;110314:467::-;;;;;;:::o;112261:274::-;112459:4;104618:42;105893:43;:47;105889:483;;-1:-1:-1;;;;;106148:18:0;;106156:10;106148:18;106144:63;;;112472:57:::1;112500:4;112506:2;112510:3;112515:7;112524:4;112472:27;:57::i;:::-;106191:7:::0;;106144:63;106230:67;;-1:-1:-1;;;106230:67:0;;106279:4;106230:67;;;19605:34:1;106286:10:0;19655:18:1;;;19648:43;104618:42:0;;106230:40;;19540:18:1;;106230:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;106215:150;;106325:30;;-1:-1:-1;;;106325:30:0;;106344:10;106325:30;;;19331:51:1;19304:18;;106325:30:0;19185:203:1;106215:150:0;112472:57:::1;112500:4;112506:2;112510:3;112515:7;112524:4;112472:27;:57::i;:::-;112261:274:::0;;;;;;:::o;95759:346::-;95874:16;95902:22;95941:8;:15;-1:-1:-1;;;;;95927:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;95927:30:0;;95902:55;;95969:9;95964:117;95988:5;:12;95984:1;:16;95964:117;;;96027:46;96052:7;96061:8;96070:1;96061:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;95722:16:0;;;;95696:7;95722:16;;;:7;:16;;;;;;;;:25;;;;;;;;;95592:161;96027:46;96016:5;96022:1;96016:8;;;;;;;;:::i;:::-;;;;;;;;;;:57;96002:3;;;;:::i;:::-;;;;95964:117;;;-1:-1:-1;96094:5:0;95759:346;-1:-1:-1;;;95759:346:0:o;61996:193::-;62056:10;61524:42;62056:17;62048:32;;;;-1:-1:-1;;;62048:32:0;;36625:2:1;62048:32:0;;;36607:21:1;36664:1;36644:18;;;36637:29;-1:-1:-1;;;36682:18:1;;;36675:32;36724:18;;62048:32:0;36423:325:1;62048:32:0;61524:42;62087:12;62102;;;:7;:12;;;;:20;;62117:5;;62102:20;:::i;:::-;61524:42;62129:12;;;;:7;:12;;;;;:20;;;62164:7;:10;;62087:35;;-1:-1:-1;62087:35:0;;62129:7;;:12;62172:1;;62164:10;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;62164:10:0;62156:19;;;;;;;;;;;;:27;;:19;;62164:10;62156:27;;;;;:::i;:::-;;;;-1:-1:-1;;;;61996:193:0:o;128076:200::-;126615:4;-1:-1:-1;;;;;126624:6:0;126607:23;;;126599:80;;;;-1:-1:-1;;;126599:80:0;;;;;;;:::i;:::-;126722:6;-1:-1:-1;;;;;126698:30:0;:20;-1:-1:-1;;;;;;;;;;;118407:65:0;-1:-1:-1;;;;;118407:65:0;;118327:153;126698:20;-1:-1:-1;;;;;126698:30:0;;126690:87;;;;-1:-1:-1;;;126690:87:0;;;;;;;:::i;:::-;128160:36:::1;128178:17;128160;:36::i;:::-;128248:12;::::0;;128258:1:::1;128248:12:::0;;;::::1;::::0;::::1;::::0;;;128207:61:::1;::::0;128229:17;;128248:12;128207:21:::1;:61::i;:::-;128076:200:::0;:::o;63302:241::-;18339:6;;-1:-1:-1;;;;;18339:6:0;16380:10;61246:23;;:53;;-1:-1:-1;61273:26:0;16380:10;61086:112;:::i;61273:26::-;61238:62;;;;;;63467:30:::1;::::0;-1:-1:-1;;;63467:30:0;;63491:4:::1;63467:30;::::0;::::1;19331:51:1::0;63430:6:0;;63386:23:::1;::::0;-1:-1:-1;;;;;63467:15:0;::::1;::::0;::::1;::::0;19304:18:1;;63467:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63504:33;::::0;-1:-1:-1;;;63504:33:0;;-1:-1:-1;;;;;21670:32:1;;;63504:33:0::1;::::0;::::1;21652:51:1::0;21719:18;;;21712:34;;;63444:53:0;;-1:-1:-1;63504:14:0;;::::1;::::0;::::1;::::0;21625:18:1;;63504:33:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;63379:164;;63302:241:::0;;:::o;62947:349::-;63009:21;63041:11;;63037:254;;63068:9;63063:221;63087:7;:14;63083:18;;63063:221;;;63119:13;63135:7;:19;63143:7;63151:1;63143:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;63143:10:0;63135:19;;;;;;;;;;;;;;-1:-1:-1;63202:4:0;63183:15;63191:7;63135:19;63183:15;:::i;:::-;63182:24;;;;:::i;:::-;63165:42;;63218:56;63255:7;63263:1;63255:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;63255:10:0;63268:5;63218:28;:56::i;:::-;63108:176;;63103:3;;;;;:::i;:::-;;;;63063:221;;;;62984:312;62947:349::o;60803:133::-;18152:13;:11;:13::i;:::-;-1:-1:-1;;;;;60876:22:0;::::1;60868:31;;;::::0;::::1;;-1:-1:-1::0;;;;;60906:17:0::1;;::::0;;;:7:::1;:17;::::0;;;;:24;;-1:-1:-1;;60906:24:0::1;60926:4;60906:24;::::0;;60803:133::o;98324:273::-;98405:14;98431:21;98467:3;:10;-1:-1:-1;;;;;98455:23:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;98431:47;;98490:9;98485:85;98509:3;:10;98505:1;:14;98485:85;;;98547:7;:15;98555:3;98559:1;98555:6;;;;;;;;:::i;:::-;;;;;;;98547:15;;;;;;;;;;;98535:27;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;98535:27:0;;;-1:-1:-1;;98535:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;98535:27:0;;;;;;;;;;;:9;;:6;;98542:1;;98535:9;;;;;;:::i;:::-;;;;;;:27;;;;98521:3;;;;;:::i;:::-;;;;98485:85;;;-1:-1:-1;98585:6:0;98324:273;-1:-1:-1;;98324:273:0:o;32936:524::-;33092:16;33153:3;:10;33134:8;:15;:29;33126:83;;;;-1:-1:-1;;;33126:83:0;;41363:2:1;33126:83:0;;;41345:21:1;41402:2;41382:18;;;41375:30;41441:34;41421:18;;;41414:62;-1:-1:-1;;;41492:18:1;;;41485:39;41541:19;;33126:83:0;41161:405:1;33126:83:0;33222:30;33269:8;:15;-1:-1:-1;;;;;33255:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33255:30:0;;33222:63;;33303:9;33298:122;33322:8;:15;33318:1;:19;33298:122;;;33378:30;33388:8;33397:1;33388:11;;;;;;;;:::i;:::-;;;;;;;33401:3;33405:1;33401:6;;;;;;;;:::i;:::-;;;;;;;33378:9;:30::i;:::-;33359:13;33373:1;33359:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;33339:3;;;:::i;:::-;;;33298:122;;128535:225;126615:4;-1:-1:-1;;;;;126624:6:0;126607:23;;;126599:80;;;;-1:-1:-1;;;126599:80:0;;;;;;;:::i;:::-;126722:6;-1:-1:-1;;;;;126698:30:0;:20;-1:-1:-1;;;;;;;;;;;118407:65:0;-1:-1:-1;;;;;118407:65:0;;118327:153;126698:20;-1:-1:-1;;;;;126698:30:0;;126690:87;;;;-1:-1:-1;;;126690:87:0;;;;;;;:::i;:::-;128653:36:::1;128671:17;128653;:36::i;:::-;128700:52;128722:17;128741:4;128747;128700:21;:52::i;127754:133::-:0;127832:7;127060:4;-1:-1:-1;;;;;127069:6:0;127052:23;;127044:92;;;;-1:-1:-1;;;127044:92:0;;33395:2:1;127044:92:0;;;33377:21:1;33434:2;33414:18;;;33407:30;33473:34;33453:18;;;33446:62;33544:26;33524:18;;;33517:54;33588:19;;127044:92:0;33193:420:1;127044:92:0;-1:-1:-1;;;;;;;;;;;;127147:1:0::1;127754:133:::0;:::o;108227:147::-;18339:6;;-1:-1:-1;;;;;18339:6:0;16380:10;61246:23;;:53;;-1:-1:-1;61273:26:0;16380:10;61086:112;:::i;61273:26::-;61238:62;;;;;;108328:24:::1;:40:::0;108227:147::o;49413:358::-;-1:-1:-1;;;;;49578:23:0;;16380:10;49578:23;;:66;;-1:-1:-1;49605:39:0;49622:7;16380:10;33760:168;:::i;49605:39::-;49556:162;;;;-1:-1:-1;;;49556:162:0;;;;;;;:::i;:::-;49731:32;49742:7;49751:3;49756:6;49731:10;:32::i;:::-;49413:358;;;:::o;18914:103::-;18152:13;:11;:13::i;:::-;18979:30:::1;19006:1;18979:18;:30::i;:::-;18914:103::o:0;97932:216::-;18339:6;;-1:-1:-1;;;;;18339:6:0;16380:10;61246:23;;:53;;-1:-1:-1;61273:26:0;16380:10;61086:112;:::i;61273:26::-;61238:62;;;;;;98052:9:::1;98047:96;98071:6;:13;98067:1;:17;98047:96;;;98100:35;98112:8;98121:1;98112:11;;;;;;;;:::i;:::-;;;;;;;98125:6;98132:1;98125:9;;;;;;;;:::i;:::-;;;;;;;98100:11;:35::i;:::-;98086:3:::0;::::1;::::0;::::1;:::i;:::-;;;;98047:96;;111617:388:::0;111694:16;111730:9;111737:1;99027:15;;-1:-1:-1;99016:26:0;98941:107;111730:9;111722:37;;;;-1:-1:-1;;;111722:37:0;;36281:2:1;111722:37:0;;;36263:21:1;36320:2;36300:18;;;36293:30;-1:-1:-1;;;36339:18:1;;;36332:45;36394:18;;111722:37:0;36079:339:1;111722:37:0;111766:25;111808:15;98914;;;98845:90;111808:15;-1:-1:-1;;;;;111794:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;111794:30:0;;111766:58;;111836:9;111831:147;98914:15;;111851:1;:19;111831:147;;;111886:22;111911;111921:8;111931:1;111911:9;:22::i;:::-;111886:47;;111956:14;111942:8;111951:1;111942:11;;;;;;;;:::i;:::-;;;;;;;;;;:28;-1:-1:-1;111872:3:0;;;;:::i;:::-;;;;111831:147;;33533:155;33628:52;16380:10;33661:8;33671;33628:18;:52::i;108115:106::-;18152:13;:11;:13::i;:::-;108185::::1;:30:::0;;-1:-1:-1;;;;;;108185:30:0::1;-1:-1:-1::0;;;;;108185:30:0;;;::::1;::::0;;;::::1;::::0;;108115:106::o;98603:236::-;98645:14;98668:21;98704:15;;-1:-1:-1;;;;;98692:28:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;98668:52;;98732:9;98727:85;98751:15;;98747:1;:19;98727:85;;;98794:10;;;;:7;:10;;;;;;;98782:22;;;;;;;;;;;;98794:10;;98782:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;98782:22:0;;;-1:-1:-1;;98782:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;98782:22:0;;;;;;;;;;;:9;;:6;;98789:1;;98782:9;;;;;;:::i;:::-;;;;;;:22;;;;98768:3;;;;;:::i;:::-;;;;98727:85;;;-1:-1:-1;98827:6:0;98603:236;-1:-1:-1;98603:236:0:o;97380:157::-;18339:6;;-1:-1:-1;;;;;18339:6:0;16380:10;61246:23;;:53;;-1:-1:-1;61273:26:0;16380:10;61086:112;:::i;61273:26::-;61238:62;;;;;;97457:9:::1;97452:80;97476:6;:13;97472:1;:17;97452:80;;;97505:19;97514:6;97521:1;97514:9;;;;;;;;:::i;:::-;;;;;;;97505:8;:19::i;:::-;97491:3:::0;::::1;::::0;::::1;:::i;:::-;;;;97452:80;;62195:439:::0;18339:6;;-1:-1:-1;;;;;18339:6:0;16380:10;61246:23;;:53;;-1:-1:-1;61273:26:0;16380:10;61086:112;:::i;61273:26::-;61238:62;;;;;;62339:1:::1;62322:88;62346:7;:14:::0;62342:18;::::1;62322:88;;;62383:7;:19;62391:7;62399:1;62391:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;62391:10:0::1;62383:19:::0;;;::::1;::::0;;;;;;;;62376:26;62362:3;::::1;::::0;::::1;:::i;:::-;;;;62322:88;;;-1:-1:-1::0;62440:17:0;;:21:::1;::::0;62460:1:::1;62440:21;:::i;:::-;-1:-1:-1::0;;;;;62426:36:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;62426:36:0::1;-1:-1:-1::0;62416:46:0;;::::1;::::0;:7:::1;::::0;:46:::1;::::0;;::::1;::::0;::::1;:::i;:::-;;61524:42;62469:7;62477:1;62469:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;:16:::0;;-1:-1:-1;;;;;;62469:16:0::1;-1:-1:-1::0;;;;;62469:16:0;;;::::1;::::0;;;::::1;::::0;;;62492:137:::1;62516:10;:17;62512:1;:21;62492:137;;;62574:5;62580:1;62574:8;;;;;;;;:::i;:::-;;;;;;;62549:7;:22;62557:10;62568:1;62557:13;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;62549:22:0::1;-1:-1:-1::0;;;;;62549:22:0::1;;;;;;;;;;;;:33;;;;62608:10;62619:1;62608:13;;;;;;;;:::i;:::-;;;;;;;62591:7;62599:1;62603;62599:5;;;;:::i;:::-;62591:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:30:::0;;-1:-1:-1;;;;;;62591:30:0::1;-1:-1:-1::0;;;;;62591:30:0;;;::::1;::::0;;;::::1;::::0;;62535:3;::::1;::::0;::::1;:::i;:::-;;;;62492:137;;129704:169:::0;11974:19;11997:13;;;;;;11996:14;;12044:34;;;;-1:-1:-1;12062:12:0;;12077:1;12062:12;;;;:16;12044:34;12043:108;;;-1:-1:-1;12123:4:0;1631:19;:23;;;12084:66;;-1:-1:-1;12133:12:0;;;;;:17;12084:66;12021:204;;;;-1:-1:-1;;;12021:204:0;;34636:2:1;12021:204:0;;;34618:21:1;34675:2;34655:18;;;34648:30;34714:34;34694:18;;;34687:62;-1:-1:-1;;;34765:18:1;;;34758:44;34819:19;;12021:204:0;34434:410:1;12021:204:0;12236:12;:16;;-1:-1:-1;;12236:16:0;12251:1;12236:16;;;12263:67;;;;12298:13;:20;;-1:-1:-1;;12298:20:0;;;;;12263:67;129808:59:::1;129839:14;129855:11;129808:30;:59::i;:::-;12356:14:::0;12352:102;;;12403:5;12387:21;;-1:-1:-1;;12387:21:0;;;12428:14;;-1:-1:-1;26374:36:1;;12428:14:0;;26362:2:1;26347:18;12428:14:0;;;;;;;11963:498;129704:169;;:::o;111315:296::-;56777:21;:19;:21::i;:::-;95370:10:::1;::::0;::::1;;95362:19;::::0;;;:7:::1;:19;::::0;;;;;111480:9;;111491;;;;95362:19:::1;;95361:20;95353:35;;;::::0;-1:-1:-1;;;95353:35:0;;38060:2:1;95353:35:0::1;::::0;::::1;38042:21:1::0;38099:1;38079:18;;;38072:29;-1:-1:-1;;;38117:18:1;;;38110:32;38159:18;;95353:35:0::1;37858:325:1::0;95353:35:0::1;95421:14;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;95403:32:0::1;:15;:32;95395:47;;;::::0;-1:-1:-1;;;95395:47:0;;29945:2:1;95395:47:0::1;::::0;::::1;29927:21:1::0;29984:1;29964:18;;;29957:29;-1:-1:-1;;;30002:18:1;;;29995:32;30044:18;;95395:47:0::1;29743:325:1::0;95395:47:0::1;95459:10;::::0;::::1;;95451:19;::::0;;;:7:::1;:19;::::0;;;;:26;;-1:-1:-1;;95451:26:0::1;95473:4;95451:26;::::0;;:19;95517:24:::1;95459:4:::0;95530:10;;95517:6:::1;:24::i;:::-;95484:57;;;;95556:7;95548:22;;;::::0;-1:-1:-1;;;95548:22:0;;37730:2:1;95548:22:0::1;::::0;::::1;37712:21:1::0;37769:1;37749:18;;;37742:29;-1:-1:-1;;;37787:18:1;;;37780:32;37829:18;;95548:22:0::1;37528:325:1::0;95548:22:0::1;111518:9:::0;109423:10:::2;109407:12;;::::0;::::2;111518:9:::0;109407:12:::2;:::i;:::-;-1:-1:-1::0;;;;;109407:26:0::2;;109399:72;;;::::0;-1:-1:-1;;;109399:72:0;;27609:2:1;109399:72:0::2;::::0;::::2;27591:21:1::0;27648:2;27628:18;;;27621:30;27687:34;27667:18;;;27660:62;-1:-1:-1;;;27738:18:1;;;27731:31;27779:19;;109399:72:0::2;27407:397:1::0;109399:72:0::2;109514:4;109484:18;::::0;;;::::2;::::0;::::2;;:::i;:::-;-1:-1:-1::0;;;;;109484:35:0::2;;109480:253;;;109551:9;:14;;;109538:9;:27;;109530:61;;;::::0;-1:-1:-1;;;109530:61:0;;39152:2:1;109530:61:0::2;::::0;::::2;39134:21:1::0;39191:2;39171:18;;;39164:30;-1:-1:-1;;;39210:18:1;;;39203:51;39271:18;;109530:61:0::2;38950:345:1::0;109530:61:0::2;109480:253;;;109614:12;109636:18;::::0;;;::::2;::::0;::::2;;:::i;:::-;109664:61;::::0;-1:-1:-1;;;109664:61:0;;109683:10:::2;109664:61;::::0;::::2;20773:34:1::0;109703:4:0::2;20823:18:1::0;;;20816:43;109710:14:0::2;::::0;::::2;;20875:18:1::0;;;20868:34;109614:41:0;;-1:-1:-1;;;;;;109664:18:0;::::2;::::0;::::2;::::0;20708::1;;109664:61:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;109605:128;109480:253;109741:12;109756:18;;::::0;::::2;:9:::0;:18:::2;:::i;:::-;:25;;109741:40;;109793:9;109788:227;109812:4;109808:1;:8;109788:227;;;109832:19;109854:31;109863:18;;::::0;::::2;:9:::0;:18:::2;:::i;:::-;109882:1;109863:21;;;;;;;:::i;:::-;;;;;;;109854:8;:31::i;:::-;109951:16;::::0;::::2;::::0;109832:53;;-1:-1:-1;109928:16:0::2;;::::0;::::2;:9:::0;:16:::2;:::i;:::-;109945:1;109928:19;;;;;;;:::i;:::-;;;;;;;109912:6;:13;;;:35;;;;:::i;:::-;:55;;109894:113;;;::::0;-1:-1:-1;;;109894:113:0;;39502:2:1;109894:113:0::2;::::0;::::2;39484:21:1::0;39541:2;39521:18;;;39514:30;-1:-1:-1;;;39560:18:1;;;39553:48;39618:18;;109894:113:0::2;39300:342:1::0;109894:113:0::2;-1:-1:-1::0;109818:3:0;::::2;::::0;::::2;:::i;:::-;;;;109788:227;;;-1:-1:-1::0;111539:66:0::3;111550:12;;::::0;::::3;:9:::0;:12:::3;:::i;:::-;111564:18;;::::0;::::3;:9:::0;:18:::3;:::i;:::-;111539:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;::::0;;;;-1:-1:-1;111584:16:0::3;::::0;-1:-1:-1;;;111584:16:0::3;::::0;::::3;::::0;::::3;:::i;:::-;111539:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;::::0;;;-1:-1:-1;111539:66:0::3;::::0;;::::3;::::0;::::3;::::0;;;;;;;-1:-1:-1;111539:10:0::3;::::0;-1:-1:-1;;111539:66:0:i:3;:::-;109392:638:::2;95579:1;95346:240:::1;;56809:1;;;56821:20:::0;56038:1;57341:7;:22;57158:213;98154:164;98211:12;;:::i;:::-;98240:16;98247:8;99027:15;;-1:-1:-1;99016:26:0;98941:107;98240:16;98232:49;;;;-1:-1:-1;;;98232:49:0;;32344:2:1;98232:49:0;;;32326:21:1;32383:2;32363:18;;;32356:30;-1:-1:-1;;;32402:18:1;;;32395:50;32462:18;;98232:49:0;32142:344:1;98232:49:0;98295:17;;;;:7;:17;;;;;;;98288:24;;;;;;;;;;;;98295:17;;98288:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;98288:24:0;;;-1:-1:-1;;98288:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;98288:24:0;;;;;;;;;;;;98154:164;-1:-1:-1;;98154:164:0:o;97543:383::-;18339:6;;-1:-1:-1;;;;;18339:6:0;16380:10;61246:23;;:53;;-1:-1:-1;61273:26:0;16380:10;61086:112;:::i;61273:26::-;61238:62;;;;;;97654:16:::1;97661:8;99027:15:::0;;-1:-1:-1;99016:26:0;98941:107;97654:16:::1;97646:49;;;::::0;-1:-1:-1;;;97646:49:0;;32344:2:1;97646:49:0::1;::::0;::::1;32326:21:1::0;32383:2;32363:18;;;32356:30;-1:-1:-1;;;32402:18:1;;;32395:50;32462:18;;97646:49:0::1;32142:344:1::0;97646:49:0::1;97738:17;::::0;;;:7:::1;:17;::::0;;;;;;;:24:::1;;::::0;97718:16;;::::1;::::0;:44:::1;;97702:104;;;::::0;-1:-1:-1;;;97702:104:0;;38390:2:1;97702:104:0::1;::::0;::::1;38372:21:1::0;38429:2;38409:18;;;38402:30;38468:28;38448:18;;;38441:56;38514:18;;97702:104:0::1;38188:350:1::0;97702:104:0::1;97838:17;::::0;;;:7:::1;:17;::::0;;;;;;:24:::1;;::::0;97821:13;;::::1;::::0;:41:::1;97813:74;;;::::0;-1:-1:-1;;;97813:74:0;;28371:2:1;97813:74:0::1;::::0;::::1;28353:21:1::0;28410:2;28390:18;;;28383:30;-1:-1:-1;;;28429:18:1;;;28422:50;28489:18;;97813:74:0::1;28169:344:1::0;97813:74:0::1;97894:17;::::0;;;:7:::1;:17;::::0;;;;;;;:26;;;;97914:6;;97894:26:::1;::::0;:17;;:26;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;97894:26:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;;97894:26:0::1;-1:-1:-1::0;;97894:26:0;::::1;;::::0;::::1;-1:-1:-1::0;;97894:26:0;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;::::1;;::::0;;-1:-1:-1;;97543:383:0:o;97222:152::-;18339:6;;-1:-1:-1;;;;;18339:6:0;16380:10;61246:23;;:53;;-1:-1:-1;61273:26:0;16380:10;61086:112;:::i;61273:26::-;61238:62;;;;;;97299:15:::1;::::0;97291:24:::1;::::0;;;:7:::1;:24;::::0;;;;;;;:33;;;;97318:6;;97291:33:::1;::::0;:24;;:33;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;97291:33:0::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;;97291:33:0::1;-1:-1:-1::0;;97291:33:0;::::1;;::::0;::::1;-1:-1:-1::0;;97291:33:0;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;97349:15:::1;::::0;:19:::1;::::0;::::1;:::i;:::-;97331:15;:37:::0;-1:-1:-1;97222:152:0:o;112011:244::-;112181:4;104618:42;105893:43;:47;105889:483;;-1:-1:-1;;;;;106148:18:0;;106156:10;106148:18;106144:63;;;112194:55:::1;112217:4;112223:2;112227:7;112236:6;112244:4;112194:22;:55::i;106144:63::-:0;106230:67;;-1:-1:-1;;;106230:67:0;;106279:4;106230:67;;;19605:34:1;106286:10:0;19655:18:1;;;19648:43;104618:42:0;;106230:40;;19540:18:1;;106230:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;106215:150;;106325:30;;-1:-1:-1;;;106325:30:0;;106344:10;106325:30;;;19331:51:1;19304:18;;106325:30:0;19185:203:1;106215:150:0;112194:55:::1;112217:4;112223:2;112227:7;112236:6;112244:4;112194:22;:55::i;19172:201::-:0;18152:13;:11;:13::i;:::-;-1:-1:-1;;;;;19261:22:0;::::1;19253:73;;;::::0;-1:-1:-1;;;19253:73:0;;28720:2:1;19253:73:0::1;::::0;::::1;28702:21:1::0;28759:2;28739:18;;;28732:30;28798:34;28778:18;;;28771:62;-1:-1:-1;;;28849:18:1;;;28842:36;28895:19;;19253:73:0::1;28518:402:1::0;19253:73:0::1;19337:28;19356:8;19337:18;:28::i;49079:326::-:0;-1:-1:-1;;;;;49219:23:0;;16380:10;49219:23;;:66;;-1:-1:-1;49246:39:0;49263:7;16380:10;33760:168;:::i;49246:39::-;49197:162;;;;-1:-1:-1;;;49197:162:0;;;;;;;:::i;:::-;49372:25;49378:7;49387:2;49391:5;49372;:25::i;62640:301::-;62704:16;62722;62750:23;62790:7;:14;;;;-1:-1:-1;;;;;62776:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62776:29:0;;62750:55;;62817:9;62812:93;62836:7;:14;62832:18;;62812:93;;;62878:7;:19;62886:7;62894:1;62886:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;62886:10:0;62878:19;;;;;;;;;;;;;62866:9;;:6;;62873:1;;62866:9;;;;;;:::i;:::-;;;;;;;;;;:31;62852:3;;;;:::i;:::-;;;;62812:93;;;;62919:7;62928:6;62911:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62911:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;62640:301;;:::o;64266:154::-;18339:6;;-1:-1:-1;;;;;18339:6:0;16380:10;61246:23;;:53;;-1:-1:-1;61273:26:0;16380:10;61086:112;:::i;61273:26::-;61238:62;;;;;;64366:9:::1;:22:::0;;-1:-1:-1;;;;;;64366:22:0::1;-1:-1:-1::0;;;;;64366:22:0;;;::::1;::::0;;;::::1;::::0;;;64395:12:::1;:19:::0;64266:154::o;31519:354::-;31643:4;-1:-1:-1;;;;;;31680:52:0;;-1:-1:-1;;;31680:52:0;;:132;;-1:-1:-1;;;;;;;31749:63:0;;-1:-1:-1;;;31749:63:0;31680:132;:185;;;-1:-1:-1;;;;;;;;;;29778:51:0;;;31829:36;29669:168;18431:132;18339:6;;-1:-1:-1;;;;;18339:6:0;16380:10;18495:23;18487:68;;;;-1:-1:-1;;;18487:68:0;;37369:2:1;18487:68:0;;;37351:21:1;;;37388:18;;;37381:30;37447:34;37427:18;;;37420:62;37499:18;;18487:68:0;37167:356:1;39181:729:0;-1:-1:-1;;;;;39334:16:0;;39326:62;;;;-1:-1:-1;;;39326:62:0;;;;;;;:::i;:::-;16380:10;39401:16;39466:21;39484:2;39466:17;:21::i;:::-;39443:44;;39498:24;39525:25;39543:6;39525:17;:25::i;:::-;39498:52;;39563:66;39584:8;39602:1;39606:2;39610:3;39615:7;39624:4;39563:20;:66::i;:::-;39642:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;39642:17:0;;;;;;;;;:27;;39663:6;;39642:13;:27;;39663:6;;39642:27;:::i;:::-;;;;-1:-1:-1;;39685:52:0;;;43776:25:1;;;43832:2;43817:18;;43810:34;;;-1:-1:-1;;;;;39685:52:0;;;;39718:1;;39685:52;;;;;;43749:18:1;39685:52:0;;;;;;;39828:74;39859:8;39877:1;39881:2;39885;39889:6;39897:4;39828:30;:74::i;:::-;39315:595;;;39181:729;;;;:::o;34483:438::-;-1:-1:-1;;;;;34716:20:0;;16380:10;34716:20;;:60;;-1:-1:-1;34740:36:0;34757:4;16380:10;33760:168;:::i;34740:36::-;34694:156;;;;-1:-1:-1;;;34694:156:0;;;;;;;:::i;:::-;34861:52;34884:4;34890:2;34894:3;34899:7;34908:4;34861:22;:52::i;129879:66::-;18152:13;:11;:13::i;119745:992::-;117698:66;120199:59;;;120195:535;;;120275:37;120294:17;120275:18;:37::i;120195:535::-;120378:17;-1:-1:-1;;;;;120349:61:0;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;120349:63:0;;;;;;;;-1:-1:-1;;120349:63:0;;;;;;;;;;;;:::i;:::-;;;120345:306;;120579:56;;-1:-1:-1;;;120579:56:0;;35866:2:1;120579:56:0;;;35848:21:1;35905:2;35885:18;;;35878:30;35944:34;35924:18;;;35917:62;-1:-1:-1;;;35995:18:1;;;35988:44;36049:19;;120579:56:0;35664:410:1;120345:306:0;-1:-1:-1;;;;;;;;;;;120463:28:0;;120455:82;;;;-1:-1:-1;;;120455:82:0;;34226:2:1;120455:82:0;;;34208:21:1;34265:2;34245:18;;;34238:30;34304:34;34284:18;;;34277:62;-1:-1:-1;;;34355:18:1;;;34348:39;34404:19;;120455:82:0;34024:405:1;120455:82:0;120413:140;120665:53;120683:17;120702:4;120708:9;120665:17;:53::i;2597:317::-;2712:6;2687:21;:31;;2679:73;;;;-1:-1:-1;;;2679:73:0;;32693:2:1;2679:73:0;;;32675:21:1;32732:2;32712:18;;;32705:30;32771:31;32751:18;;;32744:59;32820:18;;2679:73:0;32491:353:1;2679:73:0;2766:12;2784:9;-1:-1:-1;;;;;2784:14:0;2806:6;2784:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2765:52;;;2836:7;2828:78;;;;-1:-1:-1;;;2828:78:0;;31101:2:1;2828:78:0;;;31083:21:1;31140:2;31120:18;;;31113:30;31179:34;31159:18;;;31152:62;31250:28;31230:18;;;31223:56;31296:19;;2828:78:0;30899:422:1;42482:969:0;-1:-1:-1;;;;;42634:18:0;;42626:66;;;;-1:-1:-1;;;42626:66:0;;;;;;;:::i;:::-;42725:7;:14;42711:3;:10;:28;42703:81;;;;-1:-1:-1;;;42703:81:0;;;;;;;:::i;:::-;42797:16;16380:10;42797:31;;42841:66;42862:8;42872:4;42886:1;42890:3;42895:7;42841:66;;;;;;;;;;;;:20;:66::i;:::-;42925:9;42920:373;42944:3;:10;42940:1;:14;42920:373;;;42976:10;42989:3;42993:1;42989:6;;;;;;;;:::i;:::-;;;;;;;42976:19;;43010:14;43027:7;43035:1;43027:10;;;;;;;;:::i;:::-;;;;;;;;;;;;43054:19;43076:13;;;:9;:13;;;;;;-1:-1:-1;;;;;43076:19:0;;;;;;;;;;;;43027:10;;-1:-1:-1;43118:21:0;;;;43110:70;;;;-1:-1:-1;;;43110:70:0;;;;;;;:::i;:::-;43224:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;43224:19:0;;;;;;;;;;43246:20;;43224:42;;42956:3;;;;:::i;:::-;;;;42920:373;;;;43348:1;-1:-1:-1;;;;;43310:55:0;43334:4;-1:-1:-1;;;;;43310:55:0;43324:8;-1:-1:-1;;;;;43310:55:0;;43352:3;43357:7;43310:55;;;;;;;:::i;:::-;;;;;;;;43378:65;;;;;;;;;43422:1;43378:65;;;112261:274;19533:191;19626:6;;;-1:-1:-1;;;;;19643:17:0;;;-1:-1:-1;;;;;;19643:17:0;;;;;;;19676:40;;19626:6;;;19643:17;19626:6;;19676:40;;19607:16;;19676:40;19596:128;19533:191;:::o;43594:331::-;43749:8;-1:-1:-1;;;;;43740:17:0;:5;-1:-1:-1;;;;;43740:17:0;;;43732:71;;;;-1:-1:-1;;;43732:71:0;;40953:2:1;43732:71:0;;;40935:21:1;40992:2;40972:18;;;40965:30;41031:34;41011:18;;;41004:62;-1:-1:-1;;;41082:18:1;;;41075:39;41131:19;;43732:71:0;40751:405:1;43732:71:0;-1:-1:-1;;;;;43814:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;43814:46:0;;;;;;;;;;43876:41;;24310::1;;;43876::0;;24283:18:1;43876:41:0;;;;;;;43594:331;;;:::o;107751:358::-;14117:13;;;;;;;14109:69;;;;-1:-1:-1;;;14109:69:0;;;;;;;:::i;:::-;107884:18:::1;;;;;;;;;;;;::::0;:14:::1;:18::i;:::-;107909:16;:14;:16::i;:::-;107932:24;:22;:24::i;:::-;107963:51;107999:14;107963:35;:51::i;:::-;108021:43;108052:11;108021:30;:43::i;:::-;108071:32;:30;:32::i;56857:293::-:0;56082:1;56991:7;;:19;;56983:63;;;;-1:-1:-1;;;56983:63:0;;42584:2:1;56983:63:0;;;42566:21:1;42623:2;42603:18;;;42596:30;42662:33;42642:18;;;42635:61;42713:18;;56983:63:0;42382:355:1;56983:63:0;56082:1;57124:7;:18;56857:293::o;96111:249::-;96225:12;96239:14;96274:33;96290:4;96296:10;;96274:15;:33::i;:::-;96332:13;;-1:-1:-1;;;;;96322:23:0;;;96332:13;;96322:23;;-1:-1:-1;96265:42:0;-1:-1:-1;96111:249:0;;;;;;:::o;40313:813::-;-1:-1:-1;;;;;40491:16:0;;40483:62;;;;-1:-1:-1;;;40483:62:0;;;;;;;:::i;:::-;40578:7;:14;40564:3;:10;:28;40556:81;;;;-1:-1:-1;;;40556:81:0;;;;;;;:::i;:::-;16380:10;40694:66;16380:10;40650:16;40737:2;40741:3;40746:7;40755:4;40694:20;:66::i;:::-;40778:9;40773:103;40797:3;:10;40793:1;:14;40773:103;;;40854:7;40862:1;40854:10;;;;;;;;:::i;:::-;;;;;;;40829:9;:17;40839:3;40843:1;40839:6;;;;;;;;:::i;:::-;;;;;;;40829:17;;;;;;;;;;;:21;40847:2;-1:-1:-1;;;;;40829:21:0;-1:-1:-1;;;;;40829:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;40809:3:0;;-1:-1:-1;40809:3:0;;;:::i;:::-;;;;40773:103;;;;40929:2;-1:-1:-1;;;;;40893:53:0;40925:1;-1:-1:-1;;;;;40893:53:0;40907:8;-1:-1:-1;;;;;40893:53:0;;40933:3;40938:7;40893:53;;;;;;;:::i;:::-;;;;;;;;41037:81;41073:8;41091:1;41095:2;41099:3;41104:7;41113:4;41037:35;:81::i;34000:406::-;-1:-1:-1;;;;;34208:20:0;;16380:10;34208:20;;:60;;-1:-1:-1;34232:36:0;34249:4;16380:10;33760:168;:::i;34232:36::-;34186:156;;;;-1:-1:-1;;;34186:156:0;;;;;;;:::i;:::-;34353:45;34371:4;34377:2;34381;34385:6;34393:4;34353:17;:45::i;41424:808::-;-1:-1:-1;;;;;41551:18:0;;41543:66;;;;-1:-1:-1;;;41543:66:0;;;;;;;:::i;:::-;16380:10;41622:16;41687:21;41705:2;41687:17;:21::i;:::-;41664:44;;41719:24;41746:25;41764:6;41746:17;:25::i;:::-;41719:52;;41784:66;41805:8;41815:4;41829:1;41833:3;41838:7;41784:66;;;;;;;;;;;;:20;:66::i;:::-;41863:19;41885:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;41885:19:0;;;;;;;;;;41923:21;;;;41915:70;;;;-1:-1:-1;;;41915:70:0;;;;;;;:::i;:::-;42021:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;42021:19:0;;;;;;;;;;;;42043:20;;;42021:42;;42092:54;;43776:25:1;;;43817:18;;;43810:34;;;42021:19:0;;42092:54;;;;;;43749:18:1;42092:54:0;;;;;;;42159:65;;;;;;;;;42203:1;42159:65;;;112261:274;47904:198;48024:16;;;48038:1;48024:16;;;;;;;;;47970;;47999:22;;48024:16;;;;;;;;;;;;-1:-1:-1;48024:16:0;47999:41;;48062:7;48051:5;48057:1;48051:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;48089:5;47904:198;-1:-1:-1;;47904:198:0:o;108380:947::-;108606:9;108601:646;108625:3;:10;108621:1;:14;108601:646;;;108651:18;108672:16;108681:3;108685:1;108681:6;;;;;;;;:::i;:::-;;;;;;;108672:8;:16::i;:::-;108651:37;-1:-1:-1;;;;;;108701:18:0;;;108697:92;;108741:5;:18;;;108740:19;108732:47;;;;-1:-1:-1;;;108732:47:0;;33051:2:1;108732:47:0;;;33033:21:1;33090:2;33070:18;;;33063:30;-1:-1:-1;;;33109:18:1;;;33102:45;33164:18;;108732:47:0;32849:339:1;108732:47:0;-1:-1:-1;;;;;108803:18:0;;108799:441;;108843:5;:12;;;108842:13;108834:38;;;;-1:-1:-1;;;108834:38:0;;40612:2:1;108834:38:0;;;40594:21:1;40651:2;40631:18;;;40624:30;-1:-1:-1;;;40670:18:1;;;40663:42;40722:18;;108834:38:0;40410:336:1;108834:38:0;108908:18;;;;108885:41;;108941:17;108937:87;;-1:-1:-1;108988:24:0;;108937:87;109078:7;109086:1;109078:10;;;;;;;;:::i;:::-;;;;;;;109056:7;:11;109064:2;-1:-1:-1;;;;;109056:11:0;-1:-1:-1;;;;;109056:11:0;;;;;;;;;;;;:19;109068:3;109072:1;109068:6;;;;;;;;:::i;:::-;;;;;;;109056:19;;;;;;;;;;;;:32;;;;:::i;:::-;-1:-1:-1;;;;;109034:11:0;;;;;;:7;:11;;;;;109046:6;;109034:11;;;109046:3;;109050:1;;109046:6;;;;;;:::i;:::-;;;;;;;109034:19;;;;;;;;;;;:54;;;;109130:12;109107:7;:11;109115:2;-1:-1:-1;;;;;109107:11:0;-1:-1:-1;;;;;109107:11:0;;;;;;;;;;;;:19;109119:3;109123:1;109119:6;;;;;;;;:::i;:::-;;;;;;;109107:19;;;;;;;;;;;;:35;;109099:70;;;;-1:-1:-1;;;109099:70:0;;39849:2:1;109099:70:0;;;39831:21:1;39888:2;39868:18;;;39861:30;-1:-1:-1;;;39907:18:1;;;39900:52;39969:18;;109099:70:0;39647:346:1;109099:70:0;109220:7;109228:1;109220:10;;;;;;;;:::i;:::-;;;;;;;109205:5;:12;;;:25;;;;:::i;:::-;109180:7;:15;109188:3;109192:1;109188:6;;;;;;;;:::i;:::-;;;;;;;109180:15;;;;;;;;;;;:22;;:50;;;;108823:417;108799:441;-1:-1:-1;108637:3:0;;;;:::i;:::-;;;;108601:646;;;;109255:66;112261:274;46287:766;-1:-1:-1;;;;;46502:13:0;;1631:19;:23;46498:548;;46538:83;;-1:-1:-1;;;46538:83:0;;-1:-1:-1;;;;;46538:49:0;;;;;:83;;46588:8;;46598:4;;46604:2;;46608:6;;46616:4;;46538:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46538:83:0;;;;;;;;-1:-1:-1;;46538:83:0;;;;;;;;;;;;:::i;:::-;;;46534:501;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;46908:6;46901:14;;-1:-1:-1;;;46901:14:0;;;;;;;;:::i;46534:501::-;;;46957:62;;-1:-1:-1;;;46957:62:0;;42944:2:1;46957:62:0;;;42926:21:1;42983:2;42963:18;;;42956:30;43022:34;43002:18;;;42995:62;-1:-1:-1;;;43073:18:1;;;43066:50;43133:19;;46957:62:0;42742:416:1;46534:501:0;-1:-1:-1;;;;;;46671:66:0;;-1:-1:-1;;;46671:66:0;46667:165;;46762:50;;-1:-1:-1;;;46762:50:0;;;;;;;:::i;36717:1146::-;36944:7;:14;36930:3;:10;:28;36922:81;;;;-1:-1:-1;;;36922:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37022:16:0;;37014:66;;;;-1:-1:-1;;;37014:66:0;;;;;;;:::i;:::-;16380:10;37137:60;16380:10;37168:4;37174:2;37178:3;37183:7;37192:4;37137:20;:60::i;:::-;37215:9;37210:421;37234:3;:10;37230:1;:14;37210:421;;;37266:10;37279:3;37283:1;37279:6;;;;;;;;:::i;:::-;;;;;;;37266:19;;37300:14;37317:7;37325:1;37317:10;;;;;;;;:::i;:::-;;;;;;;;;;;;37344:19;37366:13;;;:9;:13;;;;;;-1:-1:-1;;;;;37366:19:0;;;;;;;;;;;;37317:10;;-1:-1:-1;37408:21:0;;;;37400:76;;;;-1:-1:-1;;;37400:76:0;;;;;;;:::i;:::-;37520:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;37520:19:0;;;;;;;;;;37542:20;;;37520:42;;37592:17;;;;;;;:27;;37542:20;;37520:13;37592:27;;37542:20;;37592:27;:::i;:::-;;;;;;;;37251:380;;;37246:3;;;;:::i;:::-;;;37210:421;;;;37678:2;-1:-1:-1;;;;;37648:47:0;37672:4;-1:-1:-1;;;;;37648:47:0;37662:8;-1:-1:-1;;;;;37648:47:0;;37682:3;37687:7;37648:47;;;;;;;:::i;:::-;;;;;;;;37780:75;37816:8;37826:4;37832:2;37836:3;37841:7;37850:4;37780:35;:75::i;118576:284::-;-1:-1:-1;;;;;1631:19:0;;;118650:106;;;;-1:-1:-1;;;118650:106:0;;36955:2:1;118650:106:0;;;36937:21:1;36994:2;36974:18;;;36967:30;37033:34;37013:18;;;37006:62;-1:-1:-1;;;37084:18:1;;;37077:43;37137:19;;118650:106:0;36753:409:1;118650:106:0;-1:-1:-1;;;;;;;;;;;118767:85:0;;-1:-1:-1;;;;;;118767:85:0;-1:-1:-1;;;;;118767:85:0;;;;;;;;;;118576:284::o;119269:297::-;119412:29;119423:17;119412:10;:29::i;:::-;119470:1;119456:4;:11;:15;:28;;;;119475:9;119456:28;119452:107;;;119501:46;119523:17;119542:4;119501:21;:46::i;31208:119::-;14117:13;;;;;;;14109:69;;;;-1:-1:-1;;;14109:69:0;;;;;;;:::i;:::-;31289:30:::1;31314:4;31289:24;:30::i;17809:97::-:0;14117:13;;;;;;;14109:69;;;;-1:-1:-1;;;14109:69:0;;;;;;;:::i;:::-;17872:26:::1;:24;:26::i;48919:68::-:0;14117:13;;;;;;;14109:69;;;;-1:-1:-1;;;14109:69:0;;;;;;;:::i;95028:208::-;14117:13;;;;;;;14109:69;;;;-1:-1:-1;;;14109:69:0;;;;;;;:::i;:::-;95143:50:::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;95143:50:0::1;;::::0;:13:::1;:50::i;61653:141::-:0;14117:13;;;;;;;14109:69;;;;-1:-1:-1;;;14109:69:0;;;;;;;:::i;:::-;61760:28:::1;61776:11;61760:15;:28::i;107079:181::-:0;14117:13;;;;;;;14109:69;;;;-1:-1:-1;;;14109:69:0;;;;;;;:::i;:::-;107154:100:::1;107029:42;107243:4;107154:51;:100::i;96366:549::-:0;96489:7;;96522:329;94674:155;96611:7;;;;:4;:7;:::i;:::-;96658:13;;;;:4;:13;:::i;:::-;96641:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;96631:42;;;;;;96713:4;:11;;;;;;;;:::i;:::-;96696:29;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;96696:29:0;;;;;;;;;96686:40;;96696:29;96686:40;;;;96739:9;;;;96761:13;;;;;;;;:::i;:::-;96787:14;;;;;;;;:::i;:::-;96567:268;;;;;;24887:25:1;;;;-1:-1:-1;;;;;24986:15:1;;;24966:18;;;24959:43;25018:18;;;25011:34;;;;25061:18;;;25054:34;;;;25104:19;;;25097:35;25169:15;;;96814:10:0;25148:19:1;;;25141:44;;;;-1:-1:-1;;;;;25222:47:1;;;25201:19;;;25194:76;96814:10:0;;;25286:19:1;;;25279:35;24859:19;;96567:268:0;;;;;;;;;;;;96547:297;;;;;;96522:16;:329::i;:::-;96505:346;;96865:44;96890:6;96898:10;;96865:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;96865:24:0;;-1:-1:-1;;;96865:44:0:i;:::-;96858:51;;;96366:549;;;;;;:::o;47061:835::-;-1:-1:-1;;;;;47301:13:0;;1631:19;:23;47297:592;;47337:90;;-1:-1:-1;;;47337:90:0;;-1:-1:-1;;;;;47337:54:0;;;;;:90;;47392:8;;47402:4;;47408:3;;47413:7;;47422:4;;47337:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47337:90:0;;;;;;;;-1:-1:-1;;47337:90:0;;;;;;;;;;;;:::i;:::-;;;47333:545;;;;:::i;:::-;-1:-1:-1;;;;;;47509:71:0;;-1:-1:-1;;;47509:71:0;47505:170;;47605:50;;-1:-1:-1;;;47605:50:0;;;;;;;:::i;35385:974::-;-1:-1:-1;;;;;35573:16:0;;35565:66;;;;-1:-1:-1;;;35565:66:0;;;;;;;:::i;:::-;16380:10;35644:16;35709:21;35727:2;35709:17;:21::i;:::-;35686:44;;35741:24;35768:25;35786:6;35768:17;:25::i;:::-;35741:52;;35806:60;35827:8;35837:4;35843:2;35847:3;35852:7;35861:4;35806:20;:60::i;:::-;35879:19;35901:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;35901:19:0;;;;;;;;;;35939:21;;;;35931:76;;;;-1:-1:-1;;;35931:76:0;;;;;;;:::i;:::-;36043:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;36043:19:0;;;;;;;;;;36065:20;;;36043:42;;36107:17;;;;;;;:27;;36065:20;;36043:13;36107:27;;36065:20;;36107:27;:::i;:::-;;;;-1:-1:-1;;36152:46:0;;;43776:25:1;;;43832:2;43817:18;;43810:34;;;-1:-1:-1;;;;;36152:46:0;;;;;;;;;;;;;;43749:18:1;36152:46:0;;;;;;;36283:68;36314:8;36324:4;36330:2;36334;36338:6;36346:4;36283:30;:68::i;:::-;35554:805;;;;35385:974;;;;;:::o;118973:155::-;119040:37;119059:17;119040:18;:37::i;:::-;119093:27;;-1:-1:-1;;;;;119093:27:0;;;;;;;;118973:155;:::o;124006:461::-;124089:12;-1:-1:-1;;;;;1631:19:0;;;124114:88;;;;-1:-1:-1;;;124114:88:0;;38745:2:1;124114:88:0;;;38727:21:1;38784:2;38764:18;;;38757:30;38823:34;38803:18;;;38796:62;-1:-1:-1;;;38874:18:1;;;38867:36;38920:19;;124114:88:0;38543:402:1;124114:88:0;124276:12;124290:23;124317:6;-1:-1:-1;;;;;124317:19:0;124337:4;124317:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;124275:67;;;;124360:99;124396:7;124405:10;124360:99;;;;;;;;;;;;;;;;;:35;:99::i;:::-;124353:106;124006:461;-1:-1:-1;;;;;124006:461:0:o;31335:112::-;14117:13;;;;;;;14109:69;;;;-1:-1:-1;;;14109:69:0;;;;;;;:::i;:::-;31426:13:::1;31434:4;31426:7;:13::i;17914:113::-:0;14117:13;;;;;;;14109:69;;;;-1:-1:-1;;;14109:69:0;;;;;;;:::i;:::-;17987:32:::1;16380:10:::0;17987:18:::1;:32::i;91079:149::-:0;14117:13;;;;;;;14109:69;;;;-1:-1:-1;;;14109:69:0;;;;;;;:::i;:::-;91182:38:::1;91206:4;91212:7;91182:23;:38::i;61800:190::-:0;61524:42;61862:12;;:7;:12;;;:26;;;61914:18;61877:11;61914:4;:18;:::i;:::-;61895:7;:16;61903:7;18339:6;;-1:-1:-1;;;;;18339:6:0;;18266:87;61903:7;-1:-1:-1;;;;;61895:16:0;;;;;;;;;;;;-1:-1:-1;61895:16:0;;;:37;;;;61939:7;:17;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;61939:17:0;61524:42;61939:17;;;61976:7;18339:6;;-1:-1:-1;;;;;18339:6:0;;18266:87;61976:7;61963:21;;;;;;;-1:-1:-1;61963:21:0;;;;;;;;;;;;-1:-1:-1;;;;;;61963:21:0;-1:-1:-1;;;;;61963:21:0;;;;;;;;;-1:-1:-1;61800:190:0:o;104668:1055::-;14117:13;;;;;;;14109:69;;;;-1:-1:-1;;;14109:69:0;;;;;;;:::i;:::-;104618:42:::1;105080:43;:47:::0;105076:642:::1;;105143:50;::::0;-1:-1:-1;;;105143:50:0;;105187:4:::1;105143:50;::::0;::::1;19331:51:1::0;104618:42:0::1;::::0;105143:35:::1;::::0;19304:18:1;;105143:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;105138:573;;105210:9;105206:496;;;105234:129;::::0;-1:-1:-1;;;105234:129:0;;105300:4:::1;105234:129;::::0;::::1;19605:34:1::0;-1:-1:-1;;;;;19675:15:1;;19655:18;;;19648:43;104618:42:0::1;::::0;105234:43:::1;::::0;19540:18:1;;105234:129:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;105206:496;-1:-1:-1::0;;;;;105398:44:0;::::1;::::0;105394:297:::1;;105459:137;::::0;-1:-1:-1;;;105459:137:0;;105529:4:::1;105459:137;::::0;::::1;19605:34:1::0;-1:-1:-1;;;;;19675:15:1;;19655:18;;;19648:43;104618:42:0::1;::::0;105459:45:::1;::::0;19540:18:1;;105459:137:0::1;19393:304:1::0;105394:297:0::1;105631:46;::::0;-1:-1:-1;;;105631:46:0;;105671:4:::1;105631:46;::::0;::::1;19331:51:1::0;104618:42:0::1;::::0;105631:31:::1;::::0;19304:18:1;;105631:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;92704:178:::0;92781:7;92808:66;92841:20;:18;:20::i;:::-;92863:10;88659:57;;-1:-1:-1;;;88659:57:0;;;18836:27:1;18879:11;;;18872:27;;;18915:12;;;18908:28;;;88622:7:0;;18952:12:1;;88659:57:0;;;;;;;;;;;;88649:68;;;;;;88642:75;;88529:196;;;;;83716:231;83794:7;83815:17;83834:18;83856:27;83867:4;83873:9;83856:10;:27::i;:::-;83814:69;;;;83894:18;83906:5;83894:11;:18::i;7746:305::-;7896:12;7925:7;7921:123;;;-1:-1:-1;7956:10:0;7949:17;;7921:123;7999:33;8007:10;8019:12;7999:7;:33::i;38707:88::-;38774:13;;;;:4;;:13;;;;;:::i;91236:302::-;14117:13;;;;;;;14109:69;;;;-1:-1:-1;;;14109:69:0;;;;;;;:::i;:::-;91370:22;;::::1;::::0;;::::1;::::0;91427:25;;;;;::::1;::::0;91463:12:::1;:25:::0;;;;91499:15:::1;:31:::0;91236:302::o;91629:162::-;91682:7;91709:74;90352:95;91743:17;93211:12;;;93126:105;91743:17;93566:15;;91980:73;;;;;;25584:25:1;;;25625:18;;;25618:34;;;25668:18;;;25661:34;;;92024:13:0;25711:18:1;;;25704:34;92047:4:0;25754:19:1;;;25747:61;91943:7:0;;25556:19:1;;91980:73:0;;;;;;;;;;;;91970:84;;;;;;91963:91;;91799:263;;;;;;91709:74;91702:81;;91629:162;:::o;82167:747::-;82248:7;82257:12;82286:9;:16;82306:2;82286:22;82282:625;;;82630:4;82615:20;;82609:27;82680:4;82665:20;;82659:27;82738:4;82723:20;;82717:27;82325:9;82709:36;82781:25;82792:4;82709:36;82609:27;82659;82781:10;:25::i;:::-;82774:32;;;;;;;;;82282:625;-1:-1:-1;82855:1:0;;-1:-1:-1;82859:35:0;82839:56;;80560:521;80638:20;80629:5;:29;;;;;;;;:::i;:::-;;80625:449;;;80560:521;:::o;80625:449::-;80736:29;80727:5;:38;;;;;;;;:::i;:::-;;80723:351;;;80782:34;;-1:-1:-1;;;80782:34:0;;26847:2:1;80782:34:0;;;26829:21:1;26886:2;26866:18;;;26859:30;26925:26;26905:18;;;26898:54;26969:18;;80782:34:0;26645:348:1;80723:351:0;80847:35;80838:5;:44;;;;;;;;:::i;:::-;;80834:240;;;80899:41;;-1:-1:-1;;;80899:41:0;;28011:2:1;80899:41:0;;;27993:21:1;28050:2;28030:18;;;28023:30;28089:33;28069:18;;;28062:61;28140:18;;80899:41:0;27809:355:1;80834:240:0;80971:30;80962:5;:39;;;;;;;;:::i;:::-;;80958:116;;;81018:44;;-1:-1:-1;;;81018:44:0;;31528:2:1;81018:44:0;;;31510:21:1;31567:2;31547:18;;;31540:30;31606:34;31586:18;;;31579:62;-1:-1:-1;;;31657:18:1;;;31650:32;31699:19;;81018:44:0;31326:398:1;8059:552:0;8220:17;;:21;8216:388;;8452:10;8446:17;8509:15;8496:10;8492:2;8488:19;8481:44;85168:1520;85299:7;;86233:66;86220:79;;86216:163;;;-1:-1:-1;86332:1:0;;-1:-1:-1;86336:30:0;86316:51;;86216:163;86493:24;;;86476:14;86493:24;;;;;;;;;26046:25:1;;;26119:4;26107:17;;26087:18;;;26080:45;;;;26141:18;;;26134:34;;;26184:18;;;26177:34;;;86493:24:0;;26018:19:1;;86493:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;86493:24:0;;-1:-1:-1;;86493:24:0;;;-1:-1:-1;;;;;;;86532:20:0;;86528:103;;86585:1;86589:29;86569:50;;;;;;;86528:103;86651:6;-1:-1:-1;86659:20:0;;-1:-1:-1;85168:1520:0;;;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:468:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;183:2;177:9;195:69;252:2;231:15;;-1:-1:-1;;227:29:1;258:4;223:40;177:9;195:69;:::i;:::-;282:6;273:15;;312:6;304;297:22;352:3;343:6;338:3;334:16;331:25;328:45;;;369:1;366;359:12;328:45;419:6;414:3;407:4;399:6;395:17;382:44;474:1;467:4;458:6;450;446:19;442:30;435:41;;14:468;;;;;:::o;487:173::-;555:20;;-1:-1:-1;;;;;604:31:1;;594:42;;584:70;;650:1;647;640:12;584:70;487:173;;;:::o;665:741::-;719:5;772:3;765:4;757:6;753:17;749:27;739:55;;790:1;787;780:12;739:55;826:6;813:20;852:4;875:43;915:2;875:43;:::i;:::-;947:2;941:9;959:31;987:2;979:6;959:31;:::i;:::-;1025:18;;;1059:15;;;;-1:-1:-1;1094:15:1;;;1144:1;1140:10;;;1128:23;;1124:32;;1121:41;-1:-1:-1;1118:61:1;;;1175:1;1172;1165:12;1118:61;1197:1;1207:169;1221:2;1218:1;1215:9;1207:169;;;1278:23;1297:3;1278:23;:::i;:::-;1266:36;;1322:12;;;;1354;;;;1239:1;1232:9;1207:169;;;-1:-1:-1;1394:6:1;;665:741;-1:-1:-1;;;;;;;665:741:1:o;1411:930::-;1470:5;1523:3;1516:4;1508:6;1504:17;1500:27;1490:55;;1541:1;1538;1531:12;1490:55;1577:6;1564:20;1603:4;1626:43;1666:2;1626:43;:::i;:::-;1698:2;1692:9;1710:31;1738:2;1730:6;1710:31;:::i;:::-;1776:18;;;1810:15;;;;-1:-1:-1;1845:15:1;;;1895:1;1891:10;;;1879:23;;1875:32;;1872:41;-1:-1:-1;1869:61:1;;;1926:1;1923;1916:12;1869:61;1948:1;1969;1979:332;1995:2;1990:3;1987:11;1979:332;;;2076:3;2063:17;-1:-1:-1;;;;;2099:11:1;2096:35;2093:55;;;2144:1;2141;2134:12;2093:55;2173:63;2232:3;2227:2;2213:11;2205:6;2201:24;2197:33;2173:63;:::i;:::-;2161:76;;-1:-1:-1;2257:12:1;;;;2289;;;;2017:1;2008:11;1979:332;;;-1:-1:-1;2329:6:1;;1411:930;-1:-1:-1;;;;;;;;1411:930:1:o;2346:735::-;2400:5;2453:3;2446:4;2438:6;2434:17;2430:27;2420:55;;2471:1;2468;2461:12;2420:55;2507:6;2494:20;2533:4;2556:43;2596:2;2556:43;:::i;:::-;2628:2;2622:9;2640:31;2668:2;2660:6;2640:31;:::i;:::-;2706:18;;;2740:15;;;;-1:-1:-1;2775:15:1;;;2825:1;2821:10;;;2809:23;;2805:32;;2802:41;-1:-1:-1;2799:61:1;;;2856:1;2853;2846:12;2799:61;2878:1;2888:163;2902:2;2899:1;2896:9;2888:163;;;2959:17;;2947:30;;2997:12;;;;3029;;;;2920:1;2913:9;2888:163;;3086:128;3151:20;;3180:28;3151:20;3180:28;:::i;3219:220::-;3261:5;3314:3;3307:4;3299:6;3295:17;3291:27;3281:55;;3332:1;3329;3322:12;3281:55;3354:79;3429:3;3420:6;3407:20;3400:4;3392:6;3388:17;3354:79;:::i;3444:876::-;3496:5;3544:4;3532:9;3527:3;3523:19;3519:30;3516:50;;;3562:1;3559;3552:12;3516:50;3595:2;3589:9;3607:32;3632:6;3607:32;:::i;:::-;3657:6;3648:15;;3699:9;3686:23;-1:-1:-1;;;;;3724:6:1;3721:30;3718:50;;;3764:1;3761;3754:12;3718:50;3787:22;;3840:4;3832:13;;3828:23;-1:-1:-1;3818:51:1;;3865:1;3862;3855:12;3818:51;3893:71;3960:3;3955:2;3942:16;3935:4;3931:2;3927:13;3893:71;:::i;:::-;3885:6;3878:87;;4028:4;4017:9;4013:20;4000:34;3993:4;3985:6;3981:17;3974:61;4096:2;4085:9;4081:18;4068:32;4063:2;4055:6;4051:15;4044:57;4134:37;4167:2;4156:9;4152:18;4134:37;:::i;:::-;4129:2;4121:6;4117:15;4110:62;4206:36;4237:3;4226:9;4222:19;4206:36;:::i;:::-;4200:3;4192:6;4188:16;4181:62;4277:36;4308:3;4297:9;4293:19;4277:36;:::i;:::-;4271:3;4263:6;4259:16;4252:62;;3444:876;;;;:::o;4325:163::-;4392:20;;4452:10;4441:22;;4431:33;;4421:61;;4478:1;4475;4468:12;4493:186;4552:6;4605:2;4593:9;4584:7;4580:23;4576:32;4573:52;;;4621:1;4618;4611:12;4573:52;4644:29;4663:9;4644:29;:::i;4684:260::-;4752:6;4760;4813:2;4801:9;4792:7;4788:23;4784:32;4781:52;;;4829:1;4826;4819:12;4781:52;4852:29;4871:9;4852:29;:::i;:::-;4842:39;;4900:38;4934:2;4923:9;4919:18;4900:38;:::i;:::-;4890:48;;4684:260;;;;;:::o;4949:943::-;5103:6;5111;5119;5127;5135;5188:3;5176:9;5167:7;5163:23;5159:33;5156:53;;;5205:1;5202;5195:12;5156:53;5228:29;5247:9;5228:29;:::i;:::-;5218:39;;5276:38;5310:2;5299:9;5295:18;5276:38;:::i;:::-;5266:48;;5365:2;5354:9;5350:18;5337:32;-1:-1:-1;;;;;5429:2:1;5421:6;5418:14;5415:34;;;5445:1;5442;5435:12;5415:34;5468:61;5521:7;5512:6;5501:9;5497:22;5468:61;:::i;:::-;5458:71;;5582:2;5571:9;5567:18;5554:32;5538:48;;5611:2;5601:8;5598:16;5595:36;;;5627:1;5624;5617:12;5595:36;5650:63;5705:7;5694:8;5683:9;5679:24;5650:63;:::i;:::-;5640:73;;5766:3;5755:9;5751:19;5738:33;5722:49;;5796:2;5786:8;5783:16;5780:36;;;5812:1;5809;5802:12;5780:36;;5835:51;5878:7;5867:8;5856:9;5852:24;5835:51;:::i;:::-;5825:61;;;4949:943;;;;;;;;:::o;5897:606::-;6001:6;6009;6017;6025;6033;6086:3;6074:9;6065:7;6061:23;6057:33;6054:53;;;6103:1;6100;6093:12;6054:53;6126:29;6145:9;6126:29;:::i;:::-;6116:39;;6174:38;6208:2;6197:9;6193:18;6174:38;:::i;:::-;6164:48;;6259:2;6248:9;6244:18;6231:32;6221:42;;6310:2;6299:9;6295:18;6282:32;6272:42;;6365:3;6354:9;6350:19;6337:33;-1:-1:-1;;;;;6385:6:1;6382:30;6379:50;;;6425:1;6422;6415:12;6379:50;6448:49;6489:7;6480:6;6469:9;6465:22;6448:49;:::i;6508:422::-;6601:6;6609;6662:2;6650:9;6641:7;6637:23;6633:32;6630:52;;;6678:1;6675;6668:12;6630:52;6701:29;6720:9;6701:29;:::i;:::-;6691:39;;6781:2;6770:9;6766:18;6753:32;-1:-1:-1;;;;;6800:6:1;6797:30;6794:50;;;6840:1;6837;6830:12;6794:50;6863:61;6916:7;6907:6;6896:9;6892:22;6863:61;:::i;:::-;6853:71;;;6508:422;;;;;:::o;6935:669::-;7062:6;7070;7078;7131:2;7119:9;7110:7;7106:23;7102:32;7099:52;;;7147:1;7144;7137:12;7099:52;7170:29;7189:9;7170:29;:::i;:::-;7160:39;;7250:2;7239:9;7235:18;7222:32;-1:-1:-1;;;;;7314:2:1;7306:6;7303:14;7300:34;;;7330:1;7327;7320:12;7300:34;7353:61;7406:7;7397:6;7386:9;7382:22;7353:61;:::i;:::-;7343:71;;7467:2;7456:9;7452:18;7439:32;7423:48;;7496:2;7486:8;7483:16;7480:36;;;7512:1;7509;7502:12;7480:36;;7535:63;7590:7;7579:8;7568:9;7564:24;7535:63;:::i;:::-;7525:73;;;6935:669;;;;;:::o;7609:315::-;7674:6;7682;7735:2;7723:9;7714:7;7710:23;7706:32;7703:52;;;7751:1;7748;7741:12;7703:52;7774:29;7793:9;7774:29;:::i;:::-;7764:39;;7853:2;7842:9;7838:18;7825:32;7866:28;7888:5;7866:28;:::i;:::-;7913:5;7903:15;;;7609:315;;;;;:::o;7929:394::-;8006:6;8014;8067:2;8055:9;8046:7;8042:23;8038:32;8035:52;;;8083:1;8080;8073:12;8035:52;8106:29;8125:9;8106:29;:::i;:::-;8096:39;;8186:2;8175:9;8171:18;8158:32;-1:-1:-1;;;;;8205:6:1;8202:30;8199:50;;;8245:1;8242;8235:12;8199:50;8268:49;8309:7;8300:6;8289:9;8285:22;8268:49;:::i;8328:254::-;8396:6;8404;8457:2;8445:9;8436:7;8432:23;8428:32;8425:52;;;8473:1;8470;8463:12;8425:52;8496:29;8515:9;8496:29;:::i;:::-;8486:39;8572:2;8557:18;;;;8544:32;;-1:-1:-1;;;8328:254:1:o;8587:322::-;8664:6;8672;8680;8733:2;8721:9;8712:7;8708:23;8704:32;8701:52;;;8749:1;8746;8739:12;8701:52;8772:29;8791:9;8772:29;:::i;:::-;8762:39;8848:2;8833:18;;8820:32;;-1:-1:-1;8899:2:1;8884:18;;;8871:32;;8587:322;-1:-1:-1;;;8587:322:1:o;8914:595::-;9032:6;9040;9093:2;9081:9;9072:7;9068:23;9064:32;9061:52;;;9109:1;9106;9099:12;9061:52;9149:9;9136:23;-1:-1:-1;;;;;9219:2:1;9211:6;9208:14;9205:34;;;9235:1;9232;9225:12;9205:34;9258:61;9311:7;9302:6;9291:9;9287:22;9258:61;:::i;:::-;9248:71;;9372:2;9361:9;9357:18;9344:32;9328:48;;9401:2;9391:8;9388:16;9385:36;;;9417:1;9414;9407:12;9385:36;;9440:63;9495:7;9484:8;9473:9;9469:24;9440:63;:::i;9514:821::-;9666:6;9674;9682;9735:2;9723:9;9714:7;9710:23;9706:32;9703:52;;;9751:1;9748;9741:12;9703:52;9791:9;9778:23;-1:-1:-1;;;;;9861:2:1;9853:6;9850:14;9847:34;;;9877:1;9874;9867:12;9847:34;9900:61;9953:7;9944:6;9933:9;9929:22;9900:61;:::i;:::-;9890:71;;10014:2;10003:9;9999:18;9986:32;9970:48;;10043:2;10033:8;10030:16;10027:36;;;10059:1;10056;10049:12;10340:376;10447:6;10500:2;10488:9;10479:7;10475:23;10471:32;10468:52;;;10516:1;10513;10506:12;10468:52;10556:9;10543:23;-1:-1:-1;;;;;10581:6:1;10578:30;10575:50;;;10621:1;10618;10611:12;10575:50;10644:66;10702:7;10693:6;10682:9;10678:22;10644:66;:::i;:::-;10634:76;10340:376;-1:-1:-1;;;;10340:376:1:o;10721:348::-;10805:6;10858:2;10846:9;10837:7;10833:23;10829:32;10826:52;;;10874:1;10871;10864:12;10826:52;10914:9;10901:23;-1:-1:-1;;;;;10939:6:1;10936:30;10933:50;;;10979:1;10976;10969:12;10933:50;11002:61;11055:7;11046:6;11035:9;11031:22;11002:61;:::i;11074:623::-;11215:6;11223;11276:2;11264:9;11255:7;11251:23;11247:32;11244:52;;;11292:1;11289;11282:12;11244:52;11332:9;11319:23;-1:-1:-1;;;;;11402:2:1;11394:6;11391:14;11388:34;;;11418:1;11415;11408:12;11388:34;11441:61;11494:7;11485:6;11474:9;11470:22;11441:61;:::i;:::-;11431:71;;11555:2;11544:9;11540:18;11527:32;11511:48;;11584:2;11574:8;11571:16;11568:36;;;11600:1;11597;11590:12;11568:36;;11623:68;11683:7;11672:8;11661:9;11657:24;11623:68;:::i;11702:245::-;11769:6;11822:2;11810:9;11801:7;11797:23;11793:32;11790:52;;;11838:1;11835;11828:12;11790:52;11870:9;11864:16;11889:28;11911:5;11889:28;:::i;11952:184::-;12022:6;12075:2;12063:9;12054:7;12050:23;12046:32;12043:52;;;12091:1;12088;12081:12;12043:52;-1:-1:-1;12114:16:1;;11952:184;-1:-1:-1;11952:184:1:o;12141:245::-;12199:6;12252:2;12240:9;12231:7;12227:23;12223:32;12220:52;;;12268:1;12265;12258:12;12220:52;12307:9;12294:23;12326:30;12350:5;12326:30;:::i;12391:249::-;12460:6;12513:2;12501:9;12492:7;12488:23;12484:32;12481:52;;;12529:1;12526;12519:12;12481:52;12561:9;12555:16;12580:30;12604:5;12580:30;:::i;12645:867::-;12762:6;12770;12778;12831:2;12819:9;12810:7;12806:23;12802:32;12799:52;;;12847:1;12844;12837:12;12799:52;12887:9;12874:23;-1:-1:-1;;;;;12957:2:1;12949:6;12946:14;12943:34;;;12973:1;12970;12963:12;12943:34;12996:22;;;;13052:3;13034:16;;;13030:26;13027:46;;;13069:1;13066;13059:12;13027:46;13092:2;;-1:-1:-1;13147:2:1;13132:18;;13119:32;;13163:16;;;13160:36;;;13192:1;13189;13182:12;13160:36;13230:8;13219:9;13215:24;13205:34;;13277:7;13270:4;13266:2;13262:13;13258:27;13248:55;;13299:1;13296;13289:12;13248:55;13339:2;13326:16;13365:2;13357:6;13354:14;13351:34;;;13381:1;13378;13371:12;13351:34;13426:7;13421:2;13412:6;13408:2;13404:15;13400:24;13397:37;13394:57;;;13447:1;13444;13437:12;13394:57;13478:2;13474;13470:11;13460:21;;13500:6;13490:16;;;;;12645:867;;;;;:::o;13517:341::-;13599:6;13652:2;13640:9;13631:7;13627:23;13623:32;13620:52;;;13668:1;13665;13658:12;13620:52;13708:9;13695:23;-1:-1:-1;;;;;13733:6:1;13730:30;13727:50;;;13773:1;13770;13763:12;13727:50;13796:56;13844:7;13835:6;13824:9;13820:22;13796:56;:::i;13863:301::-;13922:6;13975:2;13963:9;13954:7;13950:23;13946:32;13943:52;;;13991:1;13988;13981:12;13943:52;14030:9;14017:23;-1:-1:-1;;;;;14073:5:1;14069:46;14062:5;14059:57;14049:85;;14130:1;14127;14120:12;14169:180;14228:6;14281:2;14269:9;14260:7;14256:23;14252:32;14249:52;;;14297:1;14294;14287:12;14249:52;-1:-1:-1;14320:23:1;;14169:180;-1:-1:-1;14169:180:1:o;14543:322::-;14620:6;14628;14636;14689:2;14677:9;14668:7;14664:23;14660:32;14657:52;;;14705:1;14702;14695:12;14657:52;14741:9;14728:23;14718:33;;14770:38;14804:2;14793:9;14789:18;14770:38;:::i;:::-;14760:48;;14855:2;14844:9;14840:18;14827:32;14817:42;;14543:322;;;;;:::o;14870:409::-;14961:6;14969;15022:2;15010:9;15001:7;14997:23;14993:32;14990:52;;;15038:1;15035;15028:12;14990:52;15074:9;15061:23;15051:33;;15135:2;15124:9;15120:18;15107:32;-1:-1:-1;;;;;15154:6:1;15151:30;15148:50;;;15194:1;15191;15184:12;15148:50;15217:56;15265:7;15256:6;15245:9;15241:22;15217:56;:::i;15284:248::-;15352:6;15360;15413:2;15401:9;15392:7;15388:23;15384:32;15381:52;;;15429:1;15426;15419:12;15381:52;-1:-1:-1;;15452:23:1;;;15522:2;15507:18;;;15494:32;;-1:-1:-1;15284:248:1:o;15537:435::-;15590:3;15628:5;15622:12;15655:6;15650:3;15643:19;15681:4;15710:2;15705:3;15701:12;15694:19;;15747:2;15740:5;15736:14;15768:1;15778:169;15792:6;15789:1;15786:13;15778:169;;;15853:13;;15841:26;;15887:12;;;;15922:15;;;;15814:1;15807:9;15778:169;;;-1:-1:-1;15963:3:1;;15537:435;-1:-1:-1;;;;;15537:435:1:o;15977:257::-;16018:3;16056:5;16050:12;16083:6;16078:3;16071:19;16099:63;16155:6;16148:4;16143:3;16139:14;16132:4;16125:5;16121:16;16099:63;:::i;:::-;16216:2;16195:15;-1:-1:-1;;16191:29:1;16182:39;;;;16223:4;16178:50;;15977:257;-1:-1:-1;;15977:257:1:o;16239:546::-;16287:3;16331:5;16325:12;16358:4;16353:3;16346:17;16384:46;16424:4;16419:3;16415:14;16401:12;16384:46;:::i;:::-;16372:58;;16479:4;16472:5;16468:16;16462:23;16455:4;16450:3;16446:14;16439:47;16535:4;16528:5;16524:16;16518:23;16511:4;16506:3;16502:14;16495:47;16603:10;16595:4;16588:5;16584:16;16578:23;16574:40;16567:4;16562:3;16558:14;16551:64;16678:4;16671:5;16667:16;16661:23;16654:31;16647:39;16640:4;16635:3;16631:14;16624:63;16750:4;16743:5;16739:16;16733:23;16726:31;16719:39;16712:4;16707:3;16703:14;16696:63;16775:4;16768:11;;;16239:546;;;;:::o;16790:400::-;16961:3;-1:-1:-1;;;;;16982:31:1;;16979:51;;;17026:1;17023;17016:12;16979:51;17060:6;17057:1;17053:14;17102:6;17094;17089:3;17076:33;17164:1;17128:16;;17153:13;;;-1:-1:-1;17128:16:1;16790:400;-1:-1:-1;;16790:400:1:o;17195:274::-;17324:3;17362:6;17356:13;17378:53;17424:6;17419:3;17412:4;17404:6;17400:17;17378:53;:::i;:::-;17447:16;;;;;17195:274;-1:-1:-1;;17195:274:1:o;17474:1099::-;17602:3;17631:1;17664:6;17658:13;17694:3;17716:1;17744:9;17740:2;17736:18;17726:28;;17804:2;17793:9;17789:18;17826;17816:61;;17870:4;17862:6;17858:17;17848:27;;17816:61;17896:2;17944;17936:6;17933:14;17913:18;17910:38;17907:165;;;-1:-1:-1;;;17971:33:1;;18027:4;18024:1;18017:15;18057:4;17978:3;18045:17;17907:165;18088:18;18115:104;;;;18233:1;18228:320;;;;18081:467;;18115:104;-1:-1:-1;;18148:24:1;;18136:37;;18193:16;;;;-1:-1:-1;18115:104:1;;18228:320;44666:1;44659:14;;;44703:4;44690:18;;18323:1;18337:165;18351:6;18348:1;18345:13;18337:165;;;18429:14;;18416:11;;;18409:35;18472:16;;;;18366:10;;18337:165;;;18341:3;;18531:6;18526:3;18522:16;18515:23;;18081:467;-1:-1:-1;18564:3:1;;17474:1099;-1:-1:-1;;;;;;;;17474:1099:1:o;19702:826::-;-1:-1:-1;;;;;20099:15:1;;;20081:34;;20151:15;;20146:2;20131:18;;20124:43;20061:3;20198:2;20183:18;;20176:31;;;20024:4;;20230:57;;20267:19;;20259:6;20230:57;:::i;:::-;20335:9;20327:6;20323:22;20318:2;20307:9;20303:18;20296:50;20369:44;20406:6;20398;20369:44;:::i;:::-;20355:58;;20462:9;20454:6;20450:22;20444:3;20433:9;20429:19;20422:51;20490:32;20515:6;20507;20490:32;:::i;:::-;20482:40;19702:826;-1:-1:-1;;;;;;;;19702:826:1:o;20913:560::-;-1:-1:-1;;;;;21210:15:1;;;21192:34;;21262:15;;21257:2;21242:18;;21235:43;21309:2;21294:18;;21287:34;;;21352:2;21337:18;;21330:34;;;21172:3;21395;21380:19;;21373:32;;;21135:4;;21422:45;;21447:19;;21439:6;21422:45;:::i;:::-;21414:53;20913:560;-1:-1:-1;;;;;;;20913:560:1:o;21757:832::-;22025:2;22037:21;;;22107:13;;22010:18;;;22129:22;;;21977:4;;22204;;22182:2;22167:18;;;22231:15;;;21977:4;22274:195;22288:6;22285:1;22282:13;22274:195;;;22353:13;;-1:-1:-1;;;;;22349:39:1;22337:52;;22409:12;;;;22444:15;;;;22385:1;22303:9;22274:195;;;22278:3;;;22514:9;22509:3;22505:19;22500:2;22489:9;22485:18;22478:47;22542:41;22579:3;22571:6;22542:41;:::i;:::-;22534:49;21757:832;-1:-1:-1;;;;;;21757:832:1:o;22594:835::-;22782:4;22811:2;22851;22840:9;22836:18;22881:2;22870:9;22863:21;22904:6;22939;22933:13;22970:6;22962;22955:22;23008:2;22997:9;22993:18;22986:25;;23070:2;23060:6;23057:1;23053:14;23042:9;23038:30;23034:39;23020:53;;23108:2;23100:6;23096:15;23129:1;23139:261;23153:6;23150:1;23147:13;23139:261;;;23246:2;23242:7;23230:9;23222:6;23218:22;23214:36;23209:3;23202:49;23274:46;23313:6;23304;23298:13;23274:46;:::i;:::-;23264:56;-1:-1:-1;23378:12:1;;;;23343:15;;;;23175:1;23168:9;23139:261;;;-1:-1:-1;23417:6:1;;22594:835;-1:-1:-1;;;;;;;22594:835:1:o;23434:261::-;23613:2;23602:9;23595:21;23576:4;23633:56;23685:2;23674:9;23670:18;23662:6;23633:56;:::i;23700:465::-;23957:2;23946:9;23939:21;23920:4;23983:56;24035:2;24024:9;24020:18;24012:6;23983:56;:::i;:::-;24087:9;24079:6;24075:22;24070:2;24059:9;24055:18;24048:50;24115:44;24152:6;24144;24115:44;:::i;26421:219::-;26570:2;26559:9;26552:21;26533:4;26590:44;26630:2;26619:9;26615:18;26607:6;26590:44;:::i;26998:404::-;27200:2;27182:21;;;27239:2;27219:18;;;27212:30;27278:34;27273:2;27258:18;;27251:62;-1:-1:-1;;;27344:2:1;27329:18;;27322:38;27392:3;27377:19;;26998:404::o;28925:400::-;29127:2;29109:21;;;29166:2;29146:18;;;29139:30;29205:34;29200:2;29185:18;;29178:62;-1:-1:-1;;;29271:2:1;29256:18;;29249:34;29315:3;29300:19;;28925:400::o;29330:408::-;29532:2;29514:21;;;29571:2;29551:18;;;29544:30;29610:34;29605:2;29590:18;;29583:62;-1:-1:-1;;;29676:2:1;29661:18;;29654:42;29728:3;29713:19;;29330:408::o;30484:410::-;30686:2;30668:21;;;30725:2;30705:18;;;30698:30;30764:34;30759:2;30744:18;;30737:62;-1:-1:-1;;;30830:2:1;30815:18;;30808:44;30884:3;30869:19;;30484:410::o;31729:408::-;31931:2;31913:21;;;31970:2;31950:18;;;31943:30;32009:34;32004:2;31989:18;;31982:62;-1:-1:-1;;;32075:2:1;32060:18;;32053:42;32127:3;32112:19;;31729:408::o;33618:401::-;33820:2;33802:21;;;33859:2;33839:18;;;33832:30;33898:34;33893:2;33878:18;;33871:62;-1:-1:-1;;;33964:2:1;33949:18;;33942:35;34009:3;33994:19;;33618:401::o;34849:399::-;35051:2;35033:21;;;35090:2;35070:18;;;35063:30;35129:34;35124:2;35109:18;;35102:62;-1:-1:-1;;;35195:2:1;35180:18;;35173:33;35238:3;35223:19;;34849:399::o;35253:406::-;35455:2;35437:21;;;35494:2;35474:18;;;35467:30;35533:34;35528:2;35513:18;;35506:62;-1:-1:-1;;;35599:2:1;35584:18;;35577:40;35649:3;35634:19;;35253:406::o;39998:407::-;40200:2;40182:21;;;40239:2;40219:18;;;40212:30;40278:34;40273:2;40258:18;;40251:62;-1:-1:-1;;;40344:2:1;40329:18;;40322:41;40395:3;40380:19;;39998:407::o;41571:404::-;41773:2;41755:21;;;41812:2;41792:18;;;41785:30;41851:34;41846:2;41831:18;;41824:62;-1:-1:-1;;;41917:2:1;41902:18;;41895:38;41965:3;41950:19;;41571:404::o;41980:397::-;42182:2;42164:21;;;42221:2;42201:18;;;42194:30;42260:34;42255:2;42240:18;;42233:62;-1:-1:-1;;;42326:2:1;42311:18;;42304:31;42367:3;42352:19;;41980:397::o;43163:252::-;43338:2;43327:9;43320:21;43301:4;43358:51;43405:2;43394:9;43390:18;43382:6;43358:51;:::i;43855:545::-;43948:4;43954:6;44014:11;44001:25;44108:2;44104:7;44093:8;44077:14;44073:29;44069:43;44049:18;44045:68;44035:96;;44127:1;44124;44117:12;44035:96;44154:33;;44206:20;;;-1:-1:-1;;;;;;44238:30:1;;44235:50;;;44281:1;44278;44271:12;44235:50;44314:4;44302:17;;-1:-1:-1;44365:1:1;44361:14;;;44345;44341:35;44331:46;;44328:66;;;44390:1;44387;44380:12;44405:183;44465:4;-1:-1:-1;;;;;44490:6:1;44487:30;44484:56;;;44520:18;;:::i;:::-;-1:-1:-1;44565:1:1;44561:14;44577:4;44557:25;;44405:183::o;44719:128::-;44759:3;44790:1;44786:6;44783:1;44780:13;44777:39;;;44796:18;;:::i;:::-;-1:-1:-1;44832:9:1;;44719:128::o;44852:217::-;44892:1;44918;44908:132;;44962:10;44957:3;44953:20;44950:1;44943:31;44997:4;44994:1;44987:15;45025:4;45022:1;45015:15;44908:132;-1:-1:-1;45054:9:1;;44852:217::o;45074:168::-;45114:7;45180:1;45176;45172:6;45168:14;45165:1;45162:21;45157:1;45150:9;45143:17;45139:45;45136:71;;;45187:18;;:::i;:::-;-1:-1:-1;45227:9:1;;45074:168::o;45247:125::-;45287:4;45315:1;45312;45309:8;45306:34;;;45320:18;;:::i;:::-;-1:-1:-1;45357:9:1;;45247:125::o;45377:258::-;45449:1;45459:113;45473:6;45470:1;45467:13;45459:113;;;45549:11;;;45543:18;45530:11;;;45523:39;45495:2;45488:10;45459:113;;;45590:6;45587:1;45584:13;45581:48;;;-1:-1:-1;;45625:1:1;45607:16;;45600:27;45377:258::o;45640:380::-;45719:1;45715:12;;;;45762;;;45783:61;;45837:4;45829:6;45825:17;45815:27;;45783:61;45890:2;45882:6;45879:14;45859:18;45856:38;45853:161;;;45936:10;45931:3;45927:20;45924:1;45917:31;45971:4;45968:1;45961:15;45999:4;45996:1;45989:15;46025:225;46111:4;46103:6;46099:17;46182:6;46170:10;46167:22;-1:-1:-1;;;;;46134:10:1;46131:34;46128:62;46125:88;;;46193:18;;:::i;:::-;46229:2;46222:22;-1:-1:-1;46025:225:1:o;46255:249::-;46365:2;46346:13;;-1:-1:-1;;46342:27:1;46330:40;;-1:-1:-1;;;;;46385:34:1;;46421:22;;;46382:62;46379:88;;;46447:18;;:::i;:::-;46483:2;46476:22;-1:-1:-1;;46255:249:1:o;46509:135::-;46548:3;-1:-1:-1;;46569:17:1;;46566:43;;;46589:18;;:::i;:::-;-1:-1:-1;46636:1:1;46625:13;;46509:135::o;46649:127::-;46710:10;46705:3;46701:20;46698:1;46691:31;46741:4;46738:1;46731:15;46765:4;46762:1;46755:15;46781:127;46842:10;46837:3;46833:20;46830:1;46823:31;46873:4;46870:1;46863:15;46897:4;46894:1;46887:15;46913:127;46974:10;46969:3;46965:20;46962:1;46955:31;47005:4;47002:1;46995:15;47029:4;47026:1;47019:15;47045:127;47106:10;47101:3;47097:20;47094:1;47087:31;47137:4;47134:1;47127:15;47161:4;47158:1;47151:15;47177:179;47212:3;47254:1;47236:16;47233:23;47230:120;;;47300:1;47297;47294;47279:23;-1:-1:-1;47337:1:1;47331:8;47326:3;47322:18;47177:179;:::o;47361:671::-;47400:3;47442:4;47424:16;47421:26;47418:39;;;47361:671;:::o;47418:39::-;47484:2;47478:9;-1:-1:-1;;47549:16:1;47545:25;;47542:1;47478:9;47521:50;47600:4;47594:11;47624:16;-1:-1:-1;;;;;47730:2:1;47723:4;47715:6;47711:17;47708:25;47703:2;47695:6;47692:14;47689:45;47686:58;;;47737:5;;;;;47361:671;:::o;47686:58::-;47774:6;47768:4;47764:17;47753:28;;47810:3;47804:10;47837:2;47829:6;47826:14;47823:27;;;47843:5;;;;;;47361:671;:::o;47823:27::-;47927:2;47908:16;47902:4;47898:27;47894:36;47887:4;47878:6;47873:3;47869:16;47865:27;47862:69;47859:82;;;47934:5;;;;;;47361:671;:::o;47859:82::-;47950:57;48001:4;47992:6;47984;47980:19;47976:30;47970:4;47950:57;:::i;:::-;-1:-1:-1;48023:3:1;;47361:671;-1:-1:-1;;;;;47361:671:1:o;48037:118::-;48123:5;48116:13;48109:21;48102:5;48099:32;48089:60;;48145:1;48142;48135:12;48160:131;-1:-1:-1;;;;;;48234:32:1;;48224:43;;48214:71;;48281:1;48278;48271:12
Swarm Source
ipfs://6de29b804151cc564f24c4079c8f1d41232f3c5eb67fb86f0daa4174e700fae2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 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.