From 09ad67309fa72a9a87be5b9d8340a20d39ec4ec8 Mon Sep 17 00:00:00 2001 From: CedNaru Date: Wed, 23 Apr 2025 23:57:15 +0200 Subject: [PATCH 01/10] Initial conversion --- .gitmodules | 3 + CMakeLists.txt | 30 +++++-- SConstruct | 85 ++++++++++++++++++++ SCsub | 45 ----------- generate_templates.py | 3 - godot-cpp | 1 + register_types.h | 9 --- src/editor/build/build_manager.h | 7 +- src/editor/dialog/about_dialog.cpp | 7 +- src/editor/dialog/about_dialog.h | 7 +- src/editor/dialog/build_dialog.cpp | 7 +- src/editor/dialog/build_dialog.h | 7 +- src/editor/godot_kotlin_jvm_editor.cpp | 4 - src/editor/godot_kotlin_jvm_editor.h | 4 - src/editor/project/project_generator.cpp | 6 +- src/editor/project/project_generator.h | 5 -- src/editor/project/templates.h | 33 ++++---- src/editor/strings.h | 4 - src/logging.h | 19 ++--- register_types.cpp => src/register_types.cpp | 10 +-- src/register_types.h | 11 +++ src/shared_buffer.h | 6 +- 22 files changed, 158 insertions(+), 155 deletions(-) create mode 100644 .gitmodules create mode 100644 SConstruct delete mode 100644 SCsub create mode 160000 godot-cpp delete mode 100644 register_types.h rename register_types.cpp => src/register_types.cpp (93%) create mode 100644 src/register_types.h diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000..29bd727bd5 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "godot-cpp"] + path = godot-cpp + url = https://github.com/godotengine/godot-cpp.git diff --git a/CMakeLists.txt b/CMakeLists.txt index c85cca4fca..514aaafd4b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,6 @@ set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) -set(GODOT_ROOT_DIR ../../) # Uncomment to pass auto completion in TOOLS mode #add_compile_definitions(MONO_GLUE_ENABLED) @@ -20,17 +19,34 @@ add_compile_definitions(X11_ENABLED) #add_compile_definitions(IOS_ENABLED) #add_compile_definitions(__ANDROID__) + + + +#Godot-cpp +file(GLOB_RECURSE GODOT-CPP godot-cpp/*.cpp) +add_library(godot STATIC ${GODOT-CPP}) + + # Get sources file(GLOB_RECURSE SOURCES src/*.c**) file(GLOB_RECURSE HEADERS src/*.h**) +add_library(${PROJECT_NAME} SHARED ${SOURCES} ${HEADERS}) + +# Includes +target_include_directories(godot + PUBLIC + godot-cpp/include + godot-cpp/include/godot_cpp + godot-cpp/gen/include + godot-cpp/gen/include/godot_cpp + godot-cpp/gdextension +) # JNI find_package(JNI REQUIRED) - -# Includes -include_directories(./src) -include_directories(${GODOT_ROOT_DIR}) include_directories(${JNI_INCLUDE_DIRS}) -# Target -add_library(${PROJECT_NAME} SHARED register_types.h register_types.cpp ${SOURCES} ${HEADERS}) \ No newline at end of file +target_link_libraries(${PROJECT_NAME} + PRIVATE + godot +) \ No newline at end of file diff --git a/SConstruct b/SConstruct new file mode 100644 index 0000000000..6d64a782e3 --- /dev/null +++ b/SConstruct @@ -0,0 +1,85 @@ +import os +import generate_templates + +env = SConscript("godot-cpp/SConstruct") +java_home = os.environ["JAVA_HOME"] + +# Generate templates when building the engine. +generate_templates.generate_header_from_files("kt/plugins/godot-intellij-plugin/src/main/resources/template", "src/editor/project/templates.h") + +# Add those directory manually, so we can skip the godot_cpp directory when including headers in C++ files +source_path = [ + os.path.join("godot-cpp", "include","godot_cpp"), + os.path.join("godot-cpp", "gen", "include","godot_cpp") +] +env.Append(CPPPATH=[env.Dir(d) for d in source_path]) + + +# For the reference: +# - CCFLAGS are compilation flags shared between C and C++ +# - CFLAGS are for C-specific compilation flags +# - CXXFLAGS are for C++-specific compilation flags +# - CPPFLAGS are for pre-processor flags +# - CPPDEFINES are for pre-processor defines +# - LINKFLAGS are for linking flags + +# tweak this if you want to use different folders, or more folders, to store your source code in. +env.Append(CPPPATH=["src/"]) +sources = [ + Glob("register_types.cpp"), + Glob("src/*.cpp"), + Glob("src/jni/*.cpp"), + Glob("src/binding/*.cpp"), + Glob("src/resource_format/*.cpp"), + Glob("src/language/*.cpp"), + Glob("src/script/*.cpp"), + Glob("src/script/language/*.cpp"), + Glob("src/jvm_wrapper/*.cpp"), + Glob("src/jvm_wrapper/registration/*.cpp"), + Glob("src/jvm_wrapper/bridge/*.cpp"), + Glob("src/jvm_wrapper/memory/*.cpp"), + Glob("src/lifecycle/*.cpp"), + Glob("src/lifecycle/platforms/*.cpp"), + ] + +if env["target"] in ["editor", "template_debug"]: + sources.append(Glob("src/editor/*.cpp")) + sources.append(Glob("src/editor/project/*.cpp")) + sources.append(Glob("src/editor/build/*.cpp")) + sources.append(Glob("src/editor/dialog/*.cpp")) + sources.append(Glob("src/editor/panel/*.cpp")) + +# Android +if env["platform"] != "android": + java_include_dirs = [ + java_home + "/include", + java_home + "/include/linux", + java_home + "/include/win32", + java_home + "/include/darwin" + ] + env.Append(CPPPATH=[java_include_dirs]) + + +if env["platform"] == "macos": + library = env.SharedLibrary( + "bin/godot.jvm.{}.{}.framework/godot.jvm.{}.{}".format( + env["platform"], env["target"], env["platform"], env["target"] + ), + source=sources, + ) +elif env["platform"] == "ios": + if env["ios_simulator"]: + library = env.StaticLibrary( + "bin/godot.jvm.{}.{}.simulator.a".format(env["platform"], env["target"]), + source=sources, + ) + else: + library = env.StaticLibrary( + "bin/godot.jvm.{}.{}.a".format(env["platform"], env["target"]), + source=sources, + ) +else: + library = env.SharedLibrary( + "bin/godot.jvm.{}{}".format(env["suffix"], env["SHLIBSUFFIX"]), + source=sources, + ) \ No newline at end of file diff --git a/SCsub b/SCsub deleted file mode 100644 index cddd9602b3..0000000000 --- a/SCsub +++ /dev/null @@ -1,45 +0,0 @@ -import os -import generate_templates - -Import("env") - -java_home = os.environ["JAVA_HOME"] - -module_env = env.Clone() - -# Generate templates when building the engine. -generate_templates.generate_header_from_files("kt/plugins/godot-intellij-plugin/src/main/resources/template", "src/editor/project/templates.h") - -# For header includes -module_env.Append(CPPPATH=["src/"]) - -# Android -if env["platform"] != "android": - java_include_dirs = [ - java_home + "/include", - java_home + "/include/linux", - java_home + "/include/win32", - java_home + "/include/darwin" - ] - module_env.Append(CPPPATH=[java_include_dirs]) - -# Common -module_env.add_source_files(module_env.modules_sources, "register_types.cpp") -module_env.add_source_files(module_env.modules_sources, "src/*.cpp") -module_env.add_source_files(module_env.modules_sources, "src/editor/*.cpp") -module_env.add_source_files(module_env.modules_sources, "src/editor/project/*.cpp") -module_env.add_source_files(module_env.modules_sources, "src/editor/build/*.cpp") -module_env.add_source_files(module_env.modules_sources, "src/editor/dialog/*.cpp") -module_env.add_source_files(module_env.modules_sources, "src/editor/panel/*.cpp") -module_env.add_source_files(module_env.modules_sources, "src/jni/*.cpp") -module_env.add_source_files(module_env.modules_sources, "src/binding/*.cpp") -module_env.add_source_files(module_env.modules_sources, "src/resource_format/*.cpp") -module_env.add_source_files(module_env.modules_sources, "src/language/*.cpp") -module_env.add_source_files(module_env.modules_sources, "src/script/*.cpp") -module_env.add_source_files(module_env.modules_sources, "src/script/language/*.cpp") -module_env.add_source_files(module_env.modules_sources, "src/jvm_wrapper/*.cpp") -module_env.add_source_files(module_env.modules_sources, "src/jvm_wrapper/registration/*.cpp") -module_env.add_source_files(module_env.modules_sources, "src/jvm_wrapper/bridge/*.cpp") -module_env.add_source_files(module_env.modules_sources, "src/jvm_wrapper/memory/*.cpp") -module_env.add_source_files(module_env.modules_sources, "src/lifecycle/*.cpp") -module_env.add_source_files(module_env.modules_sources, "src/lifecycle/platforms/*.cpp") \ No newline at end of file diff --git a/generate_templates.py b/generate_templates.py index 4de8843dca..c5d9621d21 100644 --- a/generate_templates.py +++ b/generate_templates.py @@ -22,7 +22,6 @@ def generate_header_from_files(directory, header_file): file_is_binary = [] with open(header_file, 'w') as header: - header.write(f'#ifdef TOOLS_ENABLED \n\n') header.write(f'// Auto-generated templates from {directory} directory \n\n') header.write("#ifndef FILE_CONTENTS_H\n") header.write("#define FILE_CONTENTS_H\n\n") @@ -77,8 +76,6 @@ def generate_header_from_files(directory, header_file): header.write("#endif // FILE_CONTENTS_H\n\n") - header.write("#endif// TOOLS_ENABLED\n") - print(f"{header_file} generated successfully.") if __name__ == "__main__": diff --git a/godot-cpp b/godot-cpp new file mode 160000 index 0000000000..e4b7c25e72 --- /dev/null +++ b/godot-cpp @@ -0,0 +1 @@ +Subproject commit e4b7c25e721ce3435a029087e3917a30aa73f06b diff --git a/register_types.h b/register_types.h deleted file mode 100644 index a76f4ebb74..0000000000 --- a/register_types.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef GODOT_JVM_REGISTER_TYPES_H -#define GODOT_JVM_REGISTER_TYPES_H - -#include - -void initialize_kotlin_jvm_module(ModuleInitializationLevel p_level); -void uninitialize_kotlin_jvm_module(ModuleInitializationLevel p_level); - -#endif //GODOT_JVM_REGISTER_TYPES_H diff --git a/src/editor/build/build_manager.h b/src/editor/build/build_manager.h index f5e42fc3b1..0f12d97020 100644 --- a/src/editor/build/build_manager.h +++ b/src/editor/build/build_manager.h @@ -1,6 +1,3 @@ - -#ifdef TOOLS_ENABLED - #ifndef GODOT_JVM_BUILD_MANAGER_H #define GODOT_JVM_BUILD_MANAGER_H @@ -28,6 +25,4 @@ class BuildManager { void build_project_non_blocking(); }; -#endif// GODOT_JVM_BUILD_MANAGER_H - -#endif// TOOLS_ENABLED +#endif// GODOT_JVM_BUILD_MANAGER_H \ No newline at end of file diff --git a/src/editor/dialog/about_dialog.cpp b/src/editor/dialog/about_dialog.cpp index eee109e259..692ca60658 100644 --- a/src/editor/dialog/about_dialog.cpp +++ b/src/editor/dialog/about_dialog.cpp @@ -1,6 +1,3 @@ - -#ifdef TOOLS_ENABLED - #include "about_dialog.h" #include "editor/godot_kotlin_jvm_editor.h" @@ -56,6 +53,4 @@ void AboutDialog::_notification(int notification) { popup_centered(); set_exclusive(false); } -} - -#endif// TOOLS_ENABLED \ No newline at end of file +} \ No newline at end of file diff --git a/src/editor/dialog/about_dialog.h b/src/editor/dialog/about_dialog.h index 9b43e7f617..980328a7ee 100644 --- a/src/editor/dialog/about_dialog.h +++ b/src/editor/dialog/about_dialog.h @@ -1,6 +1,3 @@ - -#ifdef TOOLS_ENABLED - #ifndef GODOT_JVM_ABOUT_DIALOG_H #define GODOT_JVM_ABOUT_DIALOG_H @@ -21,6 +18,4 @@ class AboutDialog : public AcceptDialog { void _notification(int notification); }; -#endif// GODOT_JVM_ABOUT_DIALOG_H - -#endif// TOOLS_ENABLED \ No newline at end of file +#endif// GODOT_JVM_ABOUT_DIALOG_H \ No newline at end of file diff --git a/src/editor/dialog/build_dialog.cpp b/src/editor/dialog/build_dialog.cpp index d0512a3eeb..6a02ab5357 100644 --- a/src/editor/dialog/build_dialog.cpp +++ b/src/editor/dialog/build_dialog.cpp @@ -1,6 +1,3 @@ - -#ifdef TOOLS_ENABLED - #include "build_dialog.h" #include "editor/build/build_manager.h" @@ -37,6 +34,4 @@ void BuildDialog::_notification(int notification) { log_label->set_h_size_flags(Control::SizeFlags::SIZE_EXPAND_FILL); scroll_container->add_child(log_label); -} - -#endif// TOOLS_ENABLED \ No newline at end of file +} \ No newline at end of file diff --git a/src/editor/dialog/build_dialog.h b/src/editor/dialog/build_dialog.h index 66885f85e3..a950b7242a 100644 --- a/src/editor/dialog/build_dialog.h +++ b/src/editor/dialog/build_dialog.h @@ -1,6 +1,3 @@ - -#ifdef TOOLS_ENABLED - #ifndef GODOT_JVM_BUILD_DIALOG_H #define GODOT_JVM_BUILD_DIALOG_H @@ -21,6 +18,4 @@ class BuildDialog : public AcceptDialog { void _notification(int notification); }; -#endif// GODOT_JVM_BUILD_DIALOG_H - -#endif// TOOLS_ENABLED \ No newline at end of file +#endif// GODOT_JVM_BUILD_DIALOG_H \ No newline at end of file diff --git a/src/editor/godot_kotlin_jvm_editor.cpp b/src/editor/godot_kotlin_jvm_editor.cpp index dea061372b..279d1c61af 100644 --- a/src/editor/godot_kotlin_jvm_editor.cpp +++ b/src/editor/godot_kotlin_jvm_editor.cpp @@ -1,5 +1,3 @@ -#ifdef TOOLS_ENABLED - #include "godot_kotlin_jvm_editor.h" #include "editor/build/build_manager.h" @@ -142,5 +140,3 @@ GodotKotlinJvmEditor::~GodotKotlinJvmEditor() { memdelete(project_dialog); memdelete(tool_bar_build_button); } - -#endif// TOOLS_ENABLED \ No newline at end of file diff --git a/src/editor/godot_kotlin_jvm_editor.h b/src/editor/godot_kotlin_jvm_editor.h index efafd69949..cc57cf8686 100644 --- a/src/editor/godot_kotlin_jvm_editor.h +++ b/src/editor/godot_kotlin_jvm_editor.h @@ -1,5 +1,3 @@ -#ifdef TOOLS_ENABLED - #ifndef GODOT_JVM_GODOT_KOTLIN_JVM_EDITOR_H #define GODOT_JVM_GODOT_KOTLIN_JVM_EDITOR_H @@ -46,5 +44,3 @@ class GodotKotlinJvmEditor : public EditorPlugin { }; #endif// GODOT_JVM_GODOT_KOTLIN_JVM_EDITOR_H - -#endif// TOOLS_ENABLED \ No newline at end of file diff --git a/src/editor/project/project_generator.cpp b/src/editor/project/project_generator.cpp index 75397327e8..5e109c9ef6 100644 --- a/src/editor/project/project_generator.cpp +++ b/src/editor/project/project_generator.cpp @@ -1,5 +1,3 @@ -#ifdef TOOLS_ENABLED - #include "project_generator.h" #include "editor/strings.h" @@ -51,6 +49,4 @@ void ProjectGenerator::generate_jvm_files(bool erase_existing) { } memdelete(marshall); JVM_LOG_INFO("JVM project files generated."); -} - -#endif// TOOLS_ENABLED \ No newline at end of file +} \ No newline at end of file diff --git a/src/editor/project/project_generator.h b/src/editor/project/project_generator.h index fff6c82469..07349f91b1 100644 --- a/src/editor/project/project_generator.h +++ b/src/editor/project/project_generator.h @@ -1,6 +1,3 @@ - -#ifdef TOOLS_ENABLED - #ifndef GODOT_JVM_PROJECTGENERATOR_H #define GODOT_JVM_PROJECTGENERATOR_H @@ -15,5 +12,3 @@ class ProjectGenerator { }; #endif// GODOT_JVM_PROJECTGENERATOR_H - -#endif// TOOLS_ENABLED diff --git a/src/editor/project/templates.h b/src/editor/project/templates.h index 6720502f24..16a861ded4 100644 --- a/src/editor/project/templates.h +++ b/src/editor/project/templates.h @@ -1,30 +1,28 @@ -#ifdef TOOLS_ENABLED - // Auto-generated templates from kt/plugins/godot-intellij-plugin/src/main/resources/template directory #ifndef FILE_CONTENTS_H #define FILE_CONTENTS_H -constexpr const char* gradle_properties_file_name = R"(gradle.properties)"; -constexpr const char* gradle_properties_file_content = "b3JnLmdyYWRsZS5qdm1hcmdzPS1YbXgzRwoKIyBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlIHRvIGRpc2FibGUga290bGluIGp2bSBwbHVnaW4gdmVyc2lvbiBjaGVjawojIEF0dGVudGlvbjogdGhpcyBpcyBhbiBhZHZhbmNlZCBmZWF0dXJlLiBPbmx5IHVzZSBpdCBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZyEgV2UgY2Fubm90IGd1YXJhbnRlZSB0aGF0IG91ciBjb21waWxlciBwbHVnaW4gaXMgY29tcGF0aWJsZSB3aXRoIG90aGVyIGtvdGxpbiB2ZXJzaW9ucyB0aGFuIHRoZSBvbmUgd2UgYnVpbGQgaXQgZm9yLiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSBjYW4gbGVhZCB0byBidWlsZCBhbmQvb3IgcnVudGltZSBlcnJvcnMuCiNnb2RvdC5qdm0uc3VwcHJlc3NLb3RsaW5JbmNvbXBhdGliaWxpdHk9dHJ1ZQo="; +constexpr const char* _gitattributes_file_name = R"(.gitattributes)"; +constexpr const char* _gitattributes_file_content = "Iw0KIyBodHRwczovL2hlbHAuZ2l0aHViLmNvbS9hcnRpY2xlcy9kZWFsaW5nLXdpdGgtbGluZS1lbmRpbmdzLw0KIw0KIyBUaGVzZSBhcmUgZXhwbGljaXRseSB3aW5kb3dzIGZpbGVzIGFuZCBzaG91bGQgdXNlIGNybGYNCiouYmF0ICAgICAgICAgICB0ZXh0IGVvbD1jcmxmDQoNCg=="; constexpr const char* _gitignore_file_name = R"(.gitignore)"; -constexpr const char* _gitignore_file_content = "LmdvZG90LwovYW5kcm9pZC8KLmdyYWRsZQoua290bGluCi5pZGVhCmJ1aWxkCmp2bQ=="; +constexpr const char* _gitignore_file_content = "LmdvZG90Lw0KL2FuZHJvaWQvDQouZ3JhZGxlDQoua290bGluDQouaWRlYQ0KYnVpbGQNCmp2bQ=="; constexpr const char* build_gradle_kts_file_name = R"(build.gradle.kts)"; -constexpr const char* build_gradle_kts_file_content = "cGx1Z2lucyB7CiAgICBpZCgiY29tLnV0b3BpYS1yaXNlLmdvZG90LWtvdGxpbi1qdm0iKSB2ZXJzaW9uICJHT0RPVF9LT1RMSU5fSlZNX1ZFUlNJT04iCn0KCnJlcG9zaXRvcmllcyB7CiAgICBtYXZlbkNlbnRyYWwoKQp9Cgprb3RsaW4gewogICAganZtVG9vbGNoYWluKDE3KQp9Cgpnb2RvdCB7CiAgICAvLyAtLS0tLS0tLS1TZXR1cC0tLS0tLS0tLS0tLS0tLS0tCgogICAgLy8gdGhlIHNjcmlwdCByZWdpc3RyYXRpb24gd2hpY2ggeW91J2xsIGF0dGFjaCB0byBub2RlcyBhcmUgZ2VuZXJhdGVkIGludG8gdGhpcyBkaXJlY3RvcnkKICAgIHJlZ2lzdHJhdGlvbkZpbGVCYXNlRGlyLnNldChwcm9qZWN0RGlyLnJlc29sdmUoImdkaiIpKQoKCS8vIENyZWF0ZSAuZ2RqIGZpbGVzIGZyb20gYWxsIEpWTSBzY3JpcHRzCglpc1JlZ2lzdHJhdGlvbkZpbGVHZW5lcmF0aW9uRW5hYmxlZC5zZXQodHJ1ZSkKCiAgICAvLyBkZWZpbmVzIHdoZXRoZXIgdGhlIHNjcmlwdCByZWdpc3RyYXRpb24gZmlsZXMgc2hvdWxkIGJlIGdlbmVyYXRlZCBoaWVyYXJjaGljYWxseSBhY2NvcmRpbmcgdG8gdGhlIGNsYXNzZXMgcGFja2FnZSBwYXRoIG9yIGZsYXR0ZW5lZCBpbnRvIGByZWdpc3RyYXRpb25GaWxlQmFzZURpcmAKICAgIC8vaXNSZWdpc3RyYXRpb25GaWxlSGllcmFyY2h5RW5hYmxlZC5zZXQodHJ1ZSkKCiAgICAvLyBkZWZpbmVzIHdoZXRoZXIgeW91ciBzY3JpcHRzIHNob3VsZCBiZSByZWdpc3RlcmVkIHdpdGggdGhlaXIgZnFOYW1lIG9yIHRoZWlyIHNpbXBsZSBuYW1lIChjYW4gaGVscCB3aXRoIHJlc29sdmluZyBzY3JpcHQgbmFtZSBjb25mbGljdHMpCiAgICAvL2lzRnFOYW1lUmVnaXN0cmF0aW9uRW5hYmxlZC5zZXQoZmFsc2UpCgogICAgLy8gLS0tLS0tLS0tQW5kcm9pZC0tLS0tLS0tLS0tLS0tLS0KCiAgICAvLyBOT1RFOiBNYWtlIHN1cmUgeW91IHJlYWQ6IGh0dHBzOi8vZ29kb3Qta290bC5pbi9lbi9zdGFibGUvdXNlci1ndWlkZS9leHBvcnRpbmcvI2FuZHJvaWQgYXMgbm90IGFsbCBqdm0gbGlicmFyaWVzIGFyZSBjb21wYXRpYmxlIHdpdGggYW5kcm9pZCEKICAgIC8vIElNUE9SVEFOVDogQW5kcm9pZCBleHBvcnQgc2hvdWxkIHRvIGJlIGNvbnNpZGVyZWQgZnJvbSB0aGUgc3RhcnQgb2YgZGV2ZWxvcG1lbnQhCiAgICAvL2lzQW5kcm9pZEV4cG9ydEVuYWJsZWQuc2V0KEFORFJPSURfRU5BQkxFRCkKICAgIC8vZDhUb29sUGF0aC5zZXQoRmlsZSgiRDhfVE9PTF9QQVRIIikpCiAgICAvL2FuZHJvaWRDb21waWxlU2RrRGlyLnNldChGaWxlKCJBTkRST0lEX0NPTVBJTEVfU0RLX0RJUiIpKQoKICAgIC8vIC0tLS0tLS0tSU9TIGFuZCBHcmFhbC0tLS0tLS0tLS0tLQoKICAgIC8vIE5PVEU6IHRoaXMgaXMgYW4gYWR2YW5jZWQgZmVhdHVyZSEgUmVhZDogaHR0cHM6Ly9nb2RvdC1rb3RsLmluL2VuL3N0YWJsZS91c2VyLWd1aWRlL2FkdmFuY2VkL2dyYWFsLXZtLW5hdGl2ZS1pbWFnZS8KICAgIC8vIElNUE9SVEFOVDogR3JhYWwgTmF0aXZlIEltYWdlIG5lZWRzIHRvIGJlIGNvbnNpZGVyZWQgZnJvbSB0aGUgc3RhcnQgb2YgZGV2ZWxvcG1lbnQhCiAgICAvL2lzR3JhYWxOYXRpdmVJbWFnZUV4cG9ydEVuYWJsZWQuc2V0KElTX0dSQUFMX1ZNX0VOQUJMRUQpCiAgICAvL2dyYWFsVm1EaXJlY3Rvcnkuc2V0KEZpbGUoIkdSQUFMX1ZNX0RJUiIpKQogICAgLy93aW5kb3dzRGV2ZWxvcGVyVkNWYXJzUGF0aC5zZXQoRmlsZSgiV0lORE9XU19ERVZFTE9QRVJfVlNfVkFSU19QQVRIIikpCiAgICAvL2lzSU9TRXhwb3J0RW5hYmxlZC5zZXQoSVNfSU9TX0VOQUJMRUQpCgoJLy8gLS0tLS0tLS1MaWJyYXJ5IGF1dGhvcnMtLS0tLS0tLS0tLS0KCgkvLyBsaWJyYXJ5IHNldHVwLiBTZWU6IGh0dHBzOi8vZ29kb3Qta290bC5pbi9lbi9zdGFibGUvZGV2ZWxvcC1saWJyYXJpZXMvCiAgICAvL2NsYXNzUHJlZml4LnNldCgiTXlDdXN0b21DbGFzc1ByZWZpeCIpCiAgICAvL3Byb2plY3ROYW1lLnNldCgiTGlicmFyeVByb2plY3ROYW1lIikKICAgIC8vcHJvamVjdE5hbWUuc2V0KCJMaWJyYXJ5UHJvamVjdE5hbWUiKQp9Cg=="; +constexpr const char* build_gradle_kts_file_content = "cGx1Z2lucyB7DQogICAgaWQoImNvbS51dG9waWEtcmlzZS5nb2RvdC1rb3RsaW4tanZtIikgdmVyc2lvbiAiR09ET1RfS09UTElOX0pWTV9WRVJTSU9OIg0KfQ0KDQpyZXBvc2l0b3JpZXMgew0KICAgIG1hdmVuQ2VudHJhbCgpDQp9DQoNCmtvdGxpbiB7DQogICAganZtVG9vbGNoYWluKDE3KQ0KfQ0KDQpnb2RvdCB7DQogICAgLy8gLS0tLS0tLS0tU2V0dXAtLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgLy8gdGhlIHNjcmlwdCByZWdpc3RyYXRpb24gd2hpY2ggeW91J2xsIGF0dGFjaCB0byBub2RlcyBhcmUgZ2VuZXJhdGVkIGludG8gdGhpcyBkaXJlY3RvcnkNCiAgICByZWdpc3RyYXRpb25GaWxlQmFzZURpci5zZXQocHJvamVjdERpci5yZXNvbHZlKCJnZGoiKSkNCg0KCS8vIENyZWF0ZSAuZ2RqIGZpbGVzIGZyb20gYWxsIEpWTSBzY3JpcHRzDQoJaXNSZWdpc3RyYXRpb25GaWxlR2VuZXJhdGlvbkVuYWJsZWQuc2V0KHRydWUpDQoNCiAgICAvLyBkZWZpbmVzIHdoZXRoZXIgdGhlIHNjcmlwdCByZWdpc3RyYXRpb24gZmlsZXMgc2hvdWxkIGJlIGdlbmVyYXRlZCBoaWVyYXJjaGljYWxseSBhY2NvcmRpbmcgdG8gdGhlIGNsYXNzZXMgcGFja2FnZSBwYXRoIG9yIGZsYXR0ZW5lZCBpbnRvIGByZWdpc3RyYXRpb25GaWxlQmFzZURpcmANCiAgICAvL2lzUmVnaXN0cmF0aW9uRmlsZUhpZXJhcmNoeUVuYWJsZWQuc2V0KHRydWUpDQoNCiAgICAvLyBkZWZpbmVzIHdoZXRoZXIgeW91ciBzY3JpcHRzIHNob3VsZCBiZSByZWdpc3RlcmVkIHdpdGggdGhlaXIgZnFOYW1lIG9yIHRoZWlyIHNpbXBsZSBuYW1lIChjYW4gaGVscCB3aXRoIHJlc29sdmluZyBzY3JpcHQgbmFtZSBjb25mbGljdHMpDQogICAgLy9pc0ZxTmFtZVJlZ2lzdHJhdGlvbkVuYWJsZWQuc2V0KGZhbHNlKQ0KDQogICAgLy8gLS0tLS0tLS0tQW5kcm9pZC0tLS0tLS0tLS0tLS0tLS0NCg0KICAgIC8vIE5PVEU6IE1ha2Ugc3VyZSB5b3UgcmVhZDogaHR0cHM6Ly9nb2RvdC1rb3RsLmluL2VuL3N0YWJsZS91c2VyLWd1aWRlL2V4cG9ydGluZy8jYW5kcm9pZCBhcyBub3QgYWxsIGp2bSBsaWJyYXJpZXMgYXJlIGNvbXBhdGlibGUgd2l0aCBhbmRyb2lkIQ0KICAgIC8vIElNUE9SVEFOVDogQW5kcm9pZCBleHBvcnQgc2hvdWxkIHRvIGJlIGNvbnNpZGVyZWQgZnJvbSB0aGUgc3RhcnQgb2YgZGV2ZWxvcG1lbnQhDQogICAgLy9pc0FuZHJvaWRFeHBvcnRFbmFibGVkLnNldChBTkRST0lEX0VOQUJMRUQpDQogICAgLy9kOFRvb2xQYXRoLnNldChGaWxlKCJEOF9UT09MX1BBVEgiKSkNCiAgICAvL2FuZHJvaWRDb21waWxlU2RrRGlyLnNldChGaWxlKCJBTkRST0lEX0NPTVBJTEVfU0RLX0RJUiIpKQ0KDQogICAgLy8gLS0tLS0tLS1JT1MgYW5kIEdyYWFsLS0tLS0tLS0tLS0tDQoNCiAgICAvLyBOT1RFOiB0aGlzIGlzIGFuIGFkdmFuY2VkIGZlYXR1cmUhIFJlYWQ6IGh0dHBzOi8vZ29kb3Qta290bC5pbi9lbi9zdGFibGUvdXNlci1ndWlkZS9hZHZhbmNlZC9ncmFhbC12bS1uYXRpdmUtaW1hZ2UvDQogICAgLy8gSU1QT1JUQU5UOiBHcmFhbCBOYXRpdmUgSW1hZ2UgbmVlZHMgdG8gYmUgY29uc2lkZXJlZCBmcm9tIHRoZSBzdGFydCBvZiBkZXZlbG9wbWVudCENCiAgICAvL2lzR3JhYWxOYXRpdmVJbWFnZUV4cG9ydEVuYWJsZWQuc2V0KElTX0dSQUFMX1ZNX0VOQUJMRUQpDQogICAgLy9ncmFhbFZtRGlyZWN0b3J5LnNldChGaWxlKCJHUkFBTF9WTV9ESVIiKSkNCiAgICAvL3dpbmRvd3NEZXZlbG9wZXJWQ1ZhcnNQYXRoLnNldChGaWxlKCJXSU5ET1dTX0RFVkVMT1BFUl9WU19WQVJTX1BBVEgiKSkNCiAgICAvL2lzSU9TRXhwb3J0RW5hYmxlZC5zZXQoSVNfSU9TX0VOQUJMRUQpDQoNCgkvLyAtLS0tLS0tLUxpYnJhcnkgYXV0aG9ycy0tLS0tLS0tLS0tLQ0KDQoJLy8gbGlicmFyeSBzZXR1cC4gU2VlOiBodHRwczovL2dvZG90LWtvdGwuaW4vZW4vc3RhYmxlL2RldmVsb3AtbGlicmFyaWVzLw0KICAgIC8vY2xhc3NQcmVmaXguc2V0KCJNeUN1c3RvbUNsYXNzUHJlZml4IikNCiAgICAvL3Byb2plY3ROYW1lLnNldCgiTGlicmFyeVByb2plY3ROYW1lIikNCiAgICAvL3Byb2plY3ROYW1lLnNldCgiTGlicmFyeVByb2plY3ROYW1lIikNCn0NCg=="; -constexpr const char* gradlew_bat_file_name = R"(gradlew.bat)"; -constexpr const char* gradlew_bat_file_content = "QHJlbQpAcmVtIENvcHlyaWdodCAyMDE1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KQHJlbQpAcmVtIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwpAcmVtIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQHJlbSBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKQHJlbQpAcmVtICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMApAcmVtCkByZW0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpAcmVtIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkByZW0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCkByZW0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApAcmVtIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpAcmVtCgpAaWYgIiVERUJVRyUiID09ICIiIEBlY2hvIG9mZgpAcmVtICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkByZW0KQHJlbSAgR3JhZGxlIHN0YXJ0dXAgc2NyaXB0IGZvciBXaW5kb3dzCkByZW0KQHJlbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKQHJlbSBTZXQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsCmlmICIlT1MlIj09IldpbmRvd3NfTlQiIHNldGxvY2FsCgpzZXQgRElSTkFNRT0lfmRwMAppZiAiJURJUk5BTUUlIiA9PSAiIiBzZXQgRElSTkFNRT0uCnNldCBBUFBfQkFTRV9OQU1FPSV+bjAKc2V0IEFQUF9IT01FPSVESVJOQU1FJQoKQHJlbSBSZXNvbHZlIGFueSAiLiIgYW5kICIuLiIgaW4gQVBQX0hPTUUgdG8gbWFrZSBpdCBzaG9ydGVyLgpmb3IgJSVpIGluICgiJUFQUF9IT01FJSIpIGRvIHNldCBBUFBfSE9NRT0lJX5maQoKQHJlbSBBZGQgZGVmYXVsdCBKVk0gb3B0aW9ucyBoZXJlLiBZb3UgY2FuIGFsc28gdXNlIEpBVkFfT1BUUyBhbmQgR1JBRExFX09QVFMgdG8gcGFzcyBKVk0gb3B0aW9ucyB0byB0aGlzIHNjcmlwdC4Kc2V0IERFRkFVTFRfSlZNX09QVFM9Ii1YbXg2NG0iICItWG1zNjRtIgoKQHJlbSBGaW5kIGphdmEuZXhlCmlmIGRlZmluZWQgSkFWQV9IT01FIGdvdG8gZmluZEphdmFGcm9tSmF2YUhvbWUKCnNldCBKQVZBX0VYRT1qYXZhLmV4ZQolSkFWQV9FWEUlIC12ZXJzaW9uID5OVUwgMj4mMQppZiAiJUVSUk9STEVWRUwlIiA9PSAiMCIgZ290byBpbml0CgplY2hvLgplY2hvIEVSUk9SOiBKQVZBX0hPTUUgaXMgbm90IHNldCBhbmQgbm8gJ2phdmEnIGNvbW1hbmQgY291bGQgYmUgZm91bmQgaW4geW91ciBQQVRILgplY2hvLgplY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQplY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uCgpnb3RvIGZhaWwKCjpmaW5kSmF2YUZyb21KYXZhSG9tZQpzZXQgSkFWQV9IT01FPSVKQVZBX0hPTUU6Ij0lCnNldCBKQVZBX0VYRT0lSkFWQV9IT01FJS9iaW4vamF2YS5leGUKCmlmIGV4aXN0ICIlSkFWQV9FWEUlIiBnb3RvIGluaXQKCmVjaG8uCmVjaG8gRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICVKQVZBX0hPTUUlCmVjaG8uCmVjaG8gUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCmVjaG8gbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4KCmdvdG8gZmFpbAoKOmluaXQKQHJlbSBHZXQgY29tbWFuZC1saW5lIGFyZ3VtZW50cywgaGFuZGxpbmcgV2luZG93cyB2YXJpYW50cwoKaWYgbm90ICIlT1MlIiA9PSAiV2luZG93c19OVCIgZ290byB3aW45eE1FX2FyZ3MKCjp3aW45eE1FX2FyZ3MKQHJlbSBTbHVycCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4Kc2V0IENNRF9MSU5FX0FSR1M9CnNldCBfU0tJUD0yCgo6d2luOXhNRV9hcmdzX3NsdXJwCmlmICJ4JX4xIiA9PSAieCIgZ290byBleGVjdXRlCgpzZXQgQ01EX0xJTkVfQVJHUz0lKgoKOmV4ZWN1dGUKQHJlbSBTZXR1cCB0aGUgY29tbWFuZCBsaW5lCgpzZXQgQ0xBU1NQQVRIPSVBUFBfSE9NRSVcZ3JhZGxlXHdyYXBwZXJcZ3JhZGxlLXdyYXBwZXIuamFyCgoKQHJlbSBFeGVjdXRlIEdyYWRsZQoiJUpBVkFfRVhFJSIgJURFRkFVTFRfSlZNX09QVFMlICVKQVZBX09QVFMlICVHUkFETEVfT1BUUyUgIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSVBUFBfQkFTRV9OQU1FJSIgLWNsYXNzcGF0aCAiJUNMQVNTUEFUSCUiIG9yZy5ncmFkbGUud3JhcHBlci5HcmFkbGVXcmFwcGVyTWFpbiAlQ01EX0xJTkVfQVJHUyUKCjplbmQKQHJlbSBFbmQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsCmlmICIlRVJST1JMRVZFTCUiPT0iMCIgZ290byBtYWluRW5kCgo6ZmFpbApyZW0gU2V0IHZhcmlhYmxlIEdSQURMRV9FWElUX0NPTlNPTEUgaWYgeW91IG5lZWQgdGhlIF9zY3JpcHRfIHJldHVybiBjb2RlIGluc3RlYWQgb2YKcmVtIHRoZSBfY21kLmV4ZSAvY18gcmV0dXJuIGNvZGUhCmlmICBub3QgIiIgPT0gIiVHUkFETEVfRVhJVF9DT05TT0xFJSIgZXhpdCAxCmV4aXQgL2IgMQoKOm1haW5FbmQKaWYgIiVPUyUiPT0iV2luZG93c19OVCIgZW5kbG9jYWwKCjpvbWVnYQo="; +constexpr const char* gradle_properties_file_name = R"(gradle.properties)"; +constexpr const char* gradle_properties_file_content = "b3JnLmdyYWRsZS5qdm1hcmdzPS1YbXgzRw0KDQojIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUgdG8gZGlzYWJsZSBrb3RsaW4ganZtIHBsdWdpbiB2ZXJzaW9uIGNoZWNrDQojIEF0dGVudGlvbjogdGhpcyBpcyBhbiBhZHZhbmNlZCBmZWF0dXJlLiBPbmx5IHVzZSBpdCBpZiB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZyEgV2UgY2Fubm90IGd1YXJhbnRlZSB0aGF0IG91ciBjb21waWxlciBwbHVnaW4gaXMgY29tcGF0aWJsZSB3aXRoIG90aGVyIGtvdGxpbiB2ZXJzaW9ucyB0aGFuIHRoZSBvbmUgd2UgYnVpbGQgaXQgZm9yLiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSBjYW4gbGVhZCB0byBidWlsZCBhbmQvb3IgcnVudGltZSBlcnJvcnMuDQojZ29kb3QuanZtLnN1cHByZXNzS290bGluSW5jb21wYXRpYmlsaXR5PXRydWUNCg=="; -constexpr const char* settings_gradle_kts_file_name = R"(settings.gradle.kts)"; -constexpr const char* settings_gradle_kts_file_content = "CnBsdWdpbnMgewogICAgLy8gdG8gYXV0b21hdGljYWxseSBkb3dubG9hZCB0aGUgdG9vbGNoYWluIGpkayBpZiBtaXNzaW5nCiAgICBpZCgib3JnLmdyYWRsZS50b29sY2hhaW5zLmZvb2pheS1yZXNvbHZlci1jb252ZW50aW9uIikgdmVyc2lvbiAiMC45LjAiIC8vIGh0dHBzOi8vcGx1Z2lucy5ncmFkbGUub3JnL3BsdWdpbi9vcmcuZ3JhZGxlLnRvb2xjaGFpbnMuZm9vamF5LXJlc29sdmVyLWNvbnZlbnRpb24KfQoKcm9vdFByb2plY3QubmFtZSA9ICJQUk9KRUNUX05BTUUiCg=="; +constexpr const char* gradlew_bat_file_name = R"(gradlew.bat)"; +constexpr const char* gradlew_bat_file_content = "QHJlbQ0KQHJlbSBDb3B5cmlnaHQgMjAxNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQpAcmVtDQpAcmVtIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KQHJlbSB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQpAcmVtIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KQHJlbQ0KQHJlbSAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCkByZW0NCkByZW0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KQHJlbSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KQHJlbSBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCkByZW0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KQHJlbSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCkByZW0NCg0KQGlmICIlREVCVUclIiA9PSAiIiBAZWNobyBvZmYNCkByZW0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCkByZW0NCkByZW0gIEdyYWRsZSBzdGFydHVwIHNjcmlwdCBmb3IgV2luZG93cw0KQHJlbQ0KQHJlbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpAcmVtIFNldCBsb2NhbCBzY29wZSBmb3IgdGhlIHZhcmlhYmxlcyB3aXRoIHdpbmRvd3MgTlQgc2hlbGwNCmlmICIlT1MlIj09IldpbmRvd3NfTlQiIHNldGxvY2FsDQoNCnNldCBESVJOQU1FPSV+ZHAwDQppZiAiJURJUk5BTUUlIiA9PSAiIiBzZXQgRElSTkFNRT0uDQpzZXQgQVBQX0JBU0VfTkFNRT0lfm4wDQpzZXQgQVBQX0hPTUU9JURJUk5BTUUlDQoNCkByZW0gUmVzb2x2ZSBhbnkgIi4iIGFuZCAiLi4iIGluIEFQUF9IT01FIHRvIG1ha2UgaXQgc2hvcnRlci4NCmZvciAlJWkgaW4gKCIlQVBQX0hPTUUlIikgZG8gc2V0IEFQUF9IT01FPSUlfmZpDQoNCkByZW0gQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuDQpzZXQgREVGQVVMVF9KVk1fT1BUUz0iLVhteDY0bSIgIi1YbXM2NG0iDQoNCkByZW0gRmluZCBqYXZhLmV4ZQ0KaWYgZGVmaW5lZCBKQVZBX0hPTUUgZ290byBmaW5kSmF2YUZyb21KYXZhSG9tZQ0KDQpzZXQgSkFWQV9FWEU9amF2YS5leGUNCiVKQVZBX0VYRSUgLXZlcnNpb24gPk5VTCAyPiYxDQppZiAiJUVSUk9STEVWRUwlIiA9PSAiMCIgZ290byBpbml0DQoNCmVjaG8uDQplY2hvIEVSUk9SOiBKQVZBX0hPTUUgaXMgbm90IHNldCBhbmQgbm8gJ2phdmEnIGNvbW1hbmQgY291bGQgYmUgZm91bmQgaW4geW91ciBQQVRILg0KZWNoby4NCmVjaG8gUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlDQplY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uDQoNCmdvdG8gZmFpbA0KDQo6ZmluZEphdmFGcm9tSmF2YUhvbWUNCnNldCBKQVZBX0hPTUU9JUpBVkFfSE9NRToiPSUNCnNldCBKQVZBX0VYRT0lSkFWQV9IT01FJS9iaW4vamF2YS5leGUNCg0KaWYgZXhpc3QgIiVKQVZBX0VYRSUiIGdvdG8gaW5pdA0KDQplY2hvLg0KZWNobyBFUlJPUjogSkFWQV9IT01FIGlzIHNldCB0byBhbiBpbnZhbGlkIGRpcmVjdG9yeTogJUpBVkFfSE9NRSUNCmVjaG8uDQplY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQ0KZWNobyBsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLg0KDQpnb3RvIGZhaWwNCg0KOmluaXQNCkByZW0gR2V0IGNvbW1hbmQtbGluZSBhcmd1bWVudHMsIGhhbmRsaW5nIFdpbmRvd3MgdmFyaWFudHMNCg0KaWYgbm90ICIlT1MlIiA9PSAiV2luZG93c19OVCIgZ290byB3aW45eE1FX2FyZ3MNCg0KOndpbjl4TUVfYXJncw0KQHJlbSBTbHVycCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4NCnNldCBDTURfTElORV9BUkdTPQ0Kc2V0IF9TS0lQPTINCg0KOndpbjl4TUVfYXJnc19zbHVycA0KaWYgInglfjEiID09ICJ4IiBnb3RvIGV4ZWN1dGUNCg0Kc2V0IENNRF9MSU5FX0FSR1M9JSoNCg0KOmV4ZWN1dGUNCkByZW0gU2V0dXAgdGhlIGNvbW1hbmQgbGluZQ0KDQpzZXQgQ0xBU1NQQVRIPSVBUFBfSE9NRSVcZ3JhZGxlXHdyYXBwZXJcZ3JhZGxlLXdyYXBwZXIuamFyDQoNCg0KQHJlbSBFeGVjdXRlIEdyYWRsZQ0KIiVKQVZBX0VYRSUiICVERUZBVUxUX0pWTV9PUFRTJSAlSkFWQV9PUFRTJSAlR1JBRExFX09QVFMlICItRG9yZy5ncmFkbGUuYXBwbmFtZT0lQVBQX0JBU0VfTkFNRSUiIC1jbGFzc3BhdGggIiVDTEFTU1BBVEglIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gJUNNRF9MSU5FX0FSR1MlDQoNCjplbmQNCkByZW0gRW5kIGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbA0KaWYgIiVFUlJPUkxFVkVMJSI9PSIwIiBnb3RvIG1haW5FbmQNCg0KOmZhaWwNCnJlbSBTZXQgdmFyaWFibGUgR1JBRExFX0VYSVRfQ09OU09MRSBpZiB5b3UgbmVlZCB0aGUgX3NjcmlwdF8gcmV0dXJuIGNvZGUgaW5zdGVhZCBvZg0KcmVtIHRoZSBfY21kLmV4ZSAvY18gcmV0dXJuIGNvZGUhDQppZiAgbm90ICIiID09ICIlR1JBRExFX0VYSVRfQ09OU09MRSUiIGV4aXQgMQ0KZXhpdCAvYiAxDQoNCjptYWluRW5kDQppZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBlbmRsb2NhbA0KDQo6b21lZ2ENCg=="; constexpr const char* gradlew_file_name = R"(gradlew)"; -constexpr const char* gradlew_file_content = "IyEvdXNyL2Jpbi9lbnYgc2gKCiMKIyBDb3B5cmlnaHQgMjAxNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIwojIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAojIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgojIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIwoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjCiMjICBHcmFkbGUgc3RhcnQgdXAgc2NyaXB0IGZvciBVTipYCiMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBBdHRlbXB0IHRvIHNldCBBUFBfSE9NRQojIFJlc29sdmUgbGlua3M6ICQwIG1heSBiZSBhIGxpbmsKUFJHPSIkMCIKIyBOZWVkIHRoaXMgZm9yIHJlbGF0aXZlIHN5bWxpbmtzLgp3aGlsZSBbIC1oICIkUFJHIiBdIDsgZG8KICAgIGxzPWBscyAtbGQgIiRQUkciYAogICAgbGluaz1gZXhwciAiJGxzIiA6ICcuKi0+IFwoLipcKSQnYAogICAgaWYgZXhwciAiJGxpbmsiIDogJy8uKicgPiAvZGV2L251bGw7IHRoZW4KICAgICAgICBQUkc9IiRsaW5rIgogICAgZWxzZQogICAgICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgIi8kbGluayIKICAgIGZpCmRvbmUKU0FWRUQ9ImBwd2RgIgpjZCAiYGRpcm5hbWUgXCIkUFJHXCJgLyIgPi9kZXYvbnVsbApBUFBfSE9NRT0iYHB3ZCAtUGAiCmNkICIkU0FWRUQiID4vZGV2L251bGwKCkFQUF9OQU1FPSJHcmFkbGUiCkFQUF9CQVNFX05BTUU9YGJhc2VuYW1lICIkMCJgCgojIEFkZCBkZWZhdWx0IEpWTSBvcHRpb25zIGhlcmUuIFlvdSBjYW4gYWxzbyB1c2UgSkFWQV9PUFRTIGFuZCBHUkFETEVfT1BUUyB0byBwYXNzIEpWTSBvcHRpb25zIHRvIHRoaXMgc2NyaXB0LgpERUZBVUxUX0pWTV9PUFRTPSciLVhteDY0bSIgIi1YbXM2NG0iJwoKIyBVc2UgdGhlIG1heGltdW0gYXZhaWxhYmxlLCBvciBzZXQgTUFYX0ZEICE9IC0xIHRvIHVzZSB0aGF0IHZhbHVlLgpNQVhfRkQ9Im1heGltdW0iCgp3YXJuICgpIHsKICAgIGVjaG8gIiQqIgp9CgpkaWUgKCkgewogICAgZWNobwogICAgZWNobyAiJCoiCiAgICBlY2hvCiAgICBleGl0IDEKfQoKIyBPUyBzcGVjaWZpYyBzdXBwb3J0IChtdXN0IGJlICd0cnVlJyBvciAnZmFsc2UnKS4KY3lnd2luPWZhbHNlCm1zeXM9ZmFsc2UKZGFyd2luPWZhbHNlCm5vbnN0b3A9ZmFsc2UKY2FzZSAiYHVuYW1lYCIgaW4KICBDWUdXSU4qICkKICAgIGN5Z3dpbj10cnVlCiAgICA7OwogIERhcndpbiogKQogICAgZGFyd2luPXRydWUKICAgIDs7CiAgTUlOR1cqICkKICAgIG1zeXM9dHJ1ZQogICAgOzsKICBOT05TVE9QKiApCiAgICBub25zdG9wPXRydWUKICAgIDs7CmVzYWMKCkNMQVNTUEFUSD0kQVBQX0hPTUUvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCgoKIyBEZXRlcm1pbmUgdGhlIEphdmEgY29tbWFuZCB0byB1c2UgdG8gc3RhcnQgdGhlIEpWTS4KaWYgWyAtbiAiJEpBVkFfSE9NRSIgXSA7IHRoZW4KICAgIGlmIFsgLXggIiRKQVZBX0hPTUUvanJlL3NoL2phdmEiIF0gOyB0aGVuCiAgICAgICAgIyBJQk0ncyBKREsgb24gQUlYIHVzZXMgc3RyYW5nZSBsb2NhdGlvbnMgZm9yIHRoZSBleGVjdXRhYmxlcwogICAgICAgIEpBVkFDTUQ9IiRKQVZBX0hPTUUvanJlL3NoL2phdmEiCiAgICBlbHNlCiAgICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9iaW4vamF2YSIKICAgIGZpCiAgICBpZiBbICEgLXggIiRKQVZBQ01EIiBdIDsgdGhlbgogICAgICAgIGRpZSAiRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICRKQVZBX0hPTUUKClBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQpsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKICAgIGZpCmVsc2UKICAgIEpBVkFDTUQ9ImphdmEiCiAgICB3aGljaCBqYXZhID4vZGV2L251bGwgMj4mMSB8fCBkaWUgIkVSUk9SOiBKQVZBX0hPTUUgaXMgbm90IHNldCBhbmQgbm8gJ2phdmEnIGNvbW1hbmQgY291bGQgYmUgZm91bmQgaW4geW91ciBQQVRILgoKUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCmxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uIgpmaQoKIyBJbmNyZWFzZSB0aGUgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3JzIGlmIHdlIGNhbi4KaWYgWyAiJGN5Z3dpbiIgPSAiZmFsc2UiIC1hICIkZGFyd2luIiA9ICJmYWxzZSIgLWEgIiRub25zdG9wIiA9ICJmYWxzZSIgXSA7IHRoZW4KICAgIE1BWF9GRF9MSU1JVD1gdWxpbWl0IC1IIC1uYAogICAgaWYgWyAkPyAtZXEgMCBdIDsgdGhlbgogICAgICAgIGlmIFsgIiRNQVhfRkQiID0gIm1heGltdW0iIC1vICIkTUFYX0ZEIiA9ICJtYXgiIF0gOyB0aGVuCiAgICAgICAgICAgIE1BWF9GRD0iJE1BWF9GRF9MSU1JVCIKICAgICAgICBmaQogICAgICAgIHVsaW1pdCAtbiAkTUFYX0ZECiAgICAgICAgaWYgWyAkPyAtbmUgMCBdIDsgdGhlbgogICAgICAgICAgICB3YXJuICJDb3VsZCBub3Qgc2V0IG1heGltdW0gZmlsZSBkZXNjcmlwdG9yIGxpbWl0OiAkTUFYX0ZEIgogICAgICAgIGZpCiAgICBlbHNlCiAgICAgICAgd2FybiAiQ291bGQgbm90IHF1ZXJ5IG1heGltdW0gZmlsZSBkZXNjcmlwdG9yIGxpbWl0OiAkTUFYX0ZEX0xJTUlUIgogICAgZmkKZmkKCiMgRm9yIERhcndpbiwgYWRkIG9wdGlvbnMgdG8gc3BlY2lmeSBob3cgdGhlIGFwcGxpY2F0aW9uIGFwcGVhcnMgaW4gdGhlIGRvY2sKaWYgJGRhcndpbjsgdGhlbgogICAgR1JBRExFX09QVFM9IiRHUkFETEVfT1BUUyBcIi1YZG9jazpuYW1lPSRBUFBfTkFNRVwiIFwiLVhkb2NrOmljb249JEFQUF9IT01FL21lZGlhL2dyYWRsZS5pY25zXCIiCmZpCgojIEZvciBDeWd3aW4gb3IgTVNZUywgc3dpdGNoIHBhdGhzIHRvIFdpbmRvd3MgZm9ybWF0IGJlZm9yZSBydW5uaW5nIGphdmEKaWYgWyAiJGN5Z3dpbiIgPSAidHJ1ZSIgLW8gIiRtc3lzIiA9ICJ0cnVlIiBdIDsgdGhlbgogICAgQVBQX0hPTUU9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRBUFBfSE9NRSJgCiAgICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRDTEFTU1BBVEgiYAogICAgCiAgICBKQVZBQ01EPWBjeWdwYXRoIC0tdW5peCAiJEpBVkFDTUQiYAoKICAgICMgV2UgYnVpbGQgdGhlIHBhdHRlcm4gZm9yIGFyZ3VtZW50cyB0byBiZSBjb252ZXJ0ZWQgdmlhIGN5Z3BhdGgKICAgIFJPT1RESVJTUkFXPWBmaW5kIC1MIC8gLW1heGRlcHRoIDEgLW1pbmRlcHRoIDEgLXR5cGUgZCAyPi9kZXYvbnVsbGAKICAgIFNFUD0iIgogICAgZm9yIGRpciBpbiAkUk9PVERJUlNSQVcgOyBkbwogICAgICAgIFJPT1RESVJTPSIkUk9PVERJUlMkU0VQJGRpciIKICAgICAgICBTRVA9InwiCiAgICBkb25lCiAgICBPVVJDWUdQQVRURVJOPSIoXigkUk9PVERJUlMpKSIKICAgICMgQWRkIGEgdXNlci1kZWZpbmVkIHBhdHRlcm4gdG8gdGhlIGN5Z3BhdGggYXJndW1lbnRzCiAgICBpZiBbICIkR1JBRExFX0NZR1BBVFRFUk4iICE9ICIiIF0gOyB0aGVuCiAgICAgICAgT1VSQ1lHUEFUVEVSTj0iJE9VUkNZR1BBVFRFUk58KCRHUkFETEVfQ1lHUEFUVEVSTikiCiAgICBmaQogICAgIyBOb3cgY29udmVydCB0aGUgYXJndW1lbnRzIC0ga2x1ZGdlIHRvIGxpbWl0IG91cnNlbHZlcyB0byAvYmluL3NoCiAgICBpPTAKICAgIGZvciBhcmcgaW4gIiRAIiA7IGRvCiAgICAgICAgQ0hFQ0s9YGVjaG8gIiRhcmcifGVncmVwIC1jICIkT1VSQ1lHUEFUVEVSTiIgLWAKICAgICAgICBDSEVDSzI9YGVjaG8gIiRhcmcifGVncmVwIC1jICJeLSJgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIERldGVybWluZSBpZiBhbiBvcHRpb24KCiAgICAgICAgaWYgWyAkQ0hFQ0sgLW5lIDAgXSAmJiBbICRDSEVDSzIgLWVxIDAgXSA7IHRoZW4gICAgICAgICAgICAgICAgICAgICMjIyBBZGRlZCBhIGNvbmRpdGlvbgogICAgICAgICAgICBldmFsIGBlY2hvIGFyZ3MkaWA9YGN5Z3BhdGggLS1wYXRoIC0taWdub3JlIC0tbWl4ZWQgIiRhcmciYAogICAgICAgIGVsc2UKICAgICAgICAgICAgZXZhbCBgZWNobyBhcmdzJGlgPSJcIiRhcmdcIiIKICAgICAgICBmaQogICAgICAgIGk9YGV4cHIgJGkgKyAxYAogICAgZG9uZQogICAgY2FzZSAkaSBpbgogICAgICAgIDApIHNldCAtLSA7OwogICAgICAgIDEpIHNldCAtLSAiJGFyZ3MwIiA7OwogICAgICAgIDIpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiA7OwogICAgICAgIDMpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiA7OwogICAgICAgIDQpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiA7OwogICAgICAgIDUpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiA7OwogICAgICAgIDYpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiA7OwogICAgICAgIDcpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiA7OwogICAgICAgIDgpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiA7OwogICAgICAgIDkpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiAiJGFyZ3M4IiA7OwogICAgZXNhYwpmaQoKIyBFc2NhcGUgYXBwbGljYXRpb24gYXJncwpzYXZlICgpIHsKICAgIGZvciBpIGRvIHByaW50ZiAlc1xcbiAiJGkiIHwgc2VkICJzLycvJ1xcXFwnJy9nOzFzL14vJy87XCRzL1wkLycgXFxcXC8iIDsgZG9uZQogICAgZWNobyAiICIKfQpBUFBfQVJHUz1gc2F2ZSAiJEAiYAoKIyBDb2xsZWN0IGFsbCBhcmd1bWVudHMgZm9yIHRoZSBqYXZhIGNvbW1hbmQsIGZvbGxvd2luZyB0aGUgc2hlbGwgcXVvdGluZyBhbmQgc3Vic3RpdHV0aW9uIHJ1bGVzCmV2YWwgc2V0IC0tICRERUZBVUxUX0pWTV9PUFRTICRKQVZBX09QVFMgJEdSQURMRV9PUFRTICJcIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSRBUFBfQkFTRV9OQU1FXCIiIC1jbGFzc3BhdGggIlwiJENMQVNTUEFUSFwiIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gIiRBUFBfQVJHUyIKCmV4ZWMgIiRKQVZBQ01EIiAiJEAiCg=="; +constexpr const char* gradlew_file_content = "IyEvdXNyL2Jpbi9lbnYgc2gNCg0KIw0KIyBDb3B5cmlnaHQgMjAxNSB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQojDQojIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQojIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KIw0KIyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCiMNCiMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCiMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCiMNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIw0KIyMgIEdyYWRsZSBzdGFydCB1cCBzY3JpcHQgZm9yIFVOKlgNCiMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBBdHRlbXB0IHRvIHNldCBBUFBfSE9NRQ0KIyBSZXNvbHZlIGxpbmtzOiAkMCBtYXkgYmUgYSBsaW5rDQpQUkc9IiQwIg0KIyBOZWVkIHRoaXMgZm9yIHJlbGF0aXZlIHN5bWxpbmtzLg0Kd2hpbGUgWyAtaCAiJFBSRyIgXSA7IGRvDQogICAgbHM9YGxzIC1sZCAiJFBSRyJgDQogICAgbGluaz1gZXhwciAiJGxzIiA6ICcuKi0+IFwoLipcKSQnYA0KICAgIGlmIGV4cHIgIiRsaW5rIiA6ICcvLionID4gL2Rldi9udWxsOyB0aGVuDQogICAgICAgIFBSRz0iJGxpbmsiDQogICAgZWxzZQ0KICAgICAgICBQUkc9YGRpcm5hbWUgIiRQUkciYCIvJGxpbmsiDQogICAgZmkNCmRvbmUNClNBVkVEPSJgcHdkYCINCmNkICJgZGlybmFtZSBcIiRQUkdcImAvIiA+L2Rldi9udWxsDQpBUFBfSE9NRT0iYHB3ZCAtUGAiDQpjZCAiJFNBVkVEIiA+L2Rldi9udWxsDQoNCkFQUF9OQU1FPSJHcmFkbGUiDQpBUFBfQkFTRV9OQU1FPWBiYXNlbmFtZSAiJDAiYA0KDQojIEFkZCBkZWZhdWx0IEpWTSBvcHRpb25zIGhlcmUuIFlvdSBjYW4gYWxzbyB1c2UgSkFWQV9PUFRTIGFuZCBHUkFETEVfT1BUUyB0byBwYXNzIEpWTSBvcHRpb25zIHRvIHRoaXMgc2NyaXB0Lg0KREVGQVVMVF9KVk1fT1BUUz0nIi1YbXg2NG0iICItWG1zNjRtIicNCg0KIyBVc2UgdGhlIG1heGltdW0gYXZhaWxhYmxlLCBvciBzZXQgTUFYX0ZEICE9IC0xIHRvIHVzZSB0aGF0IHZhbHVlLg0KTUFYX0ZEPSJtYXhpbXVtIg0KDQp3YXJuICgpIHsNCiAgICBlY2hvICIkKiINCn0NCg0KZGllICgpIHsNCiAgICBlY2hvDQogICAgZWNobyAiJCoiDQogICAgZWNobw0KICAgIGV4aXQgMQ0KfQ0KDQojIE9TIHNwZWNpZmljIHN1cHBvcnQgKG11c3QgYmUgJ3RydWUnIG9yICdmYWxzZScpLg0KY3lnd2luPWZhbHNlDQptc3lzPWZhbHNlDQpkYXJ3aW49ZmFsc2UNCm5vbnN0b3A9ZmFsc2UNCmNhc2UgImB1bmFtZWAiIGluDQogIENZR1dJTiogKQ0KICAgIGN5Z3dpbj10cnVlDQogICAgOzsNCiAgRGFyd2luKiApDQogICAgZGFyd2luPXRydWUNCiAgICA7Ow0KICBNSU5HVyogKQ0KICAgIG1zeXM9dHJ1ZQ0KICAgIDs7DQogIE5PTlNUT1AqICkNCiAgICBub25zdG9wPXRydWUNCiAgICA7Ow0KZXNhYw0KDQpDTEFTU1BBVEg9JEFQUF9IT01FL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcg0KDQoNCiMgRGV0ZXJtaW5lIHRoZSBKYXZhIGNvbW1hbmQgdG8gdXNlIHRvIHN0YXJ0IHRoZSBKVk0uDQppZiBbIC1uICIkSkFWQV9IT01FIiBdIDsgdGhlbg0KICAgIGlmIFsgLXggIiRKQVZBX0hPTUUvanJlL3NoL2phdmEiIF0gOyB0aGVuDQogICAgICAgICMgSUJNJ3MgSkRLIG9uIEFJWCB1c2VzIHN0cmFuZ2UgbG9jYXRpb25zIGZvciB0aGUgZXhlY3V0YWJsZXMNCiAgICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9qcmUvc2gvamF2YSINCiAgICBlbHNlDQogICAgICAgIEpBVkFDTUQ9IiRKQVZBX0hPTUUvYmluL2phdmEiDQogICAgZmkNCiAgICBpZiBbICEgLXggIiRKQVZBQ01EIiBdIDsgdGhlbg0KICAgICAgICBkaWUgIkVSUk9SOiBKQVZBX0hPTUUgaXMgc2V0IHRvIGFuIGludmFsaWQgZGlyZWN0b3J5OiAkSkFWQV9IT01FDQoNClBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQ0KbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4iDQogICAgZmkNCmVsc2UNCiAgICBKQVZBQ01EPSJqYXZhIg0KICAgIHdoaWNoIGphdmEgPi9kZXYvbnVsbCAyPiYxIHx8IGRpZSAiRVJST1I6IEpBVkFfSE9NRSBpcyBub3Qgc2V0IGFuZCBubyAnamF2YScgY29tbWFuZCBjb3VsZCBiZSBmb3VuZCBpbiB5b3VyIFBBVEguDQoNClBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQ0KbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4iDQpmaQ0KDQojIEluY3JlYXNlIHRoZSBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvcnMgaWYgd2UgY2FuLg0KaWYgWyAiJGN5Z3dpbiIgPSAiZmFsc2UiIC1hICIkZGFyd2luIiA9ICJmYWxzZSIgLWEgIiRub25zdG9wIiA9ICJmYWxzZSIgXSA7IHRoZW4NCiAgICBNQVhfRkRfTElNSVQ9YHVsaW1pdCAtSCAtbmANCiAgICBpZiBbICQ/IC1lcSAwIF0gOyB0aGVuDQogICAgICAgIGlmIFsgIiRNQVhfRkQiID0gIm1heGltdW0iIC1vICIkTUFYX0ZEIiA9ICJtYXgiIF0gOyB0aGVuDQogICAgICAgICAgICBNQVhfRkQ9IiRNQVhfRkRfTElNSVQiDQogICAgICAgIGZpDQogICAgICAgIHVsaW1pdCAtbiAkTUFYX0ZEDQogICAgICAgIGlmIFsgJD8gLW5lIDAgXSA7IHRoZW4NCiAgICAgICAgICAgIHdhcm4gIkNvdWxkIG5vdCBzZXQgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3IgbGltaXQ6ICRNQVhfRkQiDQogICAgICAgIGZpDQogICAgZWxzZQ0KICAgICAgICB3YXJuICJDb3VsZCBub3QgcXVlcnkgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3IgbGltaXQ6ICRNQVhfRkRfTElNSVQiDQogICAgZmkNCmZpDQoNCiMgRm9yIERhcndpbiwgYWRkIG9wdGlvbnMgdG8gc3BlY2lmeSBob3cgdGhlIGFwcGxpY2F0aW9uIGFwcGVhcnMgaW4gdGhlIGRvY2sNCmlmICRkYXJ3aW47IHRoZW4NCiAgICBHUkFETEVfT1BUUz0iJEdSQURMRV9PUFRTIFwiLVhkb2NrOm5hbWU9JEFQUF9OQU1FXCIgXCItWGRvY2s6aWNvbj0kQVBQX0hPTUUvbWVkaWEvZ3JhZGxlLmljbnNcIiINCmZpDQoNCiMgRm9yIEN5Z3dpbiBvciBNU1lTLCBzd2l0Y2ggcGF0aHMgdG8gV2luZG93cyBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQ0KaWYgWyAiJGN5Z3dpbiIgPSAidHJ1ZSIgLW8gIiRtc3lzIiA9ICJ0cnVlIiBdIDsgdGhlbg0KICAgIEFQUF9IT01FPWBjeWdwYXRoIC0tcGF0aCAtLW1peGVkICIkQVBQX0hPTUUiYA0KICAgIENMQVNTUEFUSD1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJENMQVNTUEFUSCJgDQogICAgDQogICAgSkFWQUNNRD1gY3lncGF0aCAtLXVuaXggIiRKQVZBQ01EImANCg0KICAgICMgV2UgYnVpbGQgdGhlIHBhdHRlcm4gZm9yIGFyZ3VtZW50cyB0byBiZSBjb252ZXJ0ZWQgdmlhIGN5Z3BhdGgNCiAgICBST09URElSU1JBVz1gZmluZCAtTCAvIC1tYXhkZXB0aCAxIC1taW5kZXB0aCAxIC10eXBlIGQgMj4vZGV2L251bGxgDQogICAgU0VQPSIiDQogICAgZm9yIGRpciBpbiAkUk9PVERJUlNSQVcgOyBkbw0KICAgICAgICBST09URElSUz0iJFJPT1RESVJTJFNFUCRkaXIiDQogICAgICAgIFNFUD0ifCINCiAgICBkb25lDQogICAgT1VSQ1lHUEFUVEVSTj0iKF4oJFJPT1RESVJTKSkiDQogICAgIyBBZGQgYSB1c2VyLWRlZmluZWQgcGF0dGVybiB0byB0aGUgY3lncGF0aCBhcmd1bWVudHMNCiAgICBpZiBbICIkR1JBRExFX0NZR1BBVFRFUk4iICE9ICIiIF0gOyB0aGVuDQogICAgICAgIE9VUkNZR1BBVFRFUk49IiRPVVJDWUdQQVRURVJOfCgkR1JBRExFX0NZR1BBVFRFUk4pIg0KICAgIGZpDQogICAgIyBOb3cgY29udmVydCB0aGUgYXJndW1lbnRzIC0ga2x1ZGdlIHRvIGxpbWl0IG91cnNlbHZlcyB0byAvYmluL3NoDQogICAgaT0wDQogICAgZm9yIGFyZyBpbiAiJEAiIDsgZG8NCiAgICAgICAgQ0hFQ0s9YGVjaG8gIiRhcmcifGVncmVwIC1jICIkT1VSQ1lHUEFUVEVSTiIgLWANCiAgICAgICAgQ0hFQ0syPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiXi0iYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyBEZXRlcm1pbmUgaWYgYW4gb3B0aW9uDQoNCiAgICAgICAgaWYgWyAkQ0hFQ0sgLW5lIDAgXSAmJiBbICRDSEVDSzIgLWVxIDAgXSA7IHRoZW4gICAgICAgICAgICAgICAgICAgICMjIyBBZGRlZCBhIGNvbmRpdGlvbg0KICAgICAgICAgICAgZXZhbCBgZWNobyBhcmdzJGlgPWBjeWdwYXRoIC0tcGF0aCAtLWlnbm9yZSAtLW1peGVkICIkYXJnImANCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgZXZhbCBgZWNobyBhcmdzJGlgPSJcIiRhcmdcIiINCiAgICAgICAgZmkNCiAgICAgICAgaT1gZXhwciAkaSArIDFgDQogICAgZG9uZQ0KICAgIGNhc2UgJGkgaW4NCiAgICAgICAgMCkgc2V0IC0tIDs7DQogICAgICAgIDEpIHNldCAtLSAiJGFyZ3MwIiA7Ow0KICAgICAgICAyKSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgOzsNCiAgICAgICAgMykgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiIDs7DQogICAgICAgIDQpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiA7Ow0KICAgICAgICA1KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgOzsNCiAgICAgICAgNikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiIDs7DQogICAgICAgIDcpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiA7Ow0KICAgICAgICA4KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgIiRhcmdzNyIgOzsNCiAgICAgICAgOSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciICIkYXJnczgiIDs7DQogICAgZXNhYw0KZmkNCg0KIyBFc2NhcGUgYXBwbGljYXRpb24gYXJncw0Kc2F2ZSAoKSB7DQogICAgZm9yIGkgZG8gcHJpbnRmICVzXFxuICIkaSIgfCBzZWQgInMvJy8nXFxcXCcnL2c7MXMvXi8nLztcJHMvXCQvJyBcXFxcLyIgOyBkb25lDQogICAgZWNobyAiICINCn0NCkFQUF9BUkdTPWBzYXZlICIkQCJgDQoNCiMgQ29sbGVjdCBhbGwgYXJndW1lbnRzIGZvciB0aGUgamF2YSBjb21tYW5kLCBmb2xsb3dpbmcgdGhlIHNoZWxsIHF1b3RpbmcgYW5kIHN1YnN0aXR1dGlvbiBydWxlcw0KZXZhbCBzZXQgLS0gJERFRkFVTFRfSlZNX09QVFMgJEpBVkFfT1BUUyAkR1JBRExFX09QVFMgIlwiLURvcmcuZ3JhZGxlLmFwcG5hbWU9JEFQUF9CQVNFX05BTUVcIiIgLWNsYXNzcGF0aCAiXCIkQ0xBU1NQQVRIXCIiIG9yZy5ncmFkbGUud3JhcHBlci5HcmFkbGVXcmFwcGVyTWFpbiAiJEFQUF9BUkdTIg0KDQpleGVjICIkSkFWQUNNRCIgIiRAIg0K"; -constexpr const char* _gitattributes_file_name = R"(.gitattributes)"; -constexpr const char* _gitattributes_file_content = "IwojIGh0dHBzOi8vaGVscC5naXRodWIuY29tL2FydGljbGVzL2RlYWxpbmctd2l0aC1saW5lLWVuZGluZ3MvCiMKIyBUaGVzZSBhcmUgZXhwbGljaXRseSB3aW5kb3dzIGZpbGVzIGFuZCBzaG91bGQgdXNlIGNybGYKKi5iYXQgICAgICAgICAgIHRleHQgZW9sPWNybGYKCg=="; +constexpr const char* settings_gradle_kts_file_name = R"(settings.gradle.kts)"; +constexpr const char* settings_gradle_kts_file_content = "DQpwbHVnaW5zIHsNCiAgICAvLyB0byBhdXRvbWF0aWNhbGx5IGRvd25sb2FkIHRoZSB0b29sY2hhaW4gamRrIGlmIG1pc3NpbmcNCiAgICBpZCgib3JnLmdyYWRsZS50b29sY2hhaW5zLmZvb2pheS1yZXNvbHZlci1jb252ZW50aW9uIikgdmVyc2lvbiAiMC45LjAiIC8vIGh0dHBzOi8vcGx1Z2lucy5ncmFkbGUub3JnL3BsdWdpbi9vcmcuZ3JhZGxlLnRvb2xjaGFpbnMuZm9vamF5LXJlc29sdmVyLWNvbnZlbnRpb24NCn0NCg0Kcm9vdFByb2plY3QubmFtZSA9ICJQUk9KRUNUX05BTUUiDQo="; constexpr const char* gradle_gdignore_file_name = R"(gradle/.gdignore)"; constexpr const char* gradle_gdignore_file_content = ""; @@ -33,16 +31,15 @@ constexpr const char* gradle_wrapper_gradle_wrapper_jar_file_name = R"(gradle/wr constexpr const char* gradle_wrapper_gradle_wrapper_jar_file_content = "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AAAAAAAADxMAAG9yZy9ncmFkbGUvY2xpL0NvbW1hbmRMaW5lUGFyc2VyJEFmdGVyT3B0aW9ucy5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQCL4zEXLAMAAF0HAAA8AAkAAAAAAAAAAAAAANMVAABvcmcvZ3JhZGxlL2NsaS9Db21tYW5kTGluZVBhcnNlciRCZWZvcmVGaXJzdFN1YkNvbW1hbmQuY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEA6doPs98GAABiDgAAPQAJAAAAAAAAAAAAAAByGQAAb3JnL2dyYWRsZS9jbGkvQ29tbWFuZExpbmVQYXJzZXIkS25vd25PcHRpb25QYXJzZXJTdGF0ZS5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQBDJ3yiTAIAAJcEAAA8AAkAAAAAAAAAAAAAAMUgAABvcmcvZ3JhZGxlL2NsaS9Db21tYW5kTGluZVBhcnNlciRNaXNzaW5nT3B0aW9uQXJnU3RhdGUuY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEAtJRbo9cCAABKBQAAPQAJAAAAAAAAAAAAAACEIwAAb3JnL2dyYWRsZS9jbGkvQ29tbWFuZExpbmVQYXJzZXIkT3B0aW9uQXdhcmVQYXJzZXJTdGF0ZS5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQB1W3o/ogEAAH0CAAA4AAkAAAAAAAAAAAAAAM8mAABvcmcvZ3JhZGxlL2NsaS9Db21tYW5kTGluZVBhcnNlciRPcHRpb25QYXJzZXJTdGF0ZS5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQAW1+kcDQIAAEMDAAAzAAkAAAAAAAAAAAAAAOAoAABvcmcvZ3JhZGxlL2NsaS9Db21tYW5kTGluZVBhcnNlciRPcHRpb25TdHJpbmcuY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEAkMnJiacBAADOAgAAMgAJAAAAAAAAAAAAAABXKwAAb3JnL2dyYWRsZS9jbGkvQ29tbWFuZExpbmVQYXJzZXIkUGFyc2VyU3RhdGUuY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEAS8+WoHMCAADHBAAAPwAJAAAAAAAAAAAAAABnLQAAb3JnL2dyYWRsZS9jbGkvQ29tbWFuZExpbmVQYXJzZXIkVW5rbm93bk9wdGlvblBhcnNlclN0YXRlLmNsYXNzVVQFAAEAAAAAUEsBAhQAFAAICAgAAAAhAB2MmemvBAAAYwgAACYACQAAAAAAAAAAAAAAUDAAAG9yZy9ncmFkbGUvY2xpL0NvbW1hbmRMaW5lUGFyc2VyLmNsYXNzVVQFAAEAAAAAUEsBAhQAFAAICAgAAAAhAOsyd406BAAA4QcAACYACQAAAAAAAAAAAAAAXDUAAG9yZy9ncmFkbGUvY2xpL1BhcnNlZENvbW1hbmRMaW5lLmNsYXNzVVQFAAEAAAAAUEsBAhQAFAAICAgAAAAhAFrddm1UAQAArAEAACwACQAAAAAAAAAAAAAA8zkAAG9yZy9ncmFkbGUvY2xpL1BhcnNlZENvbW1hbmRMaW5lT3B0aW9uLmNsYXNzVVQFAAEAAAAAUEsBAhQAFAAICAgAAAAhAPkkTxT/AgAAnAQAADMACQAAAAAAAAAAAAAAqjsAAG9yZy9ncmFkbGUvaW50ZXJuYWwvZmlsZS9QYXRoVHJhdmVyc2FsQ2hlY2tlci5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQB5tXfKhwEAAAMCAABBAAkAAAAAAAAAAAAAABM/AABvcmcvZ3JhZGxlL2ludGVybmFsL2ZpbGUvbG9ja2luZy9FeGNsdXNpdmVGaWxlQWNjZXNzTWFuYWdlci5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQBipwaKwQEAAKMCAAA+AAkAAAAAAAAAAAAAABJBAABvcmcvZ3JhZGxlL3V0aWwvaW50ZXJuYWwvV3JhcHBlckRpc3RyaWJ1dGlvblVybENvbnZlcnRlci5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQCcRdKajgEAAB4CAAAvAAkAAAAAAAAAAAAAAEhDAABvcmcvZ3JhZGxlL3dyYXBwZXIvQm9vdHN0cmFwTWFpblN0YXJ0ZXIkMS5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQCA0yUGKQMAAOQEAABBAAkAAAAAAAAAAAAAADxFAABvcmcvZ3JhZGxlL3dyYXBwZXIvRG93bmxvYWQkRGVmYXVsdERvd25sb2FkUHJvZ3Jlc3NMaXN0ZW5lci5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQB3o7Ym5QIAABEFAAA0AAkAAAAAAAAAAAAAAN1IAABvcmcvZ3JhZGxlL3dyYXBwZXIvRG93bmxvYWQkUHJveHlBdXRoZW50aWNhdG9yLmNsYXNzVVQFAAEAAAAAUEsBAhQAFAAICAgAAAAhABgEsAxlCQAAKhIAACEACQAAAAAAAAAAAAAALUwAAG9yZy9ncmFkbGUvd3JhcHBlci9Eb3dubG9hZC5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQBBcxcJ2QEAALICAAAtAAkAAAAAAAAAAAAAAOpVAABvcmcvZ3JhZGxlL3dyYXBwZXIvR3JhZGxlVXNlckhvbWVMb29rdXAuY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEA3RS7hw0VAACpKQAAKgAJAAAAAAAAAAAAAAAnWAAAb3JnL2dyYWRsZS93cmFwcGVyL0dyYWRsZVdyYXBwZXJNYWluLmNsYXNzVVQFAAEAAAAAUEsBAhQAFAAICAgAAAAhACKYkR7DCwAAuhUAACIACQAAAAAAAAAAAAAAlW0AAG9yZy9ncmFkbGUvd3JhcHBlci9JbnN0YWxsJDEuY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEAqgSTSmoBAADnAQAALQAJAAAAAAAAAAAAAACxeQAAb3JnL2dyYWRsZS93cmFwcGVyL0luc3RhbGwkSW5zdGFsbENoZWNrLmNsYXNzVVQFAAEAAAAAUEsBAhQAFAAICAgAAAAhAD8+qWeoDgAA2hsAACAACQAAAAAAAAAAAAAAf3sAAG9yZy9ncmFkbGUvd3JhcHBlci9JbnN0YWxsLmNsYXNzVVQFAAEAAAAAUEsBAhQAFAAICAgAAAAhAF32tW87AgAAHgQAAB8ACQAAAAAAAAAAAAAAfooAAG9yZy9ncmFk" "bGUvd3JhcHBlci9Mb2dnZXIuY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEA6imTPiQBAABqAQAAJgAJAAAAAAAAAAAAAAAPjQAAb3JnL2dyYWRsZS93cmFwcGVyL1BhdGhBc3NlbWJsZXIuY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEA1uMlrJoDAABOBgAAMAAJAAAAAAAAAAAAAACQjgAAb3JnL2dyYWRsZS93cmFwcGVyL1N5c3RlbVByb3BlcnRpZXNIYW5kbGVyLmNsYXNzVVQFAAEAAAAAUEsBAhQAFAAICAgAAAAhAOYRBMnuAgAAUAYAAC0ACQAAAAAAAAAAAAAAkZIAAG9yZy9ncmFkbGUvd3JhcHBlci9XcmFwcGVyQ29uZmlndXJhdGlvbi5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQARWWHoUwYAAMUMAAAoAAkAAAAAAAAAAAAAAOOVAABvcmcvZ3JhZGxlL3dyYXBwZXIvV3JhcHBlckV4ZWN1dG9yLmNsYXNzVVQFAAEAAAAAUEsFBgAAAAAhACEAEg0AAJWcAAAAAA=="; constexpr const char* gradle_wrapper_gradle_wrapper_properties_file_name = R"(gradle/wrapper/gradle-wrapper.properties)"; -constexpr const char* gradle_wrapper_gradle_wrapper_properties_file_content = "ZGlzdHJpYnV0aW9uQmFzZT1HUkFETEVfVVNFUl9IT01FCmRpc3RyaWJ1dGlvblBhdGg9d3JhcHBlci9kaXN0cwpkaXN0cmlidXRpb25Vcmw9aHR0cHNcOi8vc2VydmljZXMuZ3JhZGxlLm9yZy9kaXN0cmlidXRpb25zL2dyYWRsZS04LjEwLjItYWxsLnppcApuZXR3b3JrVGltZW91dD0xMDAwMAp2YWxpZGF0ZURpc3RyaWJ1dGlvblVybD10cnVlCnppcFN0b3JlQmFzZT1HUkFETEVfVVNFUl9IT01FCnppcFN0b3JlUGF0aD13cmFwcGVyL2Rpc3RzCg=="; +constexpr const char* gradle_wrapper_gradle_wrapper_properties_file_content = "ZGlzdHJpYnV0aW9uQmFzZT1HUkFETEVfVVNFUl9IT01FDQpkaXN0cmlidXRpb25QYXRoPXdyYXBwZXIvZGlzdHMNCmRpc3RyaWJ1dGlvblVybD1odHRwc1w6Ly9zZXJ2aWNlcy5ncmFkbGUub3JnL2Rpc3RyaWJ1dGlvbnMvZ3JhZGxlLTguMTAuMi1hbGwuemlwDQpuZXR3b3JrVGltZW91dD0xMDAwMA0KdmFsaWRhdGVEaXN0cmlidXRpb25Vcmw9dHJ1ZQ0KemlwU3RvcmVCYXNlPUdSQURMRV9VU0VSX0hPTUUNCnppcFN0b3JlUGF0aD13cmFwcGVyL2Rpc3RzDQo="; constexpr const char* src_main_kotlin_godot_HelloGodot_kt_file_name = R"(src/main/kotlin/godot/HelloGodot.kt)"; -constexpr const char* src_main_kotlin_godot_HelloGodot_kt_file_content = "cGFja2FnZSBnb2RvdAoKaW1wb3J0IGdvZG90LmFubm90YXRpb24uRXhwb3J0CmltcG9ydCBnb2RvdC5hbm5vdGF0aW9uLlJlZ2lzdGVyQ2xhc3MKaW1wb3J0IGdvZG90LmFubm90YXRpb24uUmVnaXN0ZXJGdW5jdGlvbgppbXBvcnQgZ29kb3QuYW5ub3RhdGlvbi5SZWdpc3RlclByb3BlcnR5CmltcG9ydCBnb2RvdC5nbG9iYWwuR0QKCkBSZWdpc3RlckNsYXNzCmNsYXNzIEhlbGxvV29ybGQgOiBOb2RlKCkgewoKICAgIEBFeHBvcnQKICAgIEBSZWdpc3RlclByb3BlcnR5CiAgICB2YXIgaGVsbG9TdHJpbmcgPSAgIkdvZG90IgoKICAgIEBSZWdpc3RlckZ1bmN0aW9uCiAgICBvdmVycmlkZSBmdW4gX3JlYWR5KCkgewogICAgICAgIEdELnByaW50KCJIZWxsbyAkaGVsbG9TdHJpbmcgISIpCiAgICB9Cn0K"; +constexpr const char* src_main_kotlin_godot_HelloGodot_kt_file_content = "cGFja2FnZSBnb2RvdA0KDQppbXBvcnQgZ29kb3QuYW5ub3RhdGlvbi5FeHBvcnQNCmltcG9ydCBnb2RvdC5hbm5vdGF0aW9uLlJlZ2lzdGVyQ2xhc3MNCmltcG9ydCBnb2RvdC5hbm5vdGF0aW9uLlJlZ2lzdGVyRnVuY3Rpb24NCmltcG9ydCBnb2RvdC5hbm5vdGF0aW9uLlJlZ2lzdGVyUHJvcGVydHkNCmltcG9ydCBnb2RvdC5nbG9iYWwuR0QNCg0KQFJlZ2lzdGVyQ2xhc3MNCmNsYXNzIEhlbGxvV29ybGQgOiBOb2RlKCkgew0KDQogICAgQEV4cG9ydA0KICAgIEBSZWdpc3RlclByb3BlcnR5DQogICAgdmFyIGhlbGxvU3RyaW5nID0gICJHb2RvdCINCg0KICAgIEBSZWdpc3RlckZ1bmN0aW9uDQogICAgb3ZlcnJpZGUgZnVuIF9yZWFkeSgpIHsNCiAgICAgICAgR0QucHJpbnQoIkhlbGxvICRoZWxsb1N0cmluZyAhIikNCiAgICB9DQp9DQo="; constexpr const int number_of_files = 11; constexpr const bool file_is_binary[] = {false, false, false, false, false, false, false, false, true, false, false}; -constexpr const char* file_names[] = {gradle_properties_file_name, _gitignore_file_name, build_gradle_kts_file_name, gradlew_bat_file_name, settings_gradle_kts_file_name, gradlew_file_name, _gitattributes_file_name, gradle_gdignore_file_name, gradle_wrapper_gradle_wrapper_jar_file_name, gradle_wrapper_gradle_wrapper_properties_file_name, src_main_kotlin_godot_HelloGodot_kt_file_name}; -constexpr const char* file_contents[] = {gradle_properties_file_content, _gitignore_file_content, build_gradle_kts_file_content, gradlew_bat_file_content, settings_gradle_kts_file_content, gradlew_file_content, _gitattributes_file_content, gradle_gdignore_file_content, gradle_wrapper_gradle_wrapper_jar_file_content, gradle_wrapper_gradle_wrapper_properties_file_content, src_main_kotlin_godot_HelloGodot_kt_file_content}; +constexpr const char* file_names[] = {_gitattributes_file_name, _gitignore_file_name, build_gradle_kts_file_name, gradle_properties_file_name, gradlew_bat_file_name, gradlew_file_name, settings_gradle_kts_file_name, gradle_gdignore_file_name, gradle_wrapper_gradle_wrapper_jar_file_name, gradle_wrapper_gradle_wrapper_properties_file_name, src_main_kotlin_godot_HelloGodot_kt_file_name}; +constexpr const char* file_contents[] = {_gitattributes_file_content, _gitignore_file_content, build_gradle_kts_file_content, gradle_properties_file_content, gradlew_bat_file_content, gradlew_file_content, settings_gradle_kts_file_content, gradle_gdignore_file_content, gradle_wrapper_gradle_wrapper_jar_file_content, gradle_wrapper_gradle_wrapper_properties_file_content, src_main_kotlin_godot_HelloGodot_kt_file_content}; #endif // FILE_CONTENTS_H -#endif// TOOLS_ENABLED diff --git a/src/editor/strings.h b/src/editor/strings.h index 377bf08581..d11d432825 100644 --- a/src/editor/strings.h +++ b/src/editor/strings.h @@ -1,5 +1,3 @@ -#ifdef TOOLS_ENABLED - #ifndef GODOT_JVM_STRINGS_H #define GODOT_JVM_STRINGS_H @@ -34,5 +32,3 @@ constexpr const char* about_text = #endif// GODOT_JVM_STRINGS_H -#endif// TOOLS_ENABLED - diff --git a/src/logging.h b/src/logging.h index f7fcd95449..8322fd797d 100644 --- a/src/logging.h +++ b/src/logging.h @@ -1,11 +1,11 @@ #ifndef GODOT_JVM_LOGGING_H #define GODOT_JVM_LOGGING_H -#include "core/os/os.h" +#include +#include +#include -#include - -inline String format_prefix{"Godot-JVM: "}; +inline godot::String format_prefix{"Godot-JVM: "}; #define JVM_STRING_FORMAT(message, ...) vformat(format_prefix + message, ##__VA_ARGS__) @@ -13,7 +13,7 @@ inline String format_prefix{"Godot-JVM: "}; #define JVM_LOG_VERBOSE(message, ...) print_verbose(JVM_STRING_FORMAT(message, ##__VA_ARGS__)) (void) 0 #define JVM_LOG_WARNING(message, ...) WARN_PRINT(JVM_STRING_FORMAT(message, ##__VA_ARGS__)) -#ifdef TOOLS_ENABLED + #define JVM_ERR_FAIL_MSG(message, ...) ERR_FAIL_EDMSG(JVM_STRING_FORMAT(message, ##__VA_ARGS__)) #define JVM_ERR_FAIL_V_MSG(ret_var, message, ...) \ ERR_FAIL_V_EDMSG(ret_var, JVM_STRING_FORMAT(message, ##__VA_ARGS__)) @@ -21,15 +21,6 @@ inline String format_prefix{"Godot-JVM: "}; ERR_FAIL_COND_EDMSG(condition, JVM_STRING_FORMAT(message, ##__VA_ARGS__)) #define JVM_ERR_FAIL_COND_V_MSG(condition, ret_var, message, ...) \ ERR_FAIL_COND_V_EDMSG(condition, ret_var, JVM_STRING_FORMAT(message, ##__VA_ARGS__)) -#else -#define JVM_ERR_FAIL_MSG(message, ...) ERR_FAIL_MSG(JVM_STRING_FORMAT(message, ##__VA_ARGS__)) -#define JVM_ERR_FAIL_V_MSG(ret_var, message, ...) \ - ERR_FAIL_V_MSG(ret_var, JVM_STRING_FORMAT(message, ##__VA_ARGS__)) -#define JVM_ERR_FAIL_COND_MSG(condition, message, ...) \ - ERR_FAIL_COND_MSG(condition, JVM_STRING_FORMAT(message, ##__VA_ARGS__)) -#define JVM_ERR_FAIL_COND_V_MSG(condition, ret_var, message, ...) \ - ERR_FAIL_COND_V_MSG(condition, ret_var, JVM_STRING_FORMAT(message, ##__VA_ARGS__)) -#endif #ifdef DEV_ENABLED #define JVM_DEV_LOG(message, ...) JVM_LOG_INFO(message, ##__VA_ARGS__) diff --git a/register_types.cpp b/src/register_types.cpp similarity index 93% rename from register_types.cpp rename to src/register_types.cpp index e52b6126d6..9fd0d7633c 100644 --- a/register_types.cpp +++ b/src/register_types.cpp @@ -1,9 +1,9 @@ #ifdef TOOLS_ENABLED #include "kotlin_editor_export_plugin.h" -#include "src/editor/godot_kotlin_jvm_editor.h" +#include "editor/godot_kotlin_jvm_editor.h" -#include -#include +#include "classes/editor_node.h" +#include "classes/export/editor_export.h" #endif #include "gd_kotlin.h" @@ -39,7 +39,7 @@ static EditorPlugin* godot_kotlin_jvm_editor_plugin_creator_func() { } #endif -void initialize_kotlin_jvm_module(ModuleInitializationLevel p_level) { +void initialize__godot_jvm_module(ModuleInitializationLevel p_level) { #ifdef TOOLS_ENABLED if (Engine::get_singleton()->is_project_manager_hint()) { return; } #endif @@ -73,7 +73,7 @@ void initialize_kotlin_jvm_module(ModuleInitializationLevel p_level) { #endif } -void uninitialize_kotlin_jvm_module(ModuleInitializationLevel p_level) { +void uninitialize_godot_jvm_module(ModuleInitializationLevel p_level) { #ifdef TOOLS_ENABLED if (Engine::get_singleton()->is_project_manager_hint()) { return; } #endif diff --git a/src/register_types.h b/src/register_types.h new file mode 100644 index 0000000000..634bce0b2e --- /dev/null +++ b/src/register_types.h @@ -0,0 +1,11 @@ +#ifndef GODOT_JVM_REGISTER_TYPES_H +#define GODOT_JVM_REGISTER_TYPES_H + +#include + +using namespace godot; + +void initialize_godot_jvm_module(ModuleInitializationLevel p_level); +void uninitialize_godot_jvm_module(ModuleInitializationLevel p_level); + +#endif //GODOT_JVM_REGISTER_TYPES_H diff --git a/src/shared_buffer.h b/src/shared_buffer.h index fe3187a283..92d7ca4f89 100644 --- a/src/shared_buffer.h +++ b/src/shared_buffer.h @@ -1,7 +1,9 @@ #ifndef GODOT_JVM_SHARED_BUFFER_H #define GODOT_JVM_SHARED_BUFFER_H -#include "core/variant/variant.h" +#include "core/defs.hpp" + +#include #ifdef DEBUG_ENABLED #include "logging.h" #endif @@ -47,4 +49,4 @@ class SharedBuffer { _FORCE_INLINE_ void rewind() { position = 0; } }; -#endif// GODOT_JVM_SHARED_BUFFER_H +#endif // GODOT_JVM_SHARED_BUFFER_H From 10febef67234066053eca0d5182add06d58a8f5f Mon Sep 17 00:00:00 2001 From: CedNaru Date: Thu, 24 Apr 2025 01:16:39 +0200 Subject: [PATCH 02/10] Modify cpp project layout --- CMakeLists.txt | 1 + godot-cpp | 2 +- src/{ => api}/language/gdj_language.cpp | 0 src/{ => api}/language/gdj_language.h | 0 src/{ => api}/language/java_language.cpp | 2 +- src/{ => api}/language/java_language.h | 0 src/{ => api}/language/jvm_language.cpp | 0 src/{ => api}/language/jvm_language.h | 0 src/{ => api}/language/kotlin_language.cpp | 2 +- src/{ => api}/language/kotlin_language.h | 0 src/{ => api}/language/names.h | 0 src/{ => api}/language/scala_language.cpp | 2 +- src/{ => api}/language/scala_language.h | 0 src/{ => api}/resource_format/hash.h | 0 src/{ => api}/resource_format/java_archive.h | 0 .../java_archive_resource_format_loader.cpp | 0 .../java_archive_resource_format_loader.h | 0 .../jvm_resource_format_loader.cpp | 0 .../jvm_resource_format_loader.h | 0 .../jvm_resource_format_saver.cpp | 0 .../jvm_resource_format_saver.h | 0 src/{ => api}/script/jvm_instance.cpp | 0 src/{ => api}/script/jvm_instance.h | 0 .../script/jvm_placeholder_instance.cpp | 0 .../script/jvm_placeholder_instance.h | 0 src/{ => api}/script/jvm_script.cpp | 9 +- src/api/script/jvm_script.h | 120 ++++++++++++++ src/{ => api}/script/jvm_script_manager.cpp | 2 +- src/{ => api}/script/jvm_script_manager.h | 0 src/{ => api}/script/language/gdj_script.cpp | 0 src/{ => api}/script/language/gdj_script.h | 0 src/{ => api}/script/language/java_script.cpp | 0 src/{ => api}/script/language/java_script.h | 0 .../script/language/kotlin_script.cpp | 0 src/{ => api}/script/language/kotlin_script.h | 0 .../script/language/scala_script.cpp | 0 src/{ => api}/script/language/scala_script.h | 0 src/{binding => core}/kotlin_binding.cpp | 0 src/{binding => core}/kotlin_binding.h | 0 .../kotlin_binding_manager.cpp | 16 +- .../kotlin_binding_manager.h | 10 +- src/{ => core}/kt_variant.h | 4 +- src/core/paged_allocator.h | 155 ++++++++++++++++++ src/{ => core}/shared_buffer.cpp | 0 src/{ => core}/shared_buffer.h | 0 src/{ => core}/variant_allocator.h | 38 ++--- src/editor/build/build_manager.cpp | 4 +- .../export}/kotlin_editor_export_plugin.cpp | 2 +- .../export}/kotlin_editor_export_plugin.h | 56 +++---- src/editor/godot_kotlin_jvm_editor.cpp | 8 +- src/editor/project/project_generator.cpp | 4 +- src/editor/{dialog => ui}/about_dialog.cpp | 8 +- src/editor/{dialog => ui}/about_dialog.h | 0 src/editor/{dialog => ui}/build_dialog.cpp | 2 +- src/editor/{dialog => ui}/build_dialog.h | 0 src/gd_kotlin.cpp | 11 +- src/gd_kotlin.h | 109 ++++++------ src/{ => jvm}/jni/env.cpp | 0 src/{ => jvm}/jni/env.h | 0 src/{ => jvm}/jni/jvm.cpp | 0 src/{ => jvm}/jni/jvm.h | 0 src/{ => jvm}/jni/local_frame.cpp | 0 src/{ => jvm}/jni/local_frame.h | 0 src/{ => jvm}/jni/methods.h | 0 src/{ => jvm}/jni/types.cpp | 0 src/{ => jvm}/jni/types.h | 0 src/{ => jvm}/jni/wrapper.h | 106 ++++++------ src/{ => jvm}/lifecycle/class_loader.cpp | 0 src/{ => jvm}/lifecycle/class_loader.h | 0 src/{ => jvm}/lifecycle/jvm_manager.cpp | 0 src/{ => jvm}/lifecycle/jvm_manager.h | 0 src/{ => jvm}/lifecycle/jvm_options.cpp | 0 src/{ => jvm}/lifecycle/jvm_options.h | 0 .../lifecycle/jvm_user_configuration.cpp | 0 .../lifecycle/jvm_user_configuration.h | 0 src/{ => jvm}/lifecycle/paths.h | 0 .../wrapper}/bootstrap.cpp | 2 +- src/{jvm_wrapper => jvm/wrapper}/bootstrap.h | 2 +- .../wrapper}/bridge/bridges_utils.h | 0 .../wrapper}/bridge/callable_bridge.cpp | 0 .../wrapper}/bridge/callable_bridge.h | 0 .../wrapper}/bridge/dictionary_bridge.cpp | 0 .../wrapper}/bridge/dictionary_bridge.h | 0 .../wrapper}/bridge/godot_print_bridge.cpp | 0 .../wrapper}/bridge/godot_print_bridge.h | 0 .../bridge/lambda_callable_bridge.cpp | 0 .../wrapper}/bridge/lambda_callable_bridge.h | 0 .../wrapper}/bridge/node_path_bridge.cpp | 0 .../wrapper}/bridge/node_path_bridge.h | 0 .../wrapper}/bridge/packed_array_bridge.h | 0 .../bridge/packed_byte_array_bridge.cpp | 0 .../bridge/packed_byte_array_bridge.h | 0 .../bridge/packed_color_array_bridge.cpp | 0 .../bridge/packed_color_array_bridge.h | 0 .../bridge/packed_float_32_array_bridge.cpp | 0 .../bridge/packed_float_32_array_bridge.h | 0 .../bridge/packed_float_64_array_bridge.cpp | 0 .../bridge/packed_float_64_array_bridge.h | 0 .../bridge/packed_int_32_array_bridge.cpp | 0 .../bridge/packed_int_32_array_bridge.h | 0 .../bridge/packed_int_64_array_bridge.cpp | 0 .../bridge/packed_int_64_array_bridge.h | 0 .../bridge/packed_string_array_bridge.cpp | 0 .../bridge/packed_string_array_bridge.h | 0 .../bridge/packed_vector2_array_bridge.cpp | 0 .../bridge/packed_vector2_array_bridge.h | 0 .../bridge/packed_vector3_array_bridge.cpp | 0 .../bridge/packed_vector3_array_bridge.h | 0 .../bridge/packed_vector4_array_bridge.cpp | 0 .../bridge/packed_vector4_array_bridge.h | 0 .../wrapper}/bridge/string_name_bridge.cpp | 0 .../wrapper}/bridge/string_name_bridge.h | 0 .../wrapper}/bridge/variant_array_bridge.cpp | 0 .../wrapper}/bridge/variant_array_bridge.h | 0 .../wrapper}/jvm_instance_wrapper.h | 2 +- .../wrapper}/jvm_singleton_wrapper.h | 0 .../wrapper}/kotlin_callable_custom.cpp | 0 .../wrapper}/kotlin_callable_custom.h | 0 .../wrapper}/memory/long_string_queue.cpp | 0 .../wrapper}/memory/long_string_queue.h | 0 .../wrapper}/memory/memory_manager.cpp | 0 .../wrapper}/memory/memory_manager.h | 0 .../wrapper}/memory/transfer_context.cpp | 0 .../wrapper}/memory/transfer_context.h | 0 .../wrapper}/memory/type_manager.cpp | 120 +++++++------- .../wrapper}/memory/type_manager.h | 72 ++++---- .../wrapper}/registration/kt_class.cpp | 0 .../wrapper}/registration/kt_class.h | 44 ++--- .../wrapper}/registration/kt_constructor.cpp | 0 .../wrapper}/registration/kt_constructor.h | 0 .../wrapper}/registration/kt_function.cpp | 0 .../wrapper}/registration/kt_function.h | 0 .../wrapper}/registration/kt_object.cpp | 0 .../wrapper}/registration/kt_object.h | 0 .../wrapper}/registration/kt_property.cpp | 0 .../wrapper}/registration/kt_property.h | 0 .../wrapper}/registration/kt_rpc_config.cpp | 0 .../wrapper}/registration/kt_rpc_config.h | 0 .../wrapper}/registration/kt_signal_info.cpp | 0 .../wrapper}/registration/kt_signal_info.h | 0 src/logging.h | 16 +- src/register_types.cpp | 17 +- src/script/jvm_script.h | 116 ------------- 143 files changed, 621 insertions(+), 443 deletions(-) rename src/{ => api}/language/gdj_language.cpp (100%) rename src/{ => api}/language/gdj_language.h (100%) rename src/{ => api}/language/java_language.cpp (99%) rename src/{ => api}/language/java_language.h (100%) rename src/{ => api}/language/jvm_language.cpp (100%) rename src/{ => api}/language/jvm_language.h (100%) rename src/{ => api}/language/kotlin_language.cpp (99%) rename src/{ => api}/language/kotlin_language.h (100%) rename src/{ => api}/language/names.h (100%) rename src/{ => api}/language/scala_language.cpp (99%) rename src/{ => api}/language/scala_language.h (100%) rename src/{ => api}/resource_format/hash.h (100%) rename src/{ => api}/resource_format/java_archive.h (100%) rename src/{ => api}/resource_format/java_archive_resource_format_loader.cpp (100%) rename src/{ => api}/resource_format/java_archive_resource_format_loader.h (100%) rename src/{ => api}/resource_format/jvm_resource_format_loader.cpp (100%) rename src/{ => api}/resource_format/jvm_resource_format_loader.h (100%) rename src/{ => api}/resource_format/jvm_resource_format_saver.cpp (100%) rename src/{ => api}/resource_format/jvm_resource_format_saver.h (100%) rename src/{ => api}/script/jvm_instance.cpp (100%) rename src/{ => api}/script/jvm_instance.h (100%) rename src/{ => api}/script/jvm_placeholder_instance.cpp (100%) rename src/{ => api}/script/jvm_placeholder_instance.h (100%) rename src/{ => api}/script/jvm_script.cpp (98%) create mode 100644 src/api/script/jvm_script.h rename src/{ => api}/script/jvm_script_manager.cpp (99%) rename src/{ => api}/script/jvm_script_manager.h (100%) rename src/{ => api}/script/language/gdj_script.cpp (100%) rename src/{ => api}/script/language/gdj_script.h (100%) rename src/{ => api}/script/language/java_script.cpp (100%) rename src/{ => api}/script/language/java_script.h (100%) rename src/{ => api}/script/language/kotlin_script.cpp (100%) rename src/{ => api}/script/language/kotlin_script.h (100%) rename src/{ => api}/script/language/scala_script.cpp (100%) rename src/{ => api}/script/language/scala_script.h (100%) rename src/{binding => core}/kotlin_binding.cpp (100%) rename src/{binding => core}/kotlin_binding.h (100%) rename src/{binding => core}/kotlin_binding_manager.cpp (78%) rename src/{binding => core}/kotlin_binding_manager.h (78%) rename src/{ => core}/kt_variant.h (99%) create mode 100644 src/core/paged_allocator.h rename src/{ => core}/shared_buffer.cpp (100%) rename src/{ => core}/shared_buffer.h (100%) rename src/{ => core}/variant_allocator.h (66%) rename src/{ => editor/export}/kotlin_editor_export_plugin.cpp (99%) rename src/{ => editor/export}/kotlin_editor_export_plugin.h (96%) rename src/editor/{dialog => ui}/about_dialog.cpp (92%) rename src/editor/{dialog => ui}/about_dialog.h (100%) rename src/editor/{dialog => ui}/build_dialog.cpp (96%) rename src/editor/{dialog => ui}/build_dialog.h (100%) rename src/{ => jvm}/jni/env.cpp (100%) rename src/{ => jvm}/jni/env.h (100%) rename src/{ => jvm}/jni/jvm.cpp (100%) rename src/{ => jvm}/jni/jvm.h (100%) rename src/{ => jvm}/jni/local_frame.cpp (100%) rename src/{ => jvm}/jni/local_frame.h (100%) rename src/{ => jvm}/jni/methods.h (100%) rename src/{ => jvm}/jni/types.cpp (100%) rename src/{ => jvm}/jni/types.h (100%) rename src/{ => jvm}/jni/wrapper.h (96%) rename src/{ => jvm}/lifecycle/class_loader.cpp (100%) rename src/{ => jvm}/lifecycle/class_loader.h (100%) rename src/{ => jvm}/lifecycle/jvm_manager.cpp (100%) rename src/{ => jvm}/lifecycle/jvm_manager.h (100%) rename src/{ => jvm}/lifecycle/jvm_options.cpp (100%) rename src/{ => jvm}/lifecycle/jvm_options.h (100%) rename src/{ => jvm}/lifecycle/jvm_user_configuration.cpp (100%) rename src/{ => jvm}/lifecycle/jvm_user_configuration.h (100%) rename src/{ => jvm}/lifecycle/paths.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/bootstrap.cpp (98%) rename src/{jvm_wrapper => jvm/wrapper}/bootstrap.h (96%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/bridges_utils.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/callable_bridge.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/callable_bridge.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/dictionary_bridge.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/dictionary_bridge.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/godot_print_bridge.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/godot_print_bridge.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/lambda_callable_bridge.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/lambda_callable_bridge.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/node_path_bridge.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/node_path_bridge.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/packed_array_bridge.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/packed_byte_array_bridge.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/packed_byte_array_bridge.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/packed_color_array_bridge.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/packed_color_array_bridge.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/packed_float_32_array_bridge.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/packed_float_32_array_bridge.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/packed_float_64_array_bridge.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/packed_float_64_array_bridge.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/packed_int_32_array_bridge.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/packed_int_32_array_bridge.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/packed_int_64_array_bridge.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/packed_int_64_array_bridge.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/packed_string_array_bridge.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/packed_string_array_bridge.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/packed_vector2_array_bridge.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/packed_vector2_array_bridge.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/packed_vector3_array_bridge.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/packed_vector3_array_bridge.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/packed_vector4_array_bridge.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/packed_vector4_array_bridge.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/string_name_bridge.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/string_name_bridge.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/variant_array_bridge.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/bridge/variant_array_bridge.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/jvm_instance_wrapper.h (98%) rename src/{jvm_wrapper => jvm/wrapper}/jvm_singleton_wrapper.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/kotlin_callable_custom.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/kotlin_callable_custom.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/memory/long_string_queue.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/memory/long_string_queue.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/memory/memory_manager.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/memory/memory_manager.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/memory/transfer_context.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/memory/transfer_context.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/memory/type_manager.cpp (97%) rename src/{jvm_wrapper => jvm/wrapper}/memory/type_manager.h (97%) rename src/{jvm_wrapper => jvm/wrapper}/registration/kt_class.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/registration/kt_class.h (73%) rename src/{jvm_wrapper => jvm/wrapper}/registration/kt_constructor.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/registration/kt_constructor.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/registration/kt_function.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/registration/kt_function.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/registration/kt_object.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/registration/kt_object.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/registration/kt_property.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/registration/kt_property.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/registration/kt_rpc_config.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/registration/kt_rpc_config.h (100%) rename src/{jvm_wrapper => jvm/wrapper}/registration/kt_signal_info.cpp (100%) rename src/{jvm_wrapper => jvm/wrapper}/registration/kt_signal_info.h (100%) delete mode 100644 src/script/jvm_script.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 514aaafd4b..a9dfa2d737 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,6 +35,7 @@ add_library(${PROJECT_NAME} SHARED ${SOURCES} ${HEADERS}) # Includes target_include_directories(godot PUBLIC + src godot-cpp/include godot-cpp/include/godot_cpp godot-cpp/gen/include diff --git a/godot-cpp b/godot-cpp index e4b7c25e72..c90812e8f8 160000 --- a/godot-cpp +++ b/godot-cpp @@ -1 +1 @@ -Subproject commit e4b7c25e721ce3435a029087e3917a30aa73f06b +Subproject commit c90812e8f8de539877f4a6a47a6f5df1aac05fcf diff --git a/src/language/gdj_language.cpp b/src/api/language/gdj_language.cpp similarity index 100% rename from src/language/gdj_language.cpp rename to src/api/language/gdj_language.cpp diff --git a/src/language/gdj_language.h b/src/api/language/gdj_language.h similarity index 100% rename from src/language/gdj_language.h rename to src/api/language/gdj_language.h diff --git a/src/language/java_language.cpp b/src/api/language/java_language.cpp similarity index 99% rename from src/language/java_language.cpp rename to src/api/language/java_language.cpp index 265b822e69..59736672c8 100644 --- a/src/language/java_language.cpp +++ b/src/api/language/java_language.cpp @@ -3,7 +3,7 @@ #include "names.h" #include "script/language/java_script.h" -#include +#include constexpr const char* JAVA_TEMPLATE = PACKAGE_TEMPLATE "\n" diff --git a/src/language/java_language.h b/src/api/language/java_language.h similarity index 100% rename from src/language/java_language.h rename to src/api/language/java_language.h diff --git a/src/language/jvm_language.cpp b/src/api/language/jvm_language.cpp similarity index 100% rename from src/language/jvm_language.cpp rename to src/api/language/jvm_language.cpp diff --git a/src/language/jvm_language.h b/src/api/language/jvm_language.h similarity index 100% rename from src/language/jvm_language.h rename to src/api/language/jvm_language.h diff --git a/src/language/kotlin_language.cpp b/src/api/language/kotlin_language.cpp similarity index 99% rename from src/language/kotlin_language.cpp rename to src/api/language/kotlin_language.cpp index 4234185e24..f2d0493faf 100644 --- a/src/language/kotlin_language.cpp +++ b/src/api/language/kotlin_language.cpp @@ -3,7 +3,7 @@ #include "names.h" #include "script/language/kotlin_script.h" -#include +#include constexpr const char* KOTLIN_TEMPLATE = PACKAGE_TEMPLATE "\n" diff --git a/src/language/kotlin_language.h b/src/api/language/kotlin_language.h similarity index 100% rename from src/language/kotlin_language.h rename to src/api/language/kotlin_language.h diff --git a/src/language/names.h b/src/api/language/names.h similarity index 100% rename from src/language/names.h rename to src/api/language/names.h diff --git a/src/language/scala_language.cpp b/src/api/language/scala_language.cpp similarity index 99% rename from src/language/scala_language.cpp rename to src/api/language/scala_language.cpp index eca6125f3e..a5cb943918 100644 --- a/src/language/scala_language.cpp +++ b/src/api/language/scala_language.cpp @@ -3,7 +3,7 @@ #include "names.h" #include "script/language/scala_script.h" -#include +#include constexpr const char* SCALA_TEMPLATE = PACKAGE_TEMPLATE "\n" diff --git a/src/language/scala_language.h b/src/api/language/scala_language.h similarity index 100% rename from src/language/scala_language.h rename to src/api/language/scala_language.h diff --git a/src/resource_format/hash.h b/src/api/resource_format/hash.h similarity index 100% rename from src/resource_format/hash.h rename to src/api/resource_format/hash.h diff --git a/src/resource_format/java_archive.h b/src/api/resource_format/java_archive.h similarity index 100% rename from src/resource_format/java_archive.h rename to src/api/resource_format/java_archive.h diff --git a/src/resource_format/java_archive_resource_format_loader.cpp b/src/api/resource_format/java_archive_resource_format_loader.cpp similarity index 100% rename from src/resource_format/java_archive_resource_format_loader.cpp rename to src/api/resource_format/java_archive_resource_format_loader.cpp diff --git a/src/resource_format/java_archive_resource_format_loader.h b/src/api/resource_format/java_archive_resource_format_loader.h similarity index 100% rename from src/resource_format/java_archive_resource_format_loader.h rename to src/api/resource_format/java_archive_resource_format_loader.h diff --git a/src/resource_format/jvm_resource_format_loader.cpp b/src/api/resource_format/jvm_resource_format_loader.cpp similarity index 100% rename from src/resource_format/jvm_resource_format_loader.cpp rename to src/api/resource_format/jvm_resource_format_loader.cpp diff --git a/src/resource_format/jvm_resource_format_loader.h b/src/api/resource_format/jvm_resource_format_loader.h similarity index 100% rename from src/resource_format/jvm_resource_format_loader.h rename to src/api/resource_format/jvm_resource_format_loader.h diff --git a/src/resource_format/jvm_resource_format_saver.cpp b/src/api/resource_format/jvm_resource_format_saver.cpp similarity index 100% rename from src/resource_format/jvm_resource_format_saver.cpp rename to src/api/resource_format/jvm_resource_format_saver.cpp diff --git a/src/resource_format/jvm_resource_format_saver.h b/src/api/resource_format/jvm_resource_format_saver.h similarity index 100% rename from src/resource_format/jvm_resource_format_saver.h rename to src/api/resource_format/jvm_resource_format_saver.h diff --git a/src/script/jvm_instance.cpp b/src/api/script/jvm_instance.cpp similarity index 100% rename from src/script/jvm_instance.cpp rename to src/api/script/jvm_instance.cpp diff --git a/src/script/jvm_instance.h b/src/api/script/jvm_instance.h similarity index 100% rename from src/script/jvm_instance.h rename to src/api/script/jvm_instance.h diff --git a/src/script/jvm_placeholder_instance.cpp b/src/api/script/jvm_placeholder_instance.cpp similarity index 100% rename from src/script/jvm_placeholder_instance.cpp rename to src/api/script/jvm_placeholder_instance.cpp diff --git a/src/script/jvm_placeholder_instance.h b/src/api/script/jvm_placeholder_instance.h similarity index 100% rename from src/script/jvm_placeholder_instance.h rename to src/api/script/jvm_placeholder_instance.h diff --git a/src/script/jvm_script.cpp b/src/api/script/jvm_script.cpp similarity index 98% rename from src/script/jvm_script.cpp rename to src/api/script/jvm_script.cpp index d850f06d89..eee1fc665e 100644 --- a/src/script/jvm_script.cpp +++ b/src/api/script/jvm_script.cpp @@ -1,15 +1,16 @@ #include "jvm_script.h" #include "binding/kotlin_binding_manager.h" -#include +#include #include "jvm_instance.h" #include "jvm_placeholder_instance.h" #include "language/gdj_language.h" #include "script/jvm_script_manager.h" -#include -#include -#include +#include +#include +#include +using namespace godot; Variant JvmScript::_new() { Object* obj = _object_create(); diff --git a/src/api/script/jvm_script.h b/src/api/script/jvm_script.h new file mode 100644 index 0000000000..cf4029de3c --- /dev/null +++ b/src/api/script/jvm_script.h @@ -0,0 +1,120 @@ +#ifndef GODOT_JVM_JVM_SCRIPT_H +#define GODOT_JVM_JVM_SCRIPT_H + +#include "jvm_wrapper/registration/kt_class.h" +#include "resource_format/hash.h" + +#include +#include + +namespace godot { + + class JvmInstance; + + class JvmScript : public ScriptExtension { + GDCLASS(JvmScript, ScriptExtension); + + friend class JvmInstance; + friend class JvmScriptManager; + + protected: + KtClass* kotlin_class; + String source; + + template + ScriptInstance* _instance_create(Object* p_this); + Object* _object_create(); + + public: + JvmScript(); + ~JvmScript() override; + + Variant _new(); + bool can_instantiate() const override; + bool inherits_script(const Ref