mirror of
https://github.com/acidicoala/SmokeAPI.git
synced 2025-12-05 21:15:39 -05:00
Removed store mode
This commit is contained in:
5
.idea/dictionaries/project.xml
generated
5
.idea/dictionaries/project.xml
generated
@@ -3,8 +3,13 @@
|
||||
<words>
|
||||
<w>abcdefghijklmnopqrstuvwxyz</w>
|
||||
<w>indicies</w>
|
||||
<w>isteamapps</w>
|
||||
<w>isteamclient</w>
|
||||
<w>isteaminventory</w>
|
||||
<w>isteamuser</w>
|
||||
<w>koalabox</w>
|
||||
<w>koaloader</w>
|
||||
<w>steamapps</w>
|
||||
<w>wstr</w>
|
||||
</words>
|
||||
</dictionary>
|
||||
|
||||
1
.idea/inspectionProfiles/Project_Default.xml
generated
1
.idea/inspectionProfiles/Project_Default.xml
generated
@@ -6,5 +6,6 @@
|
||||
</inspection_tool>
|
||||
<inspection_tool class="ConstantFunctionResult" enabled="true" level="INFORMATION" enabled_by_default="true" editorAttributes="INFORMATION_ATTRIBUTES" />
|
||||
<inspection_tool class="CppDFAConstantParameter" enabled="true" level="WEAK WARNING" enabled_by_default="true" editorAttributes="INFO_ATTRIBUTES" />
|
||||
<inspection_tool class="CppRedundantParentheses" enabled="false" level="HINT" enabled_by_default="false" />
|
||||
</profile>
|
||||
</component>
|
||||
1
.idea/misc.xml
generated
1
.idea/misc.xml
generated
@@ -10,6 +10,7 @@
|
||||
</libraryRoots>
|
||||
<excludeRoots>
|
||||
<file path="$PROJECT_DIR$/build" />
|
||||
<file path="$PROJECT_DIR$/res/steamworks" />
|
||||
<file path="$PROJECT_DIR$/sdk" />
|
||||
<file path="$PROJECT_DIR$/vcpkg" />
|
||||
</excludeRoots>
|
||||
|
||||
104
CMakeLists.txt
104
CMakeLists.txt
@@ -1,6 +1,6 @@
|
||||
cmake_minimum_required(VERSION 3.24)
|
||||
|
||||
project(SmokeAPI VERSION 2.0.5)
|
||||
project(SmokeAPI VERSION 3.0.0)
|
||||
|
||||
include(KoalaBox/cmake/KoalaBox.cmake)
|
||||
|
||||
@@ -28,87 +28,75 @@ configure_build_config(extra_build_config)
|
||||
|
||||
set(
|
||||
SMOKE_API_SOURCES
|
||||
src/common/app_cache.cpp
|
||||
src/common/app_cache.hpp
|
||||
src/common/steamclient_exports.cpp
|
||||
src/common/steamclient_exports.hpp
|
||||
src/core/api.cpp
|
||||
src/core/api.hpp
|
||||
src/core/globals.cpp
|
||||
src/core/globals.hpp
|
||||
src/core/paths.cpp
|
||||
src/core/paths.hpp
|
||||
src/core/types.cpp
|
||||
src/core/types.hpp
|
||||
src/game_mode/exports/steam_api.cpp
|
||||
src/game_mode/exports/steam_api_flat.cpp
|
||||
src/game_mode/exports/steam_api_internal.cpp
|
||||
src/game_mode/exports/steam_api_unversioned.cpp
|
||||
src/game_mode/virtuals/isteamapps.cpp
|
||||
src/game_mode/virtuals/isteamclient.cpp
|
||||
src/game_mode/virtuals/isteaminventory.cpp
|
||||
src/game_mode/virtuals/isteamuser.cpp
|
||||
src/game_mode/virtuals/steam_api_virtuals.hpp
|
||||
src/exports/steamclient.cpp
|
||||
src/exports/steamclient.hpp
|
||||
src/exports/steam_api.cpp
|
||||
src/exports/steam_api_flat.cpp
|
||||
src/exports/steam_api_internal.cpp
|
||||
src/exports/steam_api_unversioned.cpp
|
||||
src/virtuals/isteamapps.cpp
|
||||
src/virtuals/isteamclient.cpp
|
||||
src/virtuals/isteaminventory.cpp
|
||||
src/virtuals/isteamuser.cpp
|
||||
src/virtuals/steam_api_virtuals.hpp
|
||||
src/smoke_api/cache.cpp
|
||||
src/smoke_api/cache.hpp
|
||||
src/smoke_api/config.cpp
|
||||
src/smoke_api/config.hpp
|
||||
src/smoke_api/smoke_api.cpp
|
||||
src/smoke_api/smoke_api.hpp
|
||||
src/steam_impl/steam_apps.cpp
|
||||
src/steam_impl/steam_apps.hpp
|
||||
src/steam_impl/steam_client.cpp
|
||||
src/steam_impl/steam_client.hpp
|
||||
src/steam_impl/steam_impl.cpp
|
||||
src/steam_impl/steam_impl.hpp
|
||||
src/steam_impl/steam_inventory.cpp
|
||||
src/steam_impl/steam_inventory.hpp
|
||||
src/steam_impl/steam_user.cpp
|
||||
src/steam_impl/steam_user.hpp
|
||||
src/smoke_api/api.cpp
|
||||
src/smoke_api/api.hpp
|
||||
src/smoke_api/globals.cpp
|
||||
src/smoke_api/globals.hpp
|
||||
src/smoke_api/types.cpp
|
||||
src/smoke_api/types.hpp
|
||||
src/steam_interface/steam_apps.cpp
|
||||
src/steam_interface/steam_apps.hpp
|
||||
src/steam_interface/steam_client.cpp
|
||||
src/steam_interface/steam_client.hpp
|
||||
src/steam_interface/steam_interface.cpp
|
||||
src/steam_interface/steam_interface.hpp
|
||||
src/steam_interface/steam_inventory.cpp
|
||||
src/steam_interface/steam_inventory.hpp
|
||||
src/steam_interface/steam_user.cpp
|
||||
src/steam_interface/steam_user.hpp
|
||||
src/main.cpp
|
||||
${GENERATED_LINKER_EXPORTS}
|
||||
)
|
||||
|
||||
# Include store_mode mode sources only in 32-bit builds
|
||||
if (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||
# TODO: Use list(APPEND ...) ?
|
||||
set(
|
||||
SMOKE_API_SOURCES ${SMOKE_API_SOURCES}
|
||||
src/store_mode/steamclient/client_app_manager.cpp
|
||||
src/store_mode/steamclient/client_apps.cpp
|
||||
src/store_mode/steamclient/client_inventory.cpp
|
||||
src/store_mode/steamclient/client_user.cpp
|
||||
src/store_mode/steamclient/client_utils.cpp
|
||||
src/store_mode/steamclient/steamclient.cpp
|
||||
src/store_mode/steamclient/steamclient.hpp
|
||||
src/store_mode/vstdlib/vstdlib.cpp
|
||||
src/store_mode/vstdlib/vstdlib.hpp
|
||||
src/store_mode/store.cpp
|
||||
src/store_mode/store.hpp
|
||||
src/store_mode/store_api.cpp
|
||||
src/store_mode/store_api.hpp
|
||||
src/store_mode/store_cache.cpp
|
||||
src/store_mode/store_cache.hpp
|
||||
src/game_mode/exports/steam_api.cpp
|
||||
)
|
||||
endif ()
|
||||
|
||||
add_library(SmokeAPI SHARED ${SMOKE_API_SOURCES} ${VERSION_RESOURCE})
|
||||
|
||||
# There is a weird bug where c++23 features are not enabled in x64 builds,
|
||||
# There is a weird MSVC bug where c++23 features are not enabled in x64 builds,
|
||||
# while they are available in x86. I've no idea what causes this discrepancy,
|
||||
# but manually setting the MSVC compiler option fixes this issue.
|
||||
target_compile_options(SmokeAPI PRIVATE /std:c++latest)
|
||||
|
||||
configure_linker_exports(
|
||||
TARGET SmokeAPI
|
||||
HEADER_NAME "linker_exports_for_steam_api"
|
||||
FORWARDED_DLL "${STEAMAPI_DLL}_o"
|
||||
INPUT_SOURCES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/game_mode/exports"
|
||||
INPUT_SOURCES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/exports"
|
||||
DLL_FILES_GLOB "${CMAKE_CURRENT_SOURCE_DIR}/res/steamworks/*/binaries/${STEAM_API_DLL}"
|
||||
)
|
||||
|
||||
configure_linker_exports(
|
||||
TARGET SmokeAPI
|
||||
HEADER_NAME "linker_exports_for_version"
|
||||
FORWARDED_DLL "C:/Windows/System32/version.dll"
|
||||
INPUT_SOURCES_DIR ""
|
||||
DLL_FILES_GLOB "C:/Windows/System32/version.dll"
|
||||
)
|
||||
|
||||
configure_output_name(${STEAMAPI_DLL})
|
||||
|
||||
configure_include_directories()
|
||||
|
||||
target_link_libraries(SmokeAPI PRIVATE KoalaBox)
|
||||
target_precompile_headers(SmokeAPI REUSE_FROM KoalaBox)
|
||||
|
||||
set(B_PRODUCTION_MODE ON)
|
||||
CPMAddPackage("gh:batterycenter/embed@1.2.19")
|
||||
b_embed(SmokeAPI "res/interface_lookup.json")
|
||||
|
||||
add_subdirectory(tools)
|
||||
|
||||
2
KoalaBox
2
KoalaBox
Submodule KoalaBox updated: 63837c420c...e749d5c90c
137
README.adoc
137
README.adoc
@@ -1,21 +1,15 @@
|
||||
= 🐨 SmokeAPI ♨
|
||||
|
||||
IMPORTANT: Steam has started checking for presence of SmokeAPI in its client, hence do not try to use store mode. Otherwise, there is a real possibility of getting your account banSned.
|
||||
= SmokeAPI
|
||||
|
||||
_Legit DLC Unlocker for Steamworks_
|
||||
|
||||
image::https://www.gstatic.com/android/keyboard/emojikitchen/20201001/u1f428/u1f428_u2615.png[,128,align="center"]
|
||||
|
||||
== ✨ Features
|
||||
|
||||
* 🔓 Legit DLC Unlocking
|
||||
* 🛅 Inventory emulation
|
||||
* 📝 Config-less operation
|
||||
* Multiple installation methods:
|
||||
** 🛍️ Store mode
|
||||
** 🎮 Game mode
|
||||
*** 🪝 Hook mode
|
||||
*** 🔀 Proxy mode
|
||||
* 2️⃣ installation methods:
|
||||
** 🪝 Hook mode
|
||||
** 🔀 Proxy mode
|
||||
|
||||
== 🔗 Links
|
||||
|
||||
@@ -30,9 +24,15 @@ image::https://www.gstatic.com/android/keyboard/emojikitchen/20201001/u1f428/u1f
|
||||
=== What is SmokeAPI?
|
||||
|
||||
SmokeAPI is a DLC unlocker for the games that are legitimately owned in your Steam account.
|
||||
It attempts to spoof games that use Steamworks SDK into believing that you own desired DLCs.
|
||||
It attempts to fool games that use Steamworks SDK into believing that you own desired DLCs.
|
||||
However, SmokeAPI does not modify the rest of the Steamworks SDK, hence features like multiplayer, achievements, etc. remain fully functional.
|
||||
|
||||
IMPORTANT: DLC unlocking is possible only in games that specifically use Steamworks SDK for ownership verification.
|
||||
But games may implement additional ownership checks, which may require custom solutions.
|
||||
If the check is server-side, as is the case in online-only games, then SmokeAPI cannot help in any way.
|
||||
Finally, even if you unlock the DLCs, games might still require additional DLC files, which would have to be downloaded from somewhere else.
|
||||
Check corresponding game topic in the forum for possible download links.
|
||||
|
||||
.Supported versions
|
||||
[%collapsible]
|
||||
====
|
||||
@@ -40,76 +40,56 @@ SmokeAPI aims to support all released SteamAPI versions.
|
||||
When it encountered a new, unsupported interface version, it will fall back on the latest supported version.
|
||||
Below is a list of supported interface versions:
|
||||
|
||||
* ISteamClient v6 — v20. (Versions before 6 did not contain any DLC related interfaces)
|
||||
* ISteamClient v6 — v21. (Versions before 6 did not contain any DLC related interfaces)
|
||||
* ISteamApps v2 — v8. (Version 1 did not contain any DLC related functions)
|
||||
* ISteamUser v12 — v21. (Versions before 12 did not contain any DLC related functions)
|
||||
* ISteamUser v12 — v23. (Versions before 12 did not contain any DLC related functions)
|
||||
* ISteamInventory v1 — v3.
|
||||
|
||||
Steam inventory does not work in all games with steam inventory because of custom implementation, and online checks.
|
||||
A list of games where inventory emulation has been shown to work is as follows:
|
||||
|
||||
* Project Winter
|
||||
* Euro Truck Simulator 2
|
||||
* Hero Siege (if you bypass EAC)
|
||||
====
|
||||
|
||||
== 🛠 Installation Instructions
|
||||
|
||||
WARNING: Please proceed with installation at your own risk.
|
||||
Usage of this unlocker entails breaking one or more terms of service, which might result in a permanent loss of your account.
|
||||
Usage of this unlocker entails breaking one or more terms of service, which might result in a permanent ban/deactivation of your account.
|
||||
|
||||
:koaloader: https://github.com/acidicoala/Koaloader[Koaloader]
|
||||
:smokeapi_release: https://github.com/acidicoala/SmokeAPI/releases/latest[SmokeAPI Releases]
|
||||
|
||||
SmokeAPI supports 2 main modes of installation: *Store* mode and *Game* mode, which are described in the next section.
|
||||
SmokeAPI is loaded into a game process, which limits it to that particular game only.
|
||||
SmokeAPI supports 2 installation modes: hook mode and proxy mode.
|
||||
|
||||
=== 🛍️ Store mode
|
||||
|===
|
||||
|Mode |Advantages |Disadvantages
|
||||
|
||||
NOTE: It is worth noting that the following instructions describe a _manual_ installation method.
|
||||
You can benefit from _automatic_ installation and GUI configuration by using https://github.com/acidicoala/Koalageddon2#readme[Koalageddon v2].
|
||||
|🪝 Hook mode
|
||||
|Persists after game updates
|
||||
|Might need an additional DLL (Koaloader)
|
||||
|
||||
In this installation mode, SmokeAPI is loaded into the Steam process, which makes it able to affect all Steam games.
|
||||
|🔀 Proxy mode
|
||||
|Guaranteed to load
|
||||
|Might need reinstallation if Steam updates affected DLL files
|
||||
|
||||
:steam-dir: the Steam directoryfootnote:fn-steam-dir[The root directory where Steam is installed]
|
||||
|===
|
||||
|
||||
. Download the latest Koaloader release zip from https://github.com/acidicoala/Koaloader/releases/latest[Koaloader Releases].
|
||||
. From Koaloader archive unpack `version.dll` from `version-32`, and place it in {steam-dir}.
|
||||
. In {steam-dir} create the following Koaloader configuration file:
|
||||
+
|
||||
.`Koaloader.config.json`
|
||||
[%collapsible]
|
||||
====
|
||||
[source,json]
|
||||
----
|
||||
{
|
||||
"auto_load": false,
|
||||
"targets": [
|
||||
"Steam.exe"
|
||||
],
|
||||
"modules": [
|
||||
{
|
||||
"path": "SmokeAPI.dll",
|
||||
"required": true
|
||||
}
|
||||
]
|
||||
}
|
||||
----
|
||||
====
|
||||
. Download the latest SmokeAPI release zip from {smokeapi_release}.
|
||||
. From SmokeAPI archive unpack `steam_api.dll`, rename it to `SmokeAPI.dll`, and place it in {steam-dir}.
|
||||
|
||||
=== 🎮 Game mode
|
||||
|
||||
In this installation mode, SmokeAPI is loaded into a game process, which limits it to that particular game only.
|
||||
This mode itself supports 2 modes: hook mode and proxy mode.
|
||||
Try installing the unlocker in hook mode first.
|
||||
If it doesn't work, try installing it in proxy mode.
|
||||
|
||||
==== 🪝 Hook mode
|
||||
|
||||
. Download the latest Koaloader release zip from https://github.com/acidicoala/Koaloader/releases/latest[Koaloader Releases].
|
||||
. From Koaloader archive unpack `version.dll` from version-32/64, depending on the game bitness, and place it next to the game exe file.
|
||||
. Download the latest SmokeAPI release zip from {smokeapi_release}.
|
||||
. From SmokeAPI archive unpack `steam_api.dll`/`steam_api64.dll`, depending on the game bitness, rename it to `SmokeAPI.dll`, and place it next to the game exe file.
|
||||
. From SmokeAPI archive unpack `steam_api.dll` or `steam_api64.dll`, depending on the game bitness, rename it to `version.dll`, and place it next to the game exe file.
|
||||
|
||||
==== 🪝 Hook mode (Alternative)
|
||||
|
||||
If a game doesn't load `version.dll`, you can use one of the {koaloader} DLLs that the game does in fact load. For example, assuming that the game loads `d3d9.dll`:
|
||||
|
||||
. Download the latest Koaloader release zip from https://github.com/acidicoala/Koaloader/releases/latest[Koaloader Releases].
|
||||
. From Koaloader archive unpack `d3d9.dll` from `d3d9-32` or `d3d9-64`, depending on the game bitness, and place it next to the game exe file.
|
||||
. Download the latest SmokeAPI release zip from {smokeapi_release}.
|
||||
. From SmokeAPI archive unpack `steam_api.dll` or `steam_api64.dll`, depending on the game bitness, rename it to `SmokeAPI.dll`, and place it next to the game exe file.
|
||||
|
||||
==== 🔀 Proxy mode
|
||||
|
||||
@@ -121,10 +101,9 @@ If the unlocker is not working as expected, then please fully read the https://g
|
||||
|
||||
== ⚙ Configuration
|
||||
|
||||
NOTE: This document describes configuration for version 2 of SmokeAPI.
|
||||
You can find the version 1 documentation https://github.com/acidicoala/SmokeAPI/blob/v1.0.3/README.md#-configuration[here].
|
||||
NOTE: This document describes configuration for version 3 of SmokeAPI.
|
||||
You can find the version 2 documentation https://github.com/acidicoala/SmokeAPI/blob/v2.0.5/README.md#-configuration[here].
|
||||
|
||||
:steam_config: https://github.com/acidicoala/public-entitlements/blob/main/steam/v2/store_config.json
|
||||
:fn-app-id: footnote:fn-app-id[App/DLC IDs can be obtained from https://steamdb.info[SteamDB] or https://steambase.io[Steambase]. Keep in mind that you need to be signed in with a steam account in order to see accurate inventory item IDs on that website.]
|
||||
|
||||
SmokeAPI does not require any manual configuration.
|
||||
@@ -132,7 +111,7 @@ By default, it uses the most reasonable options and tries to unlock all DLCs tha
|
||||
However, there might be circumstances in which you need more custom-tailored behaviour, such as disabling certain DLCs, or selectively enabling just a few of them.
|
||||
In this case you can use a configuration file link:res/SmokeAPI.config.json[SmokeAPI.config.json] that you can find here in this repository or in the release zip.
|
||||
To use it, simply place it next to the SmokeAPI DLL.
|
||||
It will be read upon each launch of a game or the store.
|
||||
It will be read upon each launch of the game.
|
||||
In the absence of the config file, default values specified below will be used.
|
||||
The configuration file is expected to conform to the Json standard.
|
||||
|
||||
@@ -142,13 +121,6 @@ The configuration file is expected to conform to the Json standard.
|
||||
Type::: Boolean
|
||||
Default::: `false`
|
||||
|
||||
`unlock_family_sharing`:: *_Store mode only_*.
|
||||
Toggles Family Sharing bypass, which enables the borrower of a shared library to start and continue playing games when library owner is playing as well.
|
||||
+
|
||||
[horizontal]
|
||||
Type::: Boolean
|
||||
Default::: `true`
|
||||
|
||||
`default_app_status`:: This option sets the default DLC unlocking behaviour.
|
||||
+
|
||||
[horizontal]
|
||||
@@ -196,7 +168,7 @@ Do not modify this value.
|
||||
+
|
||||
[horizontal]
|
||||
Type::: Integer
|
||||
Default::: `2`
|
||||
Default::: `3`
|
||||
|
||||
`extra_dlcs`:: See <<How SmokeAPI works in games with large number of DLCs>> to understand the use case for this option.
|
||||
+
|
||||
@@ -206,25 +178,14 @@ The format is the same as in the aforementioned GitHub config.
|
||||
Type::: Object
|
||||
Default::: `{}`
|
||||
|
||||
`store_config`:: *_Store mode only_*.
|
||||
An object that specifies offsets required for store mode operation.
|
||||
It will override the config fetched from {steam_config}[remote source] or local cache.
|
||||
Do not modify this value unless you know what you are doing.
|
||||
+
|
||||
[horizontal]
|
||||
Type::: Object
|
||||
Default::: See {steam_config}[online config]
|
||||
|
||||
.Complete example
|
||||
|
||||
[%collapsible]
|
||||
====
|
||||
[source,json]
|
||||
----
|
||||
{
|
||||
"$version": 2,
|
||||
"$version": 3,
|
||||
"logging": true,
|
||||
"unlock_family_sharing": true,
|
||||
"default_app_status": "unlocked",
|
||||
"override_app_status": {
|
||||
"1234": "original",
|
||||
@@ -249,14 +210,6 @@ Default::: See {steam_config}[online config]
|
||||
"98766": "Example DLC 3"
|
||||
}
|
||||
}
|
||||
},
|
||||
"store_config": {
|
||||
"client_engine_steam_client_internal_ordinal": 12,
|
||||
"steam_client_internal_interface_selector_ordinal": 18,
|
||||
"vstdlib_callback_address_offset": 20,
|
||||
"vstdlib_callback_data_offset": 0,
|
||||
"vstdlib_callback_interceptor_address_offset": 1,
|
||||
"vstdlib_callback_name_offset": 4
|
||||
}
|
||||
}
|
||||
----
|
||||
@@ -286,11 +239,11 @@ They will be added to the list of missing DLC IDs to facilitate config-less oper
|
||||
|
||||
=== 🚦 Requirements
|
||||
|
||||
:fn-lower-ver: footnote:lower-versions[Older versions may be supported as well.]
|
||||
:vs-bt-2022: https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022[Visual Studio Build Tools 2022]
|
||||
|
||||
* CMake v3.24 (Make sure that cmake is available from powershell)
|
||||
* Visual Studio 2022{fn-lower-ver}.
|
||||
* Tested on Windows 11 SDK (10.0.22621.0){fn-lower-ver}.
|
||||
* {vs-bt-2022} with `Desktop Development for C++` workload installed
|
||||
** Tested on Windows 11 SDK (10.0.26100.4188)
|
||||
|
||||
=== 👨💻 Commands
|
||||
|
||||
@@ -314,7 +267,7 @@ For example:
|
||||
|
||||
== 📚 Open-Source libraries
|
||||
|
||||
This project makes use of the open source projects specified in the https://github.com/acidicoala/KoalaBox#-open-source-libraries[KoalaBox Readme]
|
||||
TODO
|
||||
|
||||
== 📄 License
|
||||
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
{
|
||||
"$version": 2,
|
||||
"$version": 3,
|
||||
"logging": true,
|
||||
"unlock_family_sharing": true,
|
||||
"default_app_status": "unlocked",
|
||||
"override_app_id": 0,
|
||||
"override_app_status": {},
|
||||
"override_dlc_status": {},
|
||||
"auto_inject_inventory": true,
|
||||
"extra_inventory_items": [],
|
||||
"extra_dlcs": {},
|
||||
"store_config": null
|
||||
"extra_dlcs": {}
|
||||
}
|
||||
|
||||
1
res/dummy/README.md
Normal file
1
res/dummy/README.md
Normal file
@@ -0,0 +1 @@
|
||||
This directory contains dummy headers used by the `simplecpp` preprocessor
|
||||
0
res/dummy/cell/pad.h
Normal file
0
res/dummy/cell/pad.h
Normal file
0
res/dummy/stdint.h
Normal file
0
res/dummy/stdint.h
Normal file
0
res/dummy/stdio.h
Normal file
0
res/dummy/stdio.h
Normal file
0
res/dummy/string.h
Normal file
0
res/dummy/string.h
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user