From e223c606f58d9e0b39b98f6f16f51e28a70c4cee Mon Sep 17 00:00:00 2001 From: KirisameMarisa Date: Sat, 20 Jan 2024 19:40:40 +0900 Subject: [PATCH 01/40] verify release work flow --- .github/workflows/release.yml | 174 ++++++++++++------ .../BuildScripts/build_flatbuffers_cpp.py | 13 +- .../BuildScripts/build_flatbuffers_csharp.py | 5 +- ExternalTools/BuildScripts/build_godot.py | 8 + ExternalTools/BuildScripts/config.py | 9 +- .../BocchiTracker/BocchiTracker.Build.cs | 12 +- .../flatbuffers/flatbuffers.Build.cs | 12 +- 7 files changed, 143 insertions(+), 90 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 17d783c..a5b44a4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,25 +11,61 @@ permissions: contents: read jobs: - create_draft_release: + upload-plugins-artifact: permissions: contents: write pull-requests: write + + strategy: + matrix: + runs-on: [windows-latest, macos-latest, ubuntu-latest, ] + runs-on: ${{ matrix.runs-on }} - runs-on: windows-latest + env: + Builder: 1 steps: - - name: Delete drafts - uses: hugo19941994/delete-draft-releases@v1.0.0 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Create release draft - uses: release-drafter/release-drafter@v5 - id: create_draft - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - uses: actions/checkout@v3 + + - name: Checkout submodules + run: git submodule update --init --recursive + + - name: Install CMake + run: | + sudo apt-get update + sudo apt-get install -y cmake + + - name: setup python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + + - name: execute python + run: python ExternalTools/BuildScripts/build_flatbuffers.py + + - name: Build Godot + run: python ExternalTools/BuildScripts/build_godot.py + + - name: Upload Artifact Godot + uses: actions/upload-artifact@v3 + with: + name: Artifact-Godot-Plugin + path: Plugins/Godot/project/addons + + - name: Upload Artifact UnrealEngine + uses: actions/upload-artifact@v3 + with: + name: Artifact-UnrealEngine-Plugin + path: Plugins/UnrealEngine + + upload-app-artifact: + permissions: + contents: write + pull-requests: write + runs-on: windows-latest + + steps: - name: Checkout repository uses: actions/checkout@v2 @@ -41,54 +77,76 @@ jobs: - name: Build C# application run: dotnet build Application/BocchiTracker.WPF.sln -c Release - - name: Archive application - run: Compress-Archive -Path "Application/WPF/Artifact/Release/net7.0-windows" -DestinationPath "BocchiTracker.zip" + - name: Upload Artifact Application + uses: actions/upload-artifact@v3 + with: + name: Artifact-BocchiTracker + path: Application/WPF/Artifact/Release/net7.0-windows - - name: Archive UnrealEngine plugin - run: Compress-Archive -Path "Plugins/UnrealEngine" -DestinationPath "UnrealEngine.zip" + # create_draft_release: + # permissions: + # contents: write + # pull-requests: write - - name: Archive Unity plugin - run: Compress-Archive -Path "Plugins/Unity" -DestinationPath "Unity.zip" + # runs-on: windows-latest - - name: Archive Godot plugin - run: Compress-Archive -Path "Plugins/Godot" -DestinationPath "Godot.zip" + # steps: + # - name: Delete drafts + # uses: hugo19941994/delete-draft-releases@v1.0.0 + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + # - name: Create release draft + # uses: release-drafter/release-drafter@v5 + # id: create_draft + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Upload Application - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_draft.outputs.upload_url }} - asset_path: ./BocchiTracker.zip - asset_name: BocchiTracker.zip - asset_content_type: application/zip + # - name: Archive UnrealEngine plugin + # run: Compress-Archive -Path "Plugins/UnrealEngine" -DestinationPath "UnrealEngine.zip" + + # - name: Archive Unity plugin + # run: Compress-Archive -Path "Plugins/Unity" -DestinationPath "Unity.zip" + + # - name: Archive Godot plugin + # run: Compress-Archive -Path "Plugins/Godot" -DestinationPath "Godot.zip" + + # - name: Upload Application + # uses: actions/upload-release-asset@v1 + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # with: + # upload_url: ${{ steps.create_draft.outputs.upload_url }} + # asset_path: ./BocchiTracker.zip + # asset_name: BocchiTracker.zip + # asset_content_type: application/zip - - name: Upload UnrealEngine plugin - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_draft.outputs.upload_url }} - asset_path: ./UnrealEngine.zip - asset_name: UnrealEngine.zip - asset_content_type: application/zip - - - name: Upload Unity plugin - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_draft.outputs.upload_url }} - asset_path: ./Unity.zip - asset_name: Unity.zip - asset_content_type: application/zip - - - name: Upload Godot plugin - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_draft.outputs.upload_url }} - asset_path: ./Godot.zip - asset_name: Godot.zip - asset_content_type: application/zip + # - name: Upload UnrealEngine plugin + # uses: actions/upload-release-asset@v1 + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # with: + # upload_url: ${{ steps.create_draft.outputs.upload_url }} + # asset_path: ./UnrealEngine.zip + # asset_name: UnrealEngine.zip + # asset_content_type: application/zip + + # - name: Upload Unity plugin + # uses: actions/upload-release-asset@v1 + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # with: + # upload_url: ${{ steps.create_draft.outputs.upload_url }} + # asset_path: ./Unity.zip + # asset_name: Unity.zip + # asset_content_type: application/zip + + # - name: Upload Godot plugin + # uses: actions/upload-release-asset@v1 + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # with: + # upload_url: ${{ steps.create_draft.outputs.upload_url }} + # asset_path: ./Godot.zip + # asset_name: Godot.zip + # asset_content_type: application/zip diff --git a/ExternalTools/BuildScripts/build_flatbuffers_cpp.py b/ExternalTools/BuildScripts/build_flatbuffers_cpp.py index 736f6f4..0acb8f8 100644 --- a/ExternalTools/BuildScripts/build_flatbuffers_cpp.py +++ b/ExternalTools/BuildScripts/build_flatbuffers_cpp.py @@ -24,18 +24,13 @@ def Build(): shutil.copytree(release_lib_path.resolve(), unreal_engine_lib_path.resolve(), dirs_exist_ok=True) def RunMsBuild(): - msbuild_path = Path("C:\\") / "Program Files" / "Microsoft Visual Studio" / "2022" / "Community" / "Msbuild" / "Current" / "Bin" / "MSBuild.exe" - if not msbuild_path.exists(): - print("not exist MSBuild.exe, should install VisualStudio build tools.") - return - subprocess.call(["cmake", "-G", "Visual Studio 17", "-DCMAKE_BUILD_TYPE=Release"], cwd=config.cFlatBuffersPath) - subprocess.call([msbuild_path, config.cFlatBuffersPath / "FlatBuffers.sln", "-t:flatbuffers", "/p:Configuration=Release"]) - subprocess.call([msbuild_path, config.cFlatBuffersPath / "FlatBuffers.sln", "-t:flatc", "/p:Configuration=Release"]) + subprocess.call(["msbuild", config.cFlatBuffersPath / "FlatBuffers.sln", "-t:flatbuffers", "/p:Configuration=Release"], cwd=config.cFlatBuffersPath) + subprocess.call(["msbuild", config.cFlatBuffersPath / "FlatBuffers.sln", "-t:flatc", "/p:Configuration=Release"], cwd=config.cFlatBuffersPath) def RunUnix(): - subprocess.call(["cmake", "-G", "Unix Makefiles", "-DCMAKE_BUILD_TYPE=Release"]) - subprocess.call(["make", "-j"]) + subprocess.call(["cmake", "-G", "Unix Makefiles", "-DCMAKE_BUILD_TYPE=Release"], cwd=config.cFlatBuffersPath) + subprocess.call(["make", "-j"], cwd=config.cFlatBuffersPath) if __name__ == '__main__': diff --git a/ExternalTools/BuildScripts/build_flatbuffers_csharp.py b/ExternalTools/BuildScripts/build_flatbuffers_csharp.py index bd6d7d1..dc9d14d 100644 --- a/ExternalTools/BuildScripts/build_flatbuffers_csharp.py +++ b/ExternalTools/BuildScripts/build_flatbuffers_csharp.py @@ -5,12 +5,11 @@ def Build(): print("Cmake C# flatbuffers") - subprocess.call(["cmake", "-G", "Visual Studio 17", "-DCMAKE_BUILD_TYPE=Release", "ExternalTools\\flatbuffers"]) + subprocess.call(["cmake", "-G", "Visual Studio 17", "-DCMAKE_BUILD_TYPE=Release"], cwd=config.cFlatBuffersPath) print("Build C# flatbuffers") - dotnet_path = "dotnet" flatbuffers_csproj_path = config.cFlatBuffersPath / "net" / "FlatBuffers" / "Google.FlatBuffers.csproj" - subprocess.call([dotnet_path, "build", flatbuffers_csproj_path.resolve(), "-c", "Release"]) + subprocess.call(["dotnet", "build", flatbuffers_csproj_path.resolve(), "-c", "Release"], cwd=config.cFlatBuffersPath) print("Copying flatbuffers to Unity directory...") artifact = config.cFlatBuffersPath / "net" / "FlatBuffers" / "bin" / "Release" / "netstandard2.1" diff --git a/ExternalTools/BuildScripts/build_godot.py b/ExternalTools/BuildScripts/build_godot.py index e69de29..a349a0b 100644 --- a/ExternalTools/BuildScripts/build_godot.py +++ b/ExternalTools/BuildScripts/build_godot.py @@ -0,0 +1,8 @@ +import subprocess +import config + +def Build(): + subprocess.call(["python", "-m", "SConstruct"], cwd=config.cGodotPath) + +if __name__ == '__main__': + Build() \ No newline at end of file diff --git a/ExternalTools/BuildScripts/config.py b/ExternalTools/BuildScripts/config.py index 9557d6d..a91cbd9 100644 --- a/ExternalTools/BuildScripts/config.py +++ b/ExternalTools/BuildScripts/config.py @@ -1,6 +1,7 @@ from pathlib import Path -cFlatBuffersPath = Path("ExternalTools") / "flatbuffers" -cPluginsPath = "Plugins/" -cUnrealEnginePath = Path(cPluginsPath) / "UnrealEngine" -cUnityPath = Path(cPluginsPath) / "Unity" \ No newline at end of file +cFlatBuffersPath = Path("ExternalTools") / "flatbuffers" +cPluginsPath = "Plugins/" +cUnrealEnginePath = Path(cPluginsPath) / "UnrealEngine" +cUnityPath = Path(cPluginsPath) / "Unity" +cGodotPath = Path(cPluginsPath) / "Godot" \ No newline at end of file diff --git a/Plugins/UnrealEngine/BocchiTracker/Source/BocchiTracker/BocchiTracker.Build.cs b/Plugins/UnrealEngine/BocchiTracker/Source/BocchiTracker/BocchiTracker.Build.cs index 623cc5b..ae26700 100644 --- a/Plugins/UnrealEngine/BocchiTracker/Source/BocchiTracker/BocchiTracker.Build.cs +++ b/Plugins/UnrealEngine/BocchiTracker/Source/BocchiTracker/BocchiTracker.Build.cs @@ -61,13 +61,9 @@ public BocchiTracker(ReadOnlyTargetRules Target) : base(Target) { PublicAdditionalLibraries.Add(Path.Combine(ThirdPartyPath, "flatbuffers", "lib", "Win64", "Release", "flatbuffers.lib")); } - // else if (Target.Platform == UnrealTargetPlatform.Mac) - // { - // PublicAdditionalLibraries.Add(Path.Combine(LibraryPath, "Mac", "Release", "flatbuffers.a")); - // } - // else if (Target.IsInPlatformGroup(UnrealPlatformGroup.Unix)) - // { - // PublicAdditionalLibraries.Add(Path.Combine(LibraryPath, "Unix", Target.Architecture.LinuxName, "Release", "flatbuffers.a")); - // } + else if (Target.IsInPlatformGroup(UnrealPlatformGroup.Unix)) + { + PublicAdditionalLibraries.Add(Path.Combine(ThirdPartyPath, "flatbuffers", "lib", "Unix", "Release", "libzip.a")); + } } } diff --git a/Plugins/UnrealEngine/ThirdParty/flatbuffers/flatbuffers.Build.cs b/Plugins/UnrealEngine/ThirdParty/flatbuffers/flatbuffers.Build.cs index 10d05da..04d111e 100644 --- a/Plugins/UnrealEngine/ThirdParty/flatbuffers/flatbuffers.Build.cs +++ b/Plugins/UnrealEngine/ThirdParty/flatbuffers/flatbuffers.Build.cs @@ -14,14 +14,10 @@ public flatbuffers(ReadOnlyTargetRules Target) : base(Target) { PublicAdditionalLibraries.Add(Path.Combine(LibraryPath, "Win64", "Release", "flatbuffers.lib")); } - // else if (Target.Platform == UnrealTargetPlatform.Mac) - // { - // PublicAdditionalLibraries.Add(Path.Combine(LibraryPath, "Mac", "Release", "libzip.a")); - // } - // else if (Target.IsInPlatformGroup(UnrealPlatformGroup.Unix)) - // { - // PublicAdditionalLibraries.Add(Path.Combine(LibraryPath, "Unix", Target.Architecture.LinuxName, "Release", "libzip.a")); - // } + else if (Target.IsInPlatformGroup(UnrealPlatformGroup.Unix)) + { + PublicAdditionalLibraries.Add(Path.Combine(LibraryPath, "Unix", "Release", "libzip.a")); + } } } From e274017221b0598e3c6bacb92fe10dd1713b461f Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sat, 20 Jan 2024 20:02:58 +0900 Subject: [PATCH 02/40] Update release.yml --- .github/workflows/release.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a5b44a4..d859356 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -32,8 +32,15 @@ jobs: - name: Install CMake run: | - sudo apt-get update - sudo apt-get install -y cmake + if [ "${{ runner.os }}" == "Linux" ]; then + sudo apt-get update + sudo apt-get install -y cmake + elif [ "${{ runner.os }}" == "Windows" ]; then + choco install cmake + else + echo "Unsupported operating system" + exit 1 + fi - name: setup python uses: actions/setup-python@v4 From 916778b42f147542648681258b01622b3a86942c Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sat, 20 Jan 2024 20:05:55 +0900 Subject: [PATCH 03/40] Update release.yml --- .github/workflows/release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d859356..eb5f6ce 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -35,6 +35,8 @@ jobs: if [ "${{ runner.os }}" == "Linux" ]; then sudo apt-get update sudo apt-get install -y cmake + elif [ "${{ runner.os }}" == "macOS" ]; then + brew install cmake elif [ "${{ runner.os }}" == "Windows" ]; then choco install cmake else From 86c4a2244fa030df2649cb8667fb45be6c638ff3 Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sat, 20 Jan 2024 20:14:20 +0900 Subject: [PATCH 04/40] Update release.yml --- .github/workflows/release.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index eb5f6ce..1d8bb21 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -43,7 +43,24 @@ jobs: echo "Unsupported operating system" exit 1 fi + + - name: Install cmake on ubuntu-latest + if: runner.os == 'Linux' + run: | + sudo apt update -y + sudo apt install -y cmake + - name: Install cmake on macos-latest + if: runner.os == 'macOS' + run: | + brew update + brew install cmake + + - name: Install cmake on windows-latest + if: runner.os == 'Windows' + run: | + choco install cmake + - name: setup python uses: actions/setup-python@v4 with: From d25af8b4bdeb90ab625588435131de1234b6dbee Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sat, 20 Jan 2024 20:15:47 +0900 Subject: [PATCH 05/40] Update release.yml --- .github/workflows/release.yml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1d8bb21..64118e1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,20 +29,6 @@ jobs: - name: Checkout submodules run: git submodule update --init --recursive - - - name: Install CMake - run: | - if [ "${{ runner.os }}" == "Linux" ]; then - sudo apt-get update - sudo apt-get install -y cmake - elif [ "${{ runner.os }}" == "macOS" ]; then - brew install cmake - elif [ "${{ runner.os }}" == "Windows" ]; then - choco install cmake - else - echo "Unsupported operating system" - exit 1 - fi - name: Install cmake on ubuntu-latest if: runner.os == 'Linux' From 4f7d1fa44279297a341f7c5a5f2b7f77d296ce26 Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sat, 20 Jan 2024 20:20:39 +0900 Subject: [PATCH 06/40] Update release.yml --- .github/workflows/release.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 64118e1..cc78d82 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -46,6 +46,10 @@ jobs: if: runner.os == 'Windows' run: | choco install cmake + + - name: Add msbuild to PATH + if: runner.os == 'Windows' + uses: microsoft/setup-msbuild@v1.1 - name: setup python uses: actions/setup-python@v4 From 9e16908de0b00a2d7e5ab585c0d09284b19f5723 Mon Sep 17 00:00:00 2001 From: KirisameMarisa Date: Sat, 20 Jan 2024 20:25:05 +0900 Subject: [PATCH 07/40] fix script, mkdir flatbuffer output directory --- ExternalTools/BuildScripts/build_flatbuffers_cpp.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ExternalTools/BuildScripts/build_flatbuffers_cpp.py b/ExternalTools/BuildScripts/build_flatbuffers_cpp.py index 0acb8f8..ed348aa 100644 --- a/ExternalTools/BuildScripts/build_flatbuffers_cpp.py +++ b/ExternalTools/BuildScripts/build_flatbuffers_cpp.py @@ -21,6 +21,8 @@ def Build(): unreal_engine_lib_path = config.cUnrealEnginePath / "ThirdParty" / "flatbuffers" / "lib" / "Win64" / "Release" else: unreal_engine_lib_path = config.cUnrealEnginePath / "ThirdParty" / "flatbuffers" / "lib" / "Unix" / "Release" + + unreal_engine_lib_path.resolve().mkdir(exist_ok=True) shutil.copytree(release_lib_path.resolve(), unreal_engine_lib_path.resolve(), dirs_exist_ok=True) def RunMsBuild(): From 907fc4f1de63f93ea3e4ef3c43a5d873fe3c460c Mon Sep 17 00:00:00 2001 From: KirisameMarisa Date: Sat, 20 Jan 2024 21:30:28 +0900 Subject: [PATCH 08/40] fix script --- ExternalTools/BuildScripts/build_flatbuffers_cpp.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ExternalTools/BuildScripts/build_flatbuffers_cpp.py b/ExternalTools/BuildScripts/build_flatbuffers_cpp.py index ed348aa..c27ff22 100644 --- a/ExternalTools/BuildScripts/build_flatbuffers_cpp.py +++ b/ExternalTools/BuildScripts/build_flatbuffers_cpp.py @@ -16,12 +16,13 @@ def Build(): unreal_engine_include_path = config.cUnrealEnginePath / "ThirdParty" / "flatbuffers" / "include" shutil.copytree(include_path, unreal_engine_include_path.resolve(), dirs_exist_ok=True) - release_lib_path = config.cFlatBuffersPath / "Release" if platform.system() == "Windows": + release_lib_path = config.cFlatBuffersPath / "Release" unreal_engine_lib_path = config.cUnrealEnginePath / "ThirdParty" / "flatbuffers" / "lib" / "Win64" / "Release" else: + release_lib_path = config.cFlatBuffersPath / "build" / "lib" unreal_engine_lib_path = config.cUnrealEnginePath / "ThirdParty" / "flatbuffers" / "lib" / "Unix" / "Release" - + unreal_engine_lib_path.resolve().mkdir(exist_ok=True) shutil.copytree(release_lib_path.resolve(), unreal_engine_lib_path.resolve(), dirs_exist_ok=True) From 37ae4a124dcf74dcfcbd2046a6fb3b706c90c7be Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sat, 20 Jan 2024 21:57:11 +0900 Subject: [PATCH 09/40] Update build_flatbuffers_cpp.py --- ExternalTools/BuildScripts/build_flatbuffers_cpp.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ExternalTools/BuildScripts/build_flatbuffers_cpp.py b/ExternalTools/BuildScripts/build_flatbuffers_cpp.py index c27ff22..4782dcf 100644 --- a/ExternalTools/BuildScripts/build_flatbuffers_cpp.py +++ b/ExternalTools/BuildScripts/build_flatbuffers_cpp.py @@ -23,7 +23,7 @@ def Build(): release_lib_path = config.cFlatBuffersPath / "build" / "lib" unreal_engine_lib_path = config.cUnrealEnginePath / "ThirdParty" / "flatbuffers" / "lib" / "Unix" / "Release" - unreal_engine_lib_path.resolve().mkdir(exist_ok=True) + unreal_engine_lib_path.resolve().mkdir(exist_ok=True, parents=True) shutil.copytree(release_lib_path.resolve(), unreal_engine_lib_path.resolve(), dirs_exist_ok=True) def RunMsBuild(): @@ -37,4 +37,4 @@ def RunUnix(): if __name__ == '__main__': - Build() \ No newline at end of file + Build() From 9b2696925d03f776cff1419b24f3e745f72af113 Mon Sep 17 00:00:00 2001 From: KirisameMarisa Date: Sat, 20 Jan 2024 22:54:21 +0900 Subject: [PATCH 10/40] fix script --- ExternalTools/BuildScripts/build_flatbuffers_cpp.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ExternalTools/BuildScripts/build_flatbuffers_cpp.py b/ExternalTools/BuildScripts/build_flatbuffers_cpp.py index c27ff22..c175a67 100644 --- a/ExternalTools/BuildScripts/build_flatbuffers_cpp.py +++ b/ExternalTools/BuildScripts/build_flatbuffers_cpp.py @@ -17,14 +17,14 @@ def Build(): shutil.copytree(include_path, unreal_engine_include_path.resolve(), dirs_exist_ok=True) if platform.system() == "Windows": - release_lib_path = config.cFlatBuffersPath / "Release" + release_lib_path = config.cFlatBuffersPath / "Release" / "flatbuffers.lib" unreal_engine_lib_path = config.cUnrealEnginePath / "ThirdParty" / "flatbuffers" / "lib" / "Win64" / "Release" else: - release_lib_path = config.cFlatBuffersPath / "build" / "lib" + release_lib_path = config.cFlatBuffersPath / "libflatbuffers,a" unreal_engine_lib_path = config.cUnrealEnginePath / "ThirdParty" / "flatbuffers" / "lib" / "Unix" / "Release" - unreal_engine_lib_path.resolve().mkdir(exist_ok=True) - shutil.copytree(release_lib_path.resolve(), unreal_engine_lib_path.resolve(), dirs_exist_ok=True) + unreal_engine_lib_path.resolve().mkdir(exist_ok=True, parents=True) + shutil.copy(release_lib_path.resolve(), unreal_engine_lib_path.resolve(), dirs_exist_ok=True) def RunMsBuild(): subprocess.call(["cmake", "-G", "Visual Studio 17", "-DCMAKE_BUILD_TYPE=Release"], cwd=config.cFlatBuffersPath) From 2d4c1773961a90ce4a7e69fc72d7ec38beb9dec5 Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sat, 20 Jan 2024 23:00:13 +0900 Subject: [PATCH 11/40] Update build_flatbuffers_cpp.py --- ExternalTools/BuildScripts/build_flatbuffers_cpp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ExternalTools/BuildScripts/build_flatbuffers_cpp.py b/ExternalTools/BuildScripts/build_flatbuffers_cpp.py index 8ccd1ff..018eed8 100644 --- a/ExternalTools/BuildScripts/build_flatbuffers_cpp.py +++ b/ExternalTools/BuildScripts/build_flatbuffers_cpp.py @@ -24,7 +24,7 @@ def Build(): unreal_engine_lib_path = config.cUnrealEnginePath / "ThirdParty" / "flatbuffers" / "lib" / "Unix" / "Release" unreal_engine_lib_path.resolve().mkdir(exist_ok=True, parents=True) - shutil.copy(release_lib_path.resolve(), unreal_engine_lib_path.resolve(), dirs_exist_ok=True) + shutil.copy(release_lib_path.resolve(), unreal_engine_lib_path.resolve()) def RunMsBuild(): subprocess.call(["cmake", "-G", "Visual Studio 17", "-DCMAKE_BUILD_TYPE=Release"], cwd=config.cFlatBuffersPath) From 3afa5dfa52c0976a1968f1b25c347b25b780c4f2 Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sat, 20 Jan 2024 23:35:25 +0900 Subject: [PATCH 12/40] Update build_flatbuffers_cpp.py --- ExternalTools/BuildScripts/build_flatbuffers_cpp.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ExternalTools/BuildScripts/build_flatbuffers_cpp.py b/ExternalTools/BuildScripts/build_flatbuffers_cpp.py index 018eed8..e78a637 100644 --- a/ExternalTools/BuildScripts/build_flatbuffers_cpp.py +++ b/ExternalTools/BuildScripts/build_flatbuffers_cpp.py @@ -28,8 +28,8 @@ def Build(): def RunMsBuild(): subprocess.call(["cmake", "-G", "Visual Studio 17", "-DCMAKE_BUILD_TYPE=Release"], cwd=config.cFlatBuffersPath) - subprocess.call(["msbuild", config.cFlatBuffersPath / "FlatBuffers.sln", "-t:flatbuffers", "/p:Configuration=Release"], cwd=config.cFlatBuffersPath) - subprocess.call(["msbuild", config.cFlatBuffersPath / "FlatBuffers.sln", "-t:flatc", "/p:Configuration=Release"], cwd=config.cFlatBuffersPath) + subprocess.call(["msbuild", "FlatBuffers.sln", "-t:flatbuffers", "/p:Configuration=Release"], cwd=config.cFlatBuffersPath) + subprocess.call(["msbuild", "FlatBuffers.sln", "-t:flatc", "/p:Configuration=Release"], cwd=config.cFlatBuffersPath) def RunUnix(): subprocess.call(["cmake", "-G", "Unix Makefiles", "-DCMAKE_BUILD_TYPE=Release"], cwd=config.cFlatBuffersPath) From 312d2467a781ce58c5971951c362ce4e6e5cf28a Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sat, 20 Jan 2024 23:46:04 +0900 Subject: [PATCH 13/40] Update build_flatbuffers_cpp.py --- ExternalTools/BuildScripts/build_flatbuffers_cpp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ExternalTools/BuildScripts/build_flatbuffers_cpp.py b/ExternalTools/BuildScripts/build_flatbuffers_cpp.py index e78a637..149ccb7 100644 --- a/ExternalTools/BuildScripts/build_flatbuffers_cpp.py +++ b/ExternalTools/BuildScripts/build_flatbuffers_cpp.py @@ -20,7 +20,7 @@ def Build(): release_lib_path = config.cFlatBuffersPath / "Release" / "flatbuffers.lib" unreal_engine_lib_path = config.cUnrealEnginePath / "ThirdParty" / "flatbuffers" / "lib" / "Win64" / "Release" else: - release_lib_path = config.cFlatBuffersPath / "libflatbuffers,a" + release_lib_path = config.cFlatBuffersPath / "libflatbuffers.a" unreal_engine_lib_path = config.cUnrealEnginePath / "ThirdParty" / "flatbuffers" / "lib" / "Unix" / "Release" unreal_engine_lib_path.resolve().mkdir(exist_ok=True, parents=True) From d59f8085e4c18125557163e6033d95f84acdb514 Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sun, 21 Jan 2024 00:13:05 +0900 Subject: [PATCH 14/40] Update release.yml --- .github/workflows/release.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cc78d82..b465958 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -55,8 +55,10 @@ jobs: uses: actions/setup-python@v4 with: python-version: '3.10' + + - run: pip install SCons - - name: execute python + - name: Build flatbuffers run: python ExternalTools/BuildScripts/build_flatbuffers.py - name: Build Godot From 3ed5fdaa780c43b47e429845a8f8acdeac87317f Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sun, 21 Jan 2024 00:21:52 +0900 Subject: [PATCH 15/40] Update build_godot.py --- ExternalTools/BuildScripts/build_godot.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ExternalTools/BuildScripts/build_godot.py b/ExternalTools/BuildScripts/build_godot.py index a349a0b..0a16a17 100644 --- a/ExternalTools/BuildScripts/build_godot.py +++ b/ExternalTools/BuildScripts/build_godot.py @@ -2,7 +2,7 @@ import config def Build(): - subprocess.call(["python", "-m", "SConstruct"], cwd=config.cGodotPath) + subprocess.call(["python", "-m", "SCons"], cwd=config.cGodotPath) if __name__ == '__main__': - Build() \ No newline at end of file + Build() From 519d34cc8d78e6f6dda349b5e23f80c219702791 Mon Sep 17 00:00:00 2001 From: KirisameMarisa Date: Sun, 21 Jan 2024 10:54:35 +0900 Subject: [PATCH 16/40] add sample unity project --- Plugins/Unity/project/.vsconfig | 6 + .../Unity/project/Assets/BocchiTracker.meta | 8 + .../project/Assets/BocchiTracker/Editor.meta | 8 + .../Editor/BocchiTrackerSetting.cs | 24 + .../Editor/BocchiTrackerSetting.cs.meta | 11 + .../BocchiTracker/ExternalPackages.meta | 8 + .../ExternalPackages/flatbuffers.meta | 8 + .../project/Assets/BocchiTracker/Runtime.meta | 8 + .../BocchiTracker/Runtime/BocchiTracker.meta | 8 + .../BocchiTracker/ProcessLinkQuery.meta | 8 + .../ProcessLinkQuery/Queries.meta | 8 + .../ProcessLinkQuery/Queries/AppBasicInfo.cs | 94 +++ .../Queries/AppBasicInfo.cs.meta | 11 + .../ProcessLinkQuery/Queries/Issue.cs | 88 +++ .../ProcessLinkQuery/Queries/Issue.cs.meta | 11 + .../Queries/IssueesRequest.cs | 56 ++ .../Queries/IssueesRequest.cs.meta | 11 + .../ProcessLinkQuery/Queries/JumpRequest.cs | 52 ++ .../Queries/JumpRequest.cs.meta | 11 + .../ProcessLinkQuery/Queries/LogData.cs | 56 ++ .../ProcessLinkQuery/Queries/LogData.cs.meta | 11 + .../ProcessLinkQuery/Queries/Packet.cs | 65 ++ .../ProcessLinkQuery/Queries/Packet.cs.meta | 11 + .../Queries/PlayerPosition.cs | 71 ++ .../Queries/PlayerPosition.cs.meta | 11 + .../ProcessLinkQuery/Queries/QueryID.cs | 21 + .../ProcessLinkQuery/Queries/QueryID.cs.meta | 11 + .../Queries/ScreenshotData.cs | 72 ++ .../Queries/ScreenshotData.cs.meta | 11 + .../Queries/ScreenshotRequest.cs | 40 + .../Queries/ScreenshotRequest.cs.meta | 11 + .../ProcessLinkQuery/Queries/Vec3.cs | 33 + .../ProcessLinkQuery/Queries/Vec3.cs.meta | 11 + .../Runtime/BocchiTrackerLocation.cs | 14 + .../Runtime/BocchiTrackerLocation.cs.meta | 11 + .../Runtime/BocchiTrackerLogHook.cs | 47 ++ .../Runtime/BocchiTrackerLogHook.cs.meta | 11 + .../Runtime/BocchiTrackerPacket.cs | 142 ++++ .../Runtime/BocchiTrackerPacket.cs.meta | 11 + .../BocchiTrackerPlayerPositionUpdater.cs | 61 ++ ...BocchiTrackerPlayerPositionUpdater.cs.meta | 11 + .../Runtime/BocchiTrackerSystem .cs | 216 ++++++ .../Runtime/BocchiTrackerSystem .cs.meta | 11 + .../Runtime/BocchiTrackerTcpSocket.cs | 121 +++ .../Runtime/BocchiTrackerTcpSocket.cs.meta | 11 + .../project/Assets/BocchiTracker/package.json | 25 + .../Assets/BocchiTracker/package.json.meta | 7 + Plugins/Unity/project/Assets/Scenes.meta | 8 + .../project/Assets/Scenes/GenUnityPackage.cs | 14 + .../Assets/Scenes/GenUnityPackage.cs.meta | 11 + .../project/Assets/Scenes/SampleScene.unity | 208 +++++ .../Assets/Scenes/SampleScene.unity.meta | 7 + Plugins/Unity/project/Packages/manifest.json | 44 ++ .../Unity/project/Packages/packages-lock.json | 465 ++++++++++++ .../ProjectSettings/AudioManager.asset | 19 + .../ProjectSettings/ClusterInputManager.asset | 6 + .../ProjectSettings/DynamicsManager.asset | 37 + .../ProjectSettings/EditorBuildSettings.asset | 11 + .../ProjectSettings/EditorSettings.asset | 40 + .../ProjectSettings/GraphicsSettings.asset | 64 ++ .../ProjectSettings/InputManager.asset | 487 ++++++++++++ .../ProjectSettings/MemorySettings.asset | 35 + .../ProjectSettings/NavMeshAreas.asset | 93 +++ .../ProjectSettings/NetworkManager.asset | 8 + .../PackageManagerSettings.asset | 36 + .../ProjectSettings/Physics2DSettings.asset | 56 ++ .../ProjectSettings/PresetManager.asset | 7 + .../ProjectSettings/ProjectSettings.asset | 711 ++++++++++++++++++ .../ProjectSettings/ProjectVersion.txt | 2 + .../ProjectSettings/QualitySettings.asset | 239 ++++++ .../project/ProjectSettings/TagManager.asset | 43 ++ .../project/ProjectSettings/TimeManager.asset | 9 + .../UnityConnectSettings.asset | 36 + .../project/ProjectSettings/VFXManager.asset | 14 + .../VersionControlSettings.asset | 8 + .../project/ProjectSettings/XRSettings.asset | 10 + 76 files changed, 4301 insertions(+) create mode 100644 Plugins/Unity/project/.vsconfig create mode 100644 Plugins/Unity/project/Assets/BocchiTracker.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Editor.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Editor/BocchiTrackerSetting.cs create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Editor/BocchiTrackerSetting.cs.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/ExternalPackages.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/ExternalPackages/flatbuffers.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/AppBasicInfo.cs create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/AppBasicInfo.cs.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Issue.cs create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Issue.cs.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/IssueesRequest.cs create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/IssueesRequest.cs.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/JumpRequest.cs create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/JumpRequest.cs.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/LogData.cs create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/LogData.cs.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Packet.cs create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Packet.cs.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/PlayerPosition.cs create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/PlayerPosition.cs.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/QueryID.cs create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/QueryID.cs.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotData.cs create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotData.cs.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotRequest.cs create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotRequest.cs.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Vec3.cs create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Vec3.cs.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerLocation.cs create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerLocation.cs.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerLogHook.cs create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerLogHook.cs.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPacket.cs create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPacket.cs.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPlayerPositionUpdater.cs create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPlayerPositionUpdater.cs.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerSystem .cs create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerSystem .cs.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerTcpSocket.cs create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerTcpSocket.cs.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/package.json create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/package.json.meta create mode 100644 Plugins/Unity/project/Assets/Scenes.meta create mode 100644 Plugins/Unity/project/Assets/Scenes/GenUnityPackage.cs create mode 100644 Plugins/Unity/project/Assets/Scenes/GenUnityPackage.cs.meta create mode 100644 Plugins/Unity/project/Assets/Scenes/SampleScene.unity create mode 100644 Plugins/Unity/project/Assets/Scenes/SampleScene.unity.meta create mode 100644 Plugins/Unity/project/Packages/manifest.json create mode 100644 Plugins/Unity/project/Packages/packages-lock.json create mode 100644 Plugins/Unity/project/ProjectSettings/AudioManager.asset create mode 100644 Plugins/Unity/project/ProjectSettings/ClusterInputManager.asset create mode 100644 Plugins/Unity/project/ProjectSettings/DynamicsManager.asset create mode 100644 Plugins/Unity/project/ProjectSettings/EditorBuildSettings.asset create mode 100644 Plugins/Unity/project/ProjectSettings/EditorSettings.asset create mode 100644 Plugins/Unity/project/ProjectSettings/GraphicsSettings.asset create mode 100644 Plugins/Unity/project/ProjectSettings/InputManager.asset create mode 100644 Plugins/Unity/project/ProjectSettings/MemorySettings.asset create mode 100644 Plugins/Unity/project/ProjectSettings/NavMeshAreas.asset create mode 100644 Plugins/Unity/project/ProjectSettings/NetworkManager.asset create mode 100644 Plugins/Unity/project/ProjectSettings/PackageManagerSettings.asset create mode 100644 Plugins/Unity/project/ProjectSettings/Physics2DSettings.asset create mode 100644 Plugins/Unity/project/ProjectSettings/PresetManager.asset create mode 100644 Plugins/Unity/project/ProjectSettings/ProjectSettings.asset create mode 100644 Plugins/Unity/project/ProjectSettings/ProjectVersion.txt create mode 100644 Plugins/Unity/project/ProjectSettings/QualitySettings.asset create mode 100644 Plugins/Unity/project/ProjectSettings/TagManager.asset create mode 100644 Plugins/Unity/project/ProjectSettings/TimeManager.asset create mode 100644 Plugins/Unity/project/ProjectSettings/UnityConnectSettings.asset create mode 100644 Plugins/Unity/project/ProjectSettings/VFXManager.asset create mode 100644 Plugins/Unity/project/ProjectSettings/VersionControlSettings.asset create mode 100644 Plugins/Unity/project/ProjectSettings/XRSettings.asset diff --git a/Plugins/Unity/project/.vsconfig b/Plugins/Unity/project/.vsconfig new file mode 100644 index 0000000..d70cd98 --- /dev/null +++ b/Plugins/Unity/project/.vsconfig @@ -0,0 +1,6 @@ +{ + "version": "1.0", + "components": [ + "Microsoft.VisualStudio.Workload.ManagedGame" + ] +} diff --git a/Plugins/Unity/project/Assets/BocchiTracker.meta b/Plugins/Unity/project/Assets/BocchiTracker.meta new file mode 100644 index 0000000..bc24d37 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c9dad04c2d7f331478491e87c79bd9f5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Editor.meta b/Plugins/Unity/project/Assets/BocchiTracker/Editor.meta new file mode 100644 index 0000000..5dce192 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7cd851046e10973409d68f14345de333 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Editor/BocchiTrackerSetting.cs b/Plugins/Unity/project/Assets/BocchiTracker/Editor/BocchiTrackerSetting.cs new file mode 100644 index 0000000..4487511 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Editor/BocchiTrackerSetting.cs @@ -0,0 +1,24 @@ + +//!< Copyright (c) 2023 Yuto Arita + +using UnityEngine; + +namespace BocchiTracker +{ + public class BocchiTrackerSetting : MonoBehaviour + { + [Header("Settings")] + [SerializeField] + private string serverAddress = ""; + public string ServerAddress => serverAddress; + + [SerializeField] + private int serverPort = 8888; + public int ServerPort => serverPort; + + [SerializeField] + private Camera screenshotCamera = null; + public Camera ScreenshotCamera => screenshotCamera; + + } +} diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Editor/BocchiTrackerSetting.cs.meta b/Plugins/Unity/project/Assets/BocchiTracker/Editor/BocchiTrackerSetting.cs.meta new file mode 100644 index 0000000..78a2eaf --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Editor/BocchiTrackerSetting.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a8288513fdd336441b4c49f0129e33d2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/ExternalPackages.meta b/Plugins/Unity/project/Assets/BocchiTracker/ExternalPackages.meta new file mode 100644 index 0000000..ac9dcb5 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/ExternalPackages.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e79bc251109b2da46ac3ad63b628f777 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/ExternalPackages/flatbuffers.meta b/Plugins/Unity/project/Assets/BocchiTracker/ExternalPackages/flatbuffers.meta new file mode 100644 index 0000000..2fd0e39 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/ExternalPackages/flatbuffers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e9cd3539dee316840b601c562521be57 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime.meta new file mode 100644 index 0000000..157153e --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 350e56b708d94e7449e33da4bc09d2f9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker.meta new file mode 100644 index 0000000..99fa7f5 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5bfb0558f9a55104c97a2a037e4274c0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery.meta new file mode 100644 index 0000000..e1b9a51 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5fcc9a2b4edad284b9f6538c2316d736 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries.meta new file mode 100644 index 0000000..64536a1 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 806570b5f9c41604cb81a70c79136ab6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/AppBasicInfo.cs b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/AppBasicInfo.cs new file mode 100644 index 0000000..3b4ab70 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/AppBasicInfo.cs @@ -0,0 +1,94 @@ +// +// automatically generated by the FlatBuffers compiler, do not modify +// + +namespace BocchiTracker.ProcessLinkQuery.Queries +{ + +using global::System; +using global::System.Collections.Generic; +using global::Google.FlatBuffers; + +public struct AppBasicInfo : IFlatbufferObject +{ + private Table __p; + public ByteBuffer ByteBuffer { get { return __p.bb; } } + public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_23_5_26(); } + public static AppBasicInfo GetRootAsAppBasicInfo(ByteBuffer _bb) { return GetRootAsAppBasicInfo(_bb, new AppBasicInfo()); } + public static AppBasicInfo GetRootAsAppBasicInfo(ByteBuffer _bb, AppBasicInfo obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); } + public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); } + public AppBasicInfo __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } + + public int Pid { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } } + public string AppName { get { int o = __p.__offset(6); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } +#if ENABLE_SPAN_T + public Span GetAppNameBytes() { return __p.__vector_as_span(6, 1); } +#else + public ArraySegment? GetAppNameBytes() { return __p.__vector_as_arraysegment(6); } +#endif + public byte[] GetAppNameArray() { return __p.__vector_as_array(6); } + public string Args { get { int o = __p.__offset(8); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } +#if ENABLE_SPAN_T + public Span GetArgsBytes() { return __p.__vector_as_span(8, 1); } +#else + public ArraySegment? GetArgsBytes() { return __p.__vector_as_arraysegment(8); } +#endif + public byte[] GetArgsArray() { return __p.__vector_as_array(8); } + public string Platform { get { int o = __p.__offset(10); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } +#if ENABLE_SPAN_T + public Span GetPlatformBytes() { return __p.__vector_as_span(10, 1); } +#else + public ArraySegment? GetPlatformBytes() { return __p.__vector_as_arraysegment(10); } +#endif + public byte[] GetPlatformArray() { return __p.__vector_as_array(10); } + public string LogFilepath { get { int o = __p.__offset(12); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } +#if ENABLE_SPAN_T + public Span GetLogFilepathBytes() { return __p.__vector_as_span(12, 1); } +#else + public ArraySegment? GetLogFilepathBytes() { return __p.__vector_as_arraysegment(12); } +#endif + public byte[] GetLogFilepathArray() { return __p.__vector_as_array(12); } + + public static Offset CreateAppBasicInfo(FlatBufferBuilder builder, + int pid = 0, + StringOffset app_nameOffset = default(StringOffset), + StringOffset argsOffset = default(StringOffset), + StringOffset platformOffset = default(StringOffset), + StringOffset log_filepathOffset = default(StringOffset)) { + builder.StartTable(5); + AppBasicInfo.AddLogFilepath(builder, log_filepathOffset); + AppBasicInfo.AddPlatform(builder, platformOffset); + AppBasicInfo.AddArgs(builder, argsOffset); + AppBasicInfo.AddAppName(builder, app_nameOffset); + AppBasicInfo.AddPid(builder, pid); + return AppBasicInfo.EndAppBasicInfo(builder); + } + + public static void StartAppBasicInfo(FlatBufferBuilder builder) { builder.StartTable(5); } + public static void AddPid(FlatBufferBuilder builder, int pid) { builder.AddInt(0, pid, 0); } + public static void AddAppName(FlatBufferBuilder builder, StringOffset appNameOffset) { builder.AddOffset(1, appNameOffset.Value, 0); } + public static void AddArgs(FlatBufferBuilder builder, StringOffset argsOffset) { builder.AddOffset(2, argsOffset.Value, 0); } + public static void AddPlatform(FlatBufferBuilder builder, StringOffset platformOffset) { builder.AddOffset(3, platformOffset.Value, 0); } + public static void AddLogFilepath(FlatBufferBuilder builder, StringOffset logFilepathOffset) { builder.AddOffset(4, logFilepathOffset.Value, 0); } + public static Offset EndAppBasicInfo(FlatBufferBuilder builder) { + int o = builder.EndTable(); + return new Offset(o); + } +} + + +static public class AppBasicInfoVerify +{ + static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos) + { + return verifier.VerifyTableStart(tablePos) + && verifier.VerifyField(tablePos, 4 /*Pid*/, 4 /*int*/, 4, false) + && verifier.VerifyString(tablePos, 6 /*AppName*/, false) + && verifier.VerifyString(tablePos, 8 /*Args*/, false) + && verifier.VerifyString(tablePos, 10 /*Platform*/, false) + && verifier.VerifyString(tablePos, 12 /*LogFilepath*/, false) + && verifier.VerifyTableEnd(tablePos); + } +} + +} diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/AppBasicInfo.cs.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/AppBasicInfo.cs.meta new file mode 100644 index 0000000..902e778 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/AppBasicInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9cad1d212509e164f91e9b61a6849afe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Issue.cs b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Issue.cs new file mode 100644 index 0000000..2859160 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Issue.cs @@ -0,0 +1,88 @@ +// +// automatically generated by the FlatBuffers compiler, do not modify +// + +namespace BocchiTracker.ProcessLinkQuery.Queries +{ + +using global::System; +using global::System.Collections.Generic; +using global::Google.FlatBuffers; + +public struct Issue : IFlatbufferObject +{ + private Table __p; + public ByteBuffer ByteBuffer { get { return __p.bb; } } + public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_23_5_26(); } + public static Issue GetRootAsIssue(ByteBuffer _bb) { return GetRootAsIssue(_bb, new Issue()); } + public static Issue GetRootAsIssue(ByteBuffer _bb, Issue obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); } + public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); } + public Issue __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } + + public string Id { get { int o = __p.__offset(4); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } +#if ENABLE_SPAN_T + public Span GetIdBytes() { return __p.__vector_as_span(4, 1); } +#else + public ArraySegment? GetIdBytes() { return __p.__vector_as_arraysegment(4); } +#endif + public byte[] GetIdArray() { return __p.__vector_as_array(4); } + public string Summary { get { int o = __p.__offset(6); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } +#if ENABLE_SPAN_T + public Span GetSummaryBytes() { return __p.__vector_as_span(6, 1); } +#else + public ArraySegment? GetSummaryBytes() { return __p.__vector_as_arraysegment(6); } +#endif + public byte[] GetSummaryArray() { return __p.__vector_as_array(6); } + public string Assign { get { int o = __p.__offset(8); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } +#if ENABLE_SPAN_T + public Span GetAssignBytes() { return __p.__vector_as_span(8, 1); } +#else + public ArraySegment? GetAssignBytes() { return __p.__vector_as_arraysegment(8); } +#endif + public byte[] GetAssignArray() { return __p.__vector_as_array(8); } + public string Status { get { int o = __p.__offset(10); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } +#if ENABLE_SPAN_T + public Span GetStatusBytes() { return __p.__vector_as_span(10, 1); } +#else + public ArraySegment? GetStatusBytes() { return __p.__vector_as_arraysegment(10); } +#endif + public byte[] GetStatusArray() { return __p.__vector_as_array(10); } + public string Stage { get { int o = __p.__offset(12); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } +#if ENABLE_SPAN_T + public Span GetStageBytes() { return __p.__vector_as_span(12, 1); } +#else + public ArraySegment? GetStageBytes() { return __p.__vector_as_arraysegment(12); } +#endif + public byte[] GetStageArray() { return __p.__vector_as_array(12); } + public BocchiTracker.ProcessLinkQuery.Queries.Vec3? Location { get { int o = __p.__offset(14); return o != 0 ? (BocchiTracker.ProcessLinkQuery.Queries.Vec3?)(new BocchiTracker.ProcessLinkQuery.Queries.Vec3()).__assign(o + __p.bb_pos, __p.bb) : null; } } + + public static void StartIssue(FlatBufferBuilder builder) { builder.StartTable(6); } + public static void AddId(FlatBufferBuilder builder, StringOffset idOffset) { builder.AddOffset(0, idOffset.Value, 0); } + public static void AddSummary(FlatBufferBuilder builder, StringOffset summaryOffset) { builder.AddOffset(1, summaryOffset.Value, 0); } + public static void AddAssign(FlatBufferBuilder builder, StringOffset assignOffset) { builder.AddOffset(2, assignOffset.Value, 0); } + public static void AddStatus(FlatBufferBuilder builder, StringOffset statusOffset) { builder.AddOffset(3, statusOffset.Value, 0); } + public static void AddStage(FlatBufferBuilder builder, StringOffset stageOffset) { builder.AddOffset(4, stageOffset.Value, 0); } + public static void AddLocation(FlatBufferBuilder builder, Offset locationOffset) { builder.AddStruct(5, locationOffset.Value, 0); } + public static Offset EndIssue(FlatBufferBuilder builder) { + int o = builder.EndTable(); + return new Offset(o); + } +} + + +static public class IssueVerify +{ + static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos) + { + return verifier.VerifyTableStart(tablePos) + && verifier.VerifyString(tablePos, 4 /*Id*/, false) + && verifier.VerifyString(tablePos, 6 /*Summary*/, false) + && verifier.VerifyString(tablePos, 8 /*Assign*/, false) + && verifier.VerifyString(tablePos, 10 /*Status*/, false) + && verifier.VerifyString(tablePos, 12 /*Stage*/, false) + && verifier.VerifyField(tablePos, 14 /*Location*/, 12 /*BocchiTracker.ProcessLinkQuery.Queries.Vec3*/, 4, false) + && verifier.VerifyTableEnd(tablePos); + } +} + +} diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Issue.cs.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Issue.cs.meta new file mode 100644 index 0000000..6ac10d6 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Issue.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c5ea1eb37c384fd49bcbbaaca7e34d76 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/IssueesRequest.cs b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/IssueesRequest.cs new file mode 100644 index 0000000..be718ec --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/IssueesRequest.cs @@ -0,0 +1,56 @@ +// +// automatically generated by the FlatBuffers compiler, do not modify +// + +namespace BocchiTracker.ProcessLinkQuery.Queries +{ + +using global::System; +using global::System.Collections.Generic; +using global::Google.FlatBuffers; + +public struct IssueesRequest : IFlatbufferObject +{ + private Table __p; + public ByteBuffer ByteBuffer { get { return __p.bb; } } + public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_23_5_26(); } + public static IssueesRequest GetRootAsIssueesRequest(ByteBuffer _bb) { return GetRootAsIssueesRequest(_bb, new IssueesRequest()); } + public static IssueesRequest GetRootAsIssueesRequest(ByteBuffer _bb, IssueesRequest obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); } + public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); } + public IssueesRequest __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } + + public BocchiTracker.ProcessLinkQuery.Queries.Issue? Issues(int j) { int o = __p.__offset(4); return o != 0 ? (BocchiTracker.ProcessLinkQuery.Queries.Issue?)(new BocchiTracker.ProcessLinkQuery.Queries.Issue()).__assign(__p.__indirect(__p.__vector(o) + j * 4), __p.bb) : null; } + public int IssuesLength { get { int o = __p.__offset(4); return o != 0 ? __p.__vector_len(o) : 0; } } + + public static Offset CreateIssueesRequest(FlatBufferBuilder builder, + VectorOffset issuesOffset = default(VectorOffset)) { + builder.StartTable(1); + IssueesRequest.AddIssues(builder, issuesOffset); + return IssueesRequest.EndIssueesRequest(builder); + } + + public static void StartIssueesRequest(FlatBufferBuilder builder) { builder.StartTable(1); } + public static void AddIssues(FlatBufferBuilder builder, VectorOffset issuesOffset) { builder.AddOffset(0, issuesOffset.Value, 0); } + public static VectorOffset CreateIssuesVector(FlatBufferBuilder builder, Offset[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i].Value); return builder.EndVector(); } + public static VectorOffset CreateIssuesVectorBlock(FlatBufferBuilder builder, Offset[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); } + public static VectorOffset CreateIssuesVectorBlock(FlatBufferBuilder builder, ArraySegment> data) { builder.StartVector(4, data.Count, 4); builder.Add(data); return builder.EndVector(); } + public static VectorOffset CreateIssuesVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add>(dataPtr, sizeInBytes); return builder.EndVector(); } + public static void StartIssuesVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); } + public static Offset EndIssueesRequest(FlatBufferBuilder builder) { + int o = builder.EndTable(); + return new Offset(o); + } +} + + +static public class IssueesRequestVerify +{ + static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos) + { + return verifier.VerifyTableStart(tablePos) + && verifier.VerifyVectorOfTables(tablePos, 4 /*Issues*/, BocchiTracker.ProcessLinkQuery.Queries.IssueVerify.Verify, false) + && verifier.VerifyTableEnd(tablePos); + } +} + +} diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/IssueesRequest.cs.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/IssueesRequest.cs.meta new file mode 100644 index 0000000..569c727 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/IssueesRequest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 384b5d8230b99be488601694ee748151 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/JumpRequest.cs b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/JumpRequest.cs new file mode 100644 index 0000000..e514885 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/JumpRequest.cs @@ -0,0 +1,52 @@ +// +// automatically generated by the FlatBuffers compiler, do not modify +// + +namespace BocchiTracker.ProcessLinkQuery.Queries +{ + +using global::System; +using global::System.Collections.Generic; +using global::Google.FlatBuffers; + +public struct JumpRequest : IFlatbufferObject +{ + private Table __p; + public ByteBuffer ByteBuffer { get { return __p.bb; } } + public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_23_5_26(); } + public static JumpRequest GetRootAsJumpRequest(ByteBuffer _bb) { return GetRootAsJumpRequest(_bb, new JumpRequest()); } + public static JumpRequest GetRootAsJumpRequest(ByteBuffer _bb, JumpRequest obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); } + public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); } + public JumpRequest __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } + + public BocchiTracker.ProcessLinkQuery.Queries.Vec3? Location { get { int o = __p.__offset(4); return o != 0 ? (BocchiTracker.ProcessLinkQuery.Queries.Vec3?)(new BocchiTracker.ProcessLinkQuery.Queries.Vec3()).__assign(o + __p.bb_pos, __p.bb) : null; } } + public string Stage { get { int o = __p.__offset(6); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } +#if ENABLE_SPAN_T + public Span GetStageBytes() { return __p.__vector_as_span(6, 1); } +#else + public ArraySegment? GetStageBytes() { return __p.__vector_as_arraysegment(6); } +#endif + public byte[] GetStageArray() { return __p.__vector_as_array(6); } + + public static void StartJumpRequest(FlatBufferBuilder builder) { builder.StartTable(2); } + public static void AddLocation(FlatBufferBuilder builder, Offset locationOffset) { builder.AddStruct(0, locationOffset.Value, 0); } + public static void AddStage(FlatBufferBuilder builder, StringOffset stageOffset) { builder.AddOffset(1, stageOffset.Value, 0); } + public static Offset EndJumpRequest(FlatBufferBuilder builder) { + int o = builder.EndTable(); + return new Offset(o); + } +} + + +static public class JumpRequestVerify +{ + static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos) + { + return verifier.VerifyTableStart(tablePos) + && verifier.VerifyField(tablePos, 4 /*Location*/, 12 /*BocchiTracker.ProcessLinkQuery.Queries.Vec3*/, 4, false) + && verifier.VerifyString(tablePos, 6 /*Stage*/, false) + && verifier.VerifyTableEnd(tablePos); + } +} + +} diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/JumpRequest.cs.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/JumpRequest.cs.meta new file mode 100644 index 0000000..abd5c74 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/JumpRequest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3865491c4324bfd4daad42f09335d10d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/LogData.cs b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/LogData.cs new file mode 100644 index 0000000..2df4b23 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/LogData.cs @@ -0,0 +1,56 @@ +// +// automatically generated by the FlatBuffers compiler, do not modify +// + +namespace BocchiTracker.ProcessLinkQuery.Queries +{ + +using global::System; +using global::System.Collections.Generic; +using global::Google.FlatBuffers; + +public struct LogData : IFlatbufferObject +{ + private Table __p; + public ByteBuffer ByteBuffer { get { return __p.bb; } } + public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_23_5_26(); } + public static LogData GetRootAsLogData(ByteBuffer _bb) { return GetRootAsLogData(_bb, new LogData()); } + public static LogData GetRootAsLogData(ByteBuffer _bb, LogData obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); } + public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); } + public LogData __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } + + public string Log { get { int o = __p.__offset(4); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } +#if ENABLE_SPAN_T + public Span GetLogBytes() { return __p.__vector_as_span(4, 1); } +#else + public ArraySegment? GetLogBytes() { return __p.__vector_as_arraysegment(4); } +#endif + public byte[] GetLogArray() { return __p.__vector_as_array(4); } + + public static Offset CreateLogData(FlatBufferBuilder builder, + StringOffset logOffset = default(StringOffset)) { + builder.StartTable(1); + LogData.AddLog(builder, logOffset); + return LogData.EndLogData(builder); + } + + public static void StartLogData(FlatBufferBuilder builder) { builder.StartTable(1); } + public static void AddLog(FlatBufferBuilder builder, StringOffset logOffset) { builder.AddOffset(0, logOffset.Value, 0); } + public static Offset EndLogData(FlatBufferBuilder builder) { + int o = builder.EndTable(); + return new Offset(o); + } +} + + +static public class LogDataVerify +{ + static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos) + { + return verifier.VerifyTableStart(tablePos) + && verifier.VerifyString(tablePos, 4 /*Log*/, false) + && verifier.VerifyTableEnd(tablePos); + } +} + +} diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/LogData.cs.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/LogData.cs.meta new file mode 100644 index 0000000..2f0b218 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/LogData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ccd3f32fa359c4a4a962a0d5937a6669 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Packet.cs b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Packet.cs new file mode 100644 index 0000000..0474d2f --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Packet.cs @@ -0,0 +1,65 @@ +// +// automatically generated by the FlatBuffers compiler, do not modify +// + +namespace BocchiTracker.ProcessLinkQuery.Queries +{ + +using global::System; +using global::System.Collections.Generic; +using global::Google.FlatBuffers; + +public struct Packet : IFlatbufferObject +{ + private Table __p; + public ByteBuffer ByteBuffer { get { return __p.bb; } } + public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_23_5_26(); } + public static Packet GetRootAsPacket(ByteBuffer _bb) { return GetRootAsPacket(_bb, new Packet()); } + public static Packet GetRootAsPacket(ByteBuffer _bb, Packet obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); } + public static bool VerifyPacket(ByteBuffer _bb) {Google.FlatBuffers.Verifier verifier = new Google.FlatBuffers.Verifier(_bb); return verifier.VerifyBuffer("", false, PacketVerify.Verify); } + public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); } + public Packet __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } + + public BocchiTracker.ProcessLinkQuery.Queries.QueryID QueryIdType { get { int o = __p.__offset(4); return o != 0 ? (BocchiTracker.ProcessLinkQuery.Queries.QueryID)__p.bb.Get(o + __p.bb_pos) : BocchiTracker.ProcessLinkQuery.Queries.QueryID.NONE; } } + public TTable? QueryId() where TTable : struct, IFlatbufferObject { int o = __p.__offset(6); return o != 0 ? (TTable?)__p.__union(o + __p.bb_pos) : null; } + public BocchiTracker.ProcessLinkQuery.Queries.AppBasicInfo QueryIdAsAppBasicInfo() { return QueryId().Value; } + public BocchiTracker.ProcessLinkQuery.Queries.PlayerPosition QueryIdAsPlayerPosition() { return QueryId().Value; } + public BocchiTracker.ProcessLinkQuery.Queries.ScreenshotData QueryIdAsScreenshotData() { return QueryId().Value; } + public BocchiTracker.ProcessLinkQuery.Queries.LogData QueryIdAsLogData() { return QueryId().Value; } + public BocchiTracker.ProcessLinkQuery.Queries.ScreenshotRequest QueryIdAsScreenshotRequest() { return QueryId().Value; } + public BocchiTracker.ProcessLinkQuery.Queries.JumpRequest QueryIdAsJumpRequest() { return QueryId().Value; } + public BocchiTracker.ProcessLinkQuery.Queries.IssueesRequest QueryIdAsIssueesRequest() { return QueryId().Value; } + + public static Offset CreatePacket(FlatBufferBuilder builder, + BocchiTracker.ProcessLinkQuery.Queries.QueryID query_id_type = BocchiTracker.ProcessLinkQuery.Queries.QueryID.NONE, + int query_idOffset = 0) { + builder.StartTable(2); + Packet.AddQueryId(builder, query_idOffset); + Packet.AddQueryIdType(builder, query_id_type); + return Packet.EndPacket(builder); + } + + public static void StartPacket(FlatBufferBuilder builder) { builder.StartTable(2); } + public static void AddQueryIdType(FlatBufferBuilder builder, BocchiTracker.ProcessLinkQuery.Queries.QueryID queryIdType) { builder.AddByte(0, (byte)queryIdType, 0); } + public static void AddQueryId(FlatBufferBuilder builder, int queryIdOffset) { builder.AddOffset(1, queryIdOffset, 0); } + public static Offset EndPacket(FlatBufferBuilder builder) { + int o = builder.EndTable(); + return new Offset(o); + } + public static void FinishPacketBuffer(FlatBufferBuilder builder, Offset offset) { builder.Finish(offset.Value); } + public static void FinishSizePrefixedPacketBuffer(FlatBufferBuilder builder, Offset offset) { builder.FinishSizePrefixed(offset.Value); } +} + + +static public class PacketVerify +{ + static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos) + { + return verifier.VerifyTableStart(tablePos) + && verifier.VerifyField(tablePos, 4 /*QueryIdType*/, 1 /*BocchiTracker.ProcessLinkQuery.Queries.QueryID*/, 1, false) +// && verifier.VerifyUnion(tablePos, 4, 6 /*QueryId*/, BocchiTracker.ProcessLinkQuery.Queries.QueryIDVerify.Verify, false) + && verifier.VerifyTableEnd(tablePos); + } +} + +} diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Packet.cs.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Packet.cs.meta new file mode 100644 index 0000000..b368a1f --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Packet.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 192f3fd3e9fd5f344a23dd34067d36e4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/PlayerPosition.cs b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/PlayerPosition.cs new file mode 100644 index 0000000..36b0b05 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/PlayerPosition.cs @@ -0,0 +1,71 @@ +// +// automatically generated by the FlatBuffers compiler, do not modify +// + +namespace BocchiTracker.ProcessLinkQuery.Queries +{ + +using global::System; +using global::System.Collections.Generic; +using global::Google.FlatBuffers; + +public struct PlayerPosition : IFlatbufferObject +{ + private Table __p; + public ByteBuffer ByteBuffer { get { return __p.bb; } } + public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_23_5_26(); } + public static PlayerPosition GetRootAsPlayerPosition(ByteBuffer _bb) { return GetRootAsPlayerPosition(_bb, new PlayerPosition()); } + public static PlayerPosition GetRootAsPlayerPosition(ByteBuffer _bb, PlayerPosition obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); } + public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); } + public PlayerPosition __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } + + public float X { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)0.0f; } } + public float Y { get { int o = __p.__offset(6); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)0.0f; } } + public float Z { get { int o = __p.__offset(8); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)0.0f; } } + public string Stage { get { int o = __p.__offset(10); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } +#if ENABLE_SPAN_T + public Span GetStageBytes() { return __p.__vector_as_span(10, 1); } +#else + public ArraySegment? GetStageBytes() { return __p.__vector_as_arraysegment(10); } +#endif + public byte[] GetStageArray() { return __p.__vector_as_array(10); } + + public static Offset CreatePlayerPosition(FlatBufferBuilder builder, + float x = 0.0f, + float y = 0.0f, + float z = 0.0f, + StringOffset stageOffset = default(StringOffset)) { + builder.StartTable(4); + PlayerPosition.AddStage(builder, stageOffset); + PlayerPosition.AddZ(builder, z); + PlayerPosition.AddY(builder, y); + PlayerPosition.AddX(builder, x); + return PlayerPosition.EndPlayerPosition(builder); + } + + public static void StartPlayerPosition(FlatBufferBuilder builder) { builder.StartTable(4); } + public static void AddX(FlatBufferBuilder builder, float x) { builder.AddFloat(0, x, 0.0f); } + public static void AddY(FlatBufferBuilder builder, float y) { builder.AddFloat(1, y, 0.0f); } + public static void AddZ(FlatBufferBuilder builder, float z) { builder.AddFloat(2, z, 0.0f); } + public static void AddStage(FlatBufferBuilder builder, StringOffset stageOffset) { builder.AddOffset(3, stageOffset.Value, 0); } + public static Offset EndPlayerPosition(FlatBufferBuilder builder) { + int o = builder.EndTable(); + return new Offset(o); + } +} + + +static public class PlayerPositionVerify +{ + static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos) + { + return verifier.VerifyTableStart(tablePos) + && verifier.VerifyField(tablePos, 4 /*X*/, 4 /*float*/, 4, false) + && verifier.VerifyField(tablePos, 6 /*Y*/, 4 /*float*/, 4, false) + && verifier.VerifyField(tablePos, 8 /*Z*/, 4 /*float*/, 4, false) + && verifier.VerifyString(tablePos, 10 /*Stage*/, false) + && verifier.VerifyTableEnd(tablePos); + } +} + +} diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/PlayerPosition.cs.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/PlayerPosition.cs.meta new file mode 100644 index 0000000..0738ed5 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/PlayerPosition.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8442d7cd605da1543952570d4647c2d6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/QueryID.cs b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/QueryID.cs new file mode 100644 index 0000000..79b07df --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/QueryID.cs @@ -0,0 +1,21 @@ +// +// automatically generated by the FlatBuffers compiler, do not modify +// + +namespace BocchiTracker.ProcessLinkQuery.Queries +{ + +public enum QueryID : byte +{ + NONE = 0, + AppBasicInfo = 1, + PlayerPosition = 2, + ScreenshotData = 3, + LogData = 4, + ScreenshotRequest = 5, + JumpRequest = 6, + IssueesRequest = 7, +}; + + +} diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/QueryID.cs.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/QueryID.cs.meta new file mode 100644 index 0000000..93c2196 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/QueryID.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 412c077f08b6fb64d9fa0a91a292421d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotData.cs b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotData.cs new file mode 100644 index 0000000..628ce04 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotData.cs @@ -0,0 +1,72 @@ +// +// automatically generated by the FlatBuffers compiler, do not modify +// + +namespace BocchiTracker.ProcessLinkQuery.Queries +{ + +using global::System; +using global::System.Collections.Generic; +using global::Google.FlatBuffers; + +public struct ScreenshotData : IFlatbufferObject +{ + private Table __p; + public ByteBuffer ByteBuffer { get { return __p.bb; } } + public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_23_5_26(); } + public static ScreenshotData GetRootAsScreenshotData(ByteBuffer _bb) { return GetRootAsScreenshotData(_bb, new ScreenshotData()); } + public static ScreenshotData GetRootAsScreenshotData(ByteBuffer _bb, ScreenshotData obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); } + public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); } + public ScreenshotData __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } + + public int Width { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } } + public int Height { get { int o = __p.__offset(6); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } } + public byte Data(int j) { int o = __p.__offset(8); return o != 0 ? __p.bb.Get(__p.__vector(o) + j * 1) : (byte)0; } + public int DataLength { get { int o = __p.__offset(8); return o != 0 ? __p.__vector_len(o) : 0; } } +#if ENABLE_SPAN_T + public Span GetDataBytes() { return __p.__vector_as_span(8, 1); } +#else + public ArraySegment? GetDataBytes() { return __p.__vector_as_arraysegment(8); } +#endif + public byte[] GetDataArray() { return __p.__vector_as_array(8); } + + public static Offset CreateScreenshotData(FlatBufferBuilder builder, + int width = 0, + int height = 0, + VectorOffset dataOffset = default(VectorOffset)) { + builder.StartTable(3); + ScreenshotData.AddData(builder, dataOffset); + ScreenshotData.AddHeight(builder, height); + ScreenshotData.AddWidth(builder, width); + return ScreenshotData.EndScreenshotData(builder); + } + + public static void StartScreenshotData(FlatBufferBuilder builder) { builder.StartTable(3); } + public static void AddWidth(FlatBufferBuilder builder, int width) { builder.AddInt(0, width, 0); } + public static void AddHeight(FlatBufferBuilder builder, int height) { builder.AddInt(1, height, 0); } + public static void AddData(FlatBufferBuilder builder, VectorOffset dataOffset) { builder.AddOffset(2, dataOffset.Value, 0); } + public static VectorOffset CreateDataVector(FlatBufferBuilder builder, byte[] data) { builder.StartVector(1, data.Length, 1); for (int i = data.Length - 1; i >= 0; i--) builder.AddByte(data[i]); return builder.EndVector(); } + public static VectorOffset CreateDataVectorBlock(FlatBufferBuilder builder, byte[] data) { builder.StartVector(1, data.Length, 1); builder.Add(data); return builder.EndVector(); } + public static VectorOffset CreateDataVectorBlock(FlatBufferBuilder builder, ArraySegment data) { builder.StartVector(1, data.Count, 1); builder.Add(data); return builder.EndVector(); } + public static VectorOffset CreateDataVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add(dataPtr, sizeInBytes); return builder.EndVector(); } + public static void StartDataVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(1, numElems, 1); } + public static Offset EndScreenshotData(FlatBufferBuilder builder) { + int o = builder.EndTable(); + return new Offset(o); + } +} + + +static public class ScreenshotDataVerify +{ + static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos) + { + return verifier.VerifyTableStart(tablePos) + && verifier.VerifyField(tablePos, 4 /*Width*/, 4 /*int*/, 4, false) + && verifier.VerifyField(tablePos, 6 /*Height*/, 4 /*int*/, 4, false) + && verifier.VerifyVectorOfData(tablePos, 8 /*Data*/, 1 /*byte*/, false) + && verifier.VerifyTableEnd(tablePos); + } +} + +} diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotData.cs.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotData.cs.meta new file mode 100644 index 0000000..6759c0f --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e0a61fe3386b49a41929e16783391299 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotRequest.cs b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotRequest.cs new file mode 100644 index 0000000..c7219d7 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotRequest.cs @@ -0,0 +1,40 @@ +// +// automatically generated by the FlatBuffers compiler, do not modify +// + +namespace BocchiTracker.ProcessLinkQuery.Queries +{ + +using global::System; +using global::System.Collections.Generic; +using global::Google.FlatBuffers; + +public struct ScreenshotRequest : IFlatbufferObject +{ + private Table __p; + public ByteBuffer ByteBuffer { get { return __p.bb; } } + public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_23_5_26(); } + public static ScreenshotRequest GetRootAsScreenshotRequest(ByteBuffer _bb) { return GetRootAsScreenshotRequest(_bb, new ScreenshotRequest()); } + public static ScreenshotRequest GetRootAsScreenshotRequest(ByteBuffer _bb, ScreenshotRequest obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); } + public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); } + public ScreenshotRequest __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } + + + public static void StartScreenshotRequest(FlatBufferBuilder builder) { builder.StartTable(0); } + public static Offset EndScreenshotRequest(FlatBufferBuilder builder) { + int o = builder.EndTable(); + return new Offset(o); + } +} + + +static public class ScreenshotRequestVerify +{ + static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos) + { + return verifier.VerifyTableStart(tablePos) + && verifier.VerifyTableEnd(tablePos); + } +} + +} diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotRequest.cs.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotRequest.cs.meta new file mode 100644 index 0000000..001488c --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotRequest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7788fb6ab399ae8448a1d6399a013125 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Vec3.cs b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Vec3.cs new file mode 100644 index 0000000..86d0a82 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Vec3.cs @@ -0,0 +1,33 @@ +// +// automatically generated by the FlatBuffers compiler, do not modify +// + +namespace BocchiTracker.ProcessLinkQuery.Queries +{ + +using global::System; +using global::System.Collections.Generic; +using global::Google.FlatBuffers; + +public struct Vec3 : IFlatbufferObject +{ + private Struct __p; + public ByteBuffer ByteBuffer { get { return __p.bb; } } + public void __init(int _i, ByteBuffer _bb) { __p = new Struct(_i, _bb); } + public Vec3 __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } + + public float X { get { return __p.bb.GetFloat(__p.bb_pos + 0); } } + public float Y { get { return __p.bb.GetFloat(__p.bb_pos + 4); } } + public float Z { get { return __p.bb.GetFloat(__p.bb_pos + 8); } } + + public static Offset CreateVec3(FlatBufferBuilder builder, float X, float Y, float Z) { + builder.Prep(4, 12); + builder.PutFloat(Z); + builder.PutFloat(Y); + builder.PutFloat(X); + return new Offset(builder.Offset); + } +} + + +} diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Vec3.cs.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Vec3.cs.meta new file mode 100644 index 0000000..d477394 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTracker/ProcessLinkQuery/Queries/Vec3.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9fd1d399279a1374884597ba6eb4be8f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerLocation.cs b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerLocation.cs new file mode 100644 index 0000000..decf93f --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerLocation.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; +using UnityEngine; + +namespace BocchiTracker +{ + public class BocchiTrackerLocation + { + public Vector3 Location { get; set; } + + public string Stage { get; set; } + } +} diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerLocation.cs.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerLocation.cs.meta new file mode 100644 index 0000000..076041c --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerLocation.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d10280835293c40499eab38e098168c2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerLogHook.cs b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerLogHook.cs new file mode 100644 index 0000000..ec8fdd8 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerLogHook.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using UnityEngine; + +namespace BocchiTracker +{ + public class BocchiTrackerLogHook : IDisposable + { + private readonly int LOG_MAX_BUFFER = 2048; + private int bufferID = 0; + private List logBuffer; + + public BocchiTrackerLogHook() + { + Application.logMessageReceived += OnRecived; + this.logBuffer = new List { "", "" }; + } + + private void OnRecived(string logText, string stackTrace, LogType type) + { + this.logBuffer[bufferID] += logText + "\n"; + } + + public bool GetLogBuffer(out string outMessages) + { + //!< 閾値を超えた + outMessages = null; + if (this.logBuffer[bufferID].Length > LOG_MAX_BUFFER) + { + outMessages = this.logBuffer[bufferID]; + int previous_id = bufferID; + Interlocked.Exchange(ref bufferID, (bufferID + 1) % 2); + this.logBuffer[previous_id] = ""; + return true; + } + return false; + } + + public void Dispose() + { + Application.logMessageReceived -= OnRecived; + } + } +} diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerLogHook.cs.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerLogHook.cs.meta new file mode 100644 index 0000000..ca82af1 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerLogHook.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0cae051cb098adf4a87344595500c6fb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPacket.cs b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPacket.cs new file mode 100644 index 0000000..e86bf1e --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPacket.cs @@ -0,0 +1,142 @@ + +//!< Copyright (c) 2023 Yuto Arita + +using System.Collections.Generic; +using UnityEngine; +using BocchiTracker.ProcessLinkQuery.Queries; +using System.Xml.Linq; +using Google.FlatBuffers; + +namespace BocchiTracker +{ + /// + /// Helper class for creating various data packets using FlatBuffers. + /// + public static class CreatePacketHelper + { + /// + /// Creates a data packet for player position information. + /// + /// The player's position vector. + /// The current stage or environment identifier. + /// The created data packet. + public static List CreatePlayerPosition(Vector3 inPlayerPosition, string inStage) + { + var builder = new Google.FlatBuffers.FlatBufferBuilder(1024); + + // Create PlayerPosition object + var stage = builder.CreateString(inStage); + var playerPosition = PlayerPosition.CreatePlayerPosition(builder, inPlayerPosition.x, inPlayerPosition.y, inPlayerPosition.z, stage); + + // Create Packet object + var packet = Packet.CreatePacket(builder, QueryID.PlayerPosition, playerPosition.Value); + + builder.Finish(packet.Value); + + // Convert FlatBuffers data to byte array + byte[] packetData = builder.SizedByteArray(); + + // Prepend packet size + int packetSize = packetData.Length; + List finalPacketData = new List(); + finalPacketData.AddRange(System.BitConverter.GetBytes(packetSize)); + finalPacketData.AddRange(packetData); + + return finalPacketData; + } + + /// + /// Creates a data packet for application basic information. + /// + /// The created data packet. + public static List CreateApplicationBasicInformation() + { + int pid = System.Diagnostics.Process.GetCurrentProcess().Id; + string appName = Application.productName; + string args = System.Environment.CommandLine; + string platform = Application.platform.ToString(); + + var builder = new Google.FlatBuffers.FlatBufferBuilder(1024); + + // Create AppBasicInfo object + var appNameOffset = builder.CreateString(appName); + var argsOffset = builder.CreateString(args); + var platformOffset = builder.CreateString(platform); + + var appBasicInfo = AppBasicInfo.CreateAppBasicInfo(builder, pid, appNameOffset, argsOffset, platformOffset); + + // Create Packet object + var packet = Packet.CreatePacket(builder, QueryID.AppBasicInfo, appBasicInfo.Value); + + builder.Finish(packet.Value); + + // Convert FlatBuffers data to byte array + byte[] packetData = builder.SizedByteArray(); + + // Prepend packet size + int packetSize = packetData.Length; + List finalPacketData = new List(); + finalPacketData.AddRange(System.BitConverter.GetBytes(packetSize)); + finalPacketData.AddRange(packetData); + + return finalPacketData; + } + + /// + /// Creates a data packet for screenshot information. + /// + /// The width of the screenshot image. + /// The height of the screenshot image. + /// The raw data of the screenshot image. + /// The created data packet. + public static List CreateScreenshotData(int inWidth, int inHeight, byte[] inData) + { + var builder = new Google.FlatBuffers.FlatBufferBuilder(1024); + + // Create ScreenshotData object + var dataOffset = ScreenshotData.CreateDataVector(builder, inData); + var screenshotData = ScreenshotData.CreateScreenshotData(builder, inWidth, inHeight, dataOffset); + + // Create Packet object + var packet = Packet.CreatePacket(builder, QueryID.ScreenshotData, screenshotData.Value); + + builder.Finish(packet.Value); + + // Convert FlatBuffers data to byte array + byte[] packetData = builder.SizedByteArray(); + + // Prepend packet size + int packetSize = packetData.Length; + List finalPacketData = new List(); + finalPacketData.AddRange(System.BitConverter.GetBytes(packetSize)); + finalPacketData.AddRange(packetData); + + return finalPacketData; + } + + public static List CreateLogData(string inLog) + { + var builder = new Google.FlatBuffers.FlatBufferBuilder(1024); + + // Create ScreenshotData object + var dataOffset = builder.CreateString(inLog); + var logdata = LogData.CreateLogData(builder, dataOffset); + + // Create Packet object + var packet = Packet.CreatePacket(builder, QueryID.LogData, logdata.Value); + + builder.Finish(packet.Value); + + // Convert FlatBuffers data to byte array + byte[] packetData = builder.SizedByteArray(); + + // Prepend packet size + int packetSize = packetData.Length; + List finalPacketData = new List(); + finalPacketData.AddRange(System.BitConverter.GetBytes(packetSize)); + finalPacketData.AddRange(packetData); + + return finalPacketData; + } + } +} \ No newline at end of file diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPacket.cs.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPacket.cs.meta new file mode 100644 index 0000000..cd53e80 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPacket.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3d94cdddc57c7f5449f92a9fc550f1f3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPlayerPositionUpdater.cs b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPlayerPositionUpdater.cs new file mode 100644 index 0000000..af3521c --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPlayerPositionUpdater.cs @@ -0,0 +1,61 @@ + +//!< Copyright (c) 2023 Yuto Arita + +using UnityEngine; + +namespace BocchiTracker +{ + /// + /// Monitors the player's position and sends updates to the BocchiTrackerSystem if the player's movement distance exceeds a certain threshold. + /// + public class BocchiTrackerPlayerPositionUpdater : MonoBehaviour + { + [Header("Settings")] + [SerializeField] + private float distanceThreshold = 100.0f; // Minimum distance to trigger a position update + public float DistanceThreshold => distanceThreshold; + + [SerializeField] + private string stage = ""; + public string Stage => stage; + + private BocchiTrackerSystem system; + private Vector3 previousPosition; + + void Start() + { + // Find the BocchiTrackerSystem instance in the scene + system = FindObjectOfType(); + } + + void Update() + { + if (system == null) + return; + + if (!system.IsConnect()) + return; + + Vector3 currentPosition = transform.position; + + // Calculate the distance between the current position and the previous position + float distance = Vector3.Distance(currentPosition, previousPosition); + + // Check if the movement distance exceeds the threshold + if (distance >= DistanceThreshold) + { + // Create a player position packet and send it to the BocchiTrackerSystem + var playerPositionPacket = CreatePacketHelper.CreatePlayerPosition(currentPosition, Stage); + system.BocchiTrackerSendPacket(playerPositionPacket); + + // Update the previous position to the current position + previousPosition = currentPosition; + } + + if (system.JumpRequest.TryDequeue(out var request)) + { + transform.position = request.Location; + } + } + } +} diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPlayerPositionUpdater.cs.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPlayerPositionUpdater.cs.meta new file mode 100644 index 0000000..83ffe5d --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPlayerPositionUpdater.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0533936b3531aba4e8ed4b9ee28c1e28 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerSystem .cs b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerSystem .cs new file mode 100644 index 0000000..ea314df --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerSystem .cs @@ -0,0 +1,216 @@ + +//!< Copyright (c) 2023 Yuto Arita + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using Google.FlatBuffers; +using static UnityEngine.Application; + +namespace BocchiTracker +{ + /// + /// Manages communication with the BocchiTracker server and handles data packets. + /// + public class BocchiTrackerSystem : MonoBehaviour + { + public Queue JumpRequest { get; set; } = new Queue(); + + private static BocchiTrackerTcpSocket tcpSocket; + private BocchiTrackerSetting setting; + private BocchiTrackerLogHook logHook; + private bool isSentAppBasicInfo; + private Queue pendingProcessRequest = new Queue(); + + public BocchiTrackerSystem() + { + if (tcpSocket == null) + tcpSocket = new BocchiTrackerTcpSocket(); + + } + + private void Awake() + { + if (logHook == null) + logHook = new BocchiTrackerLogHook(); + } + + private async void Start() + { + setting = GetComponent(); + if (!IsConnect()) + { + isSentAppBasicInfo = false; + await tcpSocket.Connect(setting.ServerAddress, setting.ServerPort); + } + tcpSocket.ReciveCallback = this.OnReceiveData; + } + + private void OnDestroy() + { + tcpSocket.DisConnect(); + } + + private async void Update() + { + if (IsConnect()) + { + if (!isSentAppBasicInfo) + ProcessSendAppBasicInfo(); + + ProcessSendLogMessage(); + + await tcpSocket.Update(); + } + } + + private void LateUpdate() + { + if (IsConnect()) + { + if (pendingProcessRequest.TryDequeue(out object outQuery)) + { + if(outQuery is ProcessLinkQuery.Queries.IssueesRequest) + { + var request = (ProcessLinkQuery.Queries.IssueesRequest)outQuery; + for(int i = 0; i < request.IssuesLength; ++i) + { + var issue = request.Issues(i); + if (issue == null) + continue; + CacheIssueInfo(issue.Value); + } + } + else if(outQuery is ProcessLinkQuery.Queries.JumpRequest) + { + var request = (ProcessLinkQuery.Queries.JumpRequest)outQuery; + var stage = request.Stage; + var location = request.Location; + if (location == null) + return; + JumpLocation(stage, location.Value.X, location.Value.Y, location.Value.Z); + } + else if(outQuery is ProcessLinkQuery.Queries.ScreenshotRequest) + { + StartCoroutine(ProcessSendScreenshot()); + } + } + } + } + + public bool IsConnect() + { + return tcpSocket.IsConnect(); + } + + private void OnReceiveData(List inData) + { + ProcessLinkQuery.Queries.Packet packet = ProcessLinkQuery.Queries.Packet.GetRootAsPacket(new ByteBuffer(inData.ToArray())); + ProcessLinkQuery.Queries.QueryID queryID = packet.QueryIdType; + + switch (queryID) + { + case ProcessLinkQuery.Queries.QueryID.ScreenshotRequest: + pendingProcessRequest.Enqueue(packet.QueryIdAsScreenshotRequest()); break; + + case ProcessLinkQuery.Queries.QueryID.IssueesRequest: + pendingProcessRequest.Enqueue(packet.QueryIdAsIssueesRequest()); break; + + case ProcessLinkQuery.Queries.QueryID.JumpRequest: + pendingProcessRequest.Enqueue(packet.QueryIdAsJumpRequest()); break; + + default: + break; + } + } + + /// + /// Sends a data packet to the BocchiTracker server. + /// + /// The data packet to send. + public void BocchiTrackerSendPacket(List inData) + { + tcpSocket.AddSendData(inData); + } + + private void ProcessSendLogMessage() + { + string message; + if(logHook.GetLogBuffer(out message)) + { + var logDataPacket = CreatePacketHelper.CreateLogData(message); + BocchiTrackerSendPacket(logDataPacket); + } + } + + private void ProcessSendAppBasicInfo() + { + var appBasicInformationPacket = CreatePacketHelper.CreateApplicationBasicInformation(); + BocchiTrackerSendPacket(appBasicInformationPacket); + + isSentAppBasicInfo = true; + } + + private void CacheIssueInfo(ProcessLinkQuery.Queries.Issue inIssue) + { + + } + + private void JumpLocation(string inStage, float inX, float inY, float inZ) + { + if (JumpRequest.Count == 0) + JumpRequest.Enqueue(new BocchiTrackerLocation { Stage = inStage, Location = new Vector3(inX, inY, inZ) }); + } + + private IEnumerator ProcessSendScreenshot() + { + if (!IsConnect()) + yield break; + + yield return new WaitForEndOfFrame(); + + int screenWidth = Screen.width; + int screenHeight = Screen.height; + + // Capture the screenshot + RenderTexture rt = new RenderTexture(screenWidth, screenHeight, 32); + RenderTexture prev_rt = setting.ScreenshotCamera.targetTexture; + Quaternion prev_rot = setting.ScreenshotCamera.transform.rotation; + Texture2D screenShot = new Texture2D(screenWidth, screenHeight, TextureFormat.RGBA32, false); + + // Configure camera for screenshot + setting.ScreenshotCamera.targetTexture = rt; + setting.ScreenshotCamera.Render(); + setting.ScreenshotCamera.targetTexture = prev_rt; + + // Read and apply the screenshot data + RenderTexture.active = rt; + screenShot.ReadPixels(new Rect(0, 0, screenWidth, screenHeight), 0, 0); + screenShot.Apply(); + RenderTexture.active = null; + + Destroy(rt); + byte[] screenshotData = screenShot.GetRawTextureData(); + byte[] newTextureRawData = new byte[screenshotData.Length]; + + // Repack the screenshot data + for (int y = 0; y < screenHeight; y++) + { + for (int x = 0; x < screenWidth; x++) + { + int srcIndex = (screenHeight - y - 1) * screenWidth * 4 + x * 4; + int destIndex = y * screenWidth * 4 + x * 4; + + newTextureRawData[destIndex] = screenshotData[srcIndex]; + newTextureRawData[destIndex + 1] = screenshotData[srcIndex + 1]; + newTextureRawData[destIndex + 2] = screenshotData[srcIndex + 2]; + newTextureRawData[destIndex + 3] = screenshotData[srcIndex + 3]; + } + } + + // Create a screenshot data packet and send it + var screenshotDataPacket = CreatePacketHelper.CreateScreenshotData(screenWidth, screenHeight, newTextureRawData); + BocchiTrackerSendPacket(screenshotDataPacket); + } + } +} \ No newline at end of file diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerSystem .cs.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerSystem .cs.meta new file mode 100644 index 0000000..90eccf7 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerSystem .cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 76bbb54e572cbe347aa280de5de39ae7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerTcpSocket.cs b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerTcpSocket.cs new file mode 100644 index 0000000..2c5300a --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerTcpSocket.cs @@ -0,0 +1,121 @@ + +//!< Copyright (c) 2023 Yuto Arita + +using System; +using System.Threading.Tasks; +using System.Collections.Generic; +using System.Net.Sockets; +using System.Net; +using UnityEngine; + +namespace BocchiTracker +{ + /// + /// Manages TCP socket communication for the BocchiTracker system. + /// + public class BocchiTrackerTcpSocket + { + public Action> ReciveCallback { private get; set; } // Callback to handle received data + + private Socket socket; // The TCP socket + private Queue> sendDataQueue = new Queue>(); // Queue for outgoing data + + public BocchiTrackerTcpSocket() + { + socket = new Socket(SocketType.Stream, ProtocolType.Tcp); + socket.Blocking = false; // Set socket to non-blocking mode + } + + /// + /// Initiates a connection to the specified IP address and port. + /// + /// The IP address to connect to. + /// The port number to connect to. + public async Task Connect(string inIPAddress, int inPort) + { + if (IPAddress.TryParse(inIPAddress, out IPAddress ipAddress)) + { + while (!IsConnect()) + { + try + { + await socket.ConnectAsync(ipAddress, inPort); + Debug.Log("Connected to server."); + } + catch { } + } + } + } + + /// + /// Disconnects the socket. + /// + public void DisConnect() + { + if(IsConnect()) + socket.Disconnect(true); + } + + /// + /// Updates the socket, processing send and receive operations. + /// + public async Task Update() + { + if (sendDataQueue.TryDequeue(out List data)) + { + await ProcessSendData(data); + } + await ProcessReceiveData(); + } + + /// + /// Adds data to the send queue for transmission. + /// + /// The data to be sent. + public void AddSendData(List inData) + { + sendDataQueue.Enqueue(inData); + } + + private async Task ProcessSendData(List inData) + { + if (!IsConnect()) + return; + + int bytesSent = await socket.SendAsync(inData.ToArray(), SocketFlags.None); + if (bytesSent > 0) + { + Console.WriteLine("Data sent successfully: " + bytesSent + " bytes"); + } + else + { + Console.WriteLine("Failed to send data."); + } + } + + private async Task ProcessReceiveData() + { + if (!IsConnect()) + return; + + byte[] receivedData = new byte[1024]; + int bytesRead = await socket.ReceiveAsync(receivedData, SocketFlags.None); + if (bytesRead > 0) + { + Console.WriteLine("ProcessReceiveData::Success, size=" + bytesRead); + List receivedDataList = new List(receivedData); + receivedDataList.RemoveRange(bytesRead, receivedData.Length - bytesRead); + ReciveCallback?.Invoke(receivedDataList); + } + } + + /// + /// Checks if the socket is currently connected. + /// + /// True if the socket is connected, otherwise false. + public bool IsConnect() + { + return socket != null && socket.Connected; + } + } +} \ No newline at end of file diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerTcpSocket.cs.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerTcpSocket.cs.meta new file mode 100644 index 0000000..9477ec2 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerTcpSocket.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 84db15083edfd6a4ca36ccaccaef6453 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/package.json b/Plugins/Unity/project/Assets/BocchiTracker/package.json new file mode 100644 index 0000000..44cbee0 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/package.json @@ -0,0 +1,25 @@ +{ + "name": "com.kirisamemarisa.bocchitracker", + "version": "1.0.0", + "displayName": "BocchiTracker", + "description": "BocchiTracker is a bug reporting tool that allows you to report issues to various services.", + "unity": "2022.3", + "unityRelease": "6f1", + "documentationUrl": "https://github.com/KirisameMarisa/BocchiTracker/tree/master/Documents", + "changelogUrl": "", + "licensesUrl": "https://github.com/KirisameMarisa/BocchiTracker/blob/master/LICENCE.txt", + "dependencies": { + + }, + "keywords": [ + "bocchi", + "tracker", + "bug", + "issue", + "report" + ], + "author": { + "name": "YutoArita", + "url": "https://github.com/KirisameMarisa/BocchiTracker" + } +} \ No newline at end of file diff --git a/Plugins/Unity/project/Assets/BocchiTracker/package.json.meta b/Plugins/Unity/project/Assets/BocchiTracker/package.json.meta new file mode 100644 index 0000000..bc17828 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 18d35ef9ae071d54dbc19e51eeb0b69c +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/Scenes.meta b/Plugins/Unity/project/Assets/Scenes.meta new file mode 100644 index 0000000..ee07f11 --- /dev/null +++ b/Plugins/Unity/project/Assets/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a1c5b0d850dc7f349984dd23a55a5435 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/Scenes/GenUnityPackage.cs b/Plugins/Unity/project/Assets/Scenes/GenUnityPackage.cs new file mode 100644 index 0000000..a31af81 --- /dev/null +++ b/Plugins/Unity/project/Assets/Scenes/GenUnityPackage.cs @@ -0,0 +1,14 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class GenUnityPackage +{ + public static void Export () { + var dir = new FileInfo(exportPath).Directory; + if (dir != null && !dir.Exists) { + dir.Create(); + } + AssetDatabase.ExportPackage("../../Artifact", "BocchiTracker/BocchiTracker.unitypackage", ExportPackageOptions.Recurse); + } +} diff --git a/Plugins/Unity/project/Assets/Scenes/GenUnityPackage.cs.meta b/Plugins/Unity/project/Assets/Scenes/GenUnityPackage.cs.meta new file mode 100644 index 0000000..58924d6 --- /dev/null +++ b/Plugins/Unity/project/Assets/Scenes/GenUnityPackage.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6a840c4e22f323b48a1c30b93b905244 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/Scenes/SampleScene.unity b/Plugins/Unity/project/Assets/Scenes/SampleScene.unity new file mode 100644 index 0000000..9421266 --- /dev/null +++ b/Plugins/Unity/project/Assets/Scenes/SampleScene.unity @@ -0,0 +1,208 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &519420028 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 519420032} + - component: {fileID: 519420031} + - component: {fileID: 519420029} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &519420029 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519420028} + m_Enabled: 1 +--- !u!20 &519420031 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519420028} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 1 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 0 + m_HDR: 1 + m_AllowMSAA: 0 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 0 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &519420032 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519420028} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Plugins/Unity/project/Assets/Scenes/SampleScene.unity.meta b/Plugins/Unity/project/Assets/Scenes/SampleScene.unity.meta new file mode 100644 index 0000000..c1e3c88 --- /dev/null +++ b/Plugins/Unity/project/Assets/Scenes/SampleScene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2cda990e2423bbf4892e6590ba056729 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Packages/manifest.json b/Plugins/Unity/project/Packages/manifest.json new file mode 100644 index 0000000..530e2e5 --- /dev/null +++ b/Plugins/Unity/project/Packages/manifest.json @@ -0,0 +1,44 @@ +{ + "dependencies": { + "com.unity.collab-proxy": "2.0.5", + "com.unity.feature.2d": "2.0.0", + "com.unity.ide.rider": "3.0.24", + "com.unity.ide.visualstudio": "2.0.18", + "com.unity.test-framework": "1.1.33", + "com.unity.textmeshpro": "3.0.6", + "com.unity.timeline": "1.7.5", + "com.unity.ugui": "1.0.0", + "com.unity.visualscripting": "1.8.0", + "com.unity.modules.ai": "1.0.0", + "com.unity.modules.androidjni": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.cloth": "1.0.0", + "com.unity.modules.director": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.screencapture": "1.0.0", + "com.unity.modules.terrain": "1.0.0", + "com.unity.modules.terrainphysics": "1.0.0", + "com.unity.modules.tilemap": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.umbra": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.unitywebrequesttexture": "1.0.0", + "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vehicles": "1.0.0", + "com.unity.modules.video": "1.0.0", + "com.unity.modules.vr": "1.0.0", + "com.unity.modules.wind": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } +} diff --git a/Plugins/Unity/project/Packages/packages-lock.json b/Plugins/Unity/project/Packages/packages-lock.json new file mode 100644 index 0000000..8316e65 --- /dev/null +++ b/Plugins/Unity/project/Packages/packages-lock.json @@ -0,0 +1,465 @@ +{ + "dependencies": { + "com.unity.2d.animation": { + "version": "9.0.3", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.2d.common": "8.0.1", + "com.unity.2d.sprite": "1.0.0", + "com.unity.collections": "1.1.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.uielements": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.2d.aseprite": { + "version": "1.0.0", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.2d.sprite": "1.0.0", + "com.unity.2d.common": "6.0.6", + "com.unity.mathematics": "1.2.6", + "com.unity.modules.animation": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.2d.common": { + "version": "8.0.1", + "depth": 2, + "source": "registry", + "dependencies": { + "com.unity.2d.sprite": "1.0.0", + "com.unity.mathematics": "1.1.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.burst": "1.7.3" + }, + "url": "https://packages.unity.com" + }, + "com.unity.2d.pixel-perfect": { + "version": "5.0.3", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.2d.psdimporter": { + "version": "8.0.2", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.2d.animation": "9.0.1", + "com.unity.2d.common": "8.0.1", + "com.unity.2d.sprite": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.2d.sprite": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": {} + }, + "com.unity.2d.spriteshape": { + "version": "9.0.2", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.mathematics": "1.1.0", + "com.unity.2d.common": "8.0.1", + "com.unity.modules.physics2d": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.2d.tilemap": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.modules.tilemap": "1.0.0", + "com.unity.modules.uielements": "1.0.0" + } + }, + "com.unity.2d.tilemap.extras": { + "version": "3.1.1", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.modules.tilemap": "1.0.0", + "com.unity.2d.tilemap": "1.0.0", + "com.unity.ugui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.burst": { + "version": "1.8.7", + "depth": 3, + "source": "registry", + "dependencies": { + "com.unity.mathematics": "1.2.1" + }, + "url": "https://packages.unity.com" + }, + "com.unity.collab-proxy": { + "version": "2.0.5", + "depth": 0, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.collections": { + "version": "1.2.4", + "depth": 2, + "source": "registry", + "dependencies": { + "com.unity.burst": "1.6.6", + "com.unity.test-framework": "1.1.31" + }, + "url": "https://packages.unity.com" + }, + "com.unity.ext.nunit": { + "version": "1.0.6", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.feature.2d": { + "version": "2.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.2d.animation": "9.0.3", + "com.unity.2d.pixel-perfect": "5.0.3", + "com.unity.2d.psdimporter": "8.0.2", + "com.unity.2d.sprite": "1.0.0", + "com.unity.2d.spriteshape": "9.0.2", + "com.unity.2d.tilemap": "1.0.0", + "com.unity.2d.tilemap.extras": "3.1.1", + "com.unity.2d.aseprite": "1.0.0" + } + }, + "com.unity.ide.rider": { + "version": "3.0.24", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ext.nunit": "1.0.6" + }, + "url": "https://packages.unity.com" + }, + "com.unity.ide.visualstudio": { + "version": "2.0.18", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.test-framework": "1.1.9" + }, + "url": "https://packages.unity.com" + }, + "com.unity.mathematics": { + "version": "1.2.6", + "depth": 2, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.test-framework": { + "version": "1.1.33", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ext.nunit": "1.0.6", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.textmeshpro": { + "version": "3.0.6", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ugui": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.timeline": { + "version": "1.7.5", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.modules.director": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.ugui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0" + } + }, + "com.unity.visualscripting": { + "version": "1.8.0", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ugui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.modules.ai": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.androidjni": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.animation": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.assetbundle": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.audio": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.cloth": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0" + } + }, + "com.unity.modules.director": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.animation": "1.0.0" + } + }, + "com.unity.modules.imageconversion": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.imgui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.jsonserialize": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.particlesystem": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.physics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.physics2d": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.screencapture": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.subsystems": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.terrain": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.terrainphysics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.terrain": "1.0.0" + } + }, + "com.unity.modules.tilemap": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics2d": "1.0.0" + } + }, + "com.unity.modules.ui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.uielements": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.umbra": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.unityanalytics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.unitywebrequest": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.unitywebrequestassetbundle": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" + } + }, + "com.unity.modules.unitywebrequestaudio": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.audio": "1.0.0" + } + }, + "com.unity.modules.unitywebrequesttexture": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.unitywebrequestwww": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.vehicles": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0" + } + }, + "com.unity.modules.video": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" + } + }, + "com.unity.modules.vr": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } + }, + "com.unity.modules.wind": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.xr": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.subsystems": "1.0.0" + } + } + } +} diff --git a/Plugins/Unity/project/ProjectSettings/AudioManager.asset b/Plugins/Unity/project/ProjectSettings/AudioManager.asset new file mode 100644 index 0000000..27287fe --- /dev/null +++ b/Plugins/Unity/project/ProjectSettings/AudioManager.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!11 &1 +AudioManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Volume: 1 + Rolloff Scale: 1 + Doppler Factor: 1 + Default Speaker Mode: 2 + m_SampleRate: 0 + m_DSPBufferSize: 1024 + m_VirtualVoiceCount: 512 + m_RealVoiceCount: 32 + m_SpatializerPlugin: + m_AmbisonicDecoderPlugin: + m_DisableAudio: 0 + m_VirtualizeEffects: 1 + m_RequestedDSPBufferSize: 0 diff --git a/Plugins/Unity/project/ProjectSettings/ClusterInputManager.asset b/Plugins/Unity/project/ProjectSettings/ClusterInputManager.asset new file mode 100644 index 0000000..e7886b2 --- /dev/null +++ b/Plugins/Unity/project/ProjectSettings/ClusterInputManager.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!236 &1 +ClusterInputManager: + m_ObjectHideFlags: 0 + m_Inputs: [] diff --git a/Plugins/Unity/project/ProjectSettings/DynamicsManager.asset b/Plugins/Unity/project/ProjectSettings/DynamicsManager.asset new file mode 100644 index 0000000..72d1430 --- /dev/null +++ b/Plugins/Unity/project/ProjectSettings/DynamicsManager.asset @@ -0,0 +1,37 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!55 &1 +PhysicsManager: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_Gravity: {x: 0, y: -9.81, z: 0} + m_DefaultMaterial: {fileID: 0} + m_BounceThreshold: 2 + m_DefaultMaxDepenetrationVelocity: 10 + m_SleepThreshold: 0.005 + m_DefaultContactOffset: 0.01 + m_DefaultSolverIterations: 6 + m_DefaultSolverVelocityIterations: 1 + m_QueriesHitBackfaces: 0 + m_QueriesHitTriggers: 1 + m_EnableAdaptiveForce: 0 + m_ClothInterCollisionDistance: 0.1 + m_ClothInterCollisionStiffness: 0.2 + m_ContactsGeneration: 1 + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + m_AutoSimulation: 1 + m_AutoSyncTransforms: 0 + m_ReuseCollisionCallbacks: 1 + m_ClothInterCollisionSettingsToggle: 0 + m_ClothGravity: {x: 0, y: -9.81, z: 0} + m_ContactPairsMode: 0 + m_BroadphaseType: 0 + m_WorldBounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 250, y: 250, z: 250} + m_WorldSubdivisions: 8 + m_FrictionType: 0 + m_EnableEnhancedDeterminism: 0 + m_EnableUnifiedHeightmaps: 1 + m_SolverType: 0 + m_DefaultMaxAngularSpeed: 50 diff --git a/Plugins/Unity/project/ProjectSettings/EditorBuildSettings.asset b/Plugins/Unity/project/ProjectSettings/EditorBuildSettings.asset new file mode 100644 index 0000000..82ab0f5 --- /dev/null +++ b/Plugins/Unity/project/ProjectSettings/EditorBuildSettings.asset @@ -0,0 +1,11 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1045 &1 +EditorBuildSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Scenes: + - enabled: 1 + path: Assets/Scenes/SampleScene.unity + guid: 2cda990e2423bbf4892e6590ba056729 + m_configObjects: {} diff --git a/Plugins/Unity/project/ProjectSettings/EditorSettings.asset b/Plugins/Unity/project/ProjectSettings/EditorSettings.asset new file mode 100644 index 0000000..e6f57fd --- /dev/null +++ b/Plugins/Unity/project/ProjectSettings/EditorSettings.asset @@ -0,0 +1,40 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!159 &1 +EditorSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_SerializationMode: 2 + m_LineEndingsForNewScripts: 0 + m_DefaultBehaviorMode: 1 + m_PrefabRegularEnvironment: {fileID: 0} + m_PrefabUIEnvironment: {fileID: 0} + m_SpritePackerMode: 5 + m_SpritePackerPaddingPower: 1 + m_EtcTextureCompressorBehavior: 1 + m_EtcTextureFastCompressor: 1 + m_EtcTextureNormalCompressor: 2 + m_EtcTextureBestCompressor: 4 + m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;asmref;rsp + m_ProjectGenerationRootNamespace: + m_EnableTextureStreamingInEditMode: 1 + m_EnableTextureStreamingInPlayMode: 1 + m_AsyncShaderCompilation: 1 + m_CachingShaderPreprocessor: 1 + m_PrefabModeAllowAutoSave: 1 + m_EnterPlayModeOptionsEnabled: 0 + m_EnterPlayModeOptions: 3 + m_GameObjectNamingDigits: 1 + m_GameObjectNamingScheme: 0 + m_AssetNamingUsesSpace: 1 + m_UseLegacyProbeSampleCount: 0 + m_SerializeInlineMappingsOnOneLine: 1 + m_DisableCookiesInLightmapper: 1 + m_AssetPipelineMode: 1 + m_CacheServerMode: 0 + m_CacheServerEndpoint: + m_CacheServerNamespacePrefix: default + m_CacheServerEnableDownload: 1 + m_CacheServerEnableUpload: 1 + m_CacheServerEnableAuth: 0 + m_CacheServerEnableTls: 0 diff --git a/Plugins/Unity/project/ProjectSettings/GraphicsSettings.asset b/Plugins/Unity/project/ProjectSettings/GraphicsSettings.asset new file mode 100644 index 0000000..c165afb --- /dev/null +++ b/Plugins/Unity/project/ProjectSettings/GraphicsSettings.asset @@ -0,0 +1,64 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!30 &1 +GraphicsSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_Deferred: + m_Mode: 1 + m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} + m_DeferredReflections: + m_Mode: 1 + m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} + m_ScreenSpaceShadows: + m_Mode: 1 + m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} + m_LegacyDeferred: + m_Mode: 1 + m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} + m_DepthNormals: + m_Mode: 1 + m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} + m_MotionVectors: + m_Mode: 1 + m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} + m_LightHalo: + m_Mode: 1 + m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} + m_LensFlare: + m_Mode: 1 + m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} + m_VideoShadersIncludeMode: 2 + m_AlwaysIncludedShaders: + - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0} + m_PreloadedShaders: [] + m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + m_CustomRenderPipeline: {fileID: 0} + m_TransparencySortMode: 0 + m_TransparencySortAxis: {x: 0, y: 0, z: 1} + m_DefaultRenderingPath: 1 + m_DefaultMobileRenderingPath: 1 + m_TierSettings: [] + m_LightmapStripping: 0 + m_FogStripping: 0 + m_InstancingStripping: 0 + m_LightmapKeepPlain: 1 + m_LightmapKeepDirCombined: 1 + m_LightmapKeepDynamicPlain: 1 + m_LightmapKeepDynamicDirCombined: 1 + m_LightmapKeepShadowMask: 1 + m_LightmapKeepSubtractive: 1 + m_FogKeepLinear: 1 + m_FogKeepExp: 1 + m_FogKeepExp2: 1 + m_AlbedoSwatchInfos: [] + m_LightsUseLinearIntensity: 0 + m_LightsUseColorTemperature: 0 + m_DefaultRenderingLayerMask: 1 + m_LogWhenShaderIsCompiled: 0 diff --git a/Plugins/Unity/project/ProjectSettings/InputManager.asset b/Plugins/Unity/project/ProjectSettings/InputManager.asset new file mode 100644 index 0000000..b16147e --- /dev/null +++ b/Plugins/Unity/project/ProjectSettings/InputManager.asset @@ -0,0 +1,487 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!13 &1 +InputManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Axes: + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: a + altPositiveButton: d + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: s + altPositiveButton: w + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: mouse 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: mouse 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: mouse 2 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: space + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse X + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse Y + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse ScrollWheel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 2 + joyNum: 0 + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 0 + type: 2 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 1 + type: 2 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 0 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 1 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 2 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 3 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: enter + altNegativeButton: + altPositiveButton: space + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Cancel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: escape + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Enable Debug Button 1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: joystick button 8 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Enable Debug Button 2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: backspace + altNegativeButton: + altPositiveButton: joystick button 9 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Reset + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Next + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: page down + altNegativeButton: + altPositiveButton: joystick button 5 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Previous + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: page up + altNegativeButton: + altPositiveButton: joystick button 4 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Validate + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Persistent + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: right shift + altNegativeButton: + altPositiveButton: joystick button 2 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Multiplier + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: joystick button 3 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 2 + axis: 6 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 2 + axis: 5 + joyNum: 0 diff --git a/Plugins/Unity/project/ProjectSettings/MemorySettings.asset b/Plugins/Unity/project/ProjectSettings/MemorySettings.asset new file mode 100644 index 0000000..5b5face --- /dev/null +++ b/Plugins/Unity/project/ProjectSettings/MemorySettings.asset @@ -0,0 +1,35 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!387306366 &1 +MemorySettings: + m_ObjectHideFlags: 0 + m_EditorMemorySettings: + m_MainAllocatorBlockSize: -1 + m_ThreadAllocatorBlockSize: -1 + m_MainGfxBlockSize: -1 + m_ThreadGfxBlockSize: -1 + m_CacheBlockSize: -1 + m_TypetreeBlockSize: -1 + m_ProfilerBlockSize: -1 + m_ProfilerEditorBlockSize: -1 + m_BucketAllocatorGranularity: -1 + m_BucketAllocatorBucketsCount: -1 + m_BucketAllocatorBlockSize: -1 + m_BucketAllocatorBlockCount: -1 + m_ProfilerBucketAllocatorGranularity: -1 + m_ProfilerBucketAllocatorBucketsCount: -1 + m_ProfilerBucketAllocatorBlockSize: -1 + m_ProfilerBucketAllocatorBlockCount: -1 + m_TempAllocatorSizeMain: -1 + m_JobTempAllocatorBlockSize: -1 + m_BackgroundJobTempAllocatorBlockSize: -1 + m_JobTempAllocatorReducedBlockSize: -1 + m_TempAllocatorSizeGIBakingWorker: -1 + m_TempAllocatorSizeNavMeshWorker: -1 + m_TempAllocatorSizeAudioWorker: -1 + m_TempAllocatorSizeCloudWorker: -1 + m_TempAllocatorSizeGfx: -1 + m_TempAllocatorSizeJobWorker: -1 + m_TempAllocatorSizeBackgroundWorker: -1 + m_TempAllocatorSizePreloadManager: -1 + m_PlatformMemorySettings: {} diff --git a/Plugins/Unity/project/ProjectSettings/NavMeshAreas.asset b/Plugins/Unity/project/ProjectSettings/NavMeshAreas.asset new file mode 100644 index 0000000..ad2654e --- /dev/null +++ b/Plugins/Unity/project/ProjectSettings/NavMeshAreas.asset @@ -0,0 +1,93 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!126 &1 +NavMeshProjectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + areas: + - name: Walkable + cost: 1 + - name: Not Walkable + cost: 1 + - name: Jump + cost: 2 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + m_LastAgentTypeID: -887442657 + m_Settings: + - serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.75 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_SettingNames: + - Humanoid diff --git a/Plugins/Unity/project/ProjectSettings/NetworkManager.asset b/Plugins/Unity/project/ProjectSettings/NetworkManager.asset new file mode 100644 index 0000000..5dc6a83 --- /dev/null +++ b/Plugins/Unity/project/ProjectSettings/NetworkManager.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!149 &1 +NetworkManager: + m_ObjectHideFlags: 0 + m_DebugLevel: 0 + m_Sendrate: 15 + m_AssetToPrefab: {} diff --git a/Plugins/Unity/project/ProjectSettings/PackageManagerSettings.asset b/Plugins/Unity/project/ProjectSettings/PackageManagerSettings.asset new file mode 100644 index 0000000..3f47fb6 --- /dev/null +++ b/Plugins/Unity/project/ProjectSettings/PackageManagerSettings.asset @@ -0,0 +1,36 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_EnablePreReleasePackages: 0 + m_AdvancedSettingsExpanded: 1 + m_ScopedRegistriesSettingsExpanded: 1 + m_SeeAllPackageVersions: 0 + m_DismissPreviewPackagesInUse: 0 + oneTimeWarningShown: 0 + m_Registries: + - m_Id: main + m_Name: + m_Url: https://packages.unity.com + m_Scopes: [] + m_IsDefault: 1 + m_Capabilities: 7 + m_ConfigSource: 0 + m_UserSelectedRegistryName: + m_UserAddingNewScopedRegistry: 0 + m_RegistryInfoDraft: + m_Modified: 0 + m_ErrorMessage: + m_UserModificationsInstanceId: -838 + m_OriginalInstanceId: -840 + m_LoadAssets: 0 diff --git a/Plugins/Unity/project/ProjectSettings/Physics2DSettings.asset b/Plugins/Unity/project/ProjectSettings/Physics2DSettings.asset new file mode 100644 index 0000000..6cfcdda --- /dev/null +++ b/Plugins/Unity/project/ProjectSettings/Physics2DSettings.asset @@ -0,0 +1,56 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!19 &1 +Physics2DSettings: + m_ObjectHideFlags: 0 + serializedVersion: 5 + m_Gravity: {x: 0, y: -9.81} + m_DefaultMaterial: {fileID: 0} + m_VelocityIterations: 8 + m_PositionIterations: 3 + m_VelocityThreshold: 1 + m_MaxLinearCorrection: 0.2 + m_MaxAngularCorrection: 8 + m_MaxTranslationSpeed: 100 + m_MaxRotationSpeed: 360 + m_BaumgarteScale: 0.2 + m_BaumgarteTimeOfImpactScale: 0.75 + m_TimeToSleep: 0.5 + m_LinearSleepTolerance: 0.01 + m_AngularSleepTolerance: 2 + m_DefaultContactOffset: 0.01 + m_JobOptions: + serializedVersion: 2 + useMultithreading: 0 + useConsistencySorting: 0 + m_InterpolationPosesPerJob: 100 + m_NewContactsPerJob: 30 + m_CollideContactsPerJob: 100 + m_ClearFlagsPerJob: 200 + m_ClearBodyForcesPerJob: 200 + m_SyncDiscreteFixturesPerJob: 50 + m_SyncContinuousFixturesPerJob: 50 + m_FindNearestContactsPerJob: 100 + m_UpdateTriggerContactsPerJob: 100 + m_IslandSolverCostThreshold: 100 + m_IslandSolverBodyCostScale: 1 + m_IslandSolverContactCostScale: 10 + m_IslandSolverJointCostScale: 10 + m_IslandSolverBodiesPerJob: 50 + m_IslandSolverContactsPerJob: 50 + m_SimulationMode: 0 + m_QueriesHitTriggers: 1 + m_QueriesStartInColliders: 1 + m_CallbacksOnDisable: 1 + m_ReuseCollisionCallbacks: 1 + m_AutoSyncTransforms: 0 + m_AlwaysShowColliders: 0 + m_ShowColliderSleep: 1 + m_ShowColliderContacts: 0 + m_ShowColliderAABB: 0 + m_ContactArrowScale: 0.2 + m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} + m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} + m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} + m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff diff --git a/Plugins/Unity/project/ProjectSettings/PresetManager.asset b/Plugins/Unity/project/ProjectSettings/PresetManager.asset new file mode 100644 index 0000000..67a94da --- /dev/null +++ b/Plugins/Unity/project/ProjectSettings/PresetManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1386491679 &1 +PresetManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_DefaultPresets: {} diff --git a/Plugins/Unity/project/ProjectSettings/ProjectSettings.asset b/Plugins/Unity/project/ProjectSettings/ProjectSettings.asset new file mode 100644 index 0000000..ebd3fd3 --- /dev/null +++ b/Plugins/Unity/project/ProjectSettings/ProjectSettings.asset @@ -0,0 +1,711 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!129 &1 +PlayerSettings: + m_ObjectHideFlags: 0 + serializedVersion: 26 + productGUID: 23fe6ebbeeac2244ab7b495a0e495040 + AndroidProfiler: 0 + AndroidFilterTouchesWhenObscured: 0 + AndroidEnableSustainedPerformanceMode: 0 + defaultScreenOrientation: 4 + targetDevice: 2 + useOnDemandResources: 0 + accelerometerFrequency: 60 + companyName: DefaultCompany + productName: project + defaultCursor: {fileID: 0} + cursorHotspot: {x: 0, y: 0} + m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} + m_ShowUnitySplashScreen: 1 + m_ShowUnitySplashLogo: 1 + m_SplashScreenOverlayOpacity: 1 + m_SplashScreenAnimation: 1 + m_SplashScreenLogoStyle: 1 + m_SplashScreenDrawMode: 0 + m_SplashScreenBackgroundAnimationZoom: 1 + m_SplashScreenLogoAnimationZoom: 1 + m_SplashScreenBackgroundLandscapeAspect: 1 + m_SplashScreenBackgroundPortraitAspect: 1 + m_SplashScreenBackgroundLandscapeUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenBackgroundPortraitUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenLogos: [] + m_VirtualRealitySplashScreen: {fileID: 0} + m_HolographicTrackingLossScreen: {fileID: 0} + defaultScreenWidth: 1920 + defaultScreenHeight: 1080 + defaultScreenWidthWeb: 960 + defaultScreenHeightWeb: 600 + m_StereoRenderingPath: 0 + m_ActiveColorSpace: 1 + m_SpriteBatchVertexThreshold: 300 + m_MTRendering: 1 + mipStripping: 0 + numberOfMipsStripped: 0 + numberOfMipsStrippedPerMipmapLimitGroup: {} + m_StackTraceTypes: 010000000100000001000000010000000100000001000000 + iosShowActivityIndicatorOnLoading: -1 + androidShowActivityIndicatorOnLoading: -1 + iosUseCustomAppBackgroundBehavior: 0 + allowedAutorotateToPortrait: 1 + allowedAutorotateToPortraitUpsideDown: 1 + allowedAutorotateToLandscapeRight: 1 + allowedAutorotateToLandscapeLeft: 1 + useOSAutorotation: 1 + use32BitDisplayBuffer: 1 + preserveFramebufferAlpha: 0 + disableDepthAndStencilBuffers: 0 + androidStartInFullscreen: 1 + androidRenderOutsideSafeArea: 1 + androidUseSwappy: 1 + androidBlitType: 0 + androidResizableWindow: 0 + androidDefaultWindowWidth: 1920 + androidDefaultWindowHeight: 1080 + androidMinimumWindowWidth: 400 + androidMinimumWindowHeight: 300 + androidFullscreenMode: 1 + defaultIsNativeResolution: 1 + macRetinaSupport: 1 + runInBackground: 0 + captureSingleScreen: 0 + muteOtherAudioSources: 0 + Prepare IOS For Recording: 0 + Force IOS Speakers When Recording: 0 + deferSystemGesturesMode: 0 + hideHomeButton: 0 + submitAnalytics: 1 + usePlayerLog: 1 + bakeCollisionMeshes: 0 + forceSingleInstance: 0 + useFlipModelSwapchain: 1 + resizableWindow: 0 + useMacAppStoreValidation: 0 + macAppStoreCategory: public.app-category.games + gpuSkinning: 0 + xboxPIXTextureCapture: 0 + xboxEnableAvatar: 0 + xboxEnableKinect: 0 + xboxEnableKinectAutoTracking: 0 + xboxEnableFitness: 0 + visibleInBackground: 1 + allowFullscreenSwitch: 1 + fullscreenMode: 1 + xboxSpeechDB: 0 + xboxEnableHeadOrientation: 0 + xboxEnableGuest: 0 + xboxEnablePIXSampling: 0 + metalFramebufferOnly: 0 + xboxOneResolution: 0 + xboxOneSResolution: 0 + xboxOneXResolution: 3 + xboxOneMonoLoggingLevel: 0 + xboxOneLoggingLevel: 1 + xboxOneDisableEsram: 0 + xboxOneEnableTypeOptimization: 0 + xboxOnePresentImmediateThreshold: 0 + switchQueueCommandMemory: 1048576 + switchQueueControlMemory: 16384 + switchQueueComputeMemory: 262144 + switchNVNShaderPoolsGranularity: 33554432 + switchNVNDefaultPoolsGranularity: 16777216 + switchNVNOtherPoolsGranularity: 16777216 + switchGpuScratchPoolGranularity: 2097152 + switchAllowGpuScratchShrinking: 0 + switchNVNMaxPublicTextureIDCount: 0 + switchNVNMaxPublicSamplerIDCount: 0 + switchNVNGraphicsFirmwareMemory: 32 + stadiaPresentMode: 0 + stadiaTargetFramerate: 0 + vulkanNumSwapchainBuffers: 3 + vulkanEnableSetSRGBWrite: 0 + vulkanEnablePreTransform: 0 + vulkanEnableLateAcquireNextImage: 0 + vulkanEnableCommandBufferRecycling: 1 + loadStoreDebugModeEnabled: 0 + bundleVersion: 1.0 + preloadedAssets: [] + metroInputSource: 0 + wsaTransparentSwapchain: 0 + m_HolographicPauseOnTrackingLoss: 1 + xboxOneDisableKinectGpuReservation: 1 + xboxOneEnable7thCore: 1 + vrSettings: + enable360StereoCapture: 0 + isWsaHolographicRemotingEnabled: 0 + enableFrameTimingStats: 0 + enableOpenGLProfilerGPURecorders: 1 + useHDRDisplay: 0 + hdrBitDepth: 0 + m_ColorGamuts: 00000000 + targetPixelDensity: 30 + resolutionScalingMode: 0 + resetResolutionOnWindowResize: 0 + androidSupportedAspectRatio: 1 + androidMaxAspectRatio: 2.1 + applicationIdentifier: + Standalone: com.DefaultCompany.2DProject + buildNumber: + Standalone: 0 + VisionOS: 0 + iPhone: 0 + tvOS: 0 + overrideDefaultApplicationIdentifier: 1 + AndroidBundleVersionCode: 1 + AndroidMinSdkVersion: 22 + AndroidTargetSdkVersion: 0 + AndroidPreferredInstallLocation: 1 + aotOptions: + stripEngineCode: 1 + iPhoneStrippingLevel: 0 + iPhoneScriptCallOptimization: 0 + ForceInternetPermission: 0 + ForceSDCardPermission: 0 + CreateWallpaper: 0 + APKExpansionFiles: 0 + keepLoadedShadersAlive: 0 + StripUnusedMeshComponents: 0 + strictShaderVariantMatching: 0 + VertexChannelCompressionMask: 4054 + iPhoneSdkVersion: 988 + iOSTargetOSVersionString: 12.0 + tvOSSdkVersion: 0 + tvOSRequireExtendedGameController: 0 + tvOSTargetOSVersionString: 12.0 + VisionOSSdkVersion: 0 + VisionOSTargetOSVersionString: 1.0 + uIPrerenderedIcon: 0 + uIRequiresPersistentWiFi: 0 + uIRequiresFullScreen: 1 + uIStatusBarHidden: 1 + uIExitOnSuspend: 0 + uIStatusBarStyle: 0 + appleTVSplashScreen: {fileID: 0} + appleTVSplashScreen2x: {fileID: 0} + tvOSSmallIconLayers: [] + tvOSSmallIconLayers2x: [] + tvOSLargeIconLayers: [] + tvOSLargeIconLayers2x: [] + tvOSTopShelfImageLayers: [] + tvOSTopShelfImageLayers2x: [] + tvOSTopShelfImageWideLayers: [] + tvOSTopShelfImageWideLayers2x: [] + iOSLaunchScreenType: 0 + iOSLaunchScreenPortrait: {fileID: 0} + iOSLaunchScreenLandscape: {fileID: 0} + iOSLaunchScreenBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreenFillPct: 100 + iOSLaunchScreenSize: 100 + iOSLaunchScreenCustomXibPath: + iOSLaunchScreeniPadType: 0 + iOSLaunchScreeniPadImage: {fileID: 0} + iOSLaunchScreeniPadBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreeniPadFillPct: 100 + iOSLaunchScreeniPadSize: 100 + iOSLaunchScreeniPadCustomXibPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: + iOSDeviceRequirements: [] + iOSURLSchemes: [] + macOSURLSchemes: [] + iOSBackgroundModes: 0 + iOSMetalForceHardShadows: 0 + metalEditorSupport: 1 + metalAPIValidation: 1 + iOSRenderExtraFrameOnPause: 0 + iosCopyPluginsCodeInsteadOfSymlink: 0 + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + VisionOSManualSigningProvisioningProfileID: + iOSManualSigningProvisioningProfileType: 0 + tvOSManualSigningProvisioningProfileType: 0 + VisionOSManualSigningProvisioningProfileType: 0 + appleEnableAutomaticSigning: 0 + iOSRequireARKit: 0 + iOSAutomaticallyDetectAndAddCapabilities: 1 + appleEnableProMotion: 0 + shaderPrecisionModel: 0 + clonedFromGUID: 10ad67313f4034357812315f3c407484 + templatePackageId: com.unity.template.2d@7.0.3 + templateDefaultScene: Assets/Scenes/SampleScene.unity + useCustomMainManifest: 0 + useCustomLauncherManifest: 0 + useCustomMainGradleTemplate: 0 + useCustomLauncherGradleManifest: 0 + useCustomBaseGradleTemplate: 0 + useCustomGradlePropertiesTemplate: 0 + useCustomGradleSettingsTemplate: 0 + useCustomProguardFile: 0 + AndroidTargetArchitectures: 1 + AndroidTargetDevices: 0 + AndroidSplashScreenScale: 0 + androidSplashScreen: {fileID: 0} + AndroidKeystoreName: + AndroidKeyaliasName: + AndroidEnableArmv9SecurityFeatures: 0 + AndroidBuildApkPerCpuArchitecture: 0 + AndroidTVCompatibility: 0 + AndroidIsGame: 1 + AndroidEnableTango: 0 + androidEnableBanner: 1 + androidUseLowAccuracyLocation: 0 + androidUseCustomKeystore: 0 + m_AndroidBanners: + - width: 320 + height: 180 + banner: {fileID: 0} + androidGamepadSupportLevel: 0 + chromeosInputEmulation: 1 + AndroidMinifyRelease: 0 + AndroidMinifyDebug: 0 + AndroidValidateAppBundleSize: 1 + AndroidAppBundleSizeToValidate: 150 + m_BuildTargetIcons: [] + m_BuildTargetPlatformIcons: [] + m_BuildTargetBatching: [] + m_BuildTargetShaderSettings: [] + m_BuildTargetGraphicsJobs: + - m_BuildTarget: MacStandaloneSupport + m_GraphicsJobs: 0 + - m_BuildTarget: Switch + m_GraphicsJobs: 0 + - m_BuildTarget: MetroSupport + m_GraphicsJobs: 0 + - m_BuildTarget: AppleTVSupport + m_GraphicsJobs: 0 + - m_BuildTarget: BJMSupport + m_GraphicsJobs: 0 + - m_BuildTarget: LinuxStandaloneSupport + m_GraphicsJobs: 0 + - m_BuildTarget: PS4Player + m_GraphicsJobs: 0 + - m_BuildTarget: iOSSupport + m_GraphicsJobs: 0 + - m_BuildTarget: WindowsStandaloneSupport + m_GraphicsJobs: 0 + - m_BuildTarget: XboxOnePlayer + m_GraphicsJobs: 0 + - m_BuildTarget: LuminSupport + m_GraphicsJobs: 0 + - m_BuildTarget: AndroidPlayer + m_GraphicsJobs: 0 + - m_BuildTarget: WebGLSupport + m_GraphicsJobs: 0 + m_BuildTargetGraphicsJobMode: [] + m_BuildTargetGraphicsAPIs: + - m_BuildTarget: AndroidPlayer + m_APIs: 150000000b000000 + m_Automatic: 1 + - m_BuildTarget: iOSSupport + m_APIs: 10000000 + m_Automatic: 1 + m_BuildTargetVRSettings: [] + m_DefaultShaderChunkSizeInMB: 16 + m_DefaultShaderChunkCount: 0 + openGLRequireES31: 0 + openGLRequireES31AEP: 0 + openGLRequireES32: 0 + m_TemplateCustomTags: {} + mobileMTRendering: + Android: 1 + iPhone: 1 + tvOS: 1 + m_BuildTargetGroupLightmapEncodingQuality: [] + m_BuildTargetGroupHDRCubemapEncodingQuality: [] + m_BuildTargetGroupLightmapSettings: [] + m_BuildTargetGroupLoadStoreDebugModeSettings: [] + m_BuildTargetNormalMapEncoding: [] + m_BuildTargetDefaultTextureCompressionFormat: + - m_BuildTarget: Android + m_Format: 3 + playModeTestRunnerEnabled: 0 + runPlayModeTestAsEditModeTest: 0 + actionOnDotNetUnhandledException: 1 + enableInternalProfiler: 0 + logObjCUncaughtExceptions: 1 + enableCrashReportAPI: 0 + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: + macOSTargetOSVersion: 10.13.0 + switchNMETAOverride: + switchNetLibKey: + switchSocketMemoryPoolSize: 6144 + switchSocketAllocatorPoolSize: 128 + switchSocketConcurrencyLimit: 14 + switchScreenResolutionBehavior: 2 + switchUseCPUProfiler: 0 + switchUseGOLDLinker: 0 + switchLTOSetting: 0 + switchApplicationID: 0x01004b9000490000 + switchNSODependencies: + switchCompilerFlags: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: + switchIcons_0: {fileID: 0} + switchIcons_1: {fileID: 0} + switchIcons_2: {fileID: 0} + switchIcons_3: {fileID: 0} + switchIcons_4: {fileID: 0} + switchIcons_5: {fileID: 0} + switchIcons_6: {fileID: 0} + switchIcons_7: {fileID: 0} + switchIcons_8: {fileID: 0} + switchIcons_9: {fileID: 0} + switchIcons_10: {fileID: 0} + switchIcons_11: {fileID: 0} + switchIcons_12: {fileID: 0} + switchIcons_13: {fileID: 0} + switchIcons_14: {fileID: 0} + switchIcons_15: {fileID: 0} + switchSmallIcons_0: {fileID: 0} + switchSmallIcons_1: {fileID: 0} + switchSmallIcons_2: {fileID: 0} + switchSmallIcons_3: {fileID: 0} + switchSmallIcons_4: {fileID: 0} + switchSmallIcons_5: {fileID: 0} + switchSmallIcons_6: {fileID: 0} + switchSmallIcons_7: {fileID: 0} + switchSmallIcons_8: {fileID: 0} + switchSmallIcons_9: {fileID: 0} + switchSmallIcons_10: {fileID: 0} + switchSmallIcons_11: {fileID: 0} + switchSmallIcons_12: {fileID: 0} + switchSmallIcons_13: {fileID: 0} + switchSmallIcons_14: {fileID: 0} + switchSmallIcons_15: {fileID: 0} + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: + switchMainThreadStackSize: 1048576 + switchPresenceGroupId: + switchLogoHandling: 0 + switchReleaseVersion: 0 + switchDisplayVersion: 1.0.0 + switchStartupUserAccount: 0 + switchSupportedLanguagesMask: 0 + switchLogoType: 0 + switchApplicationErrorCodeCategory: + switchUserAccountSaveDataSize: 0 + switchUserAccountSaveDataJournalSize: 0 + switchApplicationAttribute: 0 + switchCardSpecSize: -1 + switchCardSpecClock: -1 + switchRatingsMask: 0 + switchRatingsInt_0: 0 + switchRatingsInt_1: 0 + switchRatingsInt_2: 0 + switchRatingsInt_3: 0 + switchRatingsInt_4: 0 + switchRatingsInt_5: 0 + switchRatingsInt_6: 0 + switchRatingsInt_7: 0 + switchRatingsInt_8: 0 + switchRatingsInt_9: 0 + switchRatingsInt_10: 0 + switchRatingsInt_11: 0 + switchRatingsInt_12: 0 + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: + switchParentalControl: 0 + switchAllowsScreenshot: 1 + switchAllowsVideoCapturing: 1 + switchAllowsRuntimeAddOnContentInstall: 0 + switchDataLossConfirmation: 0 + switchUserAccountLockEnabled: 0 + switchSystemResourceMemory: 16777216 + switchSupportedNpadStyles: 22 + switchNativeFsCacheSize: 32 + switchIsHoldTypeHorizontal: 0 + switchSupportedNpadCount: 8 + switchEnableTouchScreen: 1 + switchSocketConfigEnabled: 0 + switchTcpInitialSendBufferSize: 32 + switchTcpInitialReceiveBufferSize: 64 + switchTcpAutoSendBufferSizeMax: 256 + switchTcpAutoReceiveBufferSizeMax: 256 + switchUdpSendBufferSize: 9 + switchUdpReceiveBufferSize: 42 + switchSocketBufferEfficiency: 4 + switchSocketInitializeEnabled: 1 + switchNetworkInterfaceManagerInitializeEnabled: 1 + switchPlayerConnectionEnabled: 1 + switchUseNewStyleFilepaths: 0 + switchUseLegacyFmodPriorities: 0 + switchUseMicroSleepForYield: 1 + switchEnableRamDiskSupport: 0 + switchMicroSleepForYieldTime: 25 + switchRamDiskSpaceSize: 12 + ps4NPAgeRating: 12 + ps4NPTitleSecret: + ps4NPTrophyPackPath: + ps4ParentalLevel: 11 + ps4ContentID: ED1633-NPXX51362_00-0000000000000000 + ps4Category: 0 + ps4MasterVersion: 01.00 + ps4AppVersion: 01.00 + ps4AppType: 0 + ps4ParamSfxPath: + ps4VideoOutPixelFormat: 0 + ps4VideoOutInitialWidth: 1920 + ps4VideoOutBaseModeInitialWidth: 1920 + ps4VideoOutReprojectionRate: 60 + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: + ps4RemotePlayKeyAssignment: -1 + ps4RemotePlayKeyMappingDir: + ps4PlayTogetherPlayerCount: 0 + ps4EnterButtonAssignment: 2 + ps4ApplicationParam1: 0 + ps4ApplicationParam2: 0 + ps4ApplicationParam3: 0 + ps4ApplicationParam4: 0 + ps4DownloadDataSize: 0 + ps4GarlicHeapSize: 2048 + ps4ProGarlicHeapSize: 2560 + playerPrefsMaxSize: 32768 + ps4Passcode: bi9UOuSpM2Tlh01vOzwvSikHFswuzleh + ps4pnSessions: 1 + ps4pnPresence: 1 + ps4pnFriends: 1 + ps4pnGameCustomData: 1 + playerPrefsSupport: 0 + enableApplicationExit: 0 + resetTempFolder: 1 + restrictedAudioUsageRights: 0 + ps4UseResolutionFallback: 0 + ps4ReprojectionSupport: 0 + ps4UseAudio3dBackend: 0 + ps4UseLowGarlicFragmentationMode: 1 + ps4SocialScreenEnabled: 0 + ps4ScriptOptimizationLevel: 2 + ps4Audio3dVirtualSpeakerCount: 14 + ps4attribCpuUsage: 0 + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: + ps4PatchDayOne: 0 + ps4attribUserManagement: 0 + ps4attribMoveSupport: 0 + ps4attrib3DSupport: 0 + ps4attribShareSupport: 0 + ps4attribExclusiveVR: 0 + ps4disableAutoHideSplash: 0 + ps4videoRecordingFeaturesUsed: 0 + ps4contentSearchFeaturesUsed: 0 + ps4CompatibilityPS5: 0 + ps4AllowPS5Detection: 0 + ps4GPU800MHz: 1 + ps4attribEyeToEyeDistanceSettingVR: 0 + ps4IncludedModules: [] + ps4attribVROutputEnabled: 0 + monoEnv: + splashScreenBackgroundSourceLandscape: {fileID: 0} + splashScreenBackgroundSourcePortrait: {fileID: 0} + blurSplashScreenBackground: 1 + spritePackerPolicy: + webGLMemorySize: 32 + webGLExceptionSupport: 1 + webGLNameFilesAsHashes: 0 + webGLShowDiagnostics: 0 + webGLDataCaching: 1 + webGLDebugSymbols: 0 + webGLEmscriptenArgs: + webGLModulesDirectory: + webGLTemplate: APPLICATION:Default + webGLAnalyzeBuildSize: 0 + webGLUseEmbeddedResources: 0 + webGLCompressionFormat: 0 + webGLWasmArithmeticExceptions: 0 + webGLLinkerTarget: 1 + webGLThreadsSupport: 0 + webGLDecompressionFallback: 0 + webGLInitialMemorySize: 32 + webGLMaximumMemorySize: 2048 + webGLMemoryGrowthMode: 2 + webGLMemoryLinearGrowthStep: 16 + webGLMemoryGeometricGrowthStep: 0.2 + webGLMemoryGeometricGrowthCap: 96 + webGLPowerPreference: 2 + scriptingDefineSymbols: {} + additionalCompilerArguments: {} + platformArchitecture: {} + scriptingBackend: {} + il2cppCompilerConfiguration: {} + il2cppCodeGeneration: {} + managedStrippingLevel: + EmbeddedLinux: 1 + GameCoreScarlett: 1 + GameCoreXboxOne: 1 + Nintendo Switch: 1 + PS4: 1 + PS5: 1 + QNX: 1 + Stadia: 1 + VisionOS: 1 + WebGL: 1 + Windows Store Apps: 1 + XboxOne: 1 + iPhone: 1 + tvOS: 1 + incrementalIl2cppBuild: {} + suppressCommonWarnings: 1 + allowUnsafeCode: 0 + useDeterministicCompilation: 1 + additionalIl2CppArgs: + scriptingRuntimeVersion: 1 + gcIncremental: 1 + gcWBarrierValidation: 0 + apiCompatibilityLevelPerPlatform: {} + m_RenderingPath: 1 + m_MobileRenderingPath: 1 + metroPackageName: project + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: + metroCertificateNotAfter: 0000000000000000 + metroApplicationDescription: project + wsaImages: {} + metroTileShortName: + metroTileShowName: 0 + metroMediumTileShowName: 0 + metroLargeTileShowName: 0 + metroWideTileShowName: 0 + metroSupportStreamingInstall: 0 + metroLastRequiredScene: 0 + metroDefaultTileSize: 1 + metroTileForegroundText: 2 + metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} + metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1} + metroSplashScreenUseBackgroundColor: 0 + platformCapabilities: {} + metroTargetDeviceFamilies: {} + metroFTAName: + metroFTAFileTypes: [] + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: + XboxOneVersion: 1.0.0.0 + XboxOnePackageEncryption: 0 + XboxOnePackageUpdateGranularity: 2 + XboxOneDescription: + XboxOneLanguage: + - enus + XboxOneCapability: [] + XboxOneGameRating: {} + XboxOneIsContentPackage: 0 + XboxOneEnhancedXboxCompatibilityMode: 0 + XboxOneEnableGPUVariability: 1 + XboxOneSockets: {} + XboxOneSplashScreen: {fileID: 0} + XboxOneAllowedProductIds: [] + XboxOnePersistentLocalStorageSize: 0 + XboxOneXTitleMemory: 8 + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: + vrEditorSettings: {} + cloudServicesEnabled: {} + luminIcon: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: + luminCert: + m_CertPath: + m_SignPackage: 1 + luminIsChannelApp: 0 + luminVersion: + m_VersionCode: 1 + m_VersionName: + hmiPlayerDataPath: + hmiForceSRGBBlit: 1 + embeddedLinuxEnableGamepadInput: 1 + hmiLogStartupTiming: 0 + hmiCpuConfiguration: + apiCompatibilityLevel: 6 + activeInputHandler: 0 + windowsGamepadBackendHint: 0 + cloudProjectId: 22c40cd4-d2e8-466c-99b6-9eca59beefac + framebufferDepthMemorylessMode: 0 + qualitySettingsNames: [] + projectName: project + organizationId: yuto-arita + cloudEnabled: 0 + legacyClampBlendShapeWeights: 0 + hmiLoadingImage: {fileID: 0} + platformRequiresReadableAssets: 0 + virtualTexturingSupportEnabled: 0 + insecureHttpOption: 0 diff --git a/Plugins/Unity/project/ProjectSettings/ProjectVersion.txt b/Plugins/Unity/project/ProjectSettings/ProjectVersion.txt new file mode 100644 index 0000000..105db72 --- /dev/null +++ b/Plugins/Unity/project/ProjectSettings/ProjectVersion.txt @@ -0,0 +1,2 @@ +m_EditorVersion: 2022.3.6f1 +m_EditorVersionWithRevision: 2022.3.6f1 (b9e6e7e9fa2d) diff --git a/Plugins/Unity/project/ProjectSettings/QualitySettings.asset b/Plugins/Unity/project/ProjectSettings/QualitySettings.asset new file mode 100644 index 0000000..bcd6706 --- /dev/null +++ b/Plugins/Unity/project/ProjectSettings/QualitySettings.asset @@ -0,0 +1,239 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!47 &1 +QualitySettings: + m_ObjectHideFlags: 0 + serializedVersion: 5 + m_CurrentQuality: 5 + m_QualitySettings: + - serializedVersion: 2 + name: Very Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 15 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + skinWeights: 1 + textureQuality: 1 + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 0 + lodBias: 0.3 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + skinWeights: 2 + textureQuality: 0 + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 0 + lodBias: 0.4 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 16 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Medium + pixelLightCount: 1 + shadows: 1 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + skinWeights: 2 + textureQuality: 0 + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 1 + lodBias: 0.7 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 64 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: High + pixelLightCount: 2 + shadows: 2 + shadowResolution: 1 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 40 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + skinWeights: 2 + textureQuality: 0 + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 1 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 256 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Very High + pixelLightCount: 3 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 70 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + skinWeights: 4 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 1.5 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 1024 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Ultra + pixelLightCount: 4 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 4 + shadowDistance: 150 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + skinWeights: 255 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 2 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4096 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + m_PerPlatformDefaultQuality: + Android: 2 + Lumin: 5 + GameCoreScarlett: 5 + GameCoreXboxOne: 5 + Nintendo Switch: 5 + PS4: 5 + PS5: 5 + Stadia: 5 + Standalone: 5 + WebGL: 3 + Windows Store Apps: 5 + XboxOne: 5 + iPhone: 2 + tvOS: 2 diff --git a/Plugins/Unity/project/ProjectSettings/TagManager.asset b/Plugins/Unity/project/ProjectSettings/TagManager.asset new file mode 100644 index 0000000..1c92a78 --- /dev/null +++ b/Plugins/Unity/project/ProjectSettings/TagManager.asset @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!78 &1 +TagManager: + serializedVersion: 2 + tags: [] + layers: + - Default + - TransparentFX + - Ignore Raycast + - + - Water + - UI + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + m_SortingLayers: + - name: Default + uniqueID: 0 + locked: 0 diff --git a/Plugins/Unity/project/ProjectSettings/TimeManager.asset b/Plugins/Unity/project/ProjectSettings/TimeManager.asset new file mode 100644 index 0000000..558a017 --- /dev/null +++ b/Plugins/Unity/project/ProjectSettings/TimeManager.asset @@ -0,0 +1,9 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!5 &1 +TimeManager: + m_ObjectHideFlags: 0 + Fixed Timestep: 0.02 + Maximum Allowed Timestep: 0.33333334 + m_TimeScale: 1 + Maximum Particle Timestep: 0.03 diff --git a/Plugins/Unity/project/ProjectSettings/UnityConnectSettings.asset b/Plugins/Unity/project/ProjectSettings/UnityConnectSettings.asset new file mode 100644 index 0000000..a88bee0 --- /dev/null +++ b/Plugins/Unity/project/ProjectSettings/UnityConnectSettings.asset @@ -0,0 +1,36 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!310 &1 +UnityConnectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 1 + m_Enabled: 0 + m_TestMode: 0 + m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events + m_EventUrl: https://cdp.cloud.unity3d.com/v1/events + m_ConfigUrl: https://config.uca.cloud.unity3d.com + m_DashboardUrl: https://dashboard.unity3d.com + m_TestInitMode: 0 + CrashReportingSettings: + m_EventUrl: https://perf-events.cloud.unity3d.com + m_Enabled: 0 + m_LogBufferSize: 10 + m_CaptureEditorExceptions: 1 + UnityPurchasingSettings: + m_Enabled: 0 + m_TestMode: 0 + UnityAnalyticsSettings: + m_Enabled: 0 + m_TestMode: 0 + m_InitializeOnStartup: 1 + m_PackageRequiringCoreStatsPresent: 0 + UnityAdsSettings: + m_Enabled: 0 + m_InitializeOnStartup: 1 + m_TestMode: 0 + m_IosGameId: + m_AndroidGameId: + m_GameIds: {} + m_GameId: + PerformanceReportingSettings: + m_Enabled: 0 diff --git a/Plugins/Unity/project/ProjectSettings/VFXManager.asset b/Plugins/Unity/project/ProjectSettings/VFXManager.asset new file mode 100644 index 0000000..46f38e1 --- /dev/null +++ b/Plugins/Unity/project/ProjectSettings/VFXManager.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!937362698 &1 +VFXManager: + m_ObjectHideFlags: 0 + m_IndirectShader: {fileID: 0} + m_CopyBufferShader: {fileID: 0} + m_SortShader: {fileID: 0} + m_StripUpdateShader: {fileID: 0} + m_RenderPipeSettingsPath: + m_FixedTimeStep: 0.016666668 + m_MaxDeltaTime: 0.05 + m_CompiledVersion: 0 + m_RuntimeVersion: 0 diff --git a/Plugins/Unity/project/ProjectSettings/VersionControlSettings.asset b/Plugins/Unity/project/ProjectSettings/VersionControlSettings.asset new file mode 100644 index 0000000..dca2881 --- /dev/null +++ b/Plugins/Unity/project/ProjectSettings/VersionControlSettings.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!890905787 &1 +VersionControlSettings: + m_ObjectHideFlags: 0 + m_Mode: Visible Meta Files + m_CollabEditorSettings: + inProgressEnabled: 1 diff --git a/Plugins/Unity/project/ProjectSettings/XRSettings.asset b/Plugins/Unity/project/ProjectSettings/XRSettings.asset new file mode 100644 index 0000000..482590c --- /dev/null +++ b/Plugins/Unity/project/ProjectSettings/XRSettings.asset @@ -0,0 +1,10 @@ +{ + "m_SettingKeys": [ + "VR Device Disabled", + "VR Device User Alert" + ], + "m_SettingValues": [ + "False", + "False" + ] +} \ No newline at end of file From 72b8cec83b4a72f3d5982aa868d487851b3a2123 Mon Sep 17 00:00:00 2001 From: KirisameMarisa Date: Sun, 21 Jan 2024 10:55:08 +0900 Subject: [PATCH 17/40] moved file --- .../ProcessLinkQuery/Queries/AppBasicInfo.cs | 94 -------- .../ProcessLinkQuery/Queries/Issue.cs | 88 ------- .../Queries/IssueesRequest.cs | 56 ----- .../ProcessLinkQuery/Queries/JumpRequest.cs | 52 ----- .../ProcessLinkQuery/Queries/LogData.cs | 56 ----- .../ProcessLinkQuery/Queries/Packet.cs | 65 ------ .../Queries/PlayerPosition.cs | 71 ------ .../ProcessLinkQuery/Queries/QueryID.cs | 21 -- .../Queries/ScreenshotData.cs | 72 ------ .../Queries/ScreenshotRequest.cs | 40 ---- .../ProcessLinkQuery/Queries/Vec3.cs | 33 --- .../BocchiTracker/BocchiTrackerLocation.cs | 14 -- .../BocchiTracker/BocchiTrackerLogHook.cs | 47 ---- .../BocchiTracker/BocchiTrackerPacket.cs | 142 ------------ .../BocchiTrackerPlayerPositionUpdater.cs | 61 ----- .../BocchiTracker/BocchiTrackerSetting.cs | 24 -- .../BocchiTracker/BocchiTrackerSystem .cs | 216 ------------------ .../BocchiTracker/BocchiTrackerTcpSocket.cs | 121 ---------- 18 files changed, 1273 deletions(-) delete mode 100644 Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/AppBasicInfo.cs delete mode 100644 Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/Issue.cs delete mode 100644 Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/IssueesRequest.cs delete mode 100644 Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/JumpRequest.cs delete mode 100644 Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/LogData.cs delete mode 100644 Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/Packet.cs delete mode 100644 Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/PlayerPosition.cs delete mode 100644 Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/QueryID.cs delete mode 100644 Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotData.cs delete mode 100644 Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotRequest.cs delete mode 100644 Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/Vec3.cs delete mode 100644 Plugins/Unity/BocchiTracker/BocchiTrackerLocation.cs delete mode 100644 Plugins/Unity/BocchiTracker/BocchiTrackerLogHook.cs delete mode 100644 Plugins/Unity/BocchiTracker/BocchiTrackerPacket.cs delete mode 100644 Plugins/Unity/BocchiTracker/BocchiTrackerPlayerPositionUpdater.cs delete mode 100644 Plugins/Unity/BocchiTracker/BocchiTrackerSetting.cs delete mode 100644 Plugins/Unity/BocchiTracker/BocchiTrackerSystem .cs delete mode 100644 Plugins/Unity/BocchiTracker/BocchiTrackerTcpSocket.cs diff --git a/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/AppBasicInfo.cs b/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/AppBasicInfo.cs deleted file mode 100644 index 3b4ab70..0000000 --- a/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/AppBasicInfo.cs +++ /dev/null @@ -1,94 +0,0 @@ -// -// automatically generated by the FlatBuffers compiler, do not modify -// - -namespace BocchiTracker.ProcessLinkQuery.Queries -{ - -using global::System; -using global::System.Collections.Generic; -using global::Google.FlatBuffers; - -public struct AppBasicInfo : IFlatbufferObject -{ - private Table __p; - public ByteBuffer ByteBuffer { get { return __p.bb; } } - public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_23_5_26(); } - public static AppBasicInfo GetRootAsAppBasicInfo(ByteBuffer _bb) { return GetRootAsAppBasicInfo(_bb, new AppBasicInfo()); } - public static AppBasicInfo GetRootAsAppBasicInfo(ByteBuffer _bb, AppBasicInfo obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); } - public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); } - public AppBasicInfo __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } - - public int Pid { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } } - public string AppName { get { int o = __p.__offset(6); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } -#if ENABLE_SPAN_T - public Span GetAppNameBytes() { return __p.__vector_as_span(6, 1); } -#else - public ArraySegment? GetAppNameBytes() { return __p.__vector_as_arraysegment(6); } -#endif - public byte[] GetAppNameArray() { return __p.__vector_as_array(6); } - public string Args { get { int o = __p.__offset(8); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } -#if ENABLE_SPAN_T - public Span GetArgsBytes() { return __p.__vector_as_span(8, 1); } -#else - public ArraySegment? GetArgsBytes() { return __p.__vector_as_arraysegment(8); } -#endif - public byte[] GetArgsArray() { return __p.__vector_as_array(8); } - public string Platform { get { int o = __p.__offset(10); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } -#if ENABLE_SPAN_T - public Span GetPlatformBytes() { return __p.__vector_as_span(10, 1); } -#else - public ArraySegment? GetPlatformBytes() { return __p.__vector_as_arraysegment(10); } -#endif - public byte[] GetPlatformArray() { return __p.__vector_as_array(10); } - public string LogFilepath { get { int o = __p.__offset(12); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } -#if ENABLE_SPAN_T - public Span GetLogFilepathBytes() { return __p.__vector_as_span(12, 1); } -#else - public ArraySegment? GetLogFilepathBytes() { return __p.__vector_as_arraysegment(12); } -#endif - public byte[] GetLogFilepathArray() { return __p.__vector_as_array(12); } - - public static Offset CreateAppBasicInfo(FlatBufferBuilder builder, - int pid = 0, - StringOffset app_nameOffset = default(StringOffset), - StringOffset argsOffset = default(StringOffset), - StringOffset platformOffset = default(StringOffset), - StringOffset log_filepathOffset = default(StringOffset)) { - builder.StartTable(5); - AppBasicInfo.AddLogFilepath(builder, log_filepathOffset); - AppBasicInfo.AddPlatform(builder, platformOffset); - AppBasicInfo.AddArgs(builder, argsOffset); - AppBasicInfo.AddAppName(builder, app_nameOffset); - AppBasicInfo.AddPid(builder, pid); - return AppBasicInfo.EndAppBasicInfo(builder); - } - - public static void StartAppBasicInfo(FlatBufferBuilder builder) { builder.StartTable(5); } - public static void AddPid(FlatBufferBuilder builder, int pid) { builder.AddInt(0, pid, 0); } - public static void AddAppName(FlatBufferBuilder builder, StringOffset appNameOffset) { builder.AddOffset(1, appNameOffset.Value, 0); } - public static void AddArgs(FlatBufferBuilder builder, StringOffset argsOffset) { builder.AddOffset(2, argsOffset.Value, 0); } - public static void AddPlatform(FlatBufferBuilder builder, StringOffset platformOffset) { builder.AddOffset(3, platformOffset.Value, 0); } - public static void AddLogFilepath(FlatBufferBuilder builder, StringOffset logFilepathOffset) { builder.AddOffset(4, logFilepathOffset.Value, 0); } - public static Offset EndAppBasicInfo(FlatBufferBuilder builder) { - int o = builder.EndTable(); - return new Offset(o); - } -} - - -static public class AppBasicInfoVerify -{ - static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos) - { - return verifier.VerifyTableStart(tablePos) - && verifier.VerifyField(tablePos, 4 /*Pid*/, 4 /*int*/, 4, false) - && verifier.VerifyString(tablePos, 6 /*AppName*/, false) - && verifier.VerifyString(tablePos, 8 /*Args*/, false) - && verifier.VerifyString(tablePos, 10 /*Platform*/, false) - && verifier.VerifyString(tablePos, 12 /*LogFilepath*/, false) - && verifier.VerifyTableEnd(tablePos); - } -} - -} diff --git a/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/Issue.cs b/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/Issue.cs deleted file mode 100644 index 2859160..0000000 --- a/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/Issue.cs +++ /dev/null @@ -1,88 +0,0 @@ -// -// automatically generated by the FlatBuffers compiler, do not modify -// - -namespace BocchiTracker.ProcessLinkQuery.Queries -{ - -using global::System; -using global::System.Collections.Generic; -using global::Google.FlatBuffers; - -public struct Issue : IFlatbufferObject -{ - private Table __p; - public ByteBuffer ByteBuffer { get { return __p.bb; } } - public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_23_5_26(); } - public static Issue GetRootAsIssue(ByteBuffer _bb) { return GetRootAsIssue(_bb, new Issue()); } - public static Issue GetRootAsIssue(ByteBuffer _bb, Issue obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); } - public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); } - public Issue __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } - - public string Id { get { int o = __p.__offset(4); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } -#if ENABLE_SPAN_T - public Span GetIdBytes() { return __p.__vector_as_span(4, 1); } -#else - public ArraySegment? GetIdBytes() { return __p.__vector_as_arraysegment(4); } -#endif - public byte[] GetIdArray() { return __p.__vector_as_array(4); } - public string Summary { get { int o = __p.__offset(6); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } -#if ENABLE_SPAN_T - public Span GetSummaryBytes() { return __p.__vector_as_span(6, 1); } -#else - public ArraySegment? GetSummaryBytes() { return __p.__vector_as_arraysegment(6); } -#endif - public byte[] GetSummaryArray() { return __p.__vector_as_array(6); } - public string Assign { get { int o = __p.__offset(8); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } -#if ENABLE_SPAN_T - public Span GetAssignBytes() { return __p.__vector_as_span(8, 1); } -#else - public ArraySegment? GetAssignBytes() { return __p.__vector_as_arraysegment(8); } -#endif - public byte[] GetAssignArray() { return __p.__vector_as_array(8); } - public string Status { get { int o = __p.__offset(10); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } -#if ENABLE_SPAN_T - public Span GetStatusBytes() { return __p.__vector_as_span(10, 1); } -#else - public ArraySegment? GetStatusBytes() { return __p.__vector_as_arraysegment(10); } -#endif - public byte[] GetStatusArray() { return __p.__vector_as_array(10); } - public string Stage { get { int o = __p.__offset(12); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } -#if ENABLE_SPAN_T - public Span GetStageBytes() { return __p.__vector_as_span(12, 1); } -#else - public ArraySegment? GetStageBytes() { return __p.__vector_as_arraysegment(12); } -#endif - public byte[] GetStageArray() { return __p.__vector_as_array(12); } - public BocchiTracker.ProcessLinkQuery.Queries.Vec3? Location { get { int o = __p.__offset(14); return o != 0 ? (BocchiTracker.ProcessLinkQuery.Queries.Vec3?)(new BocchiTracker.ProcessLinkQuery.Queries.Vec3()).__assign(o + __p.bb_pos, __p.bb) : null; } } - - public static void StartIssue(FlatBufferBuilder builder) { builder.StartTable(6); } - public static void AddId(FlatBufferBuilder builder, StringOffset idOffset) { builder.AddOffset(0, idOffset.Value, 0); } - public static void AddSummary(FlatBufferBuilder builder, StringOffset summaryOffset) { builder.AddOffset(1, summaryOffset.Value, 0); } - public static void AddAssign(FlatBufferBuilder builder, StringOffset assignOffset) { builder.AddOffset(2, assignOffset.Value, 0); } - public static void AddStatus(FlatBufferBuilder builder, StringOffset statusOffset) { builder.AddOffset(3, statusOffset.Value, 0); } - public static void AddStage(FlatBufferBuilder builder, StringOffset stageOffset) { builder.AddOffset(4, stageOffset.Value, 0); } - public static void AddLocation(FlatBufferBuilder builder, Offset locationOffset) { builder.AddStruct(5, locationOffset.Value, 0); } - public static Offset EndIssue(FlatBufferBuilder builder) { - int o = builder.EndTable(); - return new Offset(o); - } -} - - -static public class IssueVerify -{ - static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos) - { - return verifier.VerifyTableStart(tablePos) - && verifier.VerifyString(tablePos, 4 /*Id*/, false) - && verifier.VerifyString(tablePos, 6 /*Summary*/, false) - && verifier.VerifyString(tablePos, 8 /*Assign*/, false) - && verifier.VerifyString(tablePos, 10 /*Status*/, false) - && verifier.VerifyString(tablePos, 12 /*Stage*/, false) - && verifier.VerifyField(tablePos, 14 /*Location*/, 12 /*BocchiTracker.ProcessLinkQuery.Queries.Vec3*/, 4, false) - && verifier.VerifyTableEnd(tablePos); - } -} - -} diff --git a/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/IssueesRequest.cs b/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/IssueesRequest.cs deleted file mode 100644 index be718ec..0000000 --- a/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/IssueesRequest.cs +++ /dev/null @@ -1,56 +0,0 @@ -// -// automatically generated by the FlatBuffers compiler, do not modify -// - -namespace BocchiTracker.ProcessLinkQuery.Queries -{ - -using global::System; -using global::System.Collections.Generic; -using global::Google.FlatBuffers; - -public struct IssueesRequest : IFlatbufferObject -{ - private Table __p; - public ByteBuffer ByteBuffer { get { return __p.bb; } } - public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_23_5_26(); } - public static IssueesRequest GetRootAsIssueesRequest(ByteBuffer _bb) { return GetRootAsIssueesRequest(_bb, new IssueesRequest()); } - public static IssueesRequest GetRootAsIssueesRequest(ByteBuffer _bb, IssueesRequest obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); } - public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); } - public IssueesRequest __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } - - public BocchiTracker.ProcessLinkQuery.Queries.Issue? Issues(int j) { int o = __p.__offset(4); return o != 0 ? (BocchiTracker.ProcessLinkQuery.Queries.Issue?)(new BocchiTracker.ProcessLinkQuery.Queries.Issue()).__assign(__p.__indirect(__p.__vector(o) + j * 4), __p.bb) : null; } - public int IssuesLength { get { int o = __p.__offset(4); return o != 0 ? __p.__vector_len(o) : 0; } } - - public static Offset CreateIssueesRequest(FlatBufferBuilder builder, - VectorOffset issuesOffset = default(VectorOffset)) { - builder.StartTable(1); - IssueesRequest.AddIssues(builder, issuesOffset); - return IssueesRequest.EndIssueesRequest(builder); - } - - public static void StartIssueesRequest(FlatBufferBuilder builder) { builder.StartTable(1); } - public static void AddIssues(FlatBufferBuilder builder, VectorOffset issuesOffset) { builder.AddOffset(0, issuesOffset.Value, 0); } - public static VectorOffset CreateIssuesVector(FlatBufferBuilder builder, Offset[] data) { builder.StartVector(4, data.Length, 4); for (int i = data.Length - 1; i >= 0; i--) builder.AddOffset(data[i].Value); return builder.EndVector(); } - public static VectorOffset CreateIssuesVectorBlock(FlatBufferBuilder builder, Offset[] data) { builder.StartVector(4, data.Length, 4); builder.Add(data); return builder.EndVector(); } - public static VectorOffset CreateIssuesVectorBlock(FlatBufferBuilder builder, ArraySegment> data) { builder.StartVector(4, data.Count, 4); builder.Add(data); return builder.EndVector(); } - public static VectorOffset CreateIssuesVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add>(dataPtr, sizeInBytes); return builder.EndVector(); } - public static void StartIssuesVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(4, numElems, 4); } - public static Offset EndIssueesRequest(FlatBufferBuilder builder) { - int o = builder.EndTable(); - return new Offset(o); - } -} - - -static public class IssueesRequestVerify -{ - static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos) - { - return verifier.VerifyTableStart(tablePos) - && verifier.VerifyVectorOfTables(tablePos, 4 /*Issues*/, BocchiTracker.ProcessLinkQuery.Queries.IssueVerify.Verify, false) - && verifier.VerifyTableEnd(tablePos); - } -} - -} diff --git a/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/JumpRequest.cs b/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/JumpRequest.cs deleted file mode 100644 index e514885..0000000 --- a/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/JumpRequest.cs +++ /dev/null @@ -1,52 +0,0 @@ -// -// automatically generated by the FlatBuffers compiler, do not modify -// - -namespace BocchiTracker.ProcessLinkQuery.Queries -{ - -using global::System; -using global::System.Collections.Generic; -using global::Google.FlatBuffers; - -public struct JumpRequest : IFlatbufferObject -{ - private Table __p; - public ByteBuffer ByteBuffer { get { return __p.bb; } } - public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_23_5_26(); } - public static JumpRequest GetRootAsJumpRequest(ByteBuffer _bb) { return GetRootAsJumpRequest(_bb, new JumpRequest()); } - public static JumpRequest GetRootAsJumpRequest(ByteBuffer _bb, JumpRequest obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); } - public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); } - public JumpRequest __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } - - public BocchiTracker.ProcessLinkQuery.Queries.Vec3? Location { get { int o = __p.__offset(4); return o != 0 ? (BocchiTracker.ProcessLinkQuery.Queries.Vec3?)(new BocchiTracker.ProcessLinkQuery.Queries.Vec3()).__assign(o + __p.bb_pos, __p.bb) : null; } } - public string Stage { get { int o = __p.__offset(6); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } -#if ENABLE_SPAN_T - public Span GetStageBytes() { return __p.__vector_as_span(6, 1); } -#else - public ArraySegment? GetStageBytes() { return __p.__vector_as_arraysegment(6); } -#endif - public byte[] GetStageArray() { return __p.__vector_as_array(6); } - - public static void StartJumpRequest(FlatBufferBuilder builder) { builder.StartTable(2); } - public static void AddLocation(FlatBufferBuilder builder, Offset locationOffset) { builder.AddStruct(0, locationOffset.Value, 0); } - public static void AddStage(FlatBufferBuilder builder, StringOffset stageOffset) { builder.AddOffset(1, stageOffset.Value, 0); } - public static Offset EndJumpRequest(FlatBufferBuilder builder) { - int o = builder.EndTable(); - return new Offset(o); - } -} - - -static public class JumpRequestVerify -{ - static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos) - { - return verifier.VerifyTableStart(tablePos) - && verifier.VerifyField(tablePos, 4 /*Location*/, 12 /*BocchiTracker.ProcessLinkQuery.Queries.Vec3*/, 4, false) - && verifier.VerifyString(tablePos, 6 /*Stage*/, false) - && verifier.VerifyTableEnd(tablePos); - } -} - -} diff --git a/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/LogData.cs b/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/LogData.cs deleted file mode 100644 index 2df4b23..0000000 --- a/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/LogData.cs +++ /dev/null @@ -1,56 +0,0 @@ -// -// automatically generated by the FlatBuffers compiler, do not modify -// - -namespace BocchiTracker.ProcessLinkQuery.Queries -{ - -using global::System; -using global::System.Collections.Generic; -using global::Google.FlatBuffers; - -public struct LogData : IFlatbufferObject -{ - private Table __p; - public ByteBuffer ByteBuffer { get { return __p.bb; } } - public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_23_5_26(); } - public static LogData GetRootAsLogData(ByteBuffer _bb) { return GetRootAsLogData(_bb, new LogData()); } - public static LogData GetRootAsLogData(ByteBuffer _bb, LogData obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); } - public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); } - public LogData __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } - - public string Log { get { int o = __p.__offset(4); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } -#if ENABLE_SPAN_T - public Span GetLogBytes() { return __p.__vector_as_span(4, 1); } -#else - public ArraySegment? GetLogBytes() { return __p.__vector_as_arraysegment(4); } -#endif - public byte[] GetLogArray() { return __p.__vector_as_array(4); } - - public static Offset CreateLogData(FlatBufferBuilder builder, - StringOffset logOffset = default(StringOffset)) { - builder.StartTable(1); - LogData.AddLog(builder, logOffset); - return LogData.EndLogData(builder); - } - - public static void StartLogData(FlatBufferBuilder builder) { builder.StartTable(1); } - public static void AddLog(FlatBufferBuilder builder, StringOffset logOffset) { builder.AddOffset(0, logOffset.Value, 0); } - public static Offset EndLogData(FlatBufferBuilder builder) { - int o = builder.EndTable(); - return new Offset(o); - } -} - - -static public class LogDataVerify -{ - static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos) - { - return verifier.VerifyTableStart(tablePos) - && verifier.VerifyString(tablePos, 4 /*Log*/, false) - && verifier.VerifyTableEnd(tablePos); - } -} - -} diff --git a/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/Packet.cs b/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/Packet.cs deleted file mode 100644 index 0474d2f..0000000 --- a/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/Packet.cs +++ /dev/null @@ -1,65 +0,0 @@ -// -// automatically generated by the FlatBuffers compiler, do not modify -// - -namespace BocchiTracker.ProcessLinkQuery.Queries -{ - -using global::System; -using global::System.Collections.Generic; -using global::Google.FlatBuffers; - -public struct Packet : IFlatbufferObject -{ - private Table __p; - public ByteBuffer ByteBuffer { get { return __p.bb; } } - public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_23_5_26(); } - public static Packet GetRootAsPacket(ByteBuffer _bb) { return GetRootAsPacket(_bb, new Packet()); } - public static Packet GetRootAsPacket(ByteBuffer _bb, Packet obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); } - public static bool VerifyPacket(ByteBuffer _bb) {Google.FlatBuffers.Verifier verifier = new Google.FlatBuffers.Verifier(_bb); return verifier.VerifyBuffer("", false, PacketVerify.Verify); } - public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); } - public Packet __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } - - public BocchiTracker.ProcessLinkQuery.Queries.QueryID QueryIdType { get { int o = __p.__offset(4); return o != 0 ? (BocchiTracker.ProcessLinkQuery.Queries.QueryID)__p.bb.Get(o + __p.bb_pos) : BocchiTracker.ProcessLinkQuery.Queries.QueryID.NONE; } } - public TTable? QueryId() where TTable : struct, IFlatbufferObject { int o = __p.__offset(6); return o != 0 ? (TTable?)__p.__union(o + __p.bb_pos) : null; } - public BocchiTracker.ProcessLinkQuery.Queries.AppBasicInfo QueryIdAsAppBasicInfo() { return QueryId().Value; } - public BocchiTracker.ProcessLinkQuery.Queries.PlayerPosition QueryIdAsPlayerPosition() { return QueryId().Value; } - public BocchiTracker.ProcessLinkQuery.Queries.ScreenshotData QueryIdAsScreenshotData() { return QueryId().Value; } - public BocchiTracker.ProcessLinkQuery.Queries.LogData QueryIdAsLogData() { return QueryId().Value; } - public BocchiTracker.ProcessLinkQuery.Queries.ScreenshotRequest QueryIdAsScreenshotRequest() { return QueryId().Value; } - public BocchiTracker.ProcessLinkQuery.Queries.JumpRequest QueryIdAsJumpRequest() { return QueryId().Value; } - public BocchiTracker.ProcessLinkQuery.Queries.IssueesRequest QueryIdAsIssueesRequest() { return QueryId().Value; } - - public static Offset CreatePacket(FlatBufferBuilder builder, - BocchiTracker.ProcessLinkQuery.Queries.QueryID query_id_type = BocchiTracker.ProcessLinkQuery.Queries.QueryID.NONE, - int query_idOffset = 0) { - builder.StartTable(2); - Packet.AddQueryId(builder, query_idOffset); - Packet.AddQueryIdType(builder, query_id_type); - return Packet.EndPacket(builder); - } - - public static void StartPacket(FlatBufferBuilder builder) { builder.StartTable(2); } - public static void AddQueryIdType(FlatBufferBuilder builder, BocchiTracker.ProcessLinkQuery.Queries.QueryID queryIdType) { builder.AddByte(0, (byte)queryIdType, 0); } - public static void AddQueryId(FlatBufferBuilder builder, int queryIdOffset) { builder.AddOffset(1, queryIdOffset, 0); } - public static Offset EndPacket(FlatBufferBuilder builder) { - int o = builder.EndTable(); - return new Offset(o); - } - public static void FinishPacketBuffer(FlatBufferBuilder builder, Offset offset) { builder.Finish(offset.Value); } - public static void FinishSizePrefixedPacketBuffer(FlatBufferBuilder builder, Offset offset) { builder.FinishSizePrefixed(offset.Value); } -} - - -static public class PacketVerify -{ - static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos) - { - return verifier.VerifyTableStart(tablePos) - && verifier.VerifyField(tablePos, 4 /*QueryIdType*/, 1 /*BocchiTracker.ProcessLinkQuery.Queries.QueryID*/, 1, false) -// && verifier.VerifyUnion(tablePos, 4, 6 /*QueryId*/, BocchiTracker.ProcessLinkQuery.Queries.QueryIDVerify.Verify, false) - && verifier.VerifyTableEnd(tablePos); - } -} - -} diff --git a/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/PlayerPosition.cs b/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/PlayerPosition.cs deleted file mode 100644 index 36b0b05..0000000 --- a/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/PlayerPosition.cs +++ /dev/null @@ -1,71 +0,0 @@ -// -// automatically generated by the FlatBuffers compiler, do not modify -// - -namespace BocchiTracker.ProcessLinkQuery.Queries -{ - -using global::System; -using global::System.Collections.Generic; -using global::Google.FlatBuffers; - -public struct PlayerPosition : IFlatbufferObject -{ - private Table __p; - public ByteBuffer ByteBuffer { get { return __p.bb; } } - public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_23_5_26(); } - public static PlayerPosition GetRootAsPlayerPosition(ByteBuffer _bb) { return GetRootAsPlayerPosition(_bb, new PlayerPosition()); } - public static PlayerPosition GetRootAsPlayerPosition(ByteBuffer _bb, PlayerPosition obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); } - public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); } - public PlayerPosition __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } - - public float X { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)0.0f; } } - public float Y { get { int o = __p.__offset(6); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)0.0f; } } - public float Z { get { int o = __p.__offset(8); return o != 0 ? __p.bb.GetFloat(o + __p.bb_pos) : (float)0.0f; } } - public string Stage { get { int o = __p.__offset(10); return o != 0 ? __p.__string(o + __p.bb_pos) : null; } } -#if ENABLE_SPAN_T - public Span GetStageBytes() { return __p.__vector_as_span(10, 1); } -#else - public ArraySegment? GetStageBytes() { return __p.__vector_as_arraysegment(10); } -#endif - public byte[] GetStageArray() { return __p.__vector_as_array(10); } - - public static Offset CreatePlayerPosition(FlatBufferBuilder builder, - float x = 0.0f, - float y = 0.0f, - float z = 0.0f, - StringOffset stageOffset = default(StringOffset)) { - builder.StartTable(4); - PlayerPosition.AddStage(builder, stageOffset); - PlayerPosition.AddZ(builder, z); - PlayerPosition.AddY(builder, y); - PlayerPosition.AddX(builder, x); - return PlayerPosition.EndPlayerPosition(builder); - } - - public static void StartPlayerPosition(FlatBufferBuilder builder) { builder.StartTable(4); } - public static void AddX(FlatBufferBuilder builder, float x) { builder.AddFloat(0, x, 0.0f); } - public static void AddY(FlatBufferBuilder builder, float y) { builder.AddFloat(1, y, 0.0f); } - public static void AddZ(FlatBufferBuilder builder, float z) { builder.AddFloat(2, z, 0.0f); } - public static void AddStage(FlatBufferBuilder builder, StringOffset stageOffset) { builder.AddOffset(3, stageOffset.Value, 0); } - public static Offset EndPlayerPosition(FlatBufferBuilder builder) { - int o = builder.EndTable(); - return new Offset(o); - } -} - - -static public class PlayerPositionVerify -{ - static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos) - { - return verifier.VerifyTableStart(tablePos) - && verifier.VerifyField(tablePos, 4 /*X*/, 4 /*float*/, 4, false) - && verifier.VerifyField(tablePos, 6 /*Y*/, 4 /*float*/, 4, false) - && verifier.VerifyField(tablePos, 8 /*Z*/, 4 /*float*/, 4, false) - && verifier.VerifyString(tablePos, 10 /*Stage*/, false) - && verifier.VerifyTableEnd(tablePos); - } -} - -} diff --git a/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/QueryID.cs b/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/QueryID.cs deleted file mode 100644 index 79b07df..0000000 --- a/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/QueryID.cs +++ /dev/null @@ -1,21 +0,0 @@ -// -// automatically generated by the FlatBuffers compiler, do not modify -// - -namespace BocchiTracker.ProcessLinkQuery.Queries -{ - -public enum QueryID : byte -{ - NONE = 0, - AppBasicInfo = 1, - PlayerPosition = 2, - ScreenshotData = 3, - LogData = 4, - ScreenshotRequest = 5, - JumpRequest = 6, - IssueesRequest = 7, -}; - - -} diff --git a/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotData.cs b/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotData.cs deleted file mode 100644 index 628ce04..0000000 --- a/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotData.cs +++ /dev/null @@ -1,72 +0,0 @@ -// -// automatically generated by the FlatBuffers compiler, do not modify -// - -namespace BocchiTracker.ProcessLinkQuery.Queries -{ - -using global::System; -using global::System.Collections.Generic; -using global::Google.FlatBuffers; - -public struct ScreenshotData : IFlatbufferObject -{ - private Table __p; - public ByteBuffer ByteBuffer { get { return __p.bb; } } - public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_23_5_26(); } - public static ScreenshotData GetRootAsScreenshotData(ByteBuffer _bb) { return GetRootAsScreenshotData(_bb, new ScreenshotData()); } - public static ScreenshotData GetRootAsScreenshotData(ByteBuffer _bb, ScreenshotData obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); } - public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); } - public ScreenshotData __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } - - public int Width { get { int o = __p.__offset(4); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } } - public int Height { get { int o = __p.__offset(6); return o != 0 ? __p.bb.GetInt(o + __p.bb_pos) : (int)0; } } - public byte Data(int j) { int o = __p.__offset(8); return o != 0 ? __p.bb.Get(__p.__vector(o) + j * 1) : (byte)0; } - public int DataLength { get { int o = __p.__offset(8); return o != 0 ? __p.__vector_len(o) : 0; } } -#if ENABLE_SPAN_T - public Span GetDataBytes() { return __p.__vector_as_span(8, 1); } -#else - public ArraySegment? GetDataBytes() { return __p.__vector_as_arraysegment(8); } -#endif - public byte[] GetDataArray() { return __p.__vector_as_array(8); } - - public static Offset CreateScreenshotData(FlatBufferBuilder builder, - int width = 0, - int height = 0, - VectorOffset dataOffset = default(VectorOffset)) { - builder.StartTable(3); - ScreenshotData.AddData(builder, dataOffset); - ScreenshotData.AddHeight(builder, height); - ScreenshotData.AddWidth(builder, width); - return ScreenshotData.EndScreenshotData(builder); - } - - public static void StartScreenshotData(FlatBufferBuilder builder) { builder.StartTable(3); } - public static void AddWidth(FlatBufferBuilder builder, int width) { builder.AddInt(0, width, 0); } - public static void AddHeight(FlatBufferBuilder builder, int height) { builder.AddInt(1, height, 0); } - public static void AddData(FlatBufferBuilder builder, VectorOffset dataOffset) { builder.AddOffset(2, dataOffset.Value, 0); } - public static VectorOffset CreateDataVector(FlatBufferBuilder builder, byte[] data) { builder.StartVector(1, data.Length, 1); for (int i = data.Length - 1; i >= 0; i--) builder.AddByte(data[i]); return builder.EndVector(); } - public static VectorOffset CreateDataVectorBlock(FlatBufferBuilder builder, byte[] data) { builder.StartVector(1, data.Length, 1); builder.Add(data); return builder.EndVector(); } - public static VectorOffset CreateDataVectorBlock(FlatBufferBuilder builder, ArraySegment data) { builder.StartVector(1, data.Count, 1); builder.Add(data); return builder.EndVector(); } - public static VectorOffset CreateDataVectorBlock(FlatBufferBuilder builder, IntPtr dataPtr, int sizeInBytes) { builder.StartVector(1, sizeInBytes, 1); builder.Add(dataPtr, sizeInBytes); return builder.EndVector(); } - public static void StartDataVector(FlatBufferBuilder builder, int numElems) { builder.StartVector(1, numElems, 1); } - public static Offset EndScreenshotData(FlatBufferBuilder builder) { - int o = builder.EndTable(); - return new Offset(o); - } -} - - -static public class ScreenshotDataVerify -{ - static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos) - { - return verifier.VerifyTableStart(tablePos) - && verifier.VerifyField(tablePos, 4 /*Width*/, 4 /*int*/, 4, false) - && verifier.VerifyField(tablePos, 6 /*Height*/, 4 /*int*/, 4, false) - && verifier.VerifyVectorOfData(tablePos, 8 /*Data*/, 1 /*byte*/, false) - && verifier.VerifyTableEnd(tablePos); - } -} - -} diff --git a/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotRequest.cs b/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotRequest.cs deleted file mode 100644 index c7219d7..0000000 --- a/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/ScreenshotRequest.cs +++ /dev/null @@ -1,40 +0,0 @@ -// -// automatically generated by the FlatBuffers compiler, do not modify -// - -namespace BocchiTracker.ProcessLinkQuery.Queries -{ - -using global::System; -using global::System.Collections.Generic; -using global::Google.FlatBuffers; - -public struct ScreenshotRequest : IFlatbufferObject -{ - private Table __p; - public ByteBuffer ByteBuffer { get { return __p.bb; } } - public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_23_5_26(); } - public static ScreenshotRequest GetRootAsScreenshotRequest(ByteBuffer _bb) { return GetRootAsScreenshotRequest(_bb, new ScreenshotRequest()); } - public static ScreenshotRequest GetRootAsScreenshotRequest(ByteBuffer _bb, ScreenshotRequest obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); } - public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); } - public ScreenshotRequest __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } - - - public static void StartScreenshotRequest(FlatBufferBuilder builder) { builder.StartTable(0); } - public static Offset EndScreenshotRequest(FlatBufferBuilder builder) { - int o = builder.EndTable(); - return new Offset(o); - } -} - - -static public class ScreenshotRequestVerify -{ - static public bool Verify(Google.FlatBuffers.Verifier verifier, uint tablePos) - { - return verifier.VerifyTableStart(tablePos) - && verifier.VerifyTableEnd(tablePos); - } -} - -} diff --git a/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/Vec3.cs b/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/Vec3.cs deleted file mode 100644 index 86d0a82..0000000 --- a/Plugins/Unity/BocchiTracker/BocchiTracker/ProcessLinkQuery/Queries/Vec3.cs +++ /dev/null @@ -1,33 +0,0 @@ -// -// automatically generated by the FlatBuffers compiler, do not modify -// - -namespace BocchiTracker.ProcessLinkQuery.Queries -{ - -using global::System; -using global::System.Collections.Generic; -using global::Google.FlatBuffers; - -public struct Vec3 : IFlatbufferObject -{ - private Struct __p; - public ByteBuffer ByteBuffer { get { return __p.bb; } } - public void __init(int _i, ByteBuffer _bb) { __p = new Struct(_i, _bb); } - public Vec3 __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } - - public float X { get { return __p.bb.GetFloat(__p.bb_pos + 0); } } - public float Y { get { return __p.bb.GetFloat(__p.bb_pos + 4); } } - public float Z { get { return __p.bb.GetFloat(__p.bb_pos + 8); } } - - public static Offset CreateVec3(FlatBufferBuilder builder, float X, float Y, float Z) { - builder.Prep(4, 12); - builder.PutFloat(Z); - builder.PutFloat(Y); - builder.PutFloat(X); - return new Offset(builder.Offset); - } -} - - -} diff --git a/Plugins/Unity/BocchiTracker/BocchiTrackerLocation.cs b/Plugins/Unity/BocchiTracker/BocchiTrackerLocation.cs deleted file mode 100644 index decf93f..0000000 --- a/Plugins/Unity/BocchiTracker/BocchiTrackerLocation.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using UnityEngine; - -namespace BocchiTracker -{ - public class BocchiTrackerLocation - { - public Vector3 Location { get; set; } - - public string Stage { get; set; } - } -} diff --git a/Plugins/Unity/BocchiTracker/BocchiTrackerLogHook.cs b/Plugins/Unity/BocchiTracker/BocchiTrackerLogHook.cs deleted file mode 100644 index ec8fdd8..0000000 --- a/Plugins/Unity/BocchiTracker/BocchiTrackerLogHook.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using UnityEngine; - -namespace BocchiTracker -{ - public class BocchiTrackerLogHook : IDisposable - { - private readonly int LOG_MAX_BUFFER = 2048; - private int bufferID = 0; - private List logBuffer; - - public BocchiTrackerLogHook() - { - Application.logMessageReceived += OnRecived; - this.logBuffer = new List { "", "" }; - } - - private void OnRecived(string logText, string stackTrace, LogType type) - { - this.logBuffer[bufferID] += logText + "\n"; - } - - public bool GetLogBuffer(out string outMessages) - { - //!< 閾値を超えた - outMessages = null; - if (this.logBuffer[bufferID].Length > LOG_MAX_BUFFER) - { - outMessages = this.logBuffer[bufferID]; - int previous_id = bufferID; - Interlocked.Exchange(ref bufferID, (bufferID + 1) % 2); - this.logBuffer[previous_id] = ""; - return true; - } - return false; - } - - public void Dispose() - { - Application.logMessageReceived -= OnRecived; - } - } -} diff --git a/Plugins/Unity/BocchiTracker/BocchiTrackerPacket.cs b/Plugins/Unity/BocchiTracker/BocchiTrackerPacket.cs deleted file mode 100644 index e86bf1e..0000000 --- a/Plugins/Unity/BocchiTracker/BocchiTrackerPacket.cs +++ /dev/null @@ -1,142 +0,0 @@ - -//!< Copyright (c) 2023 Yuto Arita - -using System.Collections.Generic; -using UnityEngine; -using BocchiTracker.ProcessLinkQuery.Queries; -using System.Xml.Linq; -using Google.FlatBuffers; - -namespace BocchiTracker -{ - /// - /// Helper class for creating various data packets using FlatBuffers. - /// - public static class CreatePacketHelper - { - /// - /// Creates a data packet for player position information. - /// - /// The player's position vector. - /// The current stage or environment identifier. - /// The created data packet. - public static List CreatePlayerPosition(Vector3 inPlayerPosition, string inStage) - { - var builder = new Google.FlatBuffers.FlatBufferBuilder(1024); - - // Create PlayerPosition object - var stage = builder.CreateString(inStage); - var playerPosition = PlayerPosition.CreatePlayerPosition(builder, inPlayerPosition.x, inPlayerPosition.y, inPlayerPosition.z, stage); - - // Create Packet object - var packet = Packet.CreatePacket(builder, QueryID.PlayerPosition, playerPosition.Value); - - builder.Finish(packet.Value); - - // Convert FlatBuffers data to byte array - byte[] packetData = builder.SizedByteArray(); - - // Prepend packet size - int packetSize = packetData.Length; - List finalPacketData = new List(); - finalPacketData.AddRange(System.BitConverter.GetBytes(packetSize)); - finalPacketData.AddRange(packetData); - - return finalPacketData; - } - - /// - /// Creates a data packet for application basic information. - /// - /// The created data packet. - public static List CreateApplicationBasicInformation() - { - int pid = System.Diagnostics.Process.GetCurrentProcess().Id; - string appName = Application.productName; - string args = System.Environment.CommandLine; - string platform = Application.platform.ToString(); - - var builder = new Google.FlatBuffers.FlatBufferBuilder(1024); - - // Create AppBasicInfo object - var appNameOffset = builder.CreateString(appName); - var argsOffset = builder.CreateString(args); - var platformOffset = builder.CreateString(platform); - - var appBasicInfo = AppBasicInfo.CreateAppBasicInfo(builder, pid, appNameOffset, argsOffset, platformOffset); - - // Create Packet object - var packet = Packet.CreatePacket(builder, QueryID.AppBasicInfo, appBasicInfo.Value); - - builder.Finish(packet.Value); - - // Convert FlatBuffers data to byte array - byte[] packetData = builder.SizedByteArray(); - - // Prepend packet size - int packetSize = packetData.Length; - List finalPacketData = new List(); - finalPacketData.AddRange(System.BitConverter.GetBytes(packetSize)); - finalPacketData.AddRange(packetData); - - return finalPacketData; - } - - /// - /// Creates a data packet for screenshot information. - /// - /// The width of the screenshot image. - /// The height of the screenshot image. - /// The raw data of the screenshot image. - /// The created data packet. - public static List CreateScreenshotData(int inWidth, int inHeight, byte[] inData) - { - var builder = new Google.FlatBuffers.FlatBufferBuilder(1024); - - // Create ScreenshotData object - var dataOffset = ScreenshotData.CreateDataVector(builder, inData); - var screenshotData = ScreenshotData.CreateScreenshotData(builder, inWidth, inHeight, dataOffset); - - // Create Packet object - var packet = Packet.CreatePacket(builder, QueryID.ScreenshotData, screenshotData.Value); - - builder.Finish(packet.Value); - - // Convert FlatBuffers data to byte array - byte[] packetData = builder.SizedByteArray(); - - // Prepend packet size - int packetSize = packetData.Length; - List finalPacketData = new List(); - finalPacketData.AddRange(System.BitConverter.GetBytes(packetSize)); - finalPacketData.AddRange(packetData); - - return finalPacketData; - } - - public static List CreateLogData(string inLog) - { - var builder = new Google.FlatBuffers.FlatBufferBuilder(1024); - - // Create ScreenshotData object - var dataOffset = builder.CreateString(inLog); - var logdata = LogData.CreateLogData(builder, dataOffset); - - // Create Packet object - var packet = Packet.CreatePacket(builder, QueryID.LogData, logdata.Value); - - builder.Finish(packet.Value); - - // Convert FlatBuffers data to byte array - byte[] packetData = builder.SizedByteArray(); - - // Prepend packet size - int packetSize = packetData.Length; - List finalPacketData = new List(); - finalPacketData.AddRange(System.BitConverter.GetBytes(packetSize)); - finalPacketData.AddRange(packetData); - - return finalPacketData; - } - } -} \ No newline at end of file diff --git a/Plugins/Unity/BocchiTracker/BocchiTrackerPlayerPositionUpdater.cs b/Plugins/Unity/BocchiTracker/BocchiTrackerPlayerPositionUpdater.cs deleted file mode 100644 index af3521c..0000000 --- a/Plugins/Unity/BocchiTracker/BocchiTrackerPlayerPositionUpdater.cs +++ /dev/null @@ -1,61 +0,0 @@ - -//!< Copyright (c) 2023 Yuto Arita - -using UnityEngine; - -namespace BocchiTracker -{ - /// - /// Monitors the player's position and sends updates to the BocchiTrackerSystem if the player's movement distance exceeds a certain threshold. - /// - public class BocchiTrackerPlayerPositionUpdater : MonoBehaviour - { - [Header("Settings")] - [SerializeField] - private float distanceThreshold = 100.0f; // Minimum distance to trigger a position update - public float DistanceThreshold => distanceThreshold; - - [SerializeField] - private string stage = ""; - public string Stage => stage; - - private BocchiTrackerSystem system; - private Vector3 previousPosition; - - void Start() - { - // Find the BocchiTrackerSystem instance in the scene - system = FindObjectOfType(); - } - - void Update() - { - if (system == null) - return; - - if (!system.IsConnect()) - return; - - Vector3 currentPosition = transform.position; - - // Calculate the distance between the current position and the previous position - float distance = Vector3.Distance(currentPosition, previousPosition); - - // Check if the movement distance exceeds the threshold - if (distance >= DistanceThreshold) - { - // Create a player position packet and send it to the BocchiTrackerSystem - var playerPositionPacket = CreatePacketHelper.CreatePlayerPosition(currentPosition, Stage); - system.BocchiTrackerSendPacket(playerPositionPacket); - - // Update the previous position to the current position - previousPosition = currentPosition; - } - - if (system.JumpRequest.TryDequeue(out var request)) - { - transform.position = request.Location; - } - } - } -} diff --git a/Plugins/Unity/BocchiTracker/BocchiTrackerSetting.cs b/Plugins/Unity/BocchiTracker/BocchiTrackerSetting.cs deleted file mode 100644 index 4487511..0000000 --- a/Plugins/Unity/BocchiTracker/BocchiTrackerSetting.cs +++ /dev/null @@ -1,24 +0,0 @@ - -//!< Copyright (c) 2023 Yuto Arita - -using UnityEngine; - -namespace BocchiTracker -{ - public class BocchiTrackerSetting : MonoBehaviour - { - [Header("Settings")] - [SerializeField] - private string serverAddress = ""; - public string ServerAddress => serverAddress; - - [SerializeField] - private int serverPort = 8888; - public int ServerPort => serverPort; - - [SerializeField] - private Camera screenshotCamera = null; - public Camera ScreenshotCamera => screenshotCamera; - - } -} diff --git a/Plugins/Unity/BocchiTracker/BocchiTrackerSystem .cs b/Plugins/Unity/BocchiTracker/BocchiTrackerSystem .cs deleted file mode 100644 index ea314df..0000000 --- a/Plugins/Unity/BocchiTracker/BocchiTrackerSystem .cs +++ /dev/null @@ -1,216 +0,0 @@ - -//!< Copyright (c) 2023 Yuto Arita - -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using Google.FlatBuffers; -using static UnityEngine.Application; - -namespace BocchiTracker -{ - /// - /// Manages communication with the BocchiTracker server and handles data packets. - /// - public class BocchiTrackerSystem : MonoBehaviour - { - public Queue JumpRequest { get; set; } = new Queue(); - - private static BocchiTrackerTcpSocket tcpSocket; - private BocchiTrackerSetting setting; - private BocchiTrackerLogHook logHook; - private bool isSentAppBasicInfo; - private Queue pendingProcessRequest = new Queue(); - - public BocchiTrackerSystem() - { - if (tcpSocket == null) - tcpSocket = new BocchiTrackerTcpSocket(); - - } - - private void Awake() - { - if (logHook == null) - logHook = new BocchiTrackerLogHook(); - } - - private async void Start() - { - setting = GetComponent(); - if (!IsConnect()) - { - isSentAppBasicInfo = false; - await tcpSocket.Connect(setting.ServerAddress, setting.ServerPort); - } - tcpSocket.ReciveCallback = this.OnReceiveData; - } - - private void OnDestroy() - { - tcpSocket.DisConnect(); - } - - private async void Update() - { - if (IsConnect()) - { - if (!isSentAppBasicInfo) - ProcessSendAppBasicInfo(); - - ProcessSendLogMessage(); - - await tcpSocket.Update(); - } - } - - private void LateUpdate() - { - if (IsConnect()) - { - if (pendingProcessRequest.TryDequeue(out object outQuery)) - { - if(outQuery is ProcessLinkQuery.Queries.IssueesRequest) - { - var request = (ProcessLinkQuery.Queries.IssueesRequest)outQuery; - for(int i = 0; i < request.IssuesLength; ++i) - { - var issue = request.Issues(i); - if (issue == null) - continue; - CacheIssueInfo(issue.Value); - } - } - else if(outQuery is ProcessLinkQuery.Queries.JumpRequest) - { - var request = (ProcessLinkQuery.Queries.JumpRequest)outQuery; - var stage = request.Stage; - var location = request.Location; - if (location == null) - return; - JumpLocation(stage, location.Value.X, location.Value.Y, location.Value.Z); - } - else if(outQuery is ProcessLinkQuery.Queries.ScreenshotRequest) - { - StartCoroutine(ProcessSendScreenshot()); - } - } - } - } - - public bool IsConnect() - { - return tcpSocket.IsConnect(); - } - - private void OnReceiveData(List inData) - { - ProcessLinkQuery.Queries.Packet packet = ProcessLinkQuery.Queries.Packet.GetRootAsPacket(new ByteBuffer(inData.ToArray())); - ProcessLinkQuery.Queries.QueryID queryID = packet.QueryIdType; - - switch (queryID) - { - case ProcessLinkQuery.Queries.QueryID.ScreenshotRequest: - pendingProcessRequest.Enqueue(packet.QueryIdAsScreenshotRequest()); break; - - case ProcessLinkQuery.Queries.QueryID.IssueesRequest: - pendingProcessRequest.Enqueue(packet.QueryIdAsIssueesRequest()); break; - - case ProcessLinkQuery.Queries.QueryID.JumpRequest: - pendingProcessRequest.Enqueue(packet.QueryIdAsJumpRequest()); break; - - default: - break; - } - } - - /// - /// Sends a data packet to the BocchiTracker server. - /// - /// The data packet to send. - public void BocchiTrackerSendPacket(List inData) - { - tcpSocket.AddSendData(inData); - } - - private void ProcessSendLogMessage() - { - string message; - if(logHook.GetLogBuffer(out message)) - { - var logDataPacket = CreatePacketHelper.CreateLogData(message); - BocchiTrackerSendPacket(logDataPacket); - } - } - - private void ProcessSendAppBasicInfo() - { - var appBasicInformationPacket = CreatePacketHelper.CreateApplicationBasicInformation(); - BocchiTrackerSendPacket(appBasicInformationPacket); - - isSentAppBasicInfo = true; - } - - private void CacheIssueInfo(ProcessLinkQuery.Queries.Issue inIssue) - { - - } - - private void JumpLocation(string inStage, float inX, float inY, float inZ) - { - if (JumpRequest.Count == 0) - JumpRequest.Enqueue(new BocchiTrackerLocation { Stage = inStage, Location = new Vector3(inX, inY, inZ) }); - } - - private IEnumerator ProcessSendScreenshot() - { - if (!IsConnect()) - yield break; - - yield return new WaitForEndOfFrame(); - - int screenWidth = Screen.width; - int screenHeight = Screen.height; - - // Capture the screenshot - RenderTexture rt = new RenderTexture(screenWidth, screenHeight, 32); - RenderTexture prev_rt = setting.ScreenshotCamera.targetTexture; - Quaternion prev_rot = setting.ScreenshotCamera.transform.rotation; - Texture2D screenShot = new Texture2D(screenWidth, screenHeight, TextureFormat.RGBA32, false); - - // Configure camera for screenshot - setting.ScreenshotCamera.targetTexture = rt; - setting.ScreenshotCamera.Render(); - setting.ScreenshotCamera.targetTexture = prev_rt; - - // Read and apply the screenshot data - RenderTexture.active = rt; - screenShot.ReadPixels(new Rect(0, 0, screenWidth, screenHeight), 0, 0); - screenShot.Apply(); - RenderTexture.active = null; - - Destroy(rt); - byte[] screenshotData = screenShot.GetRawTextureData(); - byte[] newTextureRawData = new byte[screenshotData.Length]; - - // Repack the screenshot data - for (int y = 0; y < screenHeight; y++) - { - for (int x = 0; x < screenWidth; x++) - { - int srcIndex = (screenHeight - y - 1) * screenWidth * 4 + x * 4; - int destIndex = y * screenWidth * 4 + x * 4; - - newTextureRawData[destIndex] = screenshotData[srcIndex]; - newTextureRawData[destIndex + 1] = screenshotData[srcIndex + 1]; - newTextureRawData[destIndex + 2] = screenshotData[srcIndex + 2]; - newTextureRawData[destIndex + 3] = screenshotData[srcIndex + 3]; - } - } - - // Create a screenshot data packet and send it - var screenshotDataPacket = CreatePacketHelper.CreateScreenshotData(screenWidth, screenHeight, newTextureRawData); - BocchiTrackerSendPacket(screenshotDataPacket); - } - } -} \ No newline at end of file diff --git a/Plugins/Unity/BocchiTracker/BocchiTrackerTcpSocket.cs b/Plugins/Unity/BocchiTracker/BocchiTrackerTcpSocket.cs deleted file mode 100644 index 2c5300a..0000000 --- a/Plugins/Unity/BocchiTracker/BocchiTrackerTcpSocket.cs +++ /dev/null @@ -1,121 +0,0 @@ - -//!< Copyright (c) 2023 Yuto Arita - -using System; -using System.Threading.Tasks; -using System.Collections.Generic; -using System.Net.Sockets; -using System.Net; -using UnityEngine; - -namespace BocchiTracker -{ - /// - /// Manages TCP socket communication for the BocchiTracker system. - /// - public class BocchiTrackerTcpSocket - { - public Action> ReciveCallback { private get; set; } // Callback to handle received data - - private Socket socket; // The TCP socket - private Queue> sendDataQueue = new Queue>(); // Queue for outgoing data - - public BocchiTrackerTcpSocket() - { - socket = new Socket(SocketType.Stream, ProtocolType.Tcp); - socket.Blocking = false; // Set socket to non-blocking mode - } - - /// - /// Initiates a connection to the specified IP address and port. - /// - /// The IP address to connect to. - /// The port number to connect to. - public async Task Connect(string inIPAddress, int inPort) - { - if (IPAddress.TryParse(inIPAddress, out IPAddress ipAddress)) - { - while (!IsConnect()) - { - try - { - await socket.ConnectAsync(ipAddress, inPort); - Debug.Log("Connected to server."); - } - catch { } - } - } - } - - /// - /// Disconnects the socket. - /// - public void DisConnect() - { - if(IsConnect()) - socket.Disconnect(true); - } - - /// - /// Updates the socket, processing send and receive operations. - /// - public async Task Update() - { - if (sendDataQueue.TryDequeue(out List data)) - { - await ProcessSendData(data); - } - await ProcessReceiveData(); - } - - /// - /// Adds data to the send queue for transmission. - /// - /// The data to be sent. - public void AddSendData(List inData) - { - sendDataQueue.Enqueue(inData); - } - - private async Task ProcessSendData(List inData) - { - if (!IsConnect()) - return; - - int bytesSent = await socket.SendAsync(inData.ToArray(), SocketFlags.None); - if (bytesSent > 0) - { - Console.WriteLine("Data sent successfully: " + bytesSent + " bytes"); - } - else - { - Console.WriteLine("Failed to send data."); - } - } - - private async Task ProcessReceiveData() - { - if (!IsConnect()) - return; - - byte[] receivedData = new byte[1024]; - int bytesRead = await socket.ReceiveAsync(receivedData, SocketFlags.None); - if (bytesRead > 0) - { - Console.WriteLine("ProcessReceiveData::Success, size=" + bytesRead); - List receivedDataList = new List(receivedData); - receivedDataList.RemoveRange(bytesRead, receivedData.Length - bytesRead); - ReciveCallback?.Invoke(receivedDataList); - } - } - - /// - /// Checks if the socket is currently connected. - /// - /// True if the socket is connected, otherwise false. - public bool IsConnect() - { - return socket != null && socket.Connected; - } - } -} \ No newline at end of file From b704a9e818f8b9cd84e4102427af19473c0efeb1 Mon Sep 17 00:00:00 2001 From: KirisameMarisa Date: Sun, 21 Jan 2024 10:56:08 +0900 Subject: [PATCH 18/40] delete files --- .../Unity/BocchiTracker/BocchiTracker.csproj | 29 ------------------- Plugins/Unity/BocchiTracker/BocchiTracker.sln | 25 ---------------- .../Unity/BocchiTracker/PostBuildAction.py | 19 ------------ Plugins/Unity/BocchiTracker/package.json | 25 ---------------- 4 files changed, 98 deletions(-) delete mode 100644 Plugins/Unity/BocchiTracker/BocchiTracker.csproj delete mode 100644 Plugins/Unity/BocchiTracker/BocchiTracker.sln delete mode 100644 Plugins/Unity/BocchiTracker/PostBuildAction.py delete mode 100644 Plugins/Unity/BocchiTracker/package.json diff --git a/Plugins/Unity/BocchiTracker/BocchiTracker.csproj b/Plugins/Unity/BocchiTracker/BocchiTracker.csproj deleted file mode 100644 index 3a3e170..0000000 --- a/Plugins/Unity/BocchiTracker/BocchiTracker.csproj +++ /dev/null @@ -1,29 +0,0 @@ - - - - netstandard2.1 - - - - - ..\ThirdParty\flatbuffers\Google.FlatBuffers.dll - - - ..\ThirdParty\Unity\UnityEditor.dll - - - ..\ThirdParty\Unity\UnityEngine.dll - - - - - - Always - - - - - - - - diff --git a/Plugins/Unity/BocchiTracker/BocchiTracker.sln b/Plugins/Unity/BocchiTracker/BocchiTracker.sln deleted file mode 100644 index 93ed5de..0000000 --- a/Plugins/Unity/BocchiTracker/BocchiTracker.sln +++ /dev/null @@ -1,25 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.6.33815.320 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BocchiTracker", "BocchiTracker.csproj", "{42475F6E-5845-4600-BC08-F9BBD2E9F5D5}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {42475F6E-5845-4600-BC08-F9BBD2E9F5D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {42475F6E-5845-4600-BC08-F9BBD2E9F5D5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {42475F6E-5845-4600-BC08-F9BBD2E9F5D5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {42475F6E-5845-4600-BC08-F9BBD2E9F5D5}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {C7CF6113-3F79-4B1E-B5BE-842608258EC9} - EndGlobalSection -EndGlobal diff --git a/Plugins/Unity/BocchiTracker/PostBuildAction.py b/Plugins/Unity/BocchiTracker/PostBuildAction.py deleted file mode 100644 index 60e9f62..0000000 --- a/Plugins/Unity/BocchiTracker/PostBuildAction.py +++ /dev/null @@ -1,19 +0,0 @@ -import os -import shutil -import sys -from pathlib import Path - -if len(sys.argv) != 3: - print("Usage: python script.py $(OutDir) $(SolutionDir)") - sys.exit(1) - -cOutDir = Path(sys.argv[1]) -cSolutionDir = Path(sys.argv[2]) -cVisualStudioArtifactFiles = ["BocchiTracker.dll", "package.json"] -cArtifactDir = cSolutionDir / ".." / "Artifact" - -os.makedirs(cArtifactDir, exist_ok=True) -for file in cVisualStudioArtifactFiles: - src_path = cOutDir / file - dest_path = cArtifactDir / file - shutil.copy2(src_path, dest_path) \ No newline at end of file diff --git a/Plugins/Unity/BocchiTracker/package.json b/Plugins/Unity/BocchiTracker/package.json deleted file mode 100644 index 44cbee0..0000000 --- a/Plugins/Unity/BocchiTracker/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "com.kirisamemarisa.bocchitracker", - "version": "1.0.0", - "displayName": "BocchiTracker", - "description": "BocchiTracker is a bug reporting tool that allows you to report issues to various services.", - "unity": "2022.3", - "unityRelease": "6f1", - "documentationUrl": "https://github.com/KirisameMarisa/BocchiTracker/tree/master/Documents", - "changelogUrl": "", - "licensesUrl": "https://github.com/KirisameMarisa/BocchiTracker/blob/master/LICENCE.txt", - "dependencies": { - - }, - "keywords": [ - "bocchi", - "tracker", - "bug", - "issue", - "report" - ], - "author": { - "name": "YutoArita", - "url": "https://github.com/KirisameMarisa/BocchiTracker" - } -} \ No newline at end of file From 77bb2e170c3d406b768cb0c58dc45cc1c3e4b219 Mon Sep 17 00:00:00 2001 From: KirisameMarisa Date: Sun, 21 Jan 2024 10:56:35 +0900 Subject: [PATCH 19/40] delete file --- Plugins/Unity/ThirdParty/Unity/Setup.bat | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 Plugins/Unity/ThirdParty/Unity/Setup.bat diff --git a/Plugins/Unity/ThirdParty/Unity/Setup.bat b/Plugins/Unity/ThirdParty/Unity/Setup.bat deleted file mode 100644 index 64143be..0000000 --- a/Plugins/Unity/ThirdParty/Unity/Setup.bat +++ /dev/null @@ -1,7 +0,0 @@ -echo -set /p Unity="where is unity dll dir? : " - -copy /B /Y %Unity%\UnityEditor.dll %~dp0\UnityEditor.dll -copy /B /Y %Unity%\UnityEngine.dll %~dp0\UnityEngine.dll - -pause From e54a9f93ae292f91a207c2777a063fb8d4bbbfc6 Mon Sep 17 00:00:00 2001 From: KirisameMarisa Date: Sun, 21 Jan 2024 11:13:37 +0900 Subject: [PATCH 20/40] update unity plugin --- .gitignore | 33 ++++++++++++++++-- .../BuildScripts/build_flatbuffers_csharp.py | 6 ++-- Plugins/Unity/Artifact/BocchiTracker.dll | Bin 35840 -> 0 bytes Plugins/Unity/Artifact/artifact_here.txt | 0 Plugins/Unity/Artifact/package.json | 25 ------------- .../project/Assets/BocchiTracker/Editor.meta | 8 ----- .../BocchiTrackerSetting.cs | 0 .../BocchiTrackerSetting.cs.meta | 2 +- .../project/Assets/Scenes/GenUnityPackage.cs | 6 ++-- 9 files changed, 35 insertions(+), 45 deletions(-) delete mode 100644 Plugins/Unity/Artifact/BocchiTracker.dll create mode 100644 Plugins/Unity/Artifact/artifact_here.txt delete mode 100644 Plugins/Unity/Artifact/package.json delete mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Editor.meta rename Plugins/Unity/project/Assets/BocchiTracker/{Editor => Runtime}/BocchiTrackerSetting.cs (100%) rename Plugins/Unity/project/Assets/BocchiTracker/{Editor => Runtime}/BocchiTrackerSetting.cs.meta (83%) diff --git a/.gitignore b/.gitignore index a9259dc..409abca 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ Artifact/ *.obj *.yaml *.dblite +*.unityproj launchSettings.json Plugins/UnrealEngine/BocchiTracker/Content @@ -15,6 +16,32 @@ Plugins/UnrealEngine/BocchiTracker/Binaries Plugins/UnrealEngine/BocchiTracker/Intermediate Plugins/UnrealEngine/ThirdParty/flatbuffers/include Plugins/UnrealEngine/ThirdParty/flatbuffers/lib -UnityEditor.dll -UnityEngine.dll -Google.FlatBuffers.* \ No newline at end of file +Google.FlatBuffers.* + +### Unity ### +# This .gitignore file should be placed at the root of your Unity project directory +# +# Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore +Plugins/Unity/project/[Ll]ibrary/ +Plugins/Unity/project/[Tt]emp/ +Plugins/Unity/project/[Oo]bj/ +Plugins/Unity/project/[Bb]uild/ +Plugins/Unity/project/[Bb]uilds/ +Plugins/Unity/project/[Ll]ogs/ +Plugins/Unity/project/[Uu]ser[Ss]ettings/ +Plugins/Unity/project/*sln +Plugins/Unity/project/*csproj + + +*.pidb.meta +*.pdb.meta + +sysinfo.txt + +# Builds +*.apk +*.unitypackage + +# Autogenerated files +InitTestScene*.unity.meta +InitTestScene*.unity \ No newline at end of file diff --git a/ExternalTools/BuildScripts/build_flatbuffers_csharp.py b/ExternalTools/BuildScripts/build_flatbuffers_csharp.py index dc9d14d..1214030 100644 --- a/ExternalTools/BuildScripts/build_flatbuffers_csharp.py +++ b/ExternalTools/BuildScripts/build_flatbuffers_csharp.py @@ -13,10 +13,8 @@ def Build(): print("Copying flatbuffers to Unity directory...") artifact = config.cFlatBuffersPath / "net" / "FlatBuffers" / "bin" / "Release" / "netstandard2.1" - unity_thirdparty_path = config.cUnityPath / "ThirdParty" / "flatbuffers" - unity_plugin_artifact_path = config.cUnityPath / "Artifact" - shutil.copytree(artifact, unity_thirdparty_path.resolve(), dirs_exist_ok=True) - shutil.copytree(artifact, unity_plugin_artifact_path.resolve(), dirs_exist_ok=True) + unity_external_packages_path = config.cUnityPath / "ThirdParty" / "flatbuffers" + shutil.copytree(artifact, unity_external_packages_path.resolve(), dirs_exist_ok=True) if __name__ == '__main__': Build() \ No newline at end of file diff --git a/Plugins/Unity/Artifact/BocchiTracker.dll b/Plugins/Unity/Artifact/BocchiTracker.dll deleted file mode 100644 index ad5ecfcea404601f0e11c8db207ee4ecc01707a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35840 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 diff --git a/Plugins/Unity/Artifact/artifact_here.txt b/Plugins/Unity/Artifact/artifact_here.txt new file mode 100644 index 0000000..e69de29 diff --git a/Plugins/Unity/Artifact/package.json b/Plugins/Unity/Artifact/package.json deleted file mode 100644 index 44cbee0..0000000 --- a/Plugins/Unity/Artifact/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "com.kirisamemarisa.bocchitracker", - "version": "1.0.0", - "displayName": "BocchiTracker", - "description": "BocchiTracker is a bug reporting tool that allows you to report issues to various services.", - "unity": "2022.3", - "unityRelease": "6f1", - "documentationUrl": "https://github.com/KirisameMarisa/BocchiTracker/tree/master/Documents", - "changelogUrl": "", - "licensesUrl": "https://github.com/KirisameMarisa/BocchiTracker/blob/master/LICENCE.txt", - "dependencies": { - - }, - "keywords": [ - "bocchi", - "tracker", - "bug", - "issue", - "report" - ], - "author": { - "name": "YutoArita", - "url": "https://github.com/KirisameMarisa/BocchiTracker" - } -} \ No newline at end of file diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Editor.meta b/Plugins/Unity/project/Assets/BocchiTracker/Editor.meta deleted file mode 100644 index 5dce192..0000000 --- a/Plugins/Unity/project/Assets/BocchiTracker/Editor.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 7cd851046e10973409d68f14345de333 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Editor/BocchiTrackerSetting.cs b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerSetting.cs similarity index 100% rename from Plugins/Unity/project/Assets/BocchiTracker/Editor/BocchiTrackerSetting.cs rename to Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerSetting.cs diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Editor/BocchiTrackerSetting.cs.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerSetting.cs.meta similarity index 83% rename from Plugins/Unity/project/Assets/BocchiTracker/Editor/BocchiTrackerSetting.cs.meta rename to Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerSetting.cs.meta index 78a2eaf..6bfcf43 100644 --- a/Plugins/Unity/project/Assets/BocchiTracker/Editor/BocchiTrackerSetting.cs.meta +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerSetting.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a8288513fdd336441b4c49f0129e33d2 +guid: 185bdc4ad8bc5cd48b48c8ad85703eeb MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Plugins/Unity/project/Assets/Scenes/GenUnityPackage.cs b/Plugins/Unity/project/Assets/Scenes/GenUnityPackage.cs index a31af81..a28025d 100644 --- a/Plugins/Unity/project/Assets/Scenes/GenUnityPackage.cs +++ b/Plugins/Unity/project/Assets/Scenes/GenUnityPackage.cs @@ -1,14 +1,12 @@ using System.Collections; using System.Collections.Generic; +using System.IO; +using UnityEditor; using UnityEngine; public class GenUnityPackage { public static void Export () { - var dir = new FileInfo(exportPath).Directory; - if (dir != null && !dir.Exists) { - dir.Create(); - } AssetDatabase.ExportPackage("../../Artifact", "BocchiTracker/BocchiTracker.unitypackage", ExportPackageOptions.Recurse); } } From bcc86f997d0bc25132587bc975e24ffcfe37aa18 Mon Sep 17 00:00:00 2001 From: KirisameMarisa Date: Sun, 21 Jan 2024 11:45:42 +0900 Subject: [PATCH 21/40] add asmdef --- .../Runtime/BocchiTrackerPlugin.asmdef | 14 ++++++++++++++ .../Runtime/BocchiTrackerPlugin.asmdef.meta | 7 +++++++ .../BocchiTracker/Runtime/BocchiTrackerSetting.cs | 2 +- 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPlugin.asmdef create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPlugin.asmdef.meta diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPlugin.asmdef b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPlugin.asmdef new file mode 100644 index 0000000..853d603 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPlugin.asmdef @@ -0,0 +1,14 @@ +{ + "name": "BocchiTrackerPlugin", + "rootNamespace": "", + "references": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPlugin.asmdef.meta b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPlugin.asmdef.meta new file mode 100644 index 0000000..1e83260 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerPlugin.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0ab4a9fd5f429b04a9cbdb409ec5f34a +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerSetting.cs b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerSetting.cs index 4487511..deed37e 100644 --- a/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerSetting.cs +++ b/Plugins/Unity/project/Assets/BocchiTracker/Runtime/BocchiTrackerSetting.cs @@ -9,7 +9,7 @@ public class BocchiTrackerSetting : MonoBehaviour { [Header("Settings")] [SerializeField] - private string serverAddress = ""; + private string serverAddress = "127.0.0.1"; public string ServerAddress => serverAddress; [SerializeField] From 20d61d5cd929a7450b746ac362a3f9f63f52828f Mon Sep 17 00:00:00 2001 From: KirisameMarisa Date: Sun, 21 Jan 2024 11:51:29 +0900 Subject: [PATCH 22/40] remove --- .../windows/bocchitracker_binding_debug.dll | Bin 818176 -> 0 bytes .../windows/bocchitracker_binding_debug.exp | Bin 815 -> 0 bytes .../windows/bocchitracker_binding_debug.lib | Bin 2128 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Plugins/Godot/project/addons/bocchi_tracker_godot/bin/windows/bocchitracker_binding_debug.dll delete mode 100644 Plugins/Godot/project/addons/bocchi_tracker_godot/bin/windows/bocchitracker_binding_debug.exp delete mode 100644 Plugins/Godot/project/addons/bocchi_tracker_godot/bin/windows/bocchitracker_binding_debug.lib diff --git a/Plugins/Godot/project/addons/bocchi_tracker_godot/bin/windows/bocchitracker_binding_debug.dll b/Plugins/Godot/project/addons/bocchi_tracker_godot/bin/windows/bocchitracker_binding_debug.dll deleted file mode 100644 index a5fd076d398f700cdda2b88e494f323fc042d036..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 818176 zcmeFa33yaR)<4`K3lRt%l!hQ8QKAN;*c#L@jnZw>a9g?|3IUWY4iMvjh>&Ix&|oJ* zd+iao!EqeHZE%?xm=Pu5marsYO+XQFBZ^AJh=3r3wg10!>fY|#od%cp{XgILJAH1qojP^4I(1Inx}G~1n&M3+Qv&`E22G|4{L()=|2_AgX54PyeRX@&iu1NyQW59g za>>x*d#0sNnR?&dQ}4PrecWA>C*N0+{>KUFQ@xYZ@0pyQH+V?;z4wiu&?_aSO@;=# zciR3VQ)c;=>i^G*OIM3X6%i=}b&L*-T`le`=LHKnFVBJ%A*JSrRMKP|6iO@pPaX$sopcWP_; z9KWG|_I9SnZVz3VOiS9C%Ep^aQ)VQaE;3YyiZhcZQSFX3$+U|Ye3pN` zN+!%K!M(qoj}Z~dG?kIqc-Wkp_emf*K?`dmttCg!s9MNAK9uY_W3thy;=1&NzK=F^tNFEL> z(pRP9aWS5-P@BVu90oA-Lon%|hRDyd_5^-3M2?}TBXWU;$THNeDn%=i!eDnPYRX&G zQnkECKUv$9suS@_`Sy}tN}%Hog0IXwL25KLP4TU{!mT=*U0JnCz|pMun!C>!>QZaP zndwBQZW9SWz(>$Qt_gJIPb{Jz+pZEzk-2*rfkUND@vTiprS}Mi@1fzVqcW_ZLHgLn zD<4QS1udDEB$*aU_H4#8jpig%V=C^TJUSKS1eCSgo0(pUza%4-h-P)D2hA%_DC%yf zt;(BJI%|rlWQyXORh%#_S*dXplOa%Vvnt0v^?e;L3g?(itEoy+H;IpCZtOseMrGD!gQvhCcf4U)X83_0B)g66^aVP4=H|kMvmeinvw5D{fHX$ z0(>y`yo^kG((Y2XDFJszrnn1Ys;J=MPP(>=YcGg1Ep)4E6}4Vbw~F(Z#F?ly8BZlJ zC|OZ=h+dD8)Two%oSs$GEn*G|idwCx?ulvO=#hjumg zUuERCiduTyg&}^3f}*YuA-@bd1mveU#^~tl_&bIx^L|)Blu#3|4G&_92dbrh@0Mg& zi0p+#_F_d{k_-)V!{L4&c2H#!h$AvEc3b*mf^ z;rf;wk(Jot0y|vlPOQ$C$O^k;_fG{k3f@$qE}i)`8umk9$+WTecK?ya&Q2 zB2t?+Z&uFM{$($>Pg88?Zcp|$WIxg!r8B#L0Z=N^MepU%r(6tfCk=WVXbQ|$r!z^q zio~gjrqbD6OeLRbLoLBjeK2E29C>J@^6C$o4*j=_rbEtVa7R%;%|7b)F1NKYmqVH% zV3wSVY0mN-6s6zr9AUXaRtPaztLP*v8pIf?@Ovxp_8Tf2 zLfLAZyJ%XdaW03eho6dWG=@My12M1-~=>!PwXYN2n=qAi*@1?T&T{?{sA3Pm4>Q%v6icL`3IzPpRe%a zz`dzG_(sF|8iindQ>$PrMfEh3GSu^=^?b%cLJVpSC12Z;zPG3S0)2N~q|rBhucU8{ ztPtYB*RtXrSAUgU81zjr(l-;28|j;jv4SH>M*1dbz#GK( zDY6?O76P)Q?HC^&5kcQqG~f;5QLQ9|m9z&C4vOhi7fIh9xEZ2vCtO6)H=e6P^!*011W@Zl z7CU_kF3VVg8i#t^qc+g=WOZZ0Rm*r< zr+Em*bwx&I9GTh^iM#&sqq#3b$md@ysTp`b#SsP z%dAwq`3C>HQaJ{=pDI-+p>AuHD$!4g-<4-O{2+iN7=VmLdnJ(QoPtrJ`*e38<@NjG zOsmrfY=CBn$1-TP5)&sTniiG^AH2$?cFdreQ4xiciNWwr^k>X~0tV2%BLLErp0&r3 z^`$aytrBPlKL^I7Bb-eQ;HA`M;CY7b%s!guzd=!N3VZ@O=}+X}A7@f)9f4upf;-D9 zODzA5BiK_!F$F}JC3+(ci%(}r}3UbKt;eYM&`(RBy|Oo_+c zmQ;K7Pb4CbWh?;+dH%;7gZZDNg64n6Xve6KYZLY-9bx&YrG{#v=Yo*@EJuxJTqC(P z>{pH;e+^?RV{u_$#tj+D0b||pBNVs#N(QaCJ?d$f?{ur_9UW4P9FQZTP@@Ys-=~rz zYrhMFh8(rah!Ug|N)_4d8YxK4wgV3m7!srqm{tG-NjeDv>XI}TWt}G96I)BsKwNSU zBq{qS@t&?7S*Np3E8}Y1fvfDUs&C_!KpEG&vqWHWD>r9=>d7cJolg?$ir=Bce?+(6U<60?#oWF&O$k;jzWs6D z*Uaz0BU}KVoH|s9aB%nBaM~d%(8-}0BS;3JCkB9lK*^AK~Li}Dr&HvwKFD#S7T%HBm>s$`o3)|f-?1lAD8j~Oi zY*Y3y*VtaHL-E}9;wL=O!d{HtZm<{W;0fD{gh+dlgO+Er7jE2(vKJ)PY#c~hMq!|A zFYHuR*wS9yLu0}%&0e$vJk4Gl;^AU+h2rQSt=2BoFQfo{gu5-N<}He}7yp|48|?+D zJ?up{b4Y$@!DzG>`D8C3&6tVkS(p)+h!q*H;ey28PWECswPAaa7-26GL7K+FxcNSn zez(0~Fv-+=AaN52sN0KcP}XU(pVVpzdJ%`lhwKGi$Fdhx&-NnmT=wE>X)iS4d+BcC zi8L9*Bp0O zH{|?4rQgkO2BXanpMmT;zx$!A^Sg-%LMs6gH!j3)x{k$fs%L)3pNrq2`C+DbdqSAm z_b}t3movp66r(x)C?gof>B#xv9Gw0E)`K{Gq)6v9CNyne&;C(zx&hep`iGo@dFzOU zF*q$l0y@8?H@Spbs)_yDhPX|X@TgxQc;lueE_}Wf876QuJBWyd)qk_1cI$&EsY_Lo zg$X=YYXid*f*--1y3p0myUXHtE zpOtjfeJXZ9Yx*barqb$C2PF$DDCet7LYLK>smu1_&!|yrSDy#C+-I80ce6?BbEa4V zrugcTLp>%-CvK)#i5uw7;KLCFva;y}RRK0`U~MHeOQ&kg&|4hAovhBdp@@RIahFRo%2si7C(%{1i8yluToiC-33_GDgq<{d!H{9YL;hJ{QpOmKA{)tFjebtsd#xDb!ZPU-(G?a zKSYO1MFnm}j8JprrL+}1&d}Eat9f;$5Lxs&O!k>9x<&Qb#pQc2IW)*?0NA|xz1Aq%wxql#3A6+G7&EYzY})`?Ux20S30=*D#H z2AxP{ozN!c`!K#}y+~!f&>naY55$rjeF>PuqLTx9NIP{gcMQIMiz*`v4RS-~qw^R$*EohHlyRj)@^XpAFuds`er%O zUnN&nV*zHupLE#w6n{#R$x(3)^&PPM6Bo!Ay^kNUYpcoB)EYUeWoSjw4Wwl_xxwox z^qo$9tC-nR)+Z-XN=*q2K~T7@5>S%O9a@RK_hKA@#9g>a-7|!A3BgXdhufFOZ2z)s zzdS~JfPI~+YaFRS9N-J^eKO>gXH=w_iFG!fqWQ()WMvq;9j1H*t6B(qLLM!@4oY7uZyZ%{G^#>Ig< z6Qz$vA@i?sL4kjOV2HJ1-WmLPk(Sbb1NF8fSOjY72-uya%#hspz0mqhhR{D`Xw z)wTq9lenLC41}{2)fCF2R{Tx22Jc`%a`zy-HEf zQ-W(kiCs$SQgYXr*u8`jyO#l$Qj;s?vL=_aMp&2-_eQP_S{{y1()gFE$x|0fU#cK# z4RH=!>I&ACWRpx;L-}8@E-)}vBpgHTHI1LzB;FlCVzNgm4|?~IxWE>)*KUr2?69~j z!ZR$tqcS4;Lk|GIHF$uba;~dN_@>;tKSa zU5N~r;wRnckLEfq7<_pv8hmVg%w_XwTr}zkoH~qzNKg!kGE#0e$q+Jw`@`4~4-ki~ zI)T{P8W}sQM-cROrRwYW5X$h)nPKj%Dp$acA~Nwk+-enJegE)tVO(8%7esAHf)urZJsX=DDwav96UtZ!?u zF$;OFO1T4dq6GfV|IEg`w26iQ8`F503kjkD1!-f7Mrk%?P%;}CmozeiQH``~a$}#E zR;Ct{L&(bPr70zlauskEHBeC9%CrTHg~XxQRtALn52S`SI#eY$?tyb>;D%c_ zP>+kx$HbYAuEkn#bukmMPJB6(lzS8@Lk+Pf!hGrc3?z;ucECjW22;c_!U=>vs`C+~Kc-w`q^UUH$M zViBBHQ1k<$eITVZWGiS{bvn`Hdnn&T_x~#IzaZ})Yfbn6iu-x$3~Tj(!Z=v%ZYsj- zb)pHuJ-DB%DO=~v-au8Ep9h2Xvi;s9d(M4RO2#X`hl=B9|IPr4L77(5AA0PP5%>)b zw!h2kJavE_mB9hlB6t*efguU@1(}%SVXf@q*l=nw7*i;&Sd<4~&&~ks*%`}wcE%2M zU>gHKUd*6J(PTR*BOkUOTQMMewDCflRio`mXlW0Rs&rPNi8fp8_JRVhOA0(sED5B{ zh0P0E7M)5oIo>C9-F+q&PfKw7Cl;$ipctF99Z6e(s7u{JvY3lvUfe`0*{58%OqHkL zuh{*W=9Rfa^VD(HB41^zB8P2#k;8n;dh^O=-g#6WEa^a-6*h?k8gkFs_PE&qKM+CM z8aO3RM9LiMsjM^euroH!G!jNa)8Im;!4D@|(7++#v|%`#ai8J%YB0YMEqcc_4u%<~QSbod(>*$gVg=5 zL{oWXNun$Mbkl#a$xZ#yk+m+*KhCPe<=Sl%tzL^JkpCSDl+;|spXrX92n89E`kp{`Tnhh&m}TIkC9*ncG{&xq>WLOec-UDotaxKi%d2ya?q%SU>HtuU}KjjTQf z12Y;n1C;s)^JK(v7?{}+2IeMt|1W$$2ls&?R<*gnZ#}l|6oVD5T(-*TSpDS|V-F@= z%vGd+JiVBm82>lL(3Rj(?{e%z;yV{yI4$hX_5_9FYM57(3 zMjLgu6-%=uwZ?XAdN)VKqf$uSvL7!C;Q;glmPJFVm&2efj&lJhgvmkdzveBDS!W0l zUkz)4KL@t9q#px8pJZqyM!fAww@kf_fR^fjNb(7k9}7HvqgQqAU0Ar%eBWZShvyKU z?|54#PvWumX0AgQ>PRa%kYGDG9dy>mPdXn+@iLtU97{B1?Fr;!9B1v%_k%*-YPxvx zAbiV!W#XlJ0fF1Kx_q$&brk#0M2)ufG2k(Y-8;w$ zJ{WSe3&jAL4zyehemeq#ip34L!SSPA!FkBP1#Vi5dId^6(+x%-W+5JFO}l-N{Y(z$`NrUY_34Qal`jc1UycmSrXb8`sF^0%Xjrd7ot zr1&rLnmP}N_z&pBKM$y(FAzV7jdZ_(__gFK&=$JHYV6P?;;*L6C(*gQ05s7ra=;2n z{>dn5p9Rne*6o^%M* z?@#cJ)IUuU$kgBTuIxHsIi%I)iVHTzpgvK2Ey_lUKlPDO>e1`%10}_K{;X5n z4mF5L@kQV16c3>E8z}x~a(kHKz54-eqBtchh~gIv1sU{XZH3l#6nShb*drB714`POKPztCT&`13zXihoS-jTCCL+p;EeZ~3*r zk;qFnh{(I*c8poSxEr*VVf51p1$=i^tllRLeN#0HX zfvN8rsInyLt1EfTmTp>&RXl|n&13-uvcZl5ekLDVh$$biW))vj8h!>zJSr!N_X%;7 z#*4R5Vrh7T3ZggGKb#mKnPA4sJvX&t<4ooZfqaPDpt)U?Fd)m{k4Ov^5wBsWYBg4I z=$&W`7sE+}Vn___B0Y@Z4iqJZT^TT8*nxYa`Hu?X$zd9Xj#WG{14&Gk*kg#j^x`rd zNxS&;EAE8wtwRxHObsD91}Fgm%NZy!b!Qds7D%3e=Vm~1Hi<4hJ5yLgNKR+Kgybad z4M>iog4hopFc}@IT0wJ(l3^rEXK0kPi|e@=peo`@hGp?-C@Esq+Y-t9Lr5+~O(d@i zB9Z(=5}%M%N&NtLlGxTDOXEciO3dpIs34RulJTZ!BtM%TLUJKDV^O%^&JpsX) zR1mGg2qv{a@EN>K!BS%vw{kNkT0aJ55r-rd^TpP;B!Zu4HCFK+Y77W27ZY#eM|7R} zLDJn*D_$bWrH%iMUvgoEXh4D4ypsyzF35;R!PXjr`5}clQW8S&b#4X(^Ti7c$}(0% zXN0&~L(mgKuxliOyTrzP1A_TtpoZW<5hoG+Mkox`^SS89J%NHZP(f6J_8Ni-8iJS% zcvDxc7@{MXFOs<#5F8;+e?jE&q*1o?5GH+h;CW7VyVQ}$LQKnaVMXRr_tN@VX3(=M zBhov@^%T}p0n16m(^h4ocX7Ux<{S0_?KI!?;PqUsxDq*ixR`I@K}9Ar!;2>*Ji-?o z=Uo$uq|30cjMuwV1g4R1z?(A24RE@OW3-L$qf_~y_IJ4!=hrLI^CdqRa#XlJ5151o zCE=?nkNwcrG(k}lF2gjXuVCBNstIlSBp!dVt?8i@G!!Vv&@g<qXqhuS-kcq#JMEAYb6 z^qa(%o9OvkqH71l=B`kD4GoH)@-pi(ksc}%w6sJfrJbT~q`JoE(E!w?+oBk2m=HbG zjg9MYFLbTvL(^!{nNC~&`OU_BmwMbqZ`^&4_#)m$vx6+aV57*g^J{+iOG88819P}l zQOkJ8EL|Y2iTr4uDtA-UTU+XoLUQ8g)zRdPx93LDcJN6VQz(Kn6DZ~zLiC|{=dZ=* zZ~cBRKG)&}tN(p`+Wu~Qp4k3>1E1M9|6ckyKK{RfPt#4m7oQh-jr@!96P?;8iLx8= z`!^%ZW-h}l4{`3!dANU4xzB7pzmLV@po0i}aB82E{jhT#e}n=CQoc9Ra5%Dv@6 z)LUa?0O$7+7V{5CM&M1)@6%n%Y9b6O6aMrB<@X1siOZLh@*t0R?=CJRi18@MH2n8a ztsuF?5&8X(QLE?oNrUX9L5Mm==jd5~@cv&YPk`7_C1OXUuZSJJ`js9#vgY}nm5Lv) zH2Djf6}5Z`5y9`QK=CzMtVI!cQthtn&-|m86Kv}O%B`|Nz?_3$1;NUPip=*VK8Yy~ z@2KNdRXkRhr=Fz8i{<;`c^Omuqf3kYqstWk=mq#)sMI*0B@GXf`%v>vOLIEJn9h~^taM=8iC)K3~OiKaI+x!@d=U}Ty$~nfWLS0LMf3w7!-=rK1laYtX{j!AE``B?frzwOf;t?X;!sb>9!r5-icnWWn4NjE&xiy zi^AXy3F0jVaXn#>b%qge#D7T`AkMF-1@*M(?t?IzqJnaWT{}J`V!F(?;4NO%VDEXM zk)U}uA^uvDF(nUloJo5VFguJw$#!yTYXuk-8_1a{G589k2wL9y3aXm*vx5kZ{DQ=P z*dU@M+Pl>z1_scDHoQ1vpyb!zGbx%F%DsT%%94b1#2?F3&tNtz%=06S;YMgi|Mqf}tD5Z~}6_f$sS_z|bq-^(5KuzyvAGZgcJgQ|a7= zoF838>L0K?_zjP_215^8W&u&(+)`uybd0>elJDPv`%)7I#gPf?r?XN9_|3Ph33C#u z3_jyPl79v^Q84-QH1g+xp@lJdIjWH{vVf&Q%f3CxFVr})*87^{rd@2%jYr%XKxQUG z%d_GAZUZ|nkbo{?KraB060DPAi5L5!A0f@~vu4B)t8H+ipc{|!;71Vz(v7uJH#&!O z8GnY+;569Bq#a%1f9oXu1?{-}56}+olC@(L*_-hh zGhMdNr?z(6#z$yJ8;QYM&?9Jh=1bC!(+*qEpdC3F0k`+yC2?rU6yi=4IoIuDVr*e3 zg8{{rwTBG)6i0k8Po>TK(2nd#?ZCnU1FF(B8J^=I$}<{hc4Oy>Cx!CVSuJADVjn2Ys-;XIrnBbDcD` z)kdkvNLT_$!7CVl&@v3DMyZHR-hZ0!-+=qSPeq32XgqLgJYZ>x$ABKPO{~$99_3WKx8h?3JeOc@Q^fnG7r(S)cn(CQR!lts75+W{g9E z@!t!00EHf+=fmeDpqClYWi%Y$0qnHE!@ji%dFo!86P?i$$*)wEKYvQ9(#}eRF4zTe zt`!qs)injzQd35}qG?KZ6rwamsi~rLvJ$K+?VF4=GWPB1j?uO6v7%h8E6P_dX^OG{ zU9?n`T~Ug19gG4LWj2N%v|J5DqZH+Qd4D3`Pr-e+Iu~BmV4h2Cy5al9xg_g)jR$$) z0Wr6bUa104e{RWBGh8d6RLfmHw;McFtFxRH(X&ZTe;s59Tpo<5aW+{`u2CRmD?`c$ zBv)`Ny*@X^5yWN%AmOM^g05g8LAnwXnTI6^n;buZzy^q{^`tA!(=nZBuF9KELWVsb zfQ`oECJCfJ1F7AWX!2woV?3Pk`xp-ot*;Aq(e%HmABlfI4 zm`2buZBv>F2ar6iya*-vKpMLlpli_LLic%D&@QL#+i7@dna`iGitqD61DHeuz_P?J zEzgk<${9jyKydkfgmw@med`mLrwA87LGUJ+(bM{s3UcpGQjn&ru%#u^(|H<-2nK$E z?t_-c@l=#_mdN{C`2KykU+r8N=TLVz-b)5Uoq>{!Q_k}J=Cbv?ZgM{BvQ>kc)l5x; z)d^fD30dg0{b1NN&`Cn?$875W=+3Nfo$=p!+vMd;SYj^2tF_E2BhYAvIGZ8Eim*rQ z_TP(D2`vu#fOI7JB@v9Wz*i%A<>4&(ggQL!@C6g5r5VhbJy&uH=FwXpbB5STUQZxp zCxf{IV0bO!@~uDR2A9CH8n6sgztcYfiK96g=@sojts+EyGCWxJv_R`Y3GYURcOKy7 zW!+n^k=XXbw9XFoW9c!zdW(iyOtfy4VC)QL%?=Xtyo_`gP6P5)CzCME3_430l{^(j zA~2=7$mT4Y-mb{+ENe=V{n3Wo0UF(DJrd$(G~riUiKQ5%!?wr3(p+dTNHYlv8MNFC z9P+YG58fXm(B^>H8c)nLYT(dK3qzo6OD^(qs!>f zvC(B@`ruEQbTjre_E4(3$}7F+?Ql2qGZ8$$9q3u zb76c9#H-NX1%K0v$mWG{eO!A!Hm-TL2_yq~{t0DGiHrm-jNuKM^kwdz&mxdk4M?9A z-@kF6n(=NQLfF@cjaC}QzRH9!%J0%rjrNF!(cX3SuOhKJy0ZK;&~r5C`N*$9&16Jv zn%2n_<*cajNpm5_-*RrO<}%~wmcd3!mHi{aad|k-U^z}b!4V~JPAWw&gba}Yb!Jzp z1(ou#*}Hck&#ftIw14CbepLQGe?A?zdQ1(vpo zig&&?(Mu4(CGjPwFQy%!pSYBY0Z&7)zI0ATj;W+0J#KcZ@mlJAlOvc4u!z5Std!v~ zUybK+z)~sEecn2X0fu%)YWW=n5e@%{a;6Z6mqxxvkd4va> zFoS5oqoQ-|Bq$4mS_DunUUi_$t8U5lnVL%Lp__48%q8L51Rj zif%ZMA|4^*YEZ=}3?7vro?;Ld0-?nRWq6P`;1z&`b>hP73I4AN4_?+2R-23j&7SP9 z;zZAu{%U*KcMXVu{r_7eAu0F)cU3dlHbxy#04_S{Q3nqNqu<5N??iJw=#dw=k9^hT zdE~2d*dz6~1qIh{)`EieOL@$-IIneP^5Hylsy%`JCP%riJL(yei!mPTe@Eje_w{Xg zpT--sEXRG#ePy5ZJyQ3uDd2iYDM0hLSGV}1G=3ZwWXyqAT8674)V(AW;k8on*DGBg-26!<5 zMw1>V6W`2B2BIM^88pfp(eg+rNepGz214ryDE|SqnRcOWerDVdLHicCw3bj(8OoD@ z5{vdlL~!`B-m*M%uj(+hakxQ<+Kvwr$WH1Dzi662p7EP#K4m-8yeA|hXgOKSGzSq$ z*tNXN3kY^-!v4z?zeIw&lEM8G;95{T&)gx2NiKa*tkPnT{8M(WQiy*+%LK-XNFE{V zNjhFJ+cTv4dkKaV~6Vj}`1#00v+L{$Ezr450&2s6K3_-Z93w?cGt4@3X9LkuY)y2y6U7> zq)EVblC)hdh<1^LvIAqs`{97%$T}KLG(|@w1{R;g&%sc><@R?o7A>b~5ba($Ip2%* zuNJcUV|5G#>P7}3kWvJ!f|fLZi&CJ|q@{tBVSK-N4F%ZX&A1WOn8_ZQQd4sZ;d&$u z5iNh#6&MgydNiBM9)~4i^0;hA43l_wiTo~x_6DF~?Z@dD1tI3HwEvFN7z#ox1dbta zH+fOH@K4A;38d^{Kz9+KtYgfEJmkXRBo)#MH-%s7q!sbKJt?9TOz@a*Iqmin;GvP( z{OR4Gg=nUp!2&hG_NBqgJV_c7NXcNfAFU#sV%L^K6eq( zg4P1Q8u)f7KpzUVxR(FMYUdNkFc?D#$EDF)gE0mzWz-|31^1q&)!jIprA>hZAr6~4 zkRZgL_7i+PkT5+{d;S6hFJvI0l1T6hnq$>S`+p6Agnttd+`SwyIFKMjTLy;}>Q<3T z#c&{@D?n2qL5LZQ%UJ^nwJ#e331=*ZK*AwhEF>kf{&FDU4l)U}=|@c*Lq!B^enlXG zw~AI@1W64%pFuGJY!$UT%$d^;;?L{`r#UmX9)AW_YTHJ&BV+XqmgMP1M;8q5vRU5O zV+pBR9HI7CY&E(9a{51vBh-^>q>FAy-^e&Z1>y+x6h~--4FVu(t=P6ek0Tt^;s_=! zju5>md!haAWIa?6HDM1Wk z5cTf^M2sK;NLVL!WDxvcmGx>!lfD7z%M_X%u_BETMA#s0^uwTM&@vQ#XTg;qzaX6R zI*M=vLy0k?JSv+%#my~f?#lXt)7yE0hh+AI0|?2#Er3w=o)$m|c4(37daaT;R4XZ{J&ygeOaL{4_Sn0$+F!W?j8V=6hC#EB?RzMdSPK+0~0G7?Zi zo_uul=odWs`4W(w0iDn2wD9ELy38OFQHTtX?en?)_6i^pLmd8BJozu!9ZLBN=ohpU zqobF~COWBTh(r6wiz*2aM3VL0dCmmv75O!#de200e@T!PE+QH}UU7#zjMe z_#mDa4GsK0VtCQuxJY~cOS-S_0?XhY*NOYk9N9<1qJe5>;UW4x)SxXI8pJ0kq8-(K zM#b==;k&MK(a<1nAzZNe@HOoBE*a@k`zMFaQM@+%Jp%fk5Vo=>($(cYcWAC61MG*5J3!LAe%_Lp_2WhdYs{+(Yj&IQP-JUth-&@0+RE z8t*N-`M{aY3p{nSxdCN^bq&aQd7B@_j?1xas$N}%#o?_wkz<{KQM zkEA{OoS}>%D74`hk5UA{yBKSKO37d_T1mDlbeGD^>GjA)UW3$t+!3bv{?=TK|Bz8;@`6F|0 z->zWFwTIP#{a+rLd)s3!8({$KFuq9vmPC^DWLuDQE;xMeN-Q~-g5yM9khVqc?JM$d z0x8e&Feaf-ZKL=_q1>Ap!53=GsW&eKaKch`?&3Uk?)=EK+ad{R2}8ORkfh_}T}FNr z8Xy2Vw>3vGi~I#`W1uoj0x&axua*%ilyH-2pU!%Aq?98+qgTen;Q|TbA_nmSKtP~y z3X_&@8@)2<{E(IxNd3uxxOXk>5A&|Y{xGib%{^eEgxek@+;AWaHIHCpG@YM929fDJ z0pyt*O=n|HYZlwXlgIBTK(^6 zI;+kD{$I}bd{34-kn%F<6|{H(M5frLU1$h1chV4IN=IYyx&-iF2GEf1D_e-N^}Jt8;!YB!I?yL*dGTK~rc;zz3zIkxu@ouF z=O*!HX~K3eq~U-RDaxwzutwr@C3ogaAa(|FKBL1aH6w}N>LL+}N#gzzz+eWj?Vqtp ztR;3d5{D8y8<$CMHo~NplTu=TDBuPyr2rUZ(k96JAMpJ`+$WR9s72&;p4503&cH-W zTo1J-hAoar>$H`Sd$Y780dizo2eu6_gt9;wfkqj%%Na0?+T4{!gNC_cv~jL5OT%2t zqj>I35(7@?q=mf2n-Bt$Vt`ekcNrl&*EkDqk#_hKhA;vUboNs&M_Mv?9gYto7l6@t z%$HE?4CQ>rgV%qZ3@Y{(VjqM_3lwgZjfZgK9dE?sJ+1xLPH#(DoVA$J$i7Q+6_Lb& zLU}w zA$v1-adlFBLD9n#f|@s#xblA#Y)!lriy#l zhVnLV{4<7rOdw4Ur2HE|gO)--i_#CLy#E5B%6feGx$Dw+mo!GN`jSvz^;fZ9G8^uj|?aG$n&Ni$5_g z>fC+A#Fo2C-}M`lL5J`;d0wqiDEu2-gjZ|VxK-yO+OgMiu{M~r)$hbwFmWgq1D@bH zGeP`?V9yn_SbMLP%mmRo3z;As7BbC_LqqTx8$L9IvOoH#H+a#;=UJ$0T=SYusr*@Q z_10z=9bgfDCve93cxljuqoHuV1sz?{4Z{dpo_ZAlZ>;y|yhL@)t$~i~(IeJ}`scy5 zL&=SB%=Gf124vR>0y0Pf2`?XYcmo3+?GcBZE58750mD1<3L|BNhx0Th;htW_`7S4Zt(emf5H5O>h~U}_Sb z)SFe4{TUrO4@tX0@dZ<-;sLyXiL7&cm15gEgTpab(b~_~aM0X64`6+3Q(ai59mDay zMQzc$4X$ocINkuj)d@JXKe!fmrs8;hPECftR9wE@o07eOzXuFVomFcq;A)1CW7+IG z5jP_Z55V;^@dK#f7yrz8coyps!?Q$l4IcSI8obD7d?ylS^vbT})1>HuTEO!raX^2q z??kJTpSkEe5nqyGt2gJ>;tLoNz2KP{J+Pmh_Xn46$9{JSqvQg$3inn~Z${KYWY^;p z^kFQ#;yLe!QalNT>#;6nbNM1XhYRE*aW>J_f8q2Y zzVq6HN~o6~SzdoHSsebzGU}GQ130)LP_P_AbFv)Mo3p}!mtz8hmh$) z%q%Bf=86V!saDY_E0&9EsRA!{5guYZ;4lv2PAWP54|3F+s6$L<8gkvpdYvRNVd>uJOFh)M4bkFpLkm<^%EoU9MO1yc#-NJ`hCsn#(NRj@K$7v3B8je4XS_cbQZtZ5ytVl09ujf0e_%TI z{4yRv;iUNfNiG}~U!l;1AS%w!1cB&uCe<^Tq@@-U677Ci0wf?UshIQ9AuTv8Yj4C{ zM*wAN4bD~}4x%=lPR2u{p&98Q$K5`V1J^n|h5}SP8UPd#WGKKLAtAvtc_ESv1=KH5 zi+8>9nJCmv0Ig*IA3Y&Uy~PHUBwd0O<|De`C@~_;GE97A;SqaZkx>fFFb5SH4s(j2 zhm6}Hjv?GD~nu=k8@&W6!3e6k)fKJLJkRW` z#H_E@)6|U*mA5iGx8WyVt;K=tC?t>@!p0tdvMbTJi-Q|F=m~Nd9B>RU+0%2x4{TKm zf3G4RqCEK75K9y{zDa}^0W~f;=n4rT>u^A98xKE0J>u|fZH4Qdq65|_2*kH~2veY?{%;JrvzX10 z0$8`w%!h4W-#<$JmKXhdIyV7ZwA^{XWD4Zt+oCAj*3-ThB3mLGf83-?qFYD~^fp zslw^M0!Jq#h;H;aO6|l2RC4<7hD6|lVQ)jU95n;jjRFC%&&XTjsA)}t0d$UW+YV?! z4Nwu}MhCS zJei5sZ7@BEd3@Pe8h*-x!HFi(?;tIX11UCYH}w#Su<<)Ty8c6(kK5aZ7a7VpoIAfw z$*PxofNZU%U0_~$3w(}_aYZ5x?b0k9Op2ZZh@ zbg8Li4Xon2k3i_~G>!#)5Fe=7C67>~)$msF_5R=QHX1wfvdrbhaPBCWtjDV`rrUMAR)}+jb4R3NA1_532?|3c_w7xC88p$Br4T zqlfP=h3L~Ij9yFn1qJGm_S>k#_nvjkKe=K#z-`7&O5U`}E=zt$)-OifyQsZ|;Nk z9ZACHt)pQY$q)L6<>T2WLW3W{gGaI&@^T*;fJL?JaE!7j5u^SDt*IFz2B2D35w4*C_8jTnc^i1x~t!{Lw z+k^ROP1oV2@W5X%T|iIyB*r)l8nXNZ*F`?h3=5*$S~Qc#P~z))$xW96hRX|cU}5|xN_-vo zD?WuUsBKB%PgrflHJb7p#yhxms`i-}ELpTTl%4hpDL@(@*&?Tp@r`=>eRp^tiTBT% zia7C-o))daeh^x}(HUszbRzDmci5AreJfxC&fk6?zc>jaLEY1osHQ3LyOeS9xS?d# zhPH6_oMtw!bR_T;Vt%JxT2rg+4d!SR3f8d6&a0u2T!+=C7N=AXz2Sf2`6_XqHre8TwVYNIfR{gWrw^# z5#B+yeLtf>)ITX)aE}5UjLrhtLpP=Qt#}iGr1QI|%poJ*D62Ddw z5FeQqx4lh6(n$$~dNM+oi*HgDR>Z9umODkm9U7Jj9$O^ltqx%c{)bUJPcK@<8LjOe@e0}+ zvAmYC#4L6;S{@J%0~%Jb_FL}UVv|_z6PFrpgC6oWzV7{pNGv}?ATcDR4@!J!f*7Y4 ztzv|Ra0$a^Y_^h94+Ku>_ zU4DDudI8?nC@SBsV6}@w3Y6s7_4x^0-_#M$w7V=BP*CW28T1{e`IuMYLuc4#Xn=#; z9h}SXr{FF8@vOvpV;L!>RXqB&6r@&9@t`}4-9y4OQN+l-l0BWpAr`REpr2f681(g$ zG{l|@^`cdnQA9_Jr1t+uc0?{0nbcMw8f+{z*{AifNTmD+1}j)Y)~eN!U=XIt{IKIB z0!WnR4HPVuDBq}|Jn~6Kd9k=W0_E4_ZO>wHa|mTJ&<*bxF!sqlsrzERXceP1OqPlv z7+&K$m{UUX5A*DJFNydSX`u6RGSXrj=q^h9ZnB4aLNL&@g*}SH+)hu`VAA5R*%Mb@ z(S~^H&)N`kZ#Qyf{a2DJi^WJ*CgKVW@ic67NV}Iv7&OFky=WB=pcsXbMKz^GclC94wcjq_o5G;=_)JAyMZN?GqmAApfS*(Qm z2)i0b_<EaJx zkoVQB_{%b0Lp!-{4Nxaas<6zKow)o1a7Yl^(1Dnc5I)w+?sy;Y0FXc7*A+dKOxC}5 z$Pced$8E9ubL!w=B;fZRAix9DT>e369{-IV|AROH4)8td8A8zR3a;1SLZWvmwi@rh z-0FLbA>>mZWYbWL*<7{+-O#7#@g+4Nnv7AySGbs|^fCHbO=yrQP=Se}9(D!Sx$rIR z&*^IiOsbxR$xUPFtPS|XSdqKbPM-4pC0J10l1%XE18x2eivQMRPuygj4fO-vy~g9e z8+R_zzBlSp_jpufT=0qVyTV;=5^3lX=S$M}$)C@7mhhk;8$Qbs;K$%4rhSCSRn7lKi)=8OwC}w^}!vY7fdIHxj#6Iy0#mHI2nSO5nL#ahI1JdZ? zZp;Di^iNwbAk9(wP#2Ti>zBwU-sBU}{Ts`5+I<8a&!B0oBE2~PWYL0i|jSc?S z-DO*2F56Aw8L-E>A&ao;7?dm3m9;^sI*vx$lx^R;)HO=h8pT#?p3mHd^HN~uo#IUkSGpkZSGa7O&5zuJ$AtY;&<(b-3?C0ezf-Po z`Mzs#`TI9Fb@P;eQ<6f5e_w=WAiPcS^od3d9tkKSv3>ct^mHXK7OPKMmf-dhbj$mz z>%^xs2!r>y%B?<#1?$Zo+X3&5QoL0@Dp#Q;VZOP$9cMTNOD@#*3oN0Q+UYV_;?yKJ zebt2I{Z>A58Y`qau@%#Y+rL7C4Ru(H57lFxx<#zO9TtA<7RgtrTWIA4MX1^&YIV5u zA$fe4fIn^@^<8^9>lrKHW?G;H9DEr1421q_#o*l_gdb)`vc?r?hrOPIk_QIb^~Nt` z1u-WGM`2jDN8*Df&-k#>LM(d>A1)EEcQcLAVON{e{%z;0wi1)1l#{2Sk|HcO}R-A+WFn1QJ=Sd?z8whLxiJ zEoKtfv)Ny$90ZqCjs|@>^RO(Vl)*PEJsz|w@#q}cc6HQo7qZe<$ERjT>gt4)%}y@L_=>(>I#M(IEeVH zo zrnuC>sfQir)b9AKY#d&OnA!TUV!pDf3GWwFA;{tTDo$xzMOBrD%_AyZ>O(o^;oGsV zL_W6@C)vUFZ)=2?;cLL7we;vVJi6VSiL3f=TD7#pUuItz=j!8u(6#~}S!hEvSS7#{vEt*f;JO2aAnYp{ zrMQ7(9mos^royacZ+B2g5^u3%niR_s(bGzaxQW5BV2_6B{8f@YT1xh3QnEiH$=<}0 zz4n(R`(xn1l06V8NXfn*?)7h$?A;{UCw0lbNX}Wd-6Yw&dE8sXt1Q{~LZWb1ph9Bp z1fHWvtml$xH;Q$(6l*dso5fWi7?~b2l(sKQV3u^#vst9_y^?Pf)h5MJJwUbrLOmQp z?F8*_4hi)P^yGn1JAncTlP=LtgG7^Fgp}*Qza-JMQlfhVAkhcwb%`c?QP znG*OXKD7efn)d^_3<$g4{(u%DEGM}`5Km-&OAE$I3dCWSPkH?h$T+P#PLmHTN8*zY zB|?&KK{^3@m9CD52#RCh(9L?TnK%V2=#bQ7*YwQTtZW#KH}(MFX(@Vw(9o z>wM=so%v45cZgDcM%zg{0Kne}01h!&3-5FEOzgK# z(_k#pLWyU($g&;fR$9G+@^q~}ALUQA@(7f-YUM(dpL_xs0!}f?oi37arjR_&1RG8G zJ`u5#I(!{Yu;O^PJ83!9 zx2>u4rmr&E;?qR!L?`TDs!sd}S8+zl^~0m$&J!WZi60jRgXj!`f{oswU!W8{(VFsl z%-6IfiDVF)N1$kiElD7q7of!tu#LW(?m-dz%Ia8sEO~PveSs7Y-CuYMjW1=^b%RqWd_yp>|q^;_sWG_`W`a*grC+JBUv7fx4>3_`}MZ?)Z(6KO7vsu_UcX z_tyZ%<&Sgus*+LfJp`{NIbs1!`Ur``Qj`}xwAx9>gf0^9C26N)cTY@0sb)Yb6a=Fi zi-+OMVM`uTKKSsve_Co_P`a4A71M?v|KYq|e=g?jfq3p(#eY98?@z@S>8-7)c};E( z`4lzK($ao-l{PsrELFUI9(Of%1ViRr(zN8jpiGfz1Zv0f$(|O63=WckV~hFONF0uD z`TaOtCUIE&8evHTG@$XK5pDz;i^*$>ethcL9`~=TrN^aBw3AKbyh+slF4dJxiKRBY zSZ=%vz#{n-x=+(}qvP!NGwJ>%(f8&40G`-fY1&tah9Due4PwG(ertcF#>CW6Knp*ulK){KZP-G=_oqwero0+`2N(Op;S?vGk` z@hnt+EIp_vtY_9w*LpF)mxMbHT9Ya!&~8K(n4wFvj5{!n9RN_m;MKC0uhOLc4y+B2 zlRZA4KAx|f55qURa9b-modo4>6*ccG(dE#^IxNJ1{TSm$LWV3KYEZb z;A{DKBQkBUe#K%lj*r7hmJvEw2|`TGWiRo?fE=Yt#ADSp9X zd94mlM^{jE>{}Fh>~B%0kpgemWQn>rmu=v-h(geKkiP_={>JfOg+@U`eLQ0t=cdpz zgAl+YYZxAnTfLT!VQ^~3bxwvo6yKx$?`h%)!~%s>F}nzZ6zGb=<=52`myeNPB1C~! z+DH)|2#pjAc$%eZ`fDS_wK@zVMJ$0wdMC1~bS^j>XJe>>`4@7H(E@()aePkJT=o`? zl+>Apx(iKg;^iM941PHKkOO~Llv3T;?@==#8P8(K2=m>ZEdI>jS2s&R@jKudw5Iqe zefg616mh6=u%fmporRd=1=8P^no~=Gnvz22d{Kf^8g9iC zaKl5djChFMc$3?XdaA@t150TbFjI&Ju~RUdcN}6(Ywk%d0uNcFO~43n1_sM|TU@C9 zQ~g+j2l}VE12fXzry;sNq;cY3DFP1He_Dz!?br^=2r=Xgq0AXbH_vwJsFcE@)2l4s{fkmsqGNVs77I0JVFtA2t!e~gaR19xXjxs z#=yye*E5V&U8J6YBn0{wV^GD6{R$Fx88s!qwoD9SC-pDVPO>!=HmXt|simj<^Z7@5BqJz3S4c8ZY|bQR zYXLCh>?Z9muLINME)*n4I9!OySFQ4>?X`fif-thLk@~36f@O%?V9`Ny3sNBU=J|rr z>@9uRd1p8<+!LvSEAXC_`H_vdD>B#79EcFsU-{XY_)7D>2Ixj}6F$^%v;=~_RV2_e zYBN?+5T5opwFS-vhqTeK1Rs2kdd)4CV{kte7{5&Pa6{9}zdq(7zZ>`UStKMZO7B z;-L_&%!>K_+IPWEe40-AsDbHqH+v(u1eLaH>29z}`Dm|8MH(b985tou=Pl5&t6N=9 z!RO%+TzpG9h*4Nw{xLZuvr}9g`|d~EOKhjjWuF5&#Y2&?3Jgva>+XVRtIZxnRz2}S z56)5?*ypM<-u46iea{T^&pDIa_#7GxR7ahG+S39TZSv6uK{*^_6YsXwlw88|6(VqK z&+%c%q~M1_a|4nYP}5Kxe=)GnMQ130fc{6q>LISG!8}#Si{@eUfcNVNh&>Vg zkPtlvh<$OgD~(<~qu72XyIp85zk(yvGKiZV4un$>7Yc((^;}3cA&;K2e>T=|pWgG;&Y?T8QWCvLcisaah*=u+r#nOrACdwj+pdyJiNF3V>6GsB z9%y9C-gNDy#)I)7kbnOt?nMpEThxYqGj|+ zJRT{d{~YtXWYn$8=*7_jI+6i;Z~F}b8X=p#G})vK-fx%96{2Y>ObH}(;4DaJ&im04 z`u`F6^x%vbHtpw-&z|(m|Au^C1VF!5J|`82 z!+pqftAE6L;gyU9Y#TmR0=K4$M2vc&t4DvUQq_Q6j`&0iokojzssFKzQhtsmqdan9 z4~KG=sp954Lo1{@@$t2+`$7z&kc2B7a*1+zprTHQ z$SDLl_J6BtX10gjpnmXZvgw+AtE;-Yy1Tl%=X3tPYvS9CLho@4o>WT{K~4>~=q0ET z#-~Mfn0(@Z0M=!B-?_@LYYFFzRD==W1J^YIu4{|8YHN}&aX6(|j6E}Y9owC?a>I>ce5Hn@;c0Rn8r#o z+aVHPsACmi4;ibv(|Ab0s_ylH=Bke7c!OX?-Y{0lxMe*(a0c#dE2;5yd564sr>o zU$R=i&vBrh>gUb-Gmt~ITNb0CIDu(;#(1h->B4+5~af8TWhv2>6m*T4K;@+t_~%%tA&g5;_xWU&PgD1%+Ux6OSVN z9XJN2=?O?MgXZ|vbo|@6bRNFx_!b2)Z=&b(C1y*Zm6F_YY>8mc?AqK$@xMpX0gofj`(F%pxR_}*Dk;%6PrLPy2uz*%?9;Pzu&S0ZmKCrpCD@o=8Qd_t3{?_*i;R8b0C1MpS5AMiDY2@MyBG zrPd`N9x|+o45m454EZt1I0tbeuF8Fw`XU%f3%+;BBC!ENpI^b}$bA?(A~{J9QV`jn zSlK<;yc&5*NyuNr>c@+KZ>pBK7Q2*dQm63k| zq?;I-`h97*j)^LppGg&*IFe>`SdS*qJ9jBN1_G014kV=xUVweJY?xf~w%c$E81_%G z&(z{XtQbA~f>jxmLhf-WK@+}?Uq;GVBs~DoP7I-#5FNLj$m*eilY)upXUV5sXLtO} zoTbJyKarbqzkj`DvWq_>9nF?uUuU(vf9pF)0Nu5l4)|?l$T4$>iCXc!C`|H#lj2y3hzQO@2>H zx^d4D=pp33f*0YWm}1)647sl-J7G=Tgo4jxKP^J1Pedqz}4g$A7lyg?1A# zM?9J0ejizZmVl{s|tR8t@(Uq6*P%3tbVf`(Lmr^p}5IFa7# zTDr`o<$X2g5>5Y-PP-!g3hU)OV+EYD7dQ)<( z{*}>zV^{s-FDvibx%=XR&ak1#wNAb3Y2B`6ZA7i`vA+En3|UBPS#Bf)yzZp1`<`n# zeD#g7sX8f6!60`A&2Tm@R6_YywqN6wD{{*2M_%d*V*ve>f5<=e^yknZ=IKW%+mDQ> zh_0_Nbq!3>^+3|~P|Ac&_lLSd;p_hgg?F(PUJortDg5jAS>fgjm18UYLwZJ(Uf`NH zJYy8p?h8JU+9%Ytv#S1nrutv2LTa(T2p8f}4%{pF3z-V>Jr*aO|Igate(~_sKfMeg|Uc!(m$EM?DLF*&q!{3 zGaO$KzH?*XDvaN-a^BNyj$vz{HVk9u8YoQfQAD5h9=Tc~{eror(1xvLQn5m)UJ3(! z@*e4}2X33vf>?Lp`~0hjf2PYH`SNREFr{?ZDCF(-E`}w-bjQLUXwKn04z;bvudbwxmaz3r4~F*Qw=+ILzQ` zg`a&>U9B*2zzznsXZVS7?7}Rd(aYT44ZHhWm5S5{-5q%n)8Xa!Er<`a_-rhoX+(VQ zT~Y&Y203b0PSh43bq;S>)!^W4JuW4)d{m^% zV3rWwWnO&;^3X)=F;E@Z*=~C_@c^E&va{*9D6&GR`(l0jZJ)-VXP*HAJ;EX%H=Y+vaenfQf{fsSxk!%>5?wY(jpGs5od z{>gFq<(PmMA{(VgF*(WTucsB}Y^U7LEX)nJdtC*GaUWdz=tiE1Vys!CHCrmFRv0vz8@(8BE#NV^k8QpY^~lK{oYDUl3yTC@KhM*I~@U-};rs zK6G(B;m=y-Ph44u%p~hkD#oL!K#8Yz7)YCZ188644qS~}+8eF~OBnab{gPn= zs5(>=Qzg(5Zw9G)#J<7!rdJU?A*a$8YM$xOTR!G4KiHkfSjoT&+(2Iq;N#N3fIgvi&6vV@ zFRdxjK5LIx?+!~uy}K6$v-#n3=;4kiK##+QaQA#Ik$$CnvX*Q7V7@$$vBMW^T8F*# z1nNYj_f%3cZCS%Y(@D*l+LG=ms3=Ce?y1;Nk+bP+4`@!Td>#7s>jP6*&7NF;VjAgQ z(=(5yacCPgzowY|(WSWc(U-S@RIr&;P!&&dZzmO0MO2W~o+(hl_CRY5Y1>&FARJVH zHh~J#_~C|CP(wRu(1|?HDmdApf)r5!ge5D23XlryP=VPmC?=F@#uGN-wGFURY__{v zC9tNJbeHij0co3j{+_Nd$%{$xx3<|f(Ob@_2qereXj2KkyTxH z!M^IGk`7|GDQpw?jQXHno+96{I6ULW>By#Z%|JH2Vh>B`wMcu#bo3|gB6Nog0u^=- zLEl9ez;&ig$vpaEQ;}yUiEA(sxT`DvM0J=^C(pk8QAs7|A#bACo3{pcpyQD>cc1DF z;%~jFH`p|54ShR^ktshHa~dpdVt5Sri%hJ;Kf%)3*z{U-ybbfI3BTuK=G00Yb|lVQVR-HtAinF~it}8g~LL@Sh^Eu=@nu=7ZZ6PIP@b@iG*Qs4`m4j1M%vu(H+zpo(-n z>!|=CF25{HSASU|7lbr4KW^OjXB%fy+O<~tMI|1KD`|G&W?c1`UHcing)aq0=BzCU zb*D?DvcvAT{UjUnmV#HQK$n8Vr!;(redcn*gT!5Yq)-uk@h&_^Z(q?$?-K`p3gw zVe;*fiw)5SQq5^Pi_xuG({b<)f9qA&1gRY_;B;?2tu{+5c@cMa;XSitqA$ky{T%Xp=+p;XfAD-2X7Hd&abLV*!R`=pX0S*UNYYMhOn3| zV7T`uGtt(Lu7vx6I%Ty&5WmK z(A}@FWwKM6YuSC>^3UmH&zy%`OO4N}+}ev9D!I*mST&kgL;n3(unW64fkH>E^!~_9 z=(-5JkrCfLZ8Wl~DD|nGi&EZhqFwIs_h!TeS{oBzMm6$ArQsM8(xmW2V|t>H1`>@v z<6}D>i75qFvpssPht>d;QU+@sN>Y^Km{?pO9c>W4j@ke-<|;BY*cB;*9wVbh zHgu|K*nAcP^Hb4PV=?LEIs9$hGlQ%z#qV^%%U%a%q>~Kp+xZ)a?en9Fi+hZVTioML zhzQzeUNB!$Iv%X(A3RI>pVS6D0$5NLQ&H*4_yYaQ0^GY!2LqQIc*_E<7)s#xr4ETS z4f2GF63`!kHihH(q#6v`#c=r9)@^szdX*y-)$qfAk`W;pEOaFXZ7dtK6bw~H>yMy* z_|-wA7PNwL@feCPpyDMSWJRDFK}4w`7e9%4s&n%Z24}|iv9Js!r}rxIl?kI(IzCae?meRrqob>&s8d zm-X0RCbfM?-9p#t>tXkBw1}e_aivungsCMIKo@_y~~kz;^cHAae~J?giC~Kv6ly2`TPhzt5x9nIeQ~n z@2^1moUHe!(YLTNpZ5a!f@7`s&3x_99MTTKtTH~a!v?AB>{l6MV#6?hHR*JMh`bRS zNs4;iVwR7U52&nz9sR2 zR-8nOhNEv8wbMx`N)HW{3NQ&+>dbW~J#qgT3VVFM0QQ)}m*Wk@8mkyz-{>kM6B&Qc zopG+R|FXK``Jg%N35~_oTkx!|vLF+%hUE<1(3Jt+sNgHzC{HLi>`q5zVUwAqMttBb zTtHcJH94mb(47H8L3zGB_bv>CsNv9S7l`Yk#TI>E%c>8w_esAZ_l)V}5;kqThmMQ_ znSD*h--jwrt*m?Z!pgcg3E0Fu&BnBB0^NT+RTzD$F+x_~p=yr)8ri^GNaqGWGD3;A2J{#Tvoh2a*PKaoz_RXFa1cTADPs!_)&mAF%QFN zx+?6x2~yD%29KEsOYjFCrx0R~e4=FH15pQRLH4gOxP%>+0~`(8p_K%UR!QKA@ukN2 zct7c(9v{Q*CEZyMINv+E7!gjE8_#Y*F`lKpR5T|}Ls;IgrQ-cOVYHPwlA}Wmg^A%9 zBdxZ00JBR>10nrkYsbShja<#aN8rMInXyO!IxNx zYZOMOhTY3hyZrK8eM#+w^r)$S&Ae?uE+IMg0L3E{REQZ04N!;<6+=)m%O}U9t@2&- zp!+ilut|t6AI__C6|T~&YOxcD!4)&C{Bla5$6O0e0KF1LW9hGKYC#YEiN-+7aMmmR ziS|LOh20}P++EM1?%I*MYq4t{=5Qw0u=_(ak;<{oPo4(7fDp5GIy&n>L=(-<`YKsx z-p-Pf>A`#$S-jQ-Oc{x5UYA@!a?st`FOv*t*s(P2y!s`wQMrPGrk$Wga+=ltgN~`g zubNSD`~hR^k}~>y3OHf8=n3allk$3SCrOVOFaID>2PW8=Fdx%6;6g%}?r)fP~~ z(Klgt9a}*OBJ^BLJrs+$*QFGZtX0MuKuGV?d&22At81byNu(B(PzDT!tYS%z6rjQ{ zVdW?NFjpOioc<~uYkLHZc6t-h;+w4MQq-FaH*kaD$1xUE`)X&c&X-#Cz}bsb9QJ`~ zP@zyyYwGqGwS%TVBkE6~Zq+lFyH!u_R^&iph(J;6zo|WqpEUo+?e*A1CO3=sZ#3~w ztSrDQ6$6QwQb+v1tL!yYBkX=PpSqW8;!~`ZaqyFHtMT6lBU>E?l-W?-HFK8 zXbhen)Va{WCd3Ac9pK`f!VLxGNhym9QsU$4+F)b5MiyO|Ir}#ld$*vo;e%Fs|ISp8 z>&a?-!N0)=NMGVooSEKGShm*ZDg+o^{EyxOk5E{}-3A{j=|d(y)X)boAAmORTa5P| z=CQ9&hOaNVh9A_gGqf&+t4oHf+~{5)@YeBt+A-gN9Vn!b_`wvELQt|c!26-5ZQ_k< zX24wsfg+Bhb`Pe?G>QSoxZx`!KqcKJHU#V@IATlY&ujyFaVxESnY`7>_ucvVXqR`Bi zI|t~LQ->f#It>AKxz$gBwSmvUPJHk?tgSVa{Jp}=lrAX|;MCu}{Fb?@(95{^aKiX}ijgoP%(lC5k zkuPySUWI!$kUtep>Osmx%|yjQZPz zgJE==yDvb#rcZyAV0g~psi0z1A?z-Mo%#}Y!p^k+P+>_&Sm794sIxhMLo@sppT2;< z#m~F(JUz^c$*Pmloklj&iYQ8yoPVXYja!N}58wQP3B-Ybi=P@Yg!Z*Jz8>p%-H$T}hZ~@@TksdzFF1{-K$u@&+jaT2uZ%9EmsO5PH%|b>Q*Tc_Gp`}A62V!b)(--tU z{__knsJOr>uG#%E#+GBDAyTcTj^|#8pkLj|RI{;EBOzge0MfG{anf40LEE}yLl|&x z#UvN1ABu`%9bw5=Y{@sYkdw)1_YivureFgovM7RewLXgZnf`=kOdBzTp*|!yoDpo4 zTb0LO^w#8qoy@V3963FVhQ!yzo#S)Z9mH2r-+sh-x$zb9?6~&nMh)u&4h}0fnoy@q zg(V_tM+~U_%otP3NAbq}*esj^8X`sVkMz&8%zV^gOr#E|68Z_M0ewm}GU=6dv^WgA z!=yQyuK=3-oAC`d4H1nzt_<7;&AL#T`<|q3F^J=cP^g1nV}&1|Qp7wE7$!fH*%Qo+ z{P%h;F-At1t>j@h!mOo}8QG^EZ;8qRi@w?XH)1oWsnI)=nw}a&^yRci?jh`%Nk2oV zarNCfYcX=;_(KlfBB<#`0X77@!#3dcMuF}hAvUqx*bhHQ0oHSAiG~GOiz5hRcq(W{ zNF^Ab-5H1jB7S-sei_pcv%+R!a9}+xh=<|8C~l`*z6rzuP{|>2bC(e43>t$5gm`RanAIGE=M-~vcRdntff;txP2QlsnqfmPkEboEsWJ{ zbqVeZw9<-YK1eNq^?-CfPDl#7d;Q?FT(O^qpYL$Y=dp2M;%@t1#U*>idqPnrW(sLY z4iP2G5~Tw~!4)dVFZ?@s$lk0s0@AuE?0$~;(Q1cCFmt%zJGcsb=KkoEAhuU)7l6}% z;FVye=oYlmh8BfIoO7U8| zJpfo6>Xj5;&4Zj4OkVpP=_NS_lu)lkloJ@rtEK!DE>A!?_V%d!BPmbh@_1NgF!>D> z;p_udF?rAKrg2>O96e`y0DeD$7`VI=L1rH$V6GxyM+ihlVF`EzsLPm^fioE!?8$^*XF#Fv4vvK6MiSPp~ki6qoO&8 zSWZMbE)`@#1XD>Q@3*X<)+l6^v64{!s+1qxg>q6^s27xk@+YMHXDTO^AvK4~ACmH~ zP|mvI!V)TkKT9{B@5p}E{WIb);(xqY7f&(oSWh>uMdxKdoM}wKqp0RRK$@GkBJI5b zxD|5O5!f>s*8PT!br|d22$m~?RUlaB0V^8jx6M>L_b3}?wgaXHyO?H`4rg$ce%%=h zW~RV+Y?wP7FcTs$vjyg*m@p#+rlk#&>43Q;0&|DJ3T(8S&DHhPERJYl_xEz?upR z2+}vFvzq2_Z$M4oY+yA#VM7SJMs)LoFWfHW`n zsRPp}*yOa!BEf29W4-Uds$wf;P3=o(`F{AF6n->JD}h;yxRt1>*a35I1m=B#nHCdf z?RwVH^ES-s4w#$>OtHXR9uwwCff;VYY{F#?5e5CuHpN1nE-+1F!t@iEi)@%D9Wbv) zU^ca9-7Kh!r5m@vG_qlQ4w%6am?s5h9AG>ZSDz3>?uEmNeDw{hXCVdixcYS8enhS| z5hSl5UC2mV4=s85D5S>)X_AdpfwYkb(lRzpW)VJ(MKiWhok|Mso_`clUqRArq}v@x z<0D9)2-1s;wEgy9`W}VULXaBSNEr^Kiz7(42vWa>kd}YVda9uSDGRY_w<_K5Y*fy4e{Cy>l5gHRR@M>G~7nl^lcq-1$d%M?BjW+))R?ikh0YyEJI*?wDAboubt7qPC z4ItewNH5w*1rDUEB1pO*1sG}nGarpRs!n-=G~7n|3ul%i&EGtN9+hDtMNY*m^zB6@zWz6F!x1ZJ`k8^W5V1gFdx`3 z9UL&7A}}Kb<_f?>_t>ribEgfn87U$W^=xO0;%asfm}W6y4zFR|Tx`Qkb-?^L0<-xf z*3H6SsO48JYKQA~99o_$NQWp&2fo=xF9*^f3n|-pT#)VsQgjy^Coqdlm|P>#0pqq{ za*bXBlS37nH)Pz(&kCbP?9Ku<-UQ1xW+QPVqNEzOO;k4DIGo1P{koNOee}RzznYcg zF<~_04hPHx3q~_$3(QM^i56{+z%(^sii}JL%q12~k#UE>42%hLufTjoQAX5#pz-7H zs!)5_oS2X)Fs)(=l_xOMO_-s^a}JnyESRCjk8N2u%MecWROD}cbnj6ue_$1>XRwJ> zY!o?=Zm^Jwjb{XDJdmQb{F%VCH(^E@O&l<%STLiEB7x}wm}o8ECoo$mRt+tTHL7tp zU8K#|u{klJiNNgsiE4B7`l_qIyv{KG@y0j@%A*qq}=H2 z0P&h2<;H^oQXCVcT0rsyWQwtSn<`I|2{OgFL_p4n2{KVY8VSfW<6Q^Hd^W_8f12^9 zo5lGaaT-rWU_|xN!+W9Ntn5tM^}lS~=)f6c;=F9UD>zR#gp({dPYcdW<5UOE`6kXx z<3_>h(-6+0FU9r*=L6>2(o}u?5jJ$)^fVBjC*aWZL7k(aWh)LCO%M3PX1wyKAbp$Uy-$D(3w5PaCKz3Zr>Zvp?bASvqK`M<$1!N3^93A{K++7K17xrXl4eX5ko#kT+$135 z1ti^Q>;O5*1W7mg3P^5DkaGm&N&(3@1E*6l-1Vl65bAVK`>EYyqu@76yaBe>!xag@kYwita9MygH)v#KI z2u_hP!hti^#3?e~6P#y&6YXi|2*`y3GSE2P0g_{a3^Yax$Q3a`#tBHWfDARh{aIDZ zA8a@w|4<`CKw88E=_VlSaM3+RGt5sMAa9x=#l{aUSuHgPCq~Z{5(MOV0U2dn;Q$$K zf{Zer6OdAXVCB4Y1#XJ!r^dXim#}V!3C>ufsRO5-i8I!?LU8h8R%W7r{2zma#>e5B zpK4s95;2%{Y=a>oH5RCyi2p^))m@-=TtLbRQR0Fz#sL*Hp_ue}3s%wVfQlIxIJB6h zdsEP`?-ysB?Lf;j(U^3*pbcmUZMLA@BxutJZS#++nA_Q=LLnxl3tAHv^XN7GXn{Ic zpk5}ZDGsPtO(-UP-JHdohfrYjnk-wOc4f21W)f7P18RT?#iWM?YBWO~J(1YHh}AV) zpgtg|zmWM9X~*U!6qC9MRAx-5w*=}wfvO;=_Z?7GY-phnllC@a0lz~$FXjYrxS;(< z&?*V-dI#EQ6OBp#6|~11LOV^+!soNbY6z{h1FfTp#-xFQ=4l9R!$MYCm7uLAv_(It zN?Xqs7owM!#~DopZ4V-HF(rLM&`Jeu1AS$T11)HxG3oQBV*d@H`2?*{(6$iT*$%Wk z6OBo?3)+B&&>9I^V?i?rZS(i4q}$oHl#n>?E|1 z1MMXfjY(^pu%vSlp7T@;KIaQuKIiab_X=96pw$yvHwW6~CK{8<1no9Pdui1A`;S8F zBxr?#7KaT^W7l`8q=_aPlP(st_6?!^QO%Mj3K|j&VDYz z*7ho{?0X9Bh(+5dv?ml=*rF{G+TAuyuQu!cu}}sn6sz(t3(4ak9pO5Lgmk8ZMCm5M zqGOd;vZm{Kg1T?nCxV0yK+$=zQ_-#AFJFWy~9a~&kn;rT*(*+FWT4DiX41s^<_MupR%lHv+7&{(MWHpbXqO7DuR?2X(asTC zjzVi;(M}XvTZPurq9q9JAmUz@^e&6`$9&fI4+<^SqHPk|0)^JfwAm#>nyHd3qy1QD zk2q;!N-qg*l#?d5qzkQ|lP1PAMrgST?F6fu!-UpOp|!DSeT5ch(L5Dt=+9OIb`k1N zh>#N@#B>w6+%Q@H|%NqfVMgQ7g2&6k3|~y|0CKm6Imls}kBJ z3hgB8d+!SEG=+AuMSE6g2@35Li#AbczakuE$==SQ-6^zX3hh*jcAe1PQ)s7IG_TN} zaMDDEi-dN!LThh*?{uMEqtMbVS_`3Fs?biiXa~N4t`X5pH#qBG4{;h0QVKI~kqmCi z6G8@eI$j2baeZMVy(wEsZ+dTzGrj4milfq-Je&g? zo!Nw(ys=28Li(NgnqTA_Bc-dDbHs4613ZwXg5j1D#wbHKyPzBrA!RIQuCR>HSsQl$ z`YH3vfItwL@+$EtGW_v8eafd#>GVnS%%R*RzT*cOTIjD|VeU*xYsHef%lTZW!9c#M zaT{Hn2iEkOH?D`ty)5Hpt`ui*o;nTE;x%PP{vf_ELu!HSEad;0Y`H32seG#fi)hl2 zEjeBqGOtS)4wMWp$qTf8Hk==L4yKlBChXtk6DAz<`A9zDGAK5JEBS;gQ6~9>WDm}K zz>ny8mc`Boe2gJt=K~@?kuqO#R%#^t1X7=~<6KWw+6i^U&!k`75FOd4{0OytSMC7R z&XSVXaDJTrJFxRHlUkF43R7NOVZHIidOD+(+!FCJ%8YaK$W`+hX(0Ik0!C(LoOIF( zDW|xYnHeV&qM1^@2IX@QPnI;n=TS%*e}!B4f{!gY?}8HKUb#1(O7lVlCG)?cZ1PGR z^4Nkik@Pl?{#)n|Usk34emmS4+1)ieDWN=}dwKH&I=KS^UmDPJS6C zzfR0g(nnN&1;X#^lTBrQzKZ0lkv>=zP~@vo@#E!m@?M^4pci*M93h5&5;kj<20$ zYV>C2XlqpQFVHCUcapC`eGWJI1;8&#pKpK&edb%N!e2Us`(O0Acb3SP1b(sf*;QD6 zon}h+h?AvaFO{mjG}zzEOny@lsfopJ9q178Hj7_7=4WeD;rGw%vyI6wqXB-m3cqBF z-#aTDDpmOXGx=tGEc%><_)H}2Qni-^;rM)8Q=^wSIV$!7j+VVNsLxI&zXI^1n>iih z(MupgnYk9LRm&a1{V(>i@FS6L9fBZH{5lK24JVqS4LN>({Y-wtWAR%BBKa4K-;QO+ zE#KA;MZUd=K}5-SlkiKo_&xZK_#Jcp5-|Cd#o`wR5%SfzO?|qKpI?&6uMPNFd8Vp$ zP8F8dSuCe7b*MB}e>kRmQ$G-WQXIuoA=#)ZzjKA(fi|Xy=N>1&43l3c<|jF;D!+xG zL#0ny{64QaKKW+7FY+zKWZhFCnXM|nLBj7mi=U7A9n+tYKAZAQ+pV$E+gxk={ROb7O9LDm$j1M#35q-|WYCDSGWZ^f~ z;@9o?`E@e+6~yA#UihV1{8lYIZuu6zE%L3y65q-hR_${Z>I0R&n`)|b5VJg{eI9c@ z*w5rQya9eb;a6z!`+b2!#8~!u%=z`!w?w|ZST%bpB>z~IZ!78p`F?Sk@{K!AegTtT z8S|4YWtHDJ;dj5qulaHEOEUSj0lz5wY%9#tEoLuOJCymq^oOZ$iauvxsUF4eeN+a@ z{Jf>9%=3?*UxvxA6ZrWlQD0SNPvO_k;y1tQxaFHQQ{-ESb#oNIA5a;{x3h&QU*CVk z@0k9qz~t8t{H%OyRm6a>3|TC{t#pVOt3Mo*-?}$MzO7g{N41|zm}Ohc?r<_|z+R5Y zZ@9@X0DemPwkqN)Pyw`B-Q3jbf%y&*|J``I_rD@v68Ld=TIJMDI1RNpJ?7-}zsOf+ z@|%iPbCf>ULwHCQXYp%){QTOO{4!$kyF>WB+|1PE`|}){{9ojo@w(`97S_#C`fM!x z@-2Sdj-OvAlV1V&Sy||66HbTxQ0c~|rid%PaESP?`@_N+A|I{OqvY!>%mTt}r!mCI z>|g71XV~4(cAgokixmT)^hcL?{d`5~UX^)-=iFP5@V{B9C{6-`)~JBtZeL}veuZlirVCih7 z6RGxjuCRPcSQ^H;PL}`LJ~K>yof_b`5b{H%7g-{H{+UC>f5#8<&3Z-TTZnaREcpfr zzpopc{m*wi{Lp>{Ccl2*H(xULj~e86Lj#a-v~b*MY??z7+A~mP{qVQ(NXWPDWsz?y z*0E9XkjI2onkC#F%&O8_95vAYjyeAvZt@E-zoSGuOZZhbGVL>5;b^>n%@6YJeM#g? zip6g}lnqrD3qQkn>^S+M{mM*!Q?ZVX@-G8~Uy3DP`{U#X`P!KLXx$veZwHhO`DP}Y z#`*rI|3sh1oWIO?QS>tymP06*(wgX&+}3CmxSOc7Vi zc8K`z`a9Zh;R_<)IxH=t+vj*(5VSPfrekQ-+vH0~BewmhVJ3es; z_pkXuzOBY*JMV~XUw2ac{`)FM1e+i~>o`0PDAYX>buTw03J%wM9@Y`w3 z|Cr>nhX%!7Ff=&!r(?$>A>XX$M81VsT1LtD1C$N<>f=rM`ZB-DzZoAI?hlZ!z~tAD z`5iSrj1hh>3%{Ml4<8+O`>lIce*IZ;>|#v@La|Jr|+nf#_=X&EKodNeNN%eLfe z?_{RfC$`2M_8B`r1oqj+kkdjmmps!lV1V&`RTN-+ITO)n4r%zOTJa_{}X#@m>=wO;nO1DIxO|9 z<2owKPQvn&BdpS$#vmulSoYE|Kgie53zw1z`!tWpKheN)pQ$?RMu+EE$51uc~Y7UwG?|f!v3#asVbv!y| z|I0A>b&ADr35*HKEEawk|K4#3r|?t#%Q5Y9){`P1tt+GAAwz^;iX~rP=67836`1_` z#p1UgjSKl^9yIOqhqsSgzI9KCd|R>finYFdL|7IIOT)O;$@1UX3yps!zd!^0GKAkR zf0-g4ddnf=zvBn{-21r5m(&2i&tXqc=|tg&@$Y!}LB2AR-&8F1V(GJ=@at&F*Y0@u zLB2L7zl;X>{SJGAe2Wg4UGSYZNuRcfD*Ckj%Q5@kj47heSy*?)lCMnoUA@n2zplr_ z5At;~`4xa)l)r9I%=F}R(ByQF+dQDqQV5MBgix>FIrsGt>4Nl9|&!NLi@v_O&8jY3T=m3`Jj+`sU)lV zB|`f@Cv6uCaJ|q@aMDCLztHw!0c44=!@3Z&i_kVHw4GKpI|^-{Lfd80S_$n{g|^$G z9fny#&65<`9*b5hw3`*$UW@j%(E2E}KP_67&@NPH`z+eKLOao-Igjc*Bh-2=&UN!9qqPrz2m|6V?jpX9sCJThe?X)i_9hFzFp3 zz3U+DVA8Wfdcr~4$)rg_qV-#(8e+Ahg*3=P60wE~$>Sj5rdu3x^9$)ro5aV<NV42$|423hfW9dblFa6G1MauC}P?=r~{|-#qvj>v)zz!vQm){U)?&3JnL$g!Yxt z#yM#s#eAU+RcJVTCf|EoXa!E1eD4{dWh%53>wBd_Yp&36EKM-)5ZX>GQ>=b~V`)OW zR%q)K8jht2t*6i`6dI1D2`xux(-j(yr3tOQ(8fDyB11Ew4OeJ5vL@f#|0wHPQ)oD{ zCbXZ0cCJFhku{;MB3j6gvj~TSJWR!oSj^5xpdV0~d9L!M<1L25? zbsi;hUgTkBXx+#z=S3!=tfBKFH*+N%_eb|-h}h>vocA5``%vT2Q*T5o0EZ;Ua?LT zgZj}7rec|F;5o2dgVoSnx`mgovcMwHMtqDB-CO=JaR#V3H`_Qb3r-L?^JFVS@>gw~ zzJgP}%fxZ1I2~-9fr8@!&ivuGeK()4Em7;^5**FKS@N7^cNr;zAJ ztY$nFwfFuq(uuNBXT41N-9#CwqKvaqJ`$AYff8jfFABu+9VWz?Dnu6>;tqir2#C24 z{hqKt3TLq3=oZfRFDh!;#nwY{p0fleHC9#55Qu&j#Pce|dp5*Ywyw^vZ)l-ISR@D z0`q%E;Z7;M6NNJOKE<5z{vd>b5kjcfuk6si6w0M4`S&L;7ULT(YbgJ|SIS0eQl?+MyTFRrN0hB5Oy7ci>eogm}n zogntfQaP^(CENoYYT+&R-zU-E!`4a>=pUk@7;fYV{Qa!s?{LQp@VtCk8K3CXCeB~- zFoTylY{Yw%%Sq+dIAwhydOUl}@tllj`%q?%XY@W0!j==Q%mIxRcDE)S*sle!;E%qq zU#{xsqliNx%4MsqF$}M+NG`{MfyS_Q+<+ap9?7FoXpUhrww)m5*HSs1cMbKDu`NN$ zdr&!@aSio4iE(yMCb^Tds62_w)42R6DQ`{X$z0x+%hyWzLCmK=!yBD}b0U{lOZm@K z-k8hfwB$!pzMRT&l?9%c(~_@B`Nvd_>o-s?rzM||^5>}>7m%R*1jc_z%4xmv8LnVK zc`GizOUg&1d=Bobl`;E9Dh&B6jjl+cr7?TZHg=sgM%}Y^2d^}aOlPXU#^{9SpoLR` zGEc^A8fz;fh^H{3``q75oYz#G**4Da$Y%x4*O&==IRAjJ`%!^5O`@u~zp6EXu2F$* zvw>a{phpO39*x?3^Q8*(tN{JruO?6{6)3|7x<-I{07zVyBGh1kShC)PSUF8m&X3Pq z%4sVQae$b6PQs+1j4KMxX@YZyCDSAo=UE$P)dE&d1*Wd^+t2v#BJsuw&i4~pH=Qk< zOI4i9ZJf!1GYU9S5U&YDoCR_48AYU)Hbj9yoEHnCSRj@frdBFch~>{&T8S5kZJ3-! zDdaqXc-n#}Q6b80h&WuSRENZn-w`y7Ul~z!p;}y;YRKHp)~% zxgRKVtJZqt^$@BzNE95Og_Ee_oM_|t1m_~)L>X<(L#*6gKbTdioT{khE4DpSOA~?E zjftSA;+$)X20E4du%IOVVxruuqJ(Ue1@l=g?=XtF3{X6QPf(t+P&%n7J#Ccx1!V-I z#C^4_kFzc<1!ahZ^2d{kMDaFCXF*AC0A=+A)=NhVWu}TUmo1R=vTGhovA5TTQ#&JuX6?s`u z;w_XS6=j%>@~ogd#3;=sywJpna)Y2Ox13~C73EYLv5A2Z6&qffZfiSo9fG`CRl zRFpn8N|~VC29&wuM*g}xsx#jrIB}aybK5gTk*Sf5(^YUf0w)S0TOfj#T0T%A7O?G+ zS`N%*foQ(ysW|hNnMa%g?S6pO(%VA0Sw*?uM)_D!rUPYe)`TA+8pP?pzTwRHAs=hXiG_ z3>>SCWsfRK`HroRE_`k+D2FhyiJC_C6o?N5VuLYRg?P?{*kG)l!y1_b2v5bg>z3W> zG?XTS@{pixF+3_tKNDq(@vxwbW|ZjGSw4>Sy6}5$W5YNYQp9O#q8LVjpwK)m${kD* zh{pwDr%|CoEN8O|`F9%e01?aW2} zIYKCn5JJ6v;T2DsP)4ehgG^~8l)j*RMr$Di;IYXe3;x~rag}mxn!VuPB9xO9ipAr=8WiCB+FryHygu~x6II{NA=UW3c}9`B)60s{I*S1Y_q^dx3_R6xLfK4&c+ z;=n=ey`)(4If)1Sfue@u+iU4@=Y2@;Gr~WKZ_`_I@zU?mtr>6PMShiNVpv&vr4=RU zi@$EboQI+Wr?TdJ44v#pp&2ER=s{O0zlh2uN+8jLbEUi^%IDzqII@~r^X+j zP-hCcTW;pwHQ#vQVY_#IYJ9-`B;=oO{EFvLl~tH&cq(W)jh_B#1aJL4gy-HO%g*`6 z02SqC8|7s|2{H-=z?~@13d)FY&APNwQ8H|lYXqeSq0B43?$-^{-<9eN6rc}fsGM)q z1Qnq+Kf)qIs8#~>7bXjyii!i*o$aj7$$~Q3LU~94NgYMiZr2MY+#L`A|@v14>jyei_4Rxy*v-s6yo0 z5Vs4&0IrC+o>nUIhM)}GU{>UZ$%E{Q4r$<;sp!hRu$qw8{!jz zco7iu=v6r~#ZpA-DmeFBE;B>L>1^ZNCOB6CN4Y&g!8sHV|6<{MTc)UH2b&Lx)KPF+ z#uBMYAUaqO&#Dmb*bqOx&stfIQ8Y>`lLTVF)y!9^5F>4fmjt3b7DR7>SYbi5Rw2%` zAt=8VBT->2h*W`i#e!H}s_5cpwmj0sNdl1&3*zh1tj^mlh>!~LvJLSKvQklt`4~q% z6$iYHZg<-2GlG(9q4ZQyuCY<32+BP`iR!_F1R~jjNKzr%+7Nz$xHuNX=>oCoYt!1R z9#Yh?j_r-q(NrMzV7QC2(qHdlb-ZCgJfK26ZbK}2m(}q>EQq%SB49z}sStf^h%$k= zEf&Nmf$&%m^%E39n%NK@fjB1?#6<$p(t`Lzg{WauBV8PMhXwf!16-6Y{<@QOvDq3s z?@}Qq+7NREVn!^8`2sQ1f;eA==x#%d6^QF&L6iwZi3RcdctsasHWCu#B7rz97KB$I zx?2!$st}*s5WC-IU2Mjv=Bb!H_F;-^D2}I@pftBohN&ob+bHh{%2N%Xd^w7h`ps9S zjh?EaWZNhs1f_2SD31xs%NEM|2Nk7kV}m25qzg(DMmfB2&bv;DE*F%WEtJPqlo>Y4 zrngux3ox>IDi(kI`Atrg)`HSWP?i|IRg}Rd$`WI$pxnJ99heH zS!E=vC}}3jDx;5}bY_&K4DE9#$}@seBPi>Q`41?1Sb74yQBDz*;ezs;k)xtqW}^INj1!a_8Rdei zBSW1i-`&o7xmZwk7~AhxB#JXpb{H26N_(J0tqxulh(v+dZ@i^Ke8Kh?^6xkH%w%!C z#h4NWag#u-mib87xJiY$*MtZg9|**=u^`SBh!+H+v5}!dbT%Ox8@CC>Rk0v;-Nw4O zSs+}-kK+_w>}7)q`CZ020?|4a#B71+ED&vt7gdN4O^CL}Z*QX2?~vGo{BZKU7vSK)PhiucK~u^xgIBl zT^xmbZs8}l!mUf(>Qpms^^*{mM+l)_TR9f7S|}f?l)soVPbklT@)<=P5Vu0&uEez7 z654$V4KXdDJuS2$HqDM{l?kO#p;*(JBvd@cIV&V&_;|Cpg9x^xrNz%|lTn{*RvYD2LD3sPNfeX}3#GM+a;A+kNKgtH<+R%ukOxyFT14g*a_?JW>gCJ36}@b^ z$I{D*f)a+;^i-I+0Sd}wK^a$VqD)p%p0iO_zruQ%!zfil4#GOrx_AZUZmTXH6{Vkz z^01(cW|R&${)b|VN?n=>N;?bXV2L78OBL2L~uYT3`WLjs*A5GQg)=C|31w`;4){bmHK<&CALT3%F9KD1GO zdx_OT{$4rbWV?uIg7TfElz}SBEjG$4g7Pp>qQtpQAm&*RZWSWah8QdmJ-H(7mpE-ljcsv$ypfgi(L56+sG>}_QP#f5N|_7) zs9fx9qr4_4k60)@RFtc1lt%=mqydy01?B%Nl*4x^5~bQGmkG-GjFPt^?LDVn&LR{& zIUnSRBR*LQa~y>&r0{z8h<8 zp?Nu76|Wi)2lT6m$xjClPS95 zg!>;p4CfE)xv+>oFCc5BX=C~j6Pq}Qd=O0Eqy-a#-BUDu4S%UwY>k`mOX(*sb;;Ir zstw+DlaBrgjW09mehP=_Z@k40e}ARvtHSOfjJ1R+KvUdor2>D8mv?70UQbqfY&@E8 zLj=6XC^zhGi3id7awGF8qs+~V>pBG{!&*f@|E}D4Pk#J5J_sQe=c&HD$#WA_E z&S`%%!)Fxk1xR>xcmWk^JDR~iJeX2?@XT?mjJKW*hmDEwv&NL+c$44er|@I(Gx!nz zB7O{74no_t_;Dc=W&CFp%BGFMk3A3I$9u*2arIshhEKw$aENqBt%j6%5+Z#_t^P_} zBzt`Y*;_8Eb1F298cwV%$t=f9hJ2wGy)pSJ2<4xLKhrUzyOrl+EndejW7@6ZFj~BH zVeSI{{$hM14nNYdN8aK!JmIMrPpubnUo796Pv5!$-*P-Tho77vPd1k)pQ0yo@uZP+ zOE?U4;-UVd`Z`c@80Bt3SzJY9W{bXrvKs)7C%yb6bVW6rE>Cu(Cu{JevEb&|{K6eu z!3gXspwC?XI+z6Gp@E<$g*vzrrE5WYn-slV z3P35bfP$WMO?UU_F1ISYRtxsP->ZzRPt(wWKIj7!7Ln`1iQKe9p`!fg{t&QVnuMH! z1L0J(Yycxg-*mboMPH43gxKLW1~lGn^%5Cl5xTB>`%t+?g`ccph7R+w?cP#|+5c|M zNY#)^kT$?`m4~JG>O0{Qe0ZIe-bK^Bsan=5t?EFcFR#iq={GcicYav@wfE;OaZR3y zenZ`E4P4g}Evs6~s~OYG7wX#7pI7g9b+6YZh6BUA`t2!N-r+ziQpi_NK_R6}sGwwr zS8wUnF9VY*t*Smz3$7IIT77p5b>b27P_G1Qn^%~=f z{fT&Kk~i4M8@wz9|6?t_-m9-PPE4Ss`K20Os)g1XhYkVZvbBl(0;h>jGS*Es*%MVO zU67)c{t;jDlQ;N4N^LcGhuwF*k`%Xss_fGb`?A8`s&Jw=Z~xtcNrH~{`<6^NwYx0*FD*?(#DXZDL=ejr8I*Im{tbnX(WXS%EXc-8^CP~#J;x>ikp z^XdRdN5j6FU%VqAZ;#4LqW+7 zpWai0sSc#ps(AY?{&$YHzgDaID?!t%wJM{Vmbe;?e1%r^Q=+4hy}DNK%c}B*@}-e` zVCX$Aox)zneBx7j0r4H-7k=_5{`2e*scsX36H(%doxBp+^aHudoXP-8#9-~Z> zzPPTZ7Ha+lDisIwC?Nwt`T60p0%WEdhdKKbazsCNwA>hp}fQ6w#xhg77gZ6p7n!fbW19}1)0(hM+&6YK_-1N)k8IN!3StOu_nTE*+PuYYUmKL(_}8XWU2xIv0fj1mgBhf}1vu(Bu0SBn4WQ{(Mj#+$=>2 zuojx57?eLqZxlpR8goiC2yEsO{lFaF^1Vwtw4md6Xsj#u+|(MlOF z?skk9ukD4NN|(UJV7&0_jl6oFRCpL>`oFlA`%Ty4+7){UDa{}sS8t9jy+h3(gca0y zgI8goq$w4CL`IdfjvfyRcbl~}hZhWC_VDr*j0ETZo+q!Nk3uJOpL?g}_&hg-vJtjV!?mroCKG{XjFG{n<8?!!jm-P-Mp_j>+(~jr6G-Wp? zD)?OWsPU#XKS3_Pf$;_hILE?DdC>6;T3~d)n2e4Lv%C0TSQ-rbFD-O+b2!@O#+~Rw zWZ`p=s)vGl&L706lA(oq?A7v?lx&o_FndwU;AujZf<6x$m9vsqDfxB7r~iakar*Rl ztiSxQlFuSWTJ7Cmi?@<`tBxdk@d7B;Gn|7rg{`St2C775pqkrX{v~U9U%ATGqV;^C zdoe9D?JveRbTVw3d|^IAhK+%xl{fDPudDkHG~O2Tq+z9zeL9;MnbO$4p-y*utA0)L zCGPaNQVX#zY}E)K{HgfR2R~8^)A8vt%>OQf#hi$-$e*{RBpH3X?j+pfgWtvlaY=FB zP@imi#Gkd$tFJRoL(vqUzMO6nBe%NJSaA}~j25F|(rGr}xz00)JdH7rU>P7@KgBK)Z6- zPKMcG%VY>8v-9YUgP3OaPV$BZBpJCkP*4meh`*W}=g?msy=R+Xk2WYwLt&cXMj^`5 zX*M66ZjQwR&=M}6z6$r4`SP}vG&UY=j&UKwtAA~{Tc9ea9Sz!e!bi2x2ViRWrSTUY zLYu5at9hl~^>~Xi>CWmbR-2^e*lyY~cZ}B!+xr1cZ{^qb`m)HlG1bEACJTD6PtfL? zQ=M*F-U3(I>ukbfp>&$pFT=bZ57XS8O;+aa&|T9glU-$OZ%hys}_s4mH zEivVTF51Sj%I6O!l2sOZn=HXKrE|ldEwC-;PqL5jPU3QUbqjKo+r(J zMvXslDJ@`7vb&c)s0P#Et5ZsnayHlH(-4O2h$~Zj>0N863%rShzp~1b4jg}h`wE~p zU5o1DSk#rNhR)Q$Z4f zJG@aozZe)Rsajv?`V?PqM#dDf*ii3OV<=c5e!xcJ*GsZ}XYBMR?(^#Yv|f5(SBhWn zngRb`0;}2Y*Z0?5+DGq%X$S@&`tr}^B!z3@?=-mP?F*c&>365t)J04U{95}Zbuj&i zPv56m^WDbYE`_PCvh_p>4u{Gx`^iO};^w5|hf!Udh;MA6PQz-`LRzZv`egFW=nN1L zGsCGFZW<~zA0(Mk2LpnDX2<;a}N%$O7ZFMWQ>PAKHan&{S?@&YvN~z zsYRxX|8sbb>yVw?V$iFYW}p3QqP_4jJqY(7HdD4zS?xncxab33%R<_dRZq@m(}B%q zo$jqVgb|Uvg^Qv9)=IxpR{E~VEBS?ADs+yt!v`V+v%EIPxTIU`V+s6$P=(%hm2N~XYT)3W9Qcw|Vl zMl1cP-mwZjI@E9;EkS>SF129$UZJFew661pl1{_#R9R(PqbbJH1z~sYA|S7SoL$LB{F3x;_-FYQ4KJkv??Ze4_cuMg&?FATE=XJAh!bf?eC}+zN1#y z;F^3FwPPsbJLnd0GI)6>9O8yJhdKvZVufo`Z#-r!`o(OCi}_2V&hnQ2x&?ui`nps7 z6SoFhc=Z*=D|iOOY+Yg@R)Z!U$5(oX+8rVJGO2VLxOw%%-YmE{I>~|``6LV?2x0QL z%Z(39VZjv7U{ZKh-7nVnd>q@jlt6R6`uCCVj+o-j3zMs(C8Ck)06;9M?ng~OjaK4) zG(v!D=g>&8^&CxAHNB;#!-xKZcE5<)eaBWv8@w3vlY7*ec9ZG08>8#A;!o z%wo6DoRpq}4~`1A@HC3XSaVK_eu>4_pMF>OKWU;O&4s~ur4ejP-lm>Uv%nfPSBO-Hzw_ErUicU22b-W zzAOcextM%dF+~cY)&MWsvLoi~(|^|VgTzsrW6mNmf$(DjF_z7f*2319D-(zbKa!_5 zr{Ox%I5B^?@j*zlN>0>* zovP|OaE!&)VcjP_EOi?(skzprA58>cDpd$?UrY@aU)$>lbQx-K?{gU8dwze^2yfaK zjW4u`!IRJ3KG+dvDIBq&{RgbUucc)-t@qIji}W6Q5v`<{Rp`okV-Ba1hWa+gGSzs8 z{?L1*1bbpJ)He+eG&i*V;jrGjO|Wk|0y0=#Ndz6s^xjyeuPk|o!&!sq4yOPF#@ytn z{SDav@zgKakC$swzj5@(QS~cE+5cKUGk%C(m%MS39Y2Jp-$`p+1d1^Mh9l${Ec~Na zUoBz0f*-k3l-`GtsnKlyi{g8AAefs3tFNR|kk^00A66PGk*R71|B5L1H;;zj(uG6K z;2-8}`B&0%;wl{O9FM+(TJ?z3YOG)1#TCQkt(Gd5P8HLrp^JR@bD&wfp~io=n6-mk ztBhi1AM#}kHT+aNBq3(=bf4CvD9$!!BaeDD zr6ou*rQFgq?GS%+5rs3yl0?5__|zsWq{?IOVeoYv)U;Q#hzFtbprbhBjaSk74wAte zLNfA(7ZJWs_hXI3OFi^vbD4KtO5kE%*|C3HX)H$t(0wzk@yK4^ne?}rZm#bzRY-;- ztiwK9Avzd>itG%t$r+*{1DLX4_OGEy(mjJYPI^>*t^G1G5cb_zgJZvJ2t-1dA!j=T z%gxWd<)o5Jtol$ndJ5(+-x%GbE=}nv_~_KSmbA=(TSY@7nsN$#Gw@}8?j0wUz&8!R zcUBtBh@sBIuGJLM+KqUQ?Q;-+f$g)H?9+$A9rYh& z87H?dxz23q@3fIaX*$pp_b>GRkd|q@unAua;y*;#gZWTlep);pgB`W@>6My(1!g#_ zjQK~fKZV5xeH}iE)(t+ru~#oj8Gr9daV1_&Z#w=Sd^l-@5(kw_GOf`HQmY{CM+aSA) zb&?a;hX%D2V=?`u_e{maRtpWr^Meqs>X{Zy%-OC5Z$ZUxNe%hajW;$bQbQg@$F$(t zS`b0(;7G9UsbSFu#q})0Z&>tzTrF!rHg*IOeGuPR-G=T;?+L@gv&)UDKd5m+eFmZm z1C3JlDWSo|Ci7wh=oHrH{tfHNG=UZFlV6sPsK7Hc-_-t}wReGws`&r^Q6WV|upqIt zFtIdml$erHu1PKiUJ6qyOG{15TLr0=iXkcCsu_k>mX(&8*TP&a4HIv9K?@Tr%gXF* z-U|~e<^OuW-)Dx|UD(g}@q7GzJc`+Qzt3x)^FDKC=FFM1+d4m!{wR!O!5C*_+%6ci zmXePvpZ-{X%F20}|H#Ea529kwwdwvr?;ps|)Xg1HK`(t+ zxAm6ReYE?Inin;UyCYoAXsbu5cYM)=R=|sv<KV@)}i~J z*p%E_SOi3L>DiCfzJl6cy^Sr28ITWono$XqVp#OUy1k=eOhhAVOm|H*lt)`Xr=nVx@sObsyJaZ7E;`wy@u zX$LBRD&*cukH))F85po|`!IYCZY0ozqOG#}#E9wJ3mFv^8!h(UXWe>;qIChcoEf;a z!2w(@b{p6p)WIVfjz>Io;7R-{o_N*}N{a-8FsF+!?j&&A$j`VCX1$~>PqKsc8Un2! z(3S;ryTY|JioO4>JjO=LmXj{0q9W>wsklMle^j>!c|L-3f%yhKZ(l&w!JG+==xIz| zf3#0f*AzZ4^{wgYoCvliQ-V*>j~PFpt8u#3Iz270(|{I7P`EktT4HxaevL=*HFX7& z@fe=>To{kyo7;CoKOK}h$kT0m1*EgIgNmrcOjQx7j$b_QK|%G=mIfzq{VinLB`qPdpeGWjh5D~XArd9 z{WN>I6XOMjVBWlz?4k`8=+WbxZgpGk#88|5jLdkc5z=Kcw}jeQDUC~Ubg$#gJ!m}# z$vMsnS`??-fDX=_`|;-y{C5qFs)yK&iPSzMct}mb<7}G$@o4>4>{2@6m(;*Gx8>2)B2>AJ9*kW6%qw z=3Y$AJ<9XHb9@QR;#%4k8sWK>`dMa8HFfIhFkr3Jc z>xIz8z7W2}xuBXk5r$(}1$Y^&ME0UU1${)CuQ(na_W)}e(Li!mIPlj%dt( zoVaxQ*1>1Qn9`0qp7(G(4n?NTc5u4D45fSk^Vo_^;0?o<)f-S8G`EiKRBeWS7`wH9C4zSUGo2~Eh3Ac z{{InCKHt+CVn&yYc^@?uGy<6=aDPqxFye|yDc{@j!#vyx9L6|MC#7|b%HcNof<+eq zuY2>B2q(5g;Ku21GzEK!2^|}{9!$GiV}XCC)dq`Cb5e8n@jgk6`Pi#VD-k@%Kl+Gg zFZRILBU9yg8}mPT)F^869Kd*C;?SeCN}Sz%2Y?Pgx1KecCYROYT=vD`{=8Zq?)zFN zARaZX$LX1)tg`uppw-cUA$a9qGX!)#@O7v>-NJqzOgOT>#N{^-3vc#Ay)Wru-IrOv z)WCB+XT2}=Lp?mKt6}|&>F8hK5n-V-f`dBj3U9yVnXCT_e;5z(wmci=q-it#%fyMn zVQmVXwYF@igA8YvEza;BJDpt)Kik-e&332?++9uN5e0HFyTSyFcB1I9<5ACnP+C8w z{oU@$9U1$_aGBBGW%f17Y)WOC z|D=39|G;h%D*rx|&kwn(F27=Tz&g)=&a2J`;H~Psa7vZs+Y7(gJ|OX)SAE^H0+-#y zyX<~O+0CfzuKmo-JosKS50<`UIv?VE)}GiURix6g&{;eHNy)v~p~AWvo4@Bcn}^Km zfUW(Qk)-5yd0NXHw z4e7u0B237YbSO2T3TJpyF*Y`bXVVf5cK^lX(eA(09oF?PN4kp9q0zl(BVeu2%X-ZM}}&OU1-CtUqLgk!Pw{cdEZxKi^| zT&Rt!-xoCR9qvFTHrvP1YXB`Vx5FG5?*crE3gQdAq_%&~rK*L!fIREdE~HK0iSap? zOTsllLwO%s<#=h3Qu)@~wiVx3fs|(=lu}%4_oMaD?rbcRWxjw>wJjF1)bEpG_Qq>e zv4Eadn2u*TSQf+oX*rCX(|^pI(ioG8f9c}0m&D4SAm8w8-k09x&hTkJvN5V$PR45M zci{5+QB(`A1jtIH21%H?s`VtC$j!VjwN%dA7uITgoMW#h(Ocl{Pf^8aRSNZ;`xO~0 z1NjcE_%!W`O#eW>4ibmEsRVKv9uFgsw<6CPeLE@Ad4Kj!Nflcg=nNrmy|wxsN#$Gp zZ0l<4UZhTR;GdSqS}&cvktZrD!aq%#!Y_VcIvj zSd7kLY7t#i`YF#N52-iUXgr8Ecd+0REW{;9n*negZ5yjD!8m$kjUjvh28zGJr(g>k z9tWr7WX!<)qmQ$7Pp9)U^|X@KFMOXzre8(xzQ@oV*aYi|pXmC@n1NRYQ*%>MsnkBn zt#|nyCO0ca%@agZ+2#xx+ zv}$87HVd%|Z7AuCC-do8KuwE{%dM4@1d6*cw@jLkzxDBVQSRN5IY~?LDH@;FcNgUr|Vff`03Y@g5dgwTU=606kC{*GkPc91{in%S5HpTek37@oE!6;kvDpoyPrOHI7it-SR;wWT%j zajF9r%v#d8o|@A7B3e@Ng)_7OSjDOh9+unhnKYp_4?Jrxr)T6@g;)Y9zy7(}6;UI` zV!X7D7xC5+JT)QN`>8JD$dUHfxgupY@V~X1u+|&UQcZ0zJ^CAmtC1T^SL+|@WN5QR zm(^t_#m=G2 zcWMz`#g!NRpsm)*x+u(RzCrUrpX>i9u76q*apL-aN?rdLLeF7iD5mG#bAQfBEk*1i z&}l8To*%+Z2&qioSJ^zIytN*c4p;EiHA5bwBN%RoZ0pV z^f59VmkoL$&yohN&+P9pJn!b=xi_=c#&5vj<-h?cQK&Jmt^HDAhH7*$e@5BcTH9PRfsu@q(^nKQKI!o%P)k`2#ORerU z;Uen~rlJrXMXE!E=iLw*wMSwjY%2QK9VkE3N;*dOcBwJW1Uz~wr^0f5;+?fq;>`pI z=i?||#^85f;Zv~4>LWzxSr9iFbN5?a9+gnaY1nDC#^=g0xX}6tn?md{_^8!jD;X;T zvxdgt1ynu%z|2Ll4tJgerUf&Et->G6b1Ny*X*_eAq>fr0DdNa0v|7)X)FSJEZFO5a zkV0T^&x2m8*qSehh4k{7D|Li5;2>3@IJryGxbSJT`Hh34TjIza9GT}O3~nnK+k7Q5 z({t>|+=eU^?;V+Dk9bF>AwHXtc@^hGN2Y8G8GRx%g-)%1WG0|khnp9fT~YOzAuJDn ztm0cpks@SyeWZ zhqrSumPpOr)*Uz*5{%~&UX-)QY9;5#I~b9Jyn_*p&t@>D{Yr2=RXb|^UPwltU_3*o z(?1wbp;(7|ku;Ob)A{*79oXT48c60 zd(IP0REIx;I{XPJ03pJLlI*Y3!})uFXwV*EeSfF|cQ;SeNzQG8-M>Gi--BtD*Zdgk zfE1Oh9;N~@%8f{_wGYEW9bA`-EEngJ{aK`(^fah6xl2(7#_=@T<0JEbMdD2AaE!J9 z59pq|E|Yj3|27E^SQ0dj(@Hs9QGvY4EgZQ&(Ecnc(dn#(WtFR~!DwTcRYc=0tvbp4 zehapUIO!>^GkLR~{B_xx-jXIieNtNURBAgdqTp3Pyrq=PFJEBY1~XafB}{vBlS*@X zG_gAw>Tj$)-%&LpoH@@&qi3Zl%7f>*;+V+r!f+P2XPQbyYee10*^jHH_j;GyU#1fZ|t`~1gV%207~a2 z@Nx8z<{F9DZp(U*d9VU$^Wa3F1(3M;w(I{c|EJ-0`41Z9kD&4=piL~brcgoXp=pB^ zX8Pl{(nR2`*ugUR(-3YB{ygmS`aS>&$wq{Pk#lQ@P(n@859d zhIk&c=Qg+%?~aAA+{B6-XnvA-7JtI0y~ho02c1-}>u~_$v;!~5$fgO5wuj+vl^vr; zuW{WICb!IZh?la$lAF^!HTNc(uRPb8cB-P0+(nBHbmhlcjsY|yc{bYK_IgE!uQAN? zs6oSh2kOwpaXuVzJ50?9=VJ#5dl6ywxC+X*-y?i>3!VIjX-{93TQ%&n#`k*^j~II? z7XBeW4bhPp%+IZ{M*};a?1yGK*En+?L<}E{P>;&+3Px684d>(g)30^9jkU7y>A!N& zimiEn(8V2HQHWjMvz8%K-S2mI-HmA(Z=2d{-G#w`=483!ajlGxNbkW9J#&L{uE3*R zysPs-ur;$ChoKkV)p?-4HJLs+a_@=Exd+?RdSQz4K(sXynaGRDxd*pJJ?g}s2*(RL zG<8Go*HrGU@wm;Z*&fkC;JaJS{*t=Gx)Z62t=O+uv8Bu5@R=Cb<$9t?KQ5^23$YUv z8-K^i#^0wp)5c%yYT9ZI!;^Nop6LFWuw@aKR#xLUgy;Sb(QBmN(cqOfJbNy-PIxLR zvL;6dO}-EyZYOdcN8+Bx%ZRG<9 zI9AtM#9$uZ{H(mO*0JLHx){rNq3sxww9t0DvC!5T2Vpkflr9~w`8-XYu4SWIY+FKy zVBZq-JXUTpg(jZPZP+c8z;#kOL# z*!B~fFmF$yb-53%_Or;9rtM$Iw7tT5aRaxne#qZ#-32=h`4v`+jpRv7Z9iF|Z73J! z2sWb*wfk|-KI<|HzybY!f@33VoEx7o?f4zj_D0CX*BtD#{%wm)|7k}Fb^tisZKbZ$ z@pKyoG*}Iak<2b??bh%7pzuDVLdlDwLP`jr#8tT5FvvA zom(0NXuk@Lk?99%iSS$E=EoMe!MS&Y_4-$+ZkM~qWni!Tn>(pF;N_=pPb|Z}qv#V$ z%nqNQA5eS8riG~|xscqDcLv!lXIg9!6`Py5w<(?1>*>L55AH$L^{=|W7^@raj&$9R z=|l<^FYf-HYevcF6ZD!twqIFq!-spmpE7Vo&lGi3@@0&NDXzC-sr<^XWc(HTPMtZ} ze6od}(52)gM{L#m5kgv{%gp^QC#oKi;kEwY+^;J36q z8-1VseF_8WuiMs9s4015Ds_~5}+iI|5iL7KfkH@p|I_et^ohP=^6 z$-6chEPKChc-KUx!+lD;6Y;_G&t>+WsJzD+-s$XpTD(6b?>*xEz4Gp9cz?^@XT-Z< z7QEjU?^L9jq>bV2M5e=iR=l&wdz^TGp}em!yuW7ebK)H}4c^_vdmz%Ree~MO2o6Q2 z!~LhtP2Q2>{j2icXn6n4-hYXALN>gQU*ec#BhA`*hW89)I^1RAy_>w<;vN37?LEfu zz6O~NH{EvPTn@qq&nx1+KzTb2@3+|dZ}BcB?}x>^9&UY@`#|yuc?XI28Rh-0;r%CjUli|-xa0DCjomnCRTGhBk~N0+G`>yy zN4$5C_hRv`g*!?1e#P*<%-;0O03-?U@H{8p8OnR8;Vt*W^e`XZpOLpyye}y4I}PuD zkm+z=67NLZ)O)V6xshg)Xv6zOWIEiJ#rq5LKKU=#vKAIf*!$1Ml@Ywm-WB3~3p_lV z#e1~!-eY)=L#D$`JubzYyyuAb8Rh+f;r%Cj*AVZHSOfDsCf-jY%_NzIcRDih10CYM zp1kA5`(Ne#py7Q5UU+f1Yl$~rl?(D*A>P?Yvv$1UJ%hc2#d|k-m;S>ssXfc~ZeV!V zMW(|YBHpR^;8`x-Im+9Lu8iO`_P#>AzaZ}y#rt37{iWf3nZ0X^w*#+nd3uR=Hqy-f zmf<}InGSay@&1OqW5m1B9NYUj!}|tgI^3b+Jq#Z_e`0t+`+iq>_c6Q|vv*zb{++yw z#Jf439x=(yhWCxgbhzt@_egy3ye{5Lly|Vrxfs1YiWWNrA3Q&nb4(U0 z?@@;LBKD>+9^Su__ZsoO3C|>1`yRvlR%ANd4aGYHA3QIK_Xg!1V|W*__m$#Zdmg;g z#QR>PS^J->D`PSonGW|=;=O^qZxrv4*KO|-!#f(84tJz@KZFmS@(Wzc50&>S!+Rrp zM~Qb>KD@sY?}11&$qd7L6fzxd`i2$6WHoueCEouk@5c=92J^|gk$CsT2hSMsUWhbn z-(h&KVQ+f;3+=ziyQ_G2T3~x$ZFqM>ro-J>ytDDabESB1QQl{xDkE6L-q(nCZM@3l zIrcZlAcL96fAl|j{ zwMCwE@xC8v_I|_g9*#_hySaETBky~}`@Hf_H@xdCBJWu7z84=n(c(QDY1Zy#c)!8k zEyVi>dH+$yF=_R#?cLJwz5|)~6;bh?f)Ae0#e28%u4#Dx$lf=JceD54JxjcYAM*^@*XVSH@$Cre`nKclni-Fzmcsk&pIpoSNOLV;HoPB0ro(-UcrPLEFU8xVyayZJW$b;ccz0R`?>zB- z0cqC0-SB=HnGSac@!mz=!^Jylx$PZkc(+8R!yPZ)PvL{7vv{vp-lrQ@M(`{4?kL`2 zAHln>cn?IHNp>3Eqmb!v%iH#0tI7L^a~zX@mG^swcY_t=-AT0j;)7?EcrQenwO=&6 z*RVHjR-*o!yfel7u9dd;1BQ1uWIEgl;+>5Tp8Ldmm-3D?yi3^ocJXes3f{5e{SeYj zQrGYvj!cKUi+C?1@4wG-El(-$V-b}Rth1WD?-1{Y@WHcFyjLU5+M5mUuh=_Lyqm6p z_Z#9p5^46HZ+Of1(%mWE#pFFoysuqrdp~1%w?n4GeV2Go#Rt!w;(btgrx@O6*}JQF z-~BPXBgA_)(oAxr;r$*m9d3tspC|8M&TveUKe4@o4DX@Hbhx{T_j-Kr6o_}d0^9q$ z@X83@h)jq3Zty#c+W2q?!Bg29+_Hi%f?*S-gKE?`On2VT0|x-|$XDro-J+yg$STPj~VDOL;Fh zyszF!-uH_4NPO^IE#8}uW|C=!cPV?Ph2Rlt_bKw; zDBh0GZST&8_ru6^xO<8BYJBj_6z^J_Z0{=#@9U81aMOMX^bk+ugXa2UWI?OQ@7_qWc00rSL1a4I{lt4AdG{1= zkMgc#c%Ni%TBAk;+i!t)6Y+i)Y1aOweq{tFBh%sTFWy_o`!qK1;mn78X?uTecn2ZV z;T|B~^gYR*Lh&A}yk9rGpJDHT;=PW%=Zg15!?XBysvk?C*`7Vr1T zyN`JPuDpjE-oLQ-5b=)M0q+}ZZlqbetKpr3Oo#h1@t#iJWq7cIT5eU|*BIX0+52(v z4&4dw?c$w^G;5dDt&HFRWIEhK#rsY2o-f`%DerxT_aE#%OuXCfg7=f+{WQ|7z0~l2 z5t$D6aPj_vyzdb2T3^}TFB#s~A=BZ0LcE{G2Tud>-lV)AHoW(<_XzQBz8l_0Esn`} zq?zP4!}~pCI@}}0J7f>MKNjyHNV9i@;XMtR4)>GdeTclLiFfP0w)Y>Ql@YuLnGW|; z;=KSLJP(NXdF5SXct`Ie?@{9Y0zPoOt&} znn|uOyzfJ%!~L{)&m-?{Hg_;R$9^CG$CHCmSevBpLqhW1tr9Mbgs=H6O-8rAa~d2llvo5bWPl`|(Q0iOC5WqiKH{G1bYv-y#qhpP8s@YSSI zFZ2iwl5bL&3sinsNIUiMz^FMrGQzW8ydQOP;+=Ku13*>m7o+Jhocn4OOs9iT`3SN&1nSlh?kDdo*;e++$ zJGFwc62~K1k?|vFkK+tGT}>Y)M?A|441 zo8S^J=IM&3zu!Cb9)Ql)1NSE191J~d#S*5nwTeH#ZLq0-HCE=lA`Y9fM6$wm4a{}*s1sU z2RnFYZvC1GVavf3KAU&%<%Z28!0cTa37y0Kxhpg%{h=9nfQtWOFgv0CMwTH_LL`O5 z6?O`LtQmFjOA8^p;2(72X5Mmvjps4gHcNYIyW_<}eC>w%4LW?OLkxab0~bFy39z0Z z6MYbpwEu)(W&VqrnEh2YC@2_U)@N_gsVS%aBRsp8gtP-bIox%#auRr7KF5Kh`xSRE zVY~6ix&a4zno@LmzY6WDz*dHkPC#~cD6(JSpzl|(R?xE-31?U9OuU4%Jy#Yj#<~>B z;k?|v+HgLF^1^4o!WUrJ1H>TVTyZDDnQVl!8~5w9%7}1o!#IIj{)jv)0cC6tc>(@G zC$JUd#n`yY;N6el9jIvsud}sJ04a`Jk(AAKXw{#hHBrwo4iW6bkAF+h%~>zJN%7l> zB;q$n;`bNSFkoEyZ;@=Hp_9V#dxJVgSJ<0$;4g0=er;6z{jQWrpFGyR00{G{^HO2sp%JA%JR z>0EE>+^Tg(h)!SVe9>~=4V&c0vJIWpqBBD29I9>b{DG@Ocw$5+6gr=6Jo3eA^($n$ zhGRu1PU*}xb>7oDrMGguwpOe#5|FhT$RK{>f*4! z0Fxe;2sI^|Xo>qoq6v-vfx8v8*13DP_`aqqigGtI107=fZ2Tuq>n*IN^>r} z4K$brQuQL3J%Y*n1RI9&#ua|A48J@T70M;qlLy}aWAq}66U<)Z_`jk2d!q8Yq5E;+ zAb)prO~@w&-rU4e;M*OG*i9E`;GCHQfU@!oYHu1 z^mGM12|tv2KU9q06V-YTv0l{BzIMa-zLueKn%f$w#EME7tLWbo)hbOz<&S>0$~;qL zsaE;19kcBChgj_24?bF1x1Vq=;>zu;YSi0Qc}%O!7nP|{`Rvcx4a-zNq-ov}o%%|r zwyATC*6AZU3DEJA7%CD6)%8+T(+JBUzIZ4sVIuMOMXFGXR=2h1t4@R5C@LQ+mC2^c zt6F78TMo+_R?$Bvs#P#*Q&`&evV+^%RJm8HOcj+US!LR?yYP}U`ZTSwTvTpSEPvK8 zY80YXx`;|FtJMCn0B@65!yU?>em!l?AF!r9nny zPH@|yIyDoOx=`_JE*T>6h?1CRN-Wh9Kem?ke}TeM*6h=lyg@pN$^dm0^)^)=(<<{t zWh$$r5C5`(x5`CaqX^0@6_ij@rHNL#PgJ@<#jiS>MPjUy*pBVJdV+G8n;%6aTqMf> zrs{nC+xPc)gJgDnU*E`a z`Rq@Mi@!=OQAtxOcbh5?XqB0wlEErhPd?byn`Ik%H$?YFrE&>-Z}nv#p;hh?mG)5i zjK*KpA?o;Mi_Y?U?8vM$b#`7NQHspv7F?&_&rzMCUwMCkH%$*wS$wapGS*aiNvpU; z8ZRd0Cwq7jyh+;*rs?L{RTDqiES z)|n+bHz}RBO`Ww`=l56+%l@+zmUTn2J9&qtkEk?ObsAu*Jf&6M6_r<@;un@Ek@!)8 zM41vTwZtPL(St#rtoZ_7*2CmRSLYDAIE1BCUD3tmMp%B~2FUGSRBEt_9)GpU0#Rw8 zSaM92x3tRF&87XHsiHcMh{PGyDcoa94Ac^{MPdRZus3zjbGy8&6C)}coOW{yGF7h9 zD#@a9E30f+9y#7y#Ga&BakV>?{)U@dl_9HBrf3Vfo+4U=dV0woD|Cu({hn5--%@_EE}niG}b zwu|jU!**HOJ{DW9w&~$_kyxHKEDD3h2>?FeWwN-e=gC9^Sl?z8X&HW#Ua5NcmFEG* z{cX|BI9iXdS3sY}SGiw}lS0p()Z?p+yD^e~nDS+Om2o#h@^>MB1AbRYR>^89yty$l zzJ8o!H$2CAqv54-Tc(Eh3j9#jXQ5(@uUe1B7c}2#s?GdcW~emKD&0k;EvxA9RjW)A zmAZHu!X5oOQ)MSNLt?pnJ+u6Nf>`wUs#We1l>w?oV@;Kpw2E6)-ena%GHR6?qS8*O zv@%uh&??V}%0tztY(=MzxRiCbYxL`1MqK{>n?6vD+K5UNtGxVn{)>DqX_jnJ*{)O; znks9w%JJ(sF2#TNjIUZJNpyPNWz+OCbw+5Nw?$_`*#)nmT>8&UDck$259;)hZF9vO(3U{G3szdRoOHDmO#LFDwT!I3O&O zmBczzVkb91ZvRcB{aX~4$g4c~Nm-1q8YEv-Ca77|SX1RCt>PAycUeV`uUciGsH{>! zX=SS1p;ev{m4~3>SDoubVz!bve%6S{MQ$}zo%SLT%^-Sw)gVVPE+8la9d=t;WU73k zRXo>nP`>`1f--peVwZPN-V>FqF1E^prpjoo^1i6dgo@Yrs%ah*orjdpm8MP$t@DuR zbcc>#SZ)%DASF?J#t6$V-1aCe(IQcUE2PI)4dTI|fL47a%$2A92gwZa$}E=5HOJL3 zdc8fqZWcp+rNPzn7aqMin8GBzATMxsAu~%%*h^@7@ z>G5^2SQ;7@g^?n5*R7OEc(($N?qBb_({6Y_pEAyN z8Mhuf+c$GHLau^}F}`ZO7g#SUR<)ToO_fzziXLCJN}{MN*Zse#GD54o zEh^JlMXw)gl?sefs8M;MU88VQxA ztX1lW%BfCvSjzD}vAzker&S!Hax<&w^<%B_6^2U$_xC$&m5)u8ZKp|+g7WXxT%%*Z zP>uBZu~wNWDlVlm%2b)6Ro02h+pMC;SFO@ZRNhgI?nYB3L92`vl>t!k8eg?e1JQXx z>HPSI5t(z`dZ9GS0vuA;fj6N&4TL_bqv zgqC<)B&I{c;a-|CBh9NFOWUMeWNJVsD{;1)R_uBm?}HC`B6|VUBxvz{u9;6 zU*$N4Kg8u7r834;nW|ORi^?Ka(d);WWhtrThOC9TvR{8wG8cPg&XUaD$dvok7<+)7 zB!=564X&O)^YHbQSelp?StA}OmYT3^Bo+*?SR99CkZ`#Fx^n&R-W58IDFVXsdq+Dg zoAIqidgMIty9!HfQ91iPsp#=nS7)iHjE=KaCYUO@T4hT(hh;gdY#6b0nm5anqVj}d zxz$uj(kd^A%1~BW9(C$xZ1{?E*(YUZ6$H=7b7edw;c-0bs|xlL5|n$bKD!`0wxFmnXe{VvrU!vv`T51 zwEx3Y9XWKh>QpSIFf zR3_ePx7)&>ji7wP&5wc-Dk^`LQgt3)n|9PYC^bdp{WiAB^QMYRt8A^$L0Q2nAtUGa z_f{#wWCfv}q*UTfl^$AUlBf)?M&)Huxn8N9K5EpchF0k$Dlx3mA@rLMyjh&2k{fah z%$5Cm7s-tE%4{c@#fQ}R+uR<1n~LGnN`tHCk32rq6U$qsrHm~XF*QN4FTt{r8Vkl> z%hgk!ss1Lm;fAf;)$=?bcR*}C4ckR!+a$Jj+NQ_mkHivbSQO%XFnH{2~h8jYod+aERmx?IzczYbFK z*Uxvg-kYo!6|9=v3#Q5}tx|+7cwkw{Dtdg@DuYDj6*Yu(G*z5hWwNL|!78_$`tu|= zT&;4wsFb#|Yjoy_QKOn#rL(9sgUV+`j;D%L_o8)v!VCzJS)p`3G<7!eHARs*i|weW z)8UfJ9!g6r7KsccG1Qb8uO(KB#Osj2+S%r2^}Q=JTvU1}mFrBETeJ%8uLVdSR?*|L zW@#xZdt2IJDgD6+%ZZ=p168M)sMKYZB^@hduAo)^z@!L4+0oWknQN*n(JJ59W|pFF zs73?tXoA-kutcg=R*1@IrIKQ*JgQaZiOOVF(c`mL86zrFRHM7XRB5bLdW%YDsCeBU zYn^tY(?jWO{@#ep0d9j7ncAXr_G_xs^k=({@UGKY%&rib1XZUArb@0>*@BIEI7`c+ z;@9HViNs|E($SP~YKh4r@dSg6{Ih~Fvd zCOY58s`hW{EYUjO2TS|kUqx7Ii$tc9=xs_orX}W!#8gN)-0y`isOMdwU6`Gr9nFQg z^1Aw5GPAuhS4(CbGUfI-)*hbU7DJ;-gRAEe9%E*T_lfNz!-k<-YsO1;g4{YMkE(unw#VlVg?Jk#N47tIh1sIMeWu?Baw6C(>m!qfW%?1o+>q1zWL$2< zwV%&Ngd9euJub^z6*DLw?`yQwz!X zt=m>zsahRTu{k=!d zdt;W2kkWoerhVR{IX_79cTv8~$E2N{#at6~8<4-Du{xi>QYJOomv|eiE9#Lq?GEOa zgQ|(Z+P#!MP)GGV{GjqUR2=SApMHSv(?qAK_1NOAHr@-c?B~7l|%P;=6B*fSmePg|)dz)Q5z_z4+79r@g~EN>oCWN}j3m zp;kF^nZvRDD}+^EMUppfbWGZa&fW!fSW`@$N43s8(U}Y#M5t+&c%QOQy&t4x(G-1aCa7yjew9NkGlaSv{D*jpu2RFaj-2vg++twQ?;ap}AP zmCv#he%|UAnXaPKQ0c^&IvupmNYS|uI(`x%BJp*;9o!@Pjj){MRznrKQ6$2-LSMA) zHQl>HJ1~JpaPyQ(zNxZYs~p9aJ5*@b4hlqrGIm_U#T8-ljbJQ6ragAZm{K75F3Oj& zL&lWFl0OOg8?I4fM?Pf|*FE5(d---A>6 zs0gL9+En?HTOX;EU*z-r^EOh^U8PoOC@SCO*(@VXl^3n$ELpH@B+kk!I$A6v4U3Ws5mPU1a&@cW>M32s zIou$C?pDKwt6gkI$VOLAn+sG!xuRnR^IXvD6-nRu;Nl=0sITecU&=Mzf@?5G3Os;J z`2b_%evh-$zO*24K36){kS4~=5Ia=QFE`guYhK|jdK*wmjkukC*g-` z-VYUHeNO9L%X(2mqivP%zcN%#bK@bESWyXM6}>*ERgT~$0j=(jCbr5vQ)Q`E`SCon z?ASsqx8Ho#1KeJ;$~&UcS=Fewsq&asnJ+3+Sta`8EAQ}D86qkTluD?n(nPD=Cn{a4 zQE4tJCD+(B+Pce#%eQm@eC{)x$N`u6U z#2_V+XG(miC64^bVcEW!!tz>r^SRz2f8*`~Vd<|fqh6-U5Ur9gDw(XJ7w9yLTU1;s zD0NJgYqd&WQMnx|e$|;I5@VFaw(UklO1b$_L>h?1g-ukQ)btHkdRONzQR&>sZYxtv zmAP7F=Q$3_T2|TgR3D$~xrV4b*3ec-FjZ2t%1fg16jVOTy5+jh{pz#@w>b#z?Mmm| zHlt3#TIY7rX$~DfiI+v+a87G!db4+(a$L?JI{6->Kzs*so?!bm@E7B zE|Pi7E3=(s&PJvTpe^hHw5b@Lt2DTJ{=kDwJ+VA&TK;6qMcmY&*lw_Fq_%q(b&2lTkq7^S~Q@l z+43G*U+bJ3)~h14^4pOd?qJY6b0c>;a)TohLN<6pgQm2`SNtqRg1!VL248!Uw;?ph zT0MaZsDrOg+B7Q!-_GQS#!^ma`lg_4xLR!DnJldWVc4t0gC z{2E`KG&D`VI;jsC^84XSg68V)_YuBTmjm#%!ePu8jfCPWb3-d!^JVz(ows0~iK4O+ zJxB^)q3|6bTfFc!CBCBjg|Cnd7Xa(W*B}tz0vyJCGmubxX~Z{nyo%pwAHHE!)JYVT zl{gSd;mZ_02ifwz$I^Bal$>izL4Gns2Ym zyZzCAF>3{i%1TT?QuvONlPjzl+0uk>H1QqlD|``TXjBznyFh%N<2GL@5{fVVQ)tc3 zQ1Q$5;adk+t3LBBLsIzW3*W0`D=6gn9l?)DTitCw+6QKhM=<^3H|yU3@f(Q4IDSqf z6ko|YXq`z{e2G4MEvTqbC@L$lF_Oa9NBC-xEmHVWiEnWqiQn1ZU^oO=Kfcrd1mK&9 zhX!(f`RRf5FY(0JTl4L`)#v=e)!KuiaDI`r&o4RQ{E{vG3y$BWec%hW`69^BsVcr+ z{{-M`g=#ThG!iO)c?Hl~{j7>#znR{A=a0eMhWR{53g6N>%y)onC7YSAE%6QQZTBx^ z$Oo)n{8n8Iz_$R0G2aX%6kpjV&E>sGw*E!+#f zqF%xmM}`Z4_2X+0kgrJbA))xvh;QsODt-s&V8l21;A)*jQQ$*T_$+dAg*nKUw~6By zMtre~j|}~*;u}*QAbul%wfP1hq4)|uhF0;@if_|mG}jbVLf2|;qCBSWLA_}T^HOU7Z`{yHO}_|n%xYxX!5za>6=QB+iY<_kqq z`1X^NE9@M0C|L!car_1mUw51DC>h2hn11o2_r&$LJNnIEa2WF~MMCkFtbx{*&LG{wU0QP!#4bND7}*_-H?tmA;YVmq>iUHeVqbI#tEjD-hoT947q>5{fTxHMCZb zQSm$Vns@sfMn$z@zJW*zUy$%Q$X2p}`Bv@%-_V|R|3Zd*!1~2+Rat=eh2k*gEB~pI zuWS{x!ZqI#AHIWdwPvEIti)YN3ZI*tTw%2D-HI2!ro>m2EPS+I-nsx-KfVTm_-Ngo z`FNe(oti)s_g>NZ2xx#KCTb`Ta=h_LrSeq|~4E?L( z8}nCy_<3-H%6z3rsPkK}5?aNh6yK3oy!+>MaJ5pHZyA!pcb1&+J(y%GThDx#c7Si1 zQ{qSW)7E;x`o(YGp8@z1ezf^yAC=4xB8jiP=4(3FJANTJ##(`*vJz?AyztE+Cs)|d z$gt9cZ#3~8>mhvm$1Xw@5(`N(lEx=*SHvHJ{6eZx|J|2Ss6i zfTZx13ZH{)>FYRto3?>3*yf8PL#L|v=soCa$B$4P#(d?xeMs70-g0QI9;xD&;lp6M%0b4r9I%NT~RgErV9L=1cP7 zOQND?qA1Ltkrck2!q<#!@xr&T2z*7|g)f2(7Xa(W*B}s|2h(omqkZ~{FOB%dj!^L% zz@-@a1;_;%qi=5r&V z_#%m~z2@ua6Tf*>)Cv@pm6(I1@J$fDr^%Kke5bwy-?47OH<%2Ks^V)Gh;IY7+c4i! zBotrzhtQfmT*Ysl&;4aKT&?=dN85>nFG$u8hLEjbEyr&V@pZTP`jBBfg6S8(StkR; zZvhTtz8Od;zLF21b!M32%Xrm${1`?>jY3iAUy!uvZb%#_$3lwu+6uK44tat z>lKJ^A`WA|5lE=`5M>Y*xrzI;hkR2$|?KvMW(B!11vRLiN7`U{f6x05R23adf3yj2`O z*B9W6wfW8-grR>`d}FXOS}or$9L9WZBotr4`_L+WOz{o#iQhabDuwxSkQBZN!uK@U z%2qPprOn`*cBkFHkYPPw{o=O|OOVy_CEzgTYl(#7izL4GnlH+SFNBI(fub<~!xkJb zzMqj{r3v3?;yacoeEZ4Js4Bj8f%ul;Fy@<&gyKto4_dQ_sQ88W@MTa@^_g!ZlEODa z;@6jK1uHmyM>c`4yUj=Yk*x6ureFN%J=|*J*BFN}UmYYAU&*`BIx|@DUGiBU`i*WS zMxm&z#KTAm-(ca}LbgcZOC`R=cS!u!kl_$u{rFB}$*@|!D({ctiLbZjJMY8C_eXnB zlzD&DRrvV+DE%Xj-zNNUxfN{l@%>S!s`z>Z;!Aeh@#~C)ieKI$@U4DS#qa!D@B5=D zxLR$PFBD0MU*^Yre{^m=Y$eN?uPyNn?IQ6zN``#E`o(V*RvxR3-@vbJJ|_~2uk0OY zg=@YfpZK+at2Glvp?^VA`1Z^CUk$Rw3*W-ez*ls;@SVj58tVdJ{rDOL;@gG8q<=v| z@ud;p*hf_ShWYT(z9H)*io*N_N#UC>d{2`tZyCogjQC=0zQJVZUlre&V*%oqfWxGJ zK|=8rybZ15L5i=V4_^osmBM@%_ba}$!uK;Wtg@xdH)$jIrX|?@3mMh})-QhhurgTf z`CW#?q<=v|@kJ6}d(D^a!*N z#$nRGAffou7eZ_H!zzAlefWMWhPgiT9Y#|4x=Q@EkgecDj^7~S>u&R{A;WkC(=UFr zu!dM|{Bm#@^G!fP@s+#jvNAP7=Qu zG8_V|AKz)L>{ZKm5j$a+&q6}+#S>p|&3E31ZyQ{#Jt!(GaRZXVS4ZOaF4@vQ;P@pH zU$D(LhYX#n;_DTNZzK+5z5z%mzPvY~wfaF7zlA=09jT}`%-0G@;afvauCRt=D_O#P zE7yZ>=xq|eATs0w)-Qgmu*6qw{0{H6`F0|q_{!dZR=DO%_2F9rS8FDU!umLp_W2dQ zsbq^6zNW-i)KU1xk>LVh{rDOL;!DP19KX&;D84k}8#_?N?~>2+)hH_JB#O#P3`J7- zB82Z8w!&C>i#dL-Pr(;!^BpBa|El=LVCAyf_|f|i%(oN?#aFNZTEznt-#Q<@Y$_^+ z`6ePMd^_#?H?ozz&wQ8Gfp1#8#IFw-)&tfre*3UoS1n&F9L9XnNGQHY;%l$@{GRXc zhIs{w!ul1G!Z$FkG%r_88;p-}V4zd-z$MHK-0KV=vUmO|6Bba{in}wCVYU3A*!L@K30u7IE&LdKMRCGM z?^{?G0PDxsAQ0aM9L9W0kx+bT#5Xog#V^%|FPn-wiK6iQ4N2h}EPO-AmiG?FFO2wN zZN5Ha=wB7z7%a(E8^2aKjQOIGP<#b>&?>%P@tx20ULQKY1LhRw^B^gFb%gH#*~;E# zzDaArH?6(hzmQ=)VEy8^?{EOV1vrfPW+0*XB8jiP=3D5)H;jr}fugW}g{1JUAtyXP zCtI5EomvCFW9@`5jtq^e;%gU(FBFF{U-|Y*zVz3iHTymlza$^NgK)L#Gv6*Gg>QiH zttDH*LXO`c;_GhnEh58s1k*2mvq}TRZz2w3z7a^M_?66s)|tMF@6;>a=QoLp8ik^; zK8~dD1qoj>vPBBt-qqk++*aZjL54$s_2WBzC;*>lo6T2>gyM@QzTTQ|o)6zTxLSKq z6xOeh6uzb8gy(N$OMi>wmq>iUHeV(gI#tEjD-hp69LDi;BBA*5UWL}`J}Q1mK71{x zs5Z>k7)ks53SSMfmAuJ(D_4PUXd8*&S=zsm4_LqWt-_L5wb$>(wKkuHgyJik1Fdk) zx9N=c_^}PH)=U(I`7@HjH{mRgAMcVaUig|4Ur}q}n?r^Rfc4{R5Qwi8s>Sh(MndtW z5#QL}Dt`TPyxZUTtuUWNQJB9VDSUW(_y!B#TC$}H-)Q1H)=Kymk)csleC-19 zCE!+^`C1~O;+H-PTC-DC{8|k5Zhs+gwdyn9McgS1UuSZ{^J%(uE||~pJMt0uy4!sF z$uJ(l^o!ptth`klzr$N>zMV)Yz7iL-&ZH>5K{LGD-x9c5qfiv?kB}6;2#FuP7h**U zUn=n}ZYl8_M}|Xy_2WB@C8cWll5rTvuQL*gFP`{%YrZ8ud{I=?9u$T73zA-Z=L%s< z&*%7US`NNoo9`$YI#tEjD-hoX9L9W0kx+bjGoiKmUKKxIzHBP04f9PzQuy3d3G9C+ zTgmIp*OvH(-X!tsLxz07`o(Y6fdKJqg~OOH8VSW$mJ6+L&6ng8zw=+fJQGEse?e0C z1_<8)vc(JE!e!tqx>5KF$#4O%etZoA@h!k%%r^rG#g|5WV|%Ljotp05{)SOeCs7pU zFGzavImnhbkK-3ce6coP92xpo#Ww~kQ`NRVdf$Zk$~RZ?6}$qi;$+2l-iPlXT&)!5 z+l8bT-&(SjNT~Ql5?_1G_uHS|{YwkD zS}RZ#)_0KVLXEA7r$9pIjS~(2@7n#mPjbRk{QrC z(?jtsdBi(@A#k-up(s2*!kxVExycFrGu_%p3g6xjz_+-$#BVt*ljBLlA19u$T3T_lBXCpo#o`jRbuF2^sC_=0V|u4L#`6<@DF ze2sA!pWix2D89Vu&{}MVlN?v8Yl}o@k^ahFF8ZzVq z)-Qgm_5_IEKpe(=P9zjx*~`!h*L(-3dB?8>6*Ut@;rc*Q_#(17el^GzFMLgjuc(=Q zeQbo`0$~048U*6YSz_}|Ktl1Q5#QJ(6~BYuc(=cPaJ5dND6BstDSQ?=VgDc5^5$^- zT#LaMYxBjBp?_6;V|E9KUoxu2@#~C);w#98R&jU5*O5YF?9Yy(P^2(lD3ZeGl=z+7 z09)B?=DYMh_@>23{Em`gJz)Lfw+|~v)m|SPa2WF~MMCjK5?_1Gcf{xXW>ZlsP!!e= zkQBbI!Z(C$X~H*}_>NsKe0|8!s46~sPpn!#T7Y7{Xe1P0`ZQ?GzFWo5m+!nA=K9R% zK~nh6QYA3ICtJZRj^B~@z}Ma8D&^psi@n!qO zZx|Id3PoZ3MN;_Y3!j5*k;0cse2cG>_{EXo5McfIPGe=IT0VL}%6#SPEBWGyueauF z>%(^tuGStDh50>_!siygwPZ_oar`#D3%+2RZxIE zDzw5i-=!??>vtVot(hna>jy{*-x}e2m2C0Cw{Q{oikb*tCK)aO){n12Ail$EY`&dH zD84k}8{1XI&(+JDZwXwjlPC)JA4m#c%ier_OeI@hF2^s7_+o9oab)OU72g=F%v2k{ z4eM;arAR2gf=p-?-=+AL_{1+8u2u^3O+?b>llToGTiGkjH|ZVlO}p0aU&yc?uzvB| zw=Do)D;y^M3lfSilK9$dzD+)S=L=w7fub`^>GPKSlD!$P^@jD1tYZQt?|AM6OWeVR~vPBBt-i6>>+*snb zhzy4S>&JH*OBmJiO~hf+zaXLF7f*b>HD6O7z9cGY4~oM2B$C1xCw$GwmOg{ymq>iU zHeUo8I#tC--``O!pXXznuM`Qzmp2JotM5?p+xC+8^}7zPRvYG9hNSS7lM~h_$yPF* z`BuIKzM;`}|3Zd*!1~2+6;@`dW7i-@K{b=l48y zwJE}<`{#0U0w3ARvYGGF8{nIEwcWpvVLf2|;m!MZ8ik_JzaS}mgYEu>Y>~p3N_>kWC4LcPI0RTfzSEln@Of6*e5FVzzIfv6 zt@+OT@U4TZwFgCE{(_|N)e*i|$(EkQ@!K>Xe8DzfCK)d<`}Q z;9K^(%{Lzj#g|5WV{cROJGjl8F9WXDNfd?k4J3tc{&wc;OSZhJ9KSH)i?#W>lA(W9 zd}FY3QSJ4SgY__u-vlHSU%_+GD(`79(9UnKFh*L=f#__onf*$Nbe=UYe$-vr@%muzXm zcWNH^jztLH95OVjimzQDzL7YL`34}N_|h|=H9KC#FU*IpBNbJj`C1_r4m5x5=k}UIJHZ6pF(A2a@*r zmGNyV*&>B+Zyxv-hfDm%k>L-Vqs_0bWo)*cjv z{VzxgU!DK>`e;bD^vN8*MB)p!`GUyMsVcr+f%sZssfEvPG!lw0?^$TAzE#DqX_`0R zd0PHx!+ahjg)ferFh3w$$t31m`5O3!Hjwxgk|7_ke(_s{C4y?>7rM;mD_>g4SN06F z!ZlypOz-*2LAY8oQ55<=B!zDdIidd}TfFc!CBC9C;afz83xM_GYY>QUA`avDjX*-h zFOB%d-lF2?%a=q&okUR>e~}cvuEN)hYJRq^ZR6TfY6wc0S>1|%hZBZTi=vXx9=zP7|S zG*sd@hYb0E^^4ys+__g9zmYgh#$O~9U)gAAg=@Y`lf2JwM=EM2io*DTq!(X9vc(JE z!dc)esv~?sWVirWKfVTm_zu5s^X)`J@ud;p*fuJDzI;pIYMn$;7=MuzzQGc|sbtF= z&+!W*zF3=Y92xpo#Wx1G^wq{M8HaKFIwPU@3PwSzxV7Rt?-Rc$Dk_EfLXi}{0m66g zJ=n^gW4=i)@J*{N@jFU}^?>z@-#*-VSIf5nhcVw$BotpH@wL}{r+oObsi+kw3eP`~ z6uxNT8$z};;X5@Ge8;X3zCL7VR25&lKzyxm81qFVq4?6Dg4XPtRs7cZ@ST4b=K9R% zK~ngRk`v|!WGl$v_zfby?lxZ`8O9@+e({@yTkvY*w*ZGR-wY%aU&)iuI@3z=W&7|A zqoPKkD6AhKDST^$&q20G;oF-FzQrLDzc?}+0<0h3Y1|oC%NL5nn6G?MC0{)8_11j- zeE1H+)!KuiFn>W(_%elWE!oo3Iev-67i{w_B15OD_<9B6n~1}hZv+x5et9FIwYsH> zUke|;Br2*6^CciDe0_wk8QDsnWxkcKfNyB9#4myj`GEC{-zwZPR~tW%T3;(Q*4N5L zKr3AHoqy50|62!FYbJ`q`~XSeixIw8$rdksO^L6lmhfeg;R0a&_!`f|udwuv?P*EpQ6xJt^6uxqD!u)`2dCzeCTsh#2wfWBS`d?LiW3aMNZTxnr z^#eB&im%`a6jFSn;#=awH;;-+VZIzBg>S#`Jx#WDe)UjhV_8;i{C!n z8CT0!<^H-z;%l$@GJN=Wf87cch5Z|PePf33@&39r;TuhS$7%>4@2_iA6<@nRe9KS( zpWpdNsQ9H12jA=#Dt>K!_%h&X)n~quny;(y^(9-uIF8?u>EP>b^K~V|cm&fgezS0A zTy6Xs<1pr{gM{KM83wI0v5N2D3*OhqZ*Rdo3PoZ5hoqcei<~h3BU_~Kr4rxbAc@}^ zG8_V|AK&Ta0r+xo81qd)Lh;2DUvJHq?ZelPirRysF#khR_~r}WEo4g{%kkUvGWddR zz8Eres*0~yAijiYHeX956kpy@XsvFp;urO)_xwHtu2vi7yO^c;T9Om?4`GK-hjVS0L_+bEJr1pK&6oYW_xWuBS8FDULjQuK z9Y1nH|3bES;aivuzM{**cb3);A)*j zQCR;&Quu;Sas2v{EpIf(FO2wNZN9E#=wB7zn56;YM++$2{-Tjkd@1-x6mhkNmSG*6ovH{B!zE{oZn_-ixj@SFM)6IzY@O)G8_V|AKz)*8CT2a z$+!7Rkx+c`#MfK%rTXx#gR8X%MPdGer0@+EzE{bX{v^jQk@$jbzDzQ7s*0~yAijY( zjN|7-LhBUmEd^ZK~q8&?kQ9=fQjuMdA4`lEPO<&hG)T<&EI@xiY~Q zYx5P7p?_6;W8M!CzXdpq`DP%Y_zDI=tGG#Ze8Z@y6y_UQ6(|b*3zA-ZYsr=-e4~l) z*ahKRM21FH@wE%YHxY+1-v}gB{L&wW*6eFl{CxS6sHpnPmw==fUo)~54CnYAnGC+} zHeUo8#v_=1@tcKP$ZF%a0ZT2+w-gD*SMm_F&RnDTHr?rcePq+}%qSFv^#de@ujO5Q zeGDO6r0}H@-{QX|etpPr2(W&9r*UUjEno6$HeY8X6kq)RN7~uPIaOcz9|P0Eh9~P# zG?pz!Y^CAJG8B!a#Rx4nJXwY!v9=nam4*kcLy@@dVuY?X3}_t}jms`Z*p&@WZihu; z>0-bwZV<2x1!8G6VjCKstV7XQy1&o4=YGFB$@e?2*YDWBPC56!&)d(vxw-e|CPRKx zwBNZ!9gi>luxM#7M&bJ(DA}(&?F9J#>QB*Yn(gGb;{o_}bN$|+#%Pn@QkX zh4O2OfVKHDmEYb1>s{DzX>taEOD)K~@Cn*285lFypo zQQRtU{Pv(we(f{C>ZAQm(O+u+$o=tkShTbpqi}x>CHpODaJKJ*)N5eB)qe-S-Rfw#Kh_XMWqU8s~>X`8AT?f=g9?uhO5i|A^l*8g&w*u>YZCzX{j!{ztu*JDvP` zk>4QKZz?rrnEdAB%F~+PiAP<(BPf(#>n&jI@2~uZ{;1>rw-t+)COUrWQL^7yS_scK zQLjDf_&snx{Fc7U`7NQwHptfGw+~llR==58&B<>93guT%e#5ojp@kj&uA)&JFbe1Q zDA}(>3*r2pdX4ONDh|Kne`3G0E79n0@*CEf-z!+n@p}P<@@tv_*2+(-{FYVuJwc;- zI)0C!WWSy4cMtVi?{MQR z-e2zel~5?ZM)F&5iOO$4mEX%)v~&`q@caf!_M6In&rq-BJ5GMhi{LlN^?Q^WGfaN- zafxQlZw^*-^1B6v@@t(2*8Wc^zqjx0xP3>_sELl>V3h9u$9@-6ul+X1@4}DZxAZjU z*M%C}AX}5)K3q9j{f;JGzdb0FUp@H^*M1wT{MKR7(guve`x{F3dxI8g?)4z`8rg3i z`5iySes@!&zsYY{XMQ(fH7CDoQ7FHrZ-TY*VwK;*D!+a-s;A@E110-C$A0hp1ijX8 zJNX@32)}Wz-y76egfMIJTY*a|Yku3Yn&bBz3gy>!GgxQ(D!(yRe#>aoT#Ul|FG}`X z!+v*Aub%xTk>A>roZnPx9ENO--)UU=Sp5cLHOKE#6w0rG{HAEXQB{8D=vL2OjKcMi zzCZLH`@KfJrdyr-b~M4So9nle8lz2qlRNW!3adGO52H|iEmOhT+(+g2M3vuc8a2f6 zn~Ac+_Pv36Z4t+BDEZAQbABVJu?n&^`E9}_kTt(Ye&G7uheG+aPXVis_Um_l$MdV{ zShTbpqj3B~$$n#LAw0iEy$1GMeJ}iW|B?L$QsX>iYy5h5<~Ik=GdTI(ff zD!ngrI$o+`gd_jKI83$bXar{gyVCHr;Z{BEXR>kKEq+sJR6>o=Afix6f_ zek*Y0WX0-BBpNwuxY!@hZROD!;esR?l3F!sj3Q{?JtRdx?7W?Dy*3@LT%_ z&Tk7f4nwxa@APAx_^tn*$`6I|YaqWV+OOBbj@x%37A@_?D4hSHNT+60P@@YHv65W&u7jHOKD-6w0rW{1)_3`Sq&G?+F@p z5~J|@rzqKPAp6}zy_QBNzvlVy8|3=kPK_BRzxlYFvF6tUw=x{R_i#zoo}Hzctj@2HBeY_TkFH>bE}O z`aOw4`PGx(aP7CO>iT>k7ACf59BVl{q!piq8oUkB^VCzRiz`BkqE8Z{TA@cKZ>e%<-{@*?Whv)?50TU&Hr zA4||U4A~mL(>U|D`klaPj^7a!%CCX^rf9zhs-Dl@N~88-6h8kz$$pRW^VyG4ujytd zza267b#wieP-C>oZ*pgTm*G|hZ(kJ3ujOlCZLU-Koua=e`;phj+jRLp#PK_dlKrk7 z;JiLwqF&on$8RY4&3cpb+d_?1kgdsYQ?ir%w*Q0c_Z$l4*FGMsKH9Ij>iOqoShTbp zqi}wYlKqbG^SgIYuYvtm{{Viw-(bI~)Hn~>8o%D1`MrO;>sLad{2Iw`K{u7(fU5J; zm$7K+Bu3%-7bW}M&gZAkP_Jc*lV30L8|3;uN{tyNzxhAuB)`G9mEmmPOHnAl)^T9% z@2dP>r9bNYk?nhqF5f3QekV|}-y6vsf&@~bDm;o5I#_4CerIVRy#G?Kk^N5H1;69JWxplV=x_2H z)|uaSe3a$n_Z$l4*K{LTD?KW|x*v7SZyA03)zk4?jFSDP(n7dDPQBJiPJXwM-#FKA zDm4}%%$odG;LP8e-}b*#ekhb*TL`Q(7b(BD>CwoKY~N*Av@{o^@cKZ>erq_tJE&LB zey@HXeru1puMcV*hHQ=BX`K06{RU$--v3Z2zXtM~qW#8HZQpbEqrDfSaQ%z2!}fiR zdQB6Z{Kk-9H`i|`HAb8KCU@rd6jpQm9!8=3T5bSqa~GB0vMRsXG-`~ zgDBbWTK0RMdJXJ1fc$p9&VFmCaUQZYe!V;MTa48lzq?SV{2Iw`!T()w|9@+iqxZRfdr&C9 zrmujt@`B2*`uhRvuxP2L#CkFUPhz#VibhUB40v<=04l3o0tVc~yQdW6{z{jKcXJO7>gAe$P;^ zWxSJLFY+7Y`aMdG879B^OFGLBt8soPlwWHQto`pRzg|^-qiEDb$8Ru7_Pg87k9zIn z9KQ!{hu_jeZhq9*2HBeY_TkLhx_yr}xqf?4D8G908?OB>R6QTN4vUsHU=;5Ep=3Yz z`R50z*T{aSz6-zOZR~e9HTs+UhIQt56IOHbyB3A=Yq}1smG7zis`tNsG^(fL*8^n- zzjy9Muk}VJzuU-foa^@nH5MVvn*3J$eJA<#_`d7+9`1iBzqV_^I&)t6E&HJ3`RO4n zTAGVdIR2qzzvpNn+~1&HJ^Q`-9r&$1$oZ|I#$m|T_?^a?wRQVmhW{)lzwRiMUjz9~ z`OvRw`@a1{wD)2Z?oXm*Kll0Pm#Ehia`GEPe%)NZEz}ro@|)b5-&0u4@p~AB@@p9l z*5*H}{2r+Cn@yvJIDRuxvY&f=xq*6ZH#mM9Z-d{gUvYjTsIdyNHTiAAnXxs$6Zg1& zM^Grg_Ai0eNBccd_5AZzELvKQQMf)r>26sr&|1iAu_6@E((xW^Z2 zY=dk~e*19dYV|wuUA28tD8G908?OBx_+7`>?^Y~Y+JI5mz9`x6QCbMsztn4Fzj@?$ ze80PWsnOr$H>@+ioA6NwAOBD&zorJTR=%t98#T3~UqAYIq^IN8110-SpoQ@K8r}MD z{fd*{u?YOexqfd@V-dov$!`VDT&?-_Sm64-H~&Mwwvk|+`IGWnSM_}HAuL*&i%~fK zp=7@o`1#J~saMZ_lgMxFKF)6qH4a0z#_u#vL9Kp^v6_?LT_{w34dgdP`&B>xJf24F z#VA}Kp=3Yz`R6OB*EGh-Z^umdb#wjtQe(8qZ*pgTC+4aB4~6n;`65`G-%O-ktevpX>TP zheG)^lHY=}D!=OIJC|Y6(n*ZM`8`U`&wal04(hdB@8s8u{06yxQ>ih-zw>?Zofs9M^9T3gy>8ep9qx_3L9D7A@_?D4gG; zWWO!!_aOC}u66PoLw?;{zq_e1+T=I6Grya#nv>tPD3o8zP_QP!boW1gf4hTv4eU37{C5A6{iagmJY;M9dUxhG7^^vcm!eR9jpVnWtn%Af zmESpBvy@I^6z=b$WWT=b_ZszDzU1WBJPm$>T)&;vm|^mpk26E->*Fb`=J-8~Lix1@ zz}o*u<+rZNZ#IpZ==jY<$$mR||GR;D?V}vO3*Us_(*NQ7Mo?oLWNY%$mFV@`ch*N!mP<}1y1p-`JI^U z`W-=`{MrVCb*7~Jc2xOo#iFIT7=`m^lNgX&3Y`2Vpiq7dzb-|igy9iYZ}$kzDv?#ypHR&)HGL!tZ{$#22$Reo2|uK&@`-)PiHjKc95 zCFl33dwix|%Qa4Zy~uBn>o=7eGfaN-ab{@E??lw~JAy*_wSEq){ckJ3g;md&Y{jCb ziH_fTl#%64r{niN?u4-4eY6m+Kj_v->u@K(+sJR6>vw<}ix6f_ek*Y1WzFxV zJ6ykOQ7FH*L13MEOZiQ&%C8?5EzQL!e7_7O``yL)y+e-~)U)5K6XCb^zd64*sBsvw zHGZdY4rKMC2ORkIfkOE;klz&TccE(kTSlYyViaBo=7e zqfLI3JM$Zi)f~S|Q7FHbE5X`aRQYYJ@;gVjQieEwbo++=cJk}vHR`nub^JDl;Wz6S zoZn7rtb%M!ew%RSWX+Fm@Hl=?qELSAez5vzza3S63u)AHjKcF_DB14-``t{v2KF03 ze!F+D-&ks#hir{s@6P-NV>QkXh4O18zXflq{9di{J4cT?oWv-c|Dj|*_xSP}^;(8F z`89t7euG@Uoz$3N@|%w{FKd2JVKv9^VHC=*^$M`|zoGn^tNdousELl>OqA@mhV#3D zdhG$n@4`*+Tl#a(Zv-{ALAEBpeK@nR`t`tSj^BH?edt$De#5ojm@2rk>^clNu2daYk@@;f#Ge&bxfzSLNRFl+K#fio{_ekZ=|`W-=`{MtSX)|uZbzl~LX zTd`;I1JeuztcF~u=>r!YEFI=P$<6!@|&Xl zs=uFi6^+`9Q8@oY$$swl^Dd%Z(_kmR9bboEH`nj%t!Ruk`AzQ3?zj;;pt)o#x9KWYfvfmPZe)2);wO#G_4JE%>+d03xsj&*OHTiAAnT<8So3NVW zcP$F#*FFHOKH6_Um0v#^wH%}H{)UqMMzG&I5%e0^Z}r#UxBCV5dxIM1AzS0uyEDJ{ zXS#kR6w0rW{1*I1<@a*c^Vu(B(b7qb!sovz+3yG~)ZFVC>a~2{$*&jr4RZY+rN#`C z-+Y|eSo6CK|5;9c-BBpN*3W>o|8?azwCekLZ_}uWj^9!3HvLuLo9h{NB6eL%*iW!CF~R`CX{`e$*i>TI%Wey@Hbc`f`5H zQ?K^t@+gjx}o<_~ZD15$v zlKuAZ_sg!JUOoH0dL#VSZsq*?QsXdWYy3{*o!{zrVutH?1cmZzAipWvZ(fz(RxDcD zi%~c}qhvq#`)`j?uW68z-x%`i=K3w6#%Pn@TLjrQ^3T1ix9WoZs1Rp|J|GHTiAADS$P*Q)ez)`Xy@z@Y>^Fe?cK?k1Zl}h1$kzDv?#%BxtmgP#jY9b~ zlHY>ED!;lazd9Oq5~FZ^K3(};%6@O+A4)BLC%@(!;5W$iJ3x&YCcpVObFk*O9;-Qi zPohwMt^L8;|7+#9qw4!_3u)9u$8Qcw&hLQx{VnRXU*Y&&7z@9p|H=7{rN%bM*5tPj zZ`oGA!C1}l`{?u8_2f5P`@LG_=RBXi0i$sK+^GECU_a;i>_+yRM}EhjXFuop?EWUd zVV(J{#{kX`h03q#)9_n)Nac5|%5NbSE%kK#=4ijOZhq8j9q8nD?5pq_=lYGM#v+7S zliv!whgzDnmpkZStGknIC;X>iCsVD8H6^ur?o5`PEhVy^KXmLma>DDB15)_IrkUZS>Pr z&Ao<_->l7?-=ox61=*VXHsLMSn%^9(=J?%$Lix2{0#+aGx3%i~Wus`+a*V?LA(ZU5 zhreHTG4&eQZ}k}X?cT(GU8r#$vNe9aJM%kwv+K79h4O18zXiWi`OT~HTZctUCou}2 zZ=qzrCG7Vg^;+nsvzmMLBELbd-`&)hVe*@gcV=sTH(@m=ziUw_zt&HIwf{BcH=xR| zAB~#m`1L@^ek0iLovG-xf5!29;LGq^x{>pHgBsf)Ta({Dyd_%wF2ib$Uw0JBub%vd zYrlo_I^I8hdkWecFbc0Uow^==$2YjIUuyI>`3?L3_G`Krtd$2; zeq*Z6?;XFMRen?X{NC|vrJv4f?sXgajr*wIB7|9!-wM24TJw7Z|5;9c_n}bvwe^MH znf=P|)Pj!rO{Xa4Vib-qC^^3_>~{_I>e=trApF*5IKP3^I1JeuzteaNv--V1+4U=- zP<{>MH%0rcuJU^siPr&Am2W2ftbW;T~V8u?n&^`E9~G zmo>kmlU%<&D3o7&Z?O7kzq%^Fby&2t9HVf2LCJoXvfqQ$Yhb?t)n~3@%gYu@>}q#%5Q7c_b;92!%kupuFtjK9$LtKKCFd)I;*)?^R@6B-TaG;h=$$n?~_kQW=c!lEev`;=?Z0t;Yp8J;vNe9E@y=!STa48lzq?SV{2It_iuM~{NWLq^4l>Ae%)NZzSJ0P@|)b5--(-CzauD=U(4TswfPm5--Wpy-#@lu z(b5pdZ#_!(>&t$RQLl}DnhNKCeE*Vq4eYnN0e-vJy02eqoQG_UU++%+CMZ7?%CC|9 z7VJ^^^{UEm85S*_#3=ZoWWRy55d5guLO-2_^FQ(%r2MEc!{j#~?=05*24giozMxQk zt=+-e|4Zffa;#&1=e~~iM91$0O7=TK3*q;lsn`A~$M1oW@LT$)!CLu0D!-dDuk90Hoq1XL-B#r{okq>YD4hSHrI6w0rq4y?_)RelS9(9!QI8a2f6y9_1!JxmMX z`5fxC(N9z1{BH#OX074;&W=N46=ZAj+k_*xHNRJ|n&bBZ3gy?{4Xi%eZ&a1v6Etc$ zM&bS+O7@$;e)mwXf&B)M-|l~9zuT#C9F$5*cMbJg>8G=B{x=kU<6OUi)L4WtYw}xxBd;~T z_iu3hN+^_H+eKiV*{S@_-PQ5+`!W_S&BZ8OU!r8c?(Fvr_3GJg68WwDXU^|YY8-}a zjo)b;8LfVEu$q(KEhv;f2S18$UCoP2Mo2b|1b@JOW1b*FI zzb@1mZStGkncvZ|uHPOM%CDshSeyS_4svENQ=oQG_UU+>QR)_>LYdlH56Yb3t~zfk!t{C-Ejg;=z75~Fbb zg3|S)h4B3f>b1~MXW{&h{06yxW2rI2_u;qcy)dSdEV_ zC{%uJe}Uhb7nR@iD!)-QYA#0M_=1xC?qa`-saMZ_uU-wmwW~P4F4Q;-*&4soIPzHi zj^btI`0YWV{2It_iuUVO<+qMrihD5%_pea0-$3?zka|s@aPk{Ne%)NZyQwkSGehap%{1#T_S4X2xVieB*g39k<&hJh9L#c&+It%B2 zpM&2Z*Y5x|W|;iu53Tg*0lS<2MH-=Qn}lizUdcWze4{qODTFlqxv;rtIJ z`*ml(m#Ejse)Guh_~Y!ig&O@$e#1KRdjzXFe)pkJeogPeZ{;?X-^MDx=`^aR<98EE z_S;Dd;rL9wR{H5Ioc|4i-#FKAAT<^t%$odG;K*am@2P8DzlTvMzqa%6JM&-4Z&I{l zezUP?X)Z?L`5~0-cRMZA-0KGF)wACu@>}~;&Tj-Y4nwxa?=+49R=@QPYX3u_{2It_ ziuSuOxuf4gELz%&Q8+(9$$ovOIDR)%ujwKuza3Y?ubb;PmKvi?ev>=%+dkU$dk%&2 zYxy($Hg8q=4ZX9Y-!d#(8shjZM#+9-X(3#nQ?HGFnhNKCmEXoHzu7eEBt~KXL&<(S-TjYxE%eh_IR7KRL9X8j zYRoYC&Bu|$nqLpB=J>rg>O;TQcKGf8nev-g<#z~+mL@uWub^bVCG7V+_1fvDshWE| za0UF9uH^jIP-7cpYx3KNSGLt}F;;W@?n0sRt0%wV+HYu;-*_6e0i$q#9HqPevELQc zYh=Gu1L1dk1^e}-Mt_svu+IEW;AQ3b9YLY|n%;%q%KudPow}pr>tidu6ni>;^zvuF zF6{Rh^;$1D`Q1i-<6OTb)L4WtYw}xxBabz|nOM#7n}9<3wfzZxXP#Gn8>{@TqET}( z3eOj#boW162=}k3SI>U0einXfn>oL;Bhfev*&4socx77sUcqXP-wP;|Ujz9~(SEb5 z{GOmudoc>Bv_1i*?879B^ zcx7AjdjzXFe)pkJeywNVw||rJn_lHNokmS`{BATDcTly2u zZy+_cLAEBpeRxS({oWtp`jt>9zk2c;uKjvd`Mr!qOB*l>_pea0-$3?zhI)| zKf->GQlr1gZ&+u3bFi9|-z_MVU(;#$t=y>c+wt9w``;)U)zk4CjFSBh&_cL>MZMPd zocxYm4!?1(Ul(dDLYOuAt-#C8n%~jkuHPOM%CGGd{LXApehaJo)?v}oT#Ul?B}(>t znEf84UOoFwBEPi{bAESI<1l1v{7z%fxBA_L)tvmUMWOr}$Zv}FyQ<2sAC20JQFuNA zCHq~=e(wxJuZey-tGU+>AN;zxes54?w8?LBXMWqUn&bBz3gy>w5`LRAD!*gZpRdxW zA&%c-lrZGU$BhLYc`f8_k8QezclYx3KKSB^Em!C1}lyA*};YcIpEkM?V> z@;f&aqn2Y7&i_!d-x~INjd~62xB4>p?fx= zQ2C9o@|#VgPGS_!|4_2uE$nv#^;+nsvvB@LeuG@U5!9Gr@|%xWjy1m?Sk3W!Z^(y! zt$&2y{`Jc5!fhR2zlX4BX`^9!f)v^&TkDhwn4TgzkS$; zt$vHKn&WpD3YA|y`3={8TdVxW)2Iy?h4Vj@?6-#&YVLIf^%~jlRDbv#U&?-csnOr$ zH>@+i69L!n2nyxbbOL@WpHunGtMc25MN2&$zx62DZwdQ7M!nW|o&0Vizj3bL5^5|$ zm^JyWz@Bf-ZzfiA@|%D{`L&hccjn)f-&Iw9SJ9}s7=`mclnS(>|$2GSFoDn_W}y#*Fb(#wBNCBcijJ;piz4<3g>?)+3zeZ)ZFVH z>NU|%XW{&h{JOb*w^L)Z$!~IJe%E0&$M0$s%CF@Q@Z0=vD!(VH{OV}b5XbNR!OHJB z_InfmP-=U}@!QxBezOvs-vMf@f^1EGo3LkE^SkUS*RMMY<=6gu`1R3#bvJg*@9jYt zwH%{xeua|ryOb8f^Rd)xV7~$6xBEf%+d_@=kgf6S-I-qx{AW4&y?6D8evRa}V4ccu z|{{#Cip+}a7 zW@0rbzX>RmU(<2;t$bGHcPP?v`(8z(dOCiWp=7@jErjb!>b0JB@;mk^_>FV@&VCM! zMF_JdzZKZUtogly)f~SUP$<8)x8Qdst^As+{GOmub1@3X7nJO`hW+lLUOoFwBEPkN z&-vX>jl+vw<}qfLI3JM&wQ)f~SkQ7FHbBK$T#qw>2jv*Y$%NTY^0esfT=UtjjS znR;y}9lxREH|qh;Z!9%dLAEBpP1q%@`I(P@Z^EyS_S;(J$Hza6`snd*Ap7z0kNsBn zh2QSKV?RFrLAJ)PcV~W&;IQfBcOMFsUnBV~SfldWSmigJ4z(vS3ZGx1`6WvB>&|``Q?HTzPW6W0@i_Z+p+}a7j{04{Jt&l4)9>K7@?TVb>#F?L zVbM}g$L}eW>^Fh^9;9CD2`9hX$ZwqMcQ-W_AX1 zHIUyF?YFwhZyAl+i&1#~4<-9;p@s1I0`;2cr?YVWM}FO0zp2z1ZStGkncrZn=J;KT zLix2EgWu+VR{2e;@;f&WqlP$sCs4BA3+(qA_1ga6_-*V7zghQjemkkL3bHl%ZNfIN z=Jymo~K?5{d5-2|Ge-Urk@a0a^&xm(**gpQgh3 z-`~J*>5n+SzSP(T*_!qoa2HeeK9zbM)7 z2rY!?59rdlk^Sb8-|>a+>z5k+O@6~V_4`{lziUw_zor6ME1y#NydAg6 zT|a*Q>YV}TwH|l!JJth!siD3o8@QTUyCQu$RsAGVA} z&BZ7jUr@52`+V3P)T?K|N#wV-iSwIEjl+f2S18%NU|%XW{&>JN&x2emki#+T=I6Gry;>n&bB{3gy>w1b&-W zsrDzit$L{5sL`8;sK3|7aoHzo%Y1{WKNM|2_e~rT1`t zU8u1QvNiebgSpl3CZC(%wJ4NdJ^2mSehV8r?tlHTXlVmR;rNG={T`-;aQwRry+-ys zRR_Q0ceCFc)aY;W8`hcMD_G6R?*$afujvr{R<@}8wpRH)L8E#)evhDJze{=lyN7zM zzjN}tjr_*Bez#L&5yGs=Zw3Avt@&Mt)f~U8Q7FH*Hu#-+T={LR@~fj!b1@3nmzOHP zzU=oV{-IRQey?_e-`WM7-vMeIhHQ=BY2d7WN3ojYw+DstYaqWV+V6p?*T*^ZAP*Rc+seShTbpqwx7J$`1M6OuYv78$f=$=ed5=I1kwxzuuksJ@skV?_m_muaW!~ zJf`xyFty|BcQzI+ox~`dpQ2>H+i&Lg59+o2#>ubQ1HVD8-w0~VF!{}gxi!DVSk2kK zccD;zt*^mv|D($9SXF-GY1Bl=?>dz1HP__M1n3$7Ad_kQ)6> ze#1KR>w(pr{NAho(68wL{8p}1`OT~HJA_3`JsrPSP_o|=_IsXstpz8)V_o1k&h=YE zjYSBvCchO>u;w=tt2urXP^kRc_QUVY3gx$~YX7^6M$N@2eExyb&5sts{YmQ8v)?50 zTl)jf@9ZUL9ENO--)XF3_3MEq=ZE!`Ujz9~(SGN?*>U?GqEUM>3g<5<*{}OF$M1RS zH63;G+wp%M9RFOuHPjew@|)b5-(sxBuMZT;uVo+nHaDyMR#*9rr%^*3zw1!4-xgX3 z*GJTAJL32aCBIp7+}8&+Rzdco`91ROLEUFec!JZfaZrR{0Q^klJWDn;mG+E z=a~H~G`G3#@n=N-G0jg{_$lUh{dW=HtNDHlKgfJX-6`XT zH9uH9!4*b3R#`+gx{vb4TO<`}G^p{E&qoVg3g) z|2%Fey8Hk4%>EUc+gw+c@nf2wu<%pNe^!={SM&WAevtVGW&8|o7`praY;!&Znv3JZ z7SaA0*8Hf2A7}n98NZAhithez;rp2Xu8g15{PZkyK3SUETzBR3qI?3HAF}Wx%)eE} z&*O%nyZ_&5_OH-fY+o5aruhjAKgIlAGQL;y{T6qYtJal_5s z|8F<@S7>f?T|kz9O!E^Kev0|Re7u_PxA23^Ps;o=xZ&sS|KBy|Q=qxcbuY^JVa<

S&w*xH^QrRiw70;Za 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 diff --git a/Plugins/Godot/project/addons/bocchi_tracker_godot/bin/windows/bocchitracker_binding_debug.lib b/Plugins/Godot/project/addons/bocchi_tracker_godot/bin/windows/bocchitracker_binding_debug.lib deleted file mode 100644 index 2c03fee9ca3b5343b5bcaeff0544991bd1851b31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2128 zcmcgt&1(}u6#wPJR)a_|o&<4~qV~{yr}a=|8zUN;q$N$xlVrCxi)m8Ucu-2c<>Wu% zpW&^Cf>04e^bhbN6ubxuz18=2XVOGt(xs)d%*=al-kXo#{NC)X#ky@YAB1AsaG6UC z>q?7DAsJ6gsTKlo0r2kt!9!pw3rz2E6(V0;T`5;Y?$O%Aa(=b4QWlMlVKl9-T{oVs z+oEB$O{={j%=N~L4G2-H77G6c;q{m(H>UEWT3QylrOFb`Vr_28b%a`|Wi{-&{Zd$M zs|$Cw(PN%*NF3u3Bp`PDz#$3QDPV8f0R}$!5u`6bdpjdUPIpL8c*g#MWD+w{NyU{~ zXw1Du%~lIBMJE|DY3|HIs?R#J7r^((*Iy|gaFLMb5_O0)v*v0*m4r7+k-d&^Hfovm zZha=HhOUwDjp}b{2vDyhzAOFar5PFt5n50Av0aC@OP7v2xWp=MPB`>kM8ZT2d~&>j zE4YpQ?W;x0ushE?PrKT^@~l?KmzL%DPUxUZ Date: Sun, 21 Jan 2024 11:56:28 +0900 Subject: [PATCH 23/40] add google flatbuffers meta --- .../Google.FlatBuffers.deps.json.meta | 7 ++++ .../flatbuffers/Google.FlatBuffers.dll.meta | 33 +++++++++++++++++++ .../flatbuffers/Google.FlatBuffers.pdb.meta | 7 ++++ 3 files changed, 47 insertions(+) create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/ExternalPackages/flatbuffers/Google.FlatBuffers.deps.json.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/ExternalPackages/flatbuffers/Google.FlatBuffers.dll.meta create mode 100644 Plugins/Unity/project/Assets/BocchiTracker/ExternalPackages/flatbuffers/Google.FlatBuffers.pdb.meta diff --git a/Plugins/Unity/project/Assets/BocchiTracker/ExternalPackages/flatbuffers/Google.FlatBuffers.deps.json.meta b/Plugins/Unity/project/Assets/BocchiTracker/ExternalPackages/flatbuffers/Google.FlatBuffers.deps.json.meta new file mode 100644 index 0000000..a82c375 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/ExternalPackages/flatbuffers/Google.FlatBuffers.deps.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: cbbd522994baf6342baefdba2fcc86e8 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/ExternalPackages/flatbuffers/Google.FlatBuffers.dll.meta b/Plugins/Unity/project/Assets/BocchiTracker/ExternalPackages/flatbuffers/Google.FlatBuffers.dll.meta new file mode 100644 index 0000000..dd31a83 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/ExternalPackages/flatbuffers/Google.FlatBuffers.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 886196c3531a33e48a19eb453c7dd16a +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Unity/project/Assets/BocchiTracker/ExternalPackages/flatbuffers/Google.FlatBuffers.pdb.meta b/Plugins/Unity/project/Assets/BocchiTracker/ExternalPackages/flatbuffers/Google.FlatBuffers.pdb.meta new file mode 100644 index 0000000..1768e99 --- /dev/null +++ b/Plugins/Unity/project/Assets/BocchiTracker/ExternalPackages/flatbuffers/Google.FlatBuffers.pdb.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d42fa9e16b905a345b0ce7d29d01fc8c +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From a50d9cbb1c407fe4df1fb302c31c53c8f5897a2e Mon Sep 17 00:00:00 2001 From: KirisameMarisa Date: Sun, 21 Jan 2024 11:57:56 +0900 Subject: [PATCH 24/40] update script --- ExternalTools/BuildScripts/build_flatbuffers_csharp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ExternalTools/BuildScripts/build_flatbuffers_csharp.py b/ExternalTools/BuildScripts/build_flatbuffers_csharp.py index 1214030..deb343f 100644 --- a/ExternalTools/BuildScripts/build_flatbuffers_csharp.py +++ b/ExternalTools/BuildScripts/build_flatbuffers_csharp.py @@ -13,7 +13,7 @@ def Build(): print("Copying flatbuffers to Unity directory...") artifact = config.cFlatBuffersPath / "net" / "FlatBuffers" / "bin" / "Release" / "netstandard2.1" - unity_external_packages_path = config.cUnityPath / "ThirdParty" / "flatbuffers" + unity_external_packages_path = config.cUnityPath / "project" / "Assets" / "BocchiTracker" / "ExternalPackages" / "flatbuffers" shutil.copytree(artifact, unity_external_packages_path.resolve(), dirs_exist_ok=True) if __name__ == '__main__': From dae67eb2747186279c59052f987ca3c40f4b890e Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sun, 21 Jan 2024 12:15:46 +0900 Subject: [PATCH 25/40] Update release.yml --- .github/workflows/release.yml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b465958..14d5178 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,6 +11,38 @@ permissions: contents: read jobs: + unity-build: + permissions: + contents: write + pull-requests: write + + runs-on: windows-latest + + steps: + - name: setup python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + + - name: Build flatbuffers + run: python ExternalTools/BuildScripts/build_flatbuffers_csharp.py + + - name: Setup unity + uses: game-ci/unity-builder@v4 + env: + UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} + UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} + UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }} + with: + projectPath: Plugins/Unity/project + buildMethod: GenUnityPackage.Export + + - name: Upload Artifact Unity + uses: actions/upload-artifact@v3 + with: + name: Artifact-Unity-Plugin + path: Plugins/Unity/Artifact + upload-plugins-artifact: permissions: contents: write From df02afafde3f9962e4a4156951575c5c239016ef Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sun, 21 Jan 2024 12:19:28 +0900 Subject: [PATCH 26/40] Update release.yml --- .github/workflows/release.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 14d5178..a3fd53d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,6 +19,13 @@ jobs: runs-on: windows-latest steps: + - uses: actions/checkout@v3 + + - name: Set up .NET Core + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 7.0.x + - name: setup python uses: actions/setup-python@v4 with: From 7cd2ce2c8535b0a53e2ee6ac3aead4a6ec450d3c Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sun, 21 Jan 2024 12:22:29 +0900 Subject: [PATCH 27/40] Update release.yml --- .github/workflows/release.yml | 147 +++++++++++++++++----------------- 1 file changed, 75 insertions(+), 72 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a3fd53d..e2af6f1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,6 +21,9 @@ jobs: steps: - uses: actions/checkout@v3 + - name: Checkout submodules + run: git submodule update --init --recursive + - name: Set up .NET Core uses: actions/setup-dotnet@v4 with: @@ -50,95 +53,95 @@ jobs: name: Artifact-Unity-Plugin path: Plugins/Unity/Artifact - upload-plugins-artifact: - permissions: - contents: write - pull-requests: write + # upload-plugins-artifact: + # permissions: + # contents: write + # pull-requests: write - strategy: - matrix: - runs-on: [windows-latest, macos-latest, ubuntu-latest, ] - runs-on: ${{ matrix.runs-on }} + # strategy: + # matrix: + # runs-on: [windows-latest, macos-latest, ubuntu-latest, ] + # runs-on: ${{ matrix.runs-on }} - env: - Builder: 1 + # env: + # Builder: 1 - steps: - - uses: actions/checkout@v3 + # steps: + # - uses: actions/checkout@v3 - - name: Checkout submodules - run: git submodule update --init --recursive + # - name: Checkout submodules + # run: git submodule update --init --recursive - - name: Install cmake on ubuntu-latest - if: runner.os == 'Linux' - run: | - sudo apt update -y - sudo apt install -y cmake - - - name: Install cmake on macos-latest - if: runner.os == 'macOS' - run: | - brew update - brew install cmake - - - name: Install cmake on windows-latest - if: runner.os == 'Windows' - run: | - choco install cmake - - - name: Add msbuild to PATH - if: runner.os == 'Windows' - uses: microsoft/setup-msbuild@v1.1 + # - name: Install cmake on ubuntu-latest + # if: runner.os == 'Linux' + # run: | + # sudo apt update -y + # sudo apt install -y cmake + + # - name: Install cmake on macos-latest + # if: runner.os == 'macOS' + # run: | + # brew update + # brew install cmake + + # - name: Install cmake on windows-latest + # if: runner.os == 'Windows' + # run: | + # choco install cmake + + # - name: Add msbuild to PATH + # if: runner.os == 'Windows' + # uses: microsoft/setup-msbuild@v1.1 - - name: setup python - uses: actions/setup-python@v4 - with: - python-version: '3.10' + # - name: setup python + # uses: actions/setup-python@v4 + # with: + # python-version: '3.10' - - run: pip install SCons + # - run: pip install SCons - - name: Build flatbuffers - run: python ExternalTools/BuildScripts/build_flatbuffers.py + # - name: Build flatbuffers + # run: python ExternalTools/BuildScripts/build_flatbuffers.py - - name: Build Godot - run: python ExternalTools/BuildScripts/build_godot.py + # - name: Build Godot + # run: python ExternalTools/BuildScripts/build_godot.py - - name: Upload Artifact Godot - uses: actions/upload-artifact@v3 - with: - name: Artifact-Godot-Plugin - path: Plugins/Godot/project/addons + # - name: Upload Artifact Godot + # uses: actions/upload-artifact@v3 + # with: + # name: Artifact-Godot-Plugin + # path: Plugins/Godot/project/addons - - name: Upload Artifact UnrealEngine - uses: actions/upload-artifact@v3 - with: - name: Artifact-UnrealEngine-Plugin - path: Plugins/UnrealEngine + # - name: Upload Artifact UnrealEngine + # uses: actions/upload-artifact@v3 + # with: + # name: Artifact-UnrealEngine-Plugin + # path: Plugins/UnrealEngine - upload-app-artifact: - permissions: - contents: write - pull-requests: write + # upload-app-artifact: + # permissions: + # contents: write + # pull-requests: write - runs-on: windows-latest + # runs-on: windows-latest - steps: - - name: Checkout repository - uses: actions/checkout@v2 + # steps: + # - name: Checkout repository + # uses: actions/checkout@v2 - - name: Set up .NET Core - uses: actions/setup-dotnet@v4 - with: - dotnet-version: 7.0.x + # - name: Set up .NET Core + # uses: actions/setup-dotnet@v4 + # with: + # dotnet-version: 7.0.x - - name: Build C# application - run: dotnet build Application/BocchiTracker.WPF.sln -c Release + # - name: Build C# application + # run: dotnet build Application/BocchiTracker.WPF.sln -c Release - - name: Upload Artifact Application - uses: actions/upload-artifact@v3 - with: - name: Artifact-BocchiTracker - path: Application/WPF/Artifact/Release/net7.0-windows + # - name: Upload Artifact Application + # uses: actions/upload-artifact@v3 + # with: + # name: Artifact-BocchiTracker + # path: Application/WPF/Artifact/Release/net7.0-windows # create_draft_release: # permissions: From 91a3e701b017b2af9f93eaaf9fec2bc9fa89275f Mon Sep 17 00:00:00 2001 From: KirisameMarisa Date: Sun, 21 Jan 2024 12:26:44 +0900 Subject: [PATCH 28/40] update script --- ExternalTools/BuildScripts/build_flatbuffers_csharp.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/ExternalTools/BuildScripts/build_flatbuffers_csharp.py b/ExternalTools/BuildScripts/build_flatbuffers_csharp.py index deb343f..ff33f6c 100644 --- a/ExternalTools/BuildScripts/build_flatbuffers_csharp.py +++ b/ExternalTools/BuildScripts/build_flatbuffers_csharp.py @@ -4,9 +4,6 @@ import config def Build(): - print("Cmake C# flatbuffers") - subprocess.call(["cmake", "-G", "Visual Studio 17", "-DCMAKE_BUILD_TYPE=Release"], cwd=config.cFlatBuffersPath) - print("Build C# flatbuffers") flatbuffers_csproj_path = config.cFlatBuffersPath / "net" / "FlatBuffers" / "Google.FlatBuffers.csproj" subprocess.call(["dotnet", "build", flatbuffers_csproj_path.resolve(), "-c", "Release"], cwd=config.cFlatBuffersPath) From f74d413fcc26304ef77db384fa6a2388d6a86c51 Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sun, 21 Jan 2024 12:42:14 +0900 Subject: [PATCH 29/40] Update release.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e2af6f1..cd373a1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,7 +16,7 @@ jobs: contents: write pull-requests: write - runs-on: windows-latest + runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 From ca7c732b5971491458123b1c81c59f2ab87e5872 Mon Sep 17 00:00:00 2001 From: KirisameMarisa Date: Sun, 21 Jan 2024 13:39:58 +0900 Subject: [PATCH 30/40] fix pack script --- .../project/Assets/Scenes/GenUnityPackage.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/Plugins/Unity/project/Assets/Scenes/GenUnityPackage.cs b/Plugins/Unity/project/Assets/Scenes/GenUnityPackage.cs index a28025d..307b17f 100644 --- a/Plugins/Unity/project/Assets/Scenes/GenUnityPackage.cs +++ b/Plugins/Unity/project/Assets/Scenes/GenUnityPackage.cs @@ -1,12 +1,21 @@ -using System.Collections; using System.Collections.Generic; -using System.IO; using UnityEditor; using UnityEngine; public class GenUnityPackage { + [MenuItem("BocchiTracker/Export Package")] public static void Export () { - AssetDatabase.ExportPackage("../../Artifact", "BocchiTracker/BocchiTracker.unitypackage", ExportPackageOptions.Recurse); + + var exportedPackageAssetList = new List(); + foreach (var guid in AssetDatabase.FindAssets("", new[] { "Assets/BocchiTracker" })) + { + var path = AssetDatabase.GUIDToAssetPath(guid); + exportedPackageAssetList.Add(path); + } + + foreach (var PackFile in exportedPackageAssetList) { Debug.Log(PackFile); } + + AssetDatabase.ExportPackage(exportedPackageAssetList.ToArray(), "../Artifact/BocchiTracker.unitypackage", ExportPackageOptions.Recurse); } } From 1519b0ea4a44919d2aead20420d6760c083530df Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sun, 21 Jan 2024 13:56:08 +0900 Subject: [PATCH 31/40] Update release.yml --- .github/workflows/release.yml | 256 ++++++++++++++++------------------ 1 file changed, 123 insertions(+), 133 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cd373a1..a52146f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,49 +10,7 @@ on: permissions: contents: read -jobs: - unity-build: - permissions: - contents: write - pull-requests: write - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - - name: Checkout submodules - run: git submodule update --init --recursive - - - name: Set up .NET Core - uses: actions/setup-dotnet@v4 - with: - dotnet-version: 7.0.x - - - name: setup python - uses: actions/setup-python@v4 - with: - python-version: '3.10' - - - name: Build flatbuffers - run: python ExternalTools/BuildScripts/build_flatbuffers_csharp.py - - - name: Setup unity - uses: game-ci/unity-builder@v4 - env: - UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} - UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} - UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }} - with: - projectPath: Plugins/Unity/project - buildMethod: GenUnityPackage.Export - - - name: Upload Artifact Unity - uses: actions/upload-artifact@v3 - with: - name: Artifact-Unity-Plugin - path: Plugins/Unity/Artifact - +jobs: # upload-plugins-artifact: # permissions: # contents: write @@ -71,7 +29,20 @@ jobs: # - name: Checkout submodules # run: git submodule update --init --recursive - + + # - name: setup python + # uses: actions/setup-python@v4 + # with: + # python-version: '3.10' + + # - run: pip install SCons + + # - name: Set up .NET Core + # if: runner.os == 'Linux' + # uses: actions/setup-dotnet@v4 + # with: + # dotnet-version: 7.0.x + # - name: Install cmake on ubuntu-latest # if: runner.os == 'Linux' # run: | @@ -92,13 +63,6 @@ jobs: # - name: Add msbuild to PATH # if: runner.os == 'Windows' # uses: microsoft/setup-msbuild@v1.1 - - # - name: setup python - # uses: actions/setup-python@v4 - # with: - # python-version: '3.10' - - # - run: pip install SCons # - name: Build flatbuffers # run: python ExternalTools/BuildScripts/build_flatbuffers.py @@ -106,6 +70,23 @@ jobs: # - name: Build Godot # run: python ExternalTools/BuildScripts/build_godot.py + # - name: Build unity + # if: runner.os == 'Linux' + # uses: game-ci/unity-builder@v4 + # env: + # UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} + # UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} + # UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }} + # with: + # projectPath: Plugins/Unity/project + # buildMethod: GenUnityPackage.Export + + # - name: Upload Artifact Unity + # uses: actions/upload-artifact@v3 + # with: + # name: Artifact-Unity-Plugin + # path: Plugins/Unity/Artifact + # - name: Upload Artifact Godot # uses: actions/upload-artifact@v3 # with: @@ -118,95 +99,104 @@ jobs: # name: Artifact-UnrealEngine-Plugin # path: Plugins/UnrealEngine - # upload-app-artifact: - # permissions: - # contents: write - # pull-requests: write + upload-app-artifact: + permissions: + contents: write + pull-requests: write - # runs-on: windows-latest + runs-on: windows-latest - # steps: - # - name: Checkout repository - # uses: actions/checkout@v2 + steps: + - name: Checkout repository + uses: actions/checkout@v2 - # - name: Set up .NET Core - # uses: actions/setup-dotnet@v4 - # with: - # dotnet-version: 7.0.x + - name: Set up .NET Core + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 7.0.x - # - name: Build C# application - # run: dotnet build Application/BocchiTracker.WPF.sln -c Release - - # - name: Upload Artifact Application - # uses: actions/upload-artifact@v3 - # with: - # name: Artifact-BocchiTracker - # path: Application/WPF/Artifact/Release/net7.0-windows - - # create_draft_release: - # permissions: - # contents: write - # pull-requests: write + - name: Build C# application + run: dotnet build Application/BocchiTracker.WPF.sln -c Release - # runs-on: windows-latest - - # steps: - # - name: Delete drafts - # uses: hugo19941994/delete-draft-releases@v1.0.0 - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - # - name: Create release draft - # uses: release-drafter/release-drafter@v5 - # id: create_draft - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Upload Artifact Application + uses: actions/upload-artifact@v3 + with: + name: Artifact-BocchiTracker + path: Application/WPF/Artifact/Release/net7.0-windows - # - name: Archive UnrealEngine plugin - # run: Compress-Archive -Path "Plugins/UnrealEngine" -DestinationPath "UnrealEngine.zip" + create_draft_release: + needs: [upload-app-artifact] + permissions: + contents: write + pull-requests: write - # - name: Archive Unity plugin - # run: Compress-Archive -Path "Plugins/Unity" -DestinationPath "Unity.zip" + runs-on: windows-latest - # - name: Archive Godot plugin - # run: Compress-Archive -Path "Plugins/Godot" -DestinationPath "Godot.zip" + steps: + - name: Download All Artifacts + uses: actions/download-artifact@v4 + with: + path: Artifacts + pattern: Artifact-* + + - run: ls -R my-artifact - # - name: Upload Application - # uses: actions/upload-release-asset@v1 - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # with: - # upload_url: ${{ steps.create_draft.outputs.upload_url }} - # asset_path: ./BocchiTracker.zip - # asset_name: BocchiTracker.zip - # asset_content_type: application/zip + # - name: Delete drafts + # uses: hugo19941994/delete-draft-releases@v1.0.0 + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # - name: Upload UnrealEngine plugin - # uses: actions/upload-release-asset@v1 - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # with: - # upload_url: ${{ steps.create_draft.outputs.upload_url }} - # asset_path: ./UnrealEngine.zip - # asset_name: UnrealEngine.zip - # asset_content_type: application/zip - - # - name: Upload Unity plugin - # uses: actions/upload-release-asset@v1 - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # with: - # upload_url: ${{ steps.create_draft.outputs.upload_url }} - # asset_path: ./Unity.zip - # asset_name: Unity.zip - # asset_content_type: application/zip - - # - name: Upload Godot plugin - # uses: actions/upload-release-asset@v1 - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # with: - # upload_url: ${{ steps.create_draft.outputs.upload_url }} - # asset_path: ./Godot.zip - # asset_name: Godot.zip - # asset_content_type: application/zip + # - name: Create release draft + # uses: release-drafter/release-drafter@v5 + # id: create_draft + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + # - name: Archive UnrealEngine plugin + # run: Compress-Archive -Path "Plugins/UnrealEngine" -DestinationPath "UnrealEngine.zip" + + # - name: Archive Unity plugin + # run: Compress-Archive -Path "Plugins/Unity" -DestinationPath "Unity.zip" + + # - name: Archive Godot plugin + # run: Compress-Archive -Path "Plugins/Godot" -DestinationPath "Godot.zip" + + # - name: Upload Application + # uses: actions/upload-release-asset@v1 + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # with: + # upload_url: ${{ steps.create_draft.outputs.upload_url }} + # asset_path: ./BocchiTracker.zip + # asset_name: BocchiTracker.zip + # asset_content_type: application/zip + + # - name: Upload UnrealEngine plugin + # uses: actions/upload-release-asset@v1 + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # with: + # upload_url: ${{ steps.create_draft.outputs.upload_url }} + # asset_path: ./UnrealEngine.zip + # asset_name: UnrealEngine.zip + # asset_content_type: application/zip + + # - name: Upload Unity plugin + # uses: actions/upload-release-asset@v1 + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # with: + # upload_url: ${{ steps.create_draft.outputs.upload_url }} + # asset_path: ./Unity.zip + # asset_name: Unity.zip + # asset_content_type: application/zip + + # - name: Upload Godot plugin + # uses: actions/upload-release-asset@v1 + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # with: + # upload_url: ${{ steps.create_draft.outputs.upload_url }} + # asset_path: ./Godot.zip + # asset_name: Godot.zip + # asset_content_type: application/zip From 7132a64b8a87205d684905058f27a5aedcba6e2d Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sun, 21 Jan 2024 13:57:25 +0900 Subject: [PATCH 32/40] Update release.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a52146f..31b448c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -139,7 +139,7 @@ jobs: path: Artifacts pattern: Artifact-* - - run: ls -R my-artifact + - run: ls -R Artifacts # - name: Delete drafts # uses: hugo19941994/delete-draft-releases@v1.0.0 From 1e6e6e9e8ee67c7a8ff26b7dc7f3bafceb99bfa3 Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sun, 21 Jan 2024 14:05:16 +0900 Subject: [PATCH 33/40] Update release.yml --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 31b448c..8844e11 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -138,6 +138,7 @@ jobs: with: path: Artifacts pattern: Artifact-* + merge-multiple: true - run: ls -R Artifacts From 4ab5cbbb37ec3c2a97c3b92d639cdc477bc22ec8 Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sun, 21 Jan 2024 14:15:10 +0900 Subject: [PATCH 34/40] Update release.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8844e11..ed0eb03 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -130,7 +130,7 @@ jobs: contents: write pull-requests: write - runs-on: windows-latest + runs-on: ubuntu-latest steps: - name: Download All Artifacts From 06378be476c248f94d301f25fb1e2f881235f75b Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sun, 21 Jan 2024 14:33:23 +0900 Subject: [PATCH 35/40] Update release.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ed0eb03..506d2d3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -134,7 +134,7 @@ jobs: steps: - name: Download All Artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v3 with: path: Artifacts pattern: Artifact-* From bcb2d46162b3150751f5e48d2e47ea601955391a Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sun, 21 Jan 2024 14:45:58 +0900 Subject: [PATCH 36/40] Update release.yml --- .github/workflows/release.yml | 276 +++++++++++++++++----------------- 1 file changed, 137 insertions(+), 139 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 506d2d3..b8596ec 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,93 +11,93 @@ permissions: contents: read jobs: - # upload-plugins-artifact: - # permissions: - # contents: write - # pull-requests: write + upload-plugins-artifact: + permissions: + contents: write + pull-requests: write - # strategy: - # matrix: - # runs-on: [windows-latest, macos-latest, ubuntu-latest, ] - # runs-on: ${{ matrix.runs-on }} + strategy: + matrix: + runs-on: [windows-latest, macos-latest, ubuntu-latest, ] + runs-on: ${{ matrix.runs-on }} - # env: - # Builder: 1 + env: + Builder: 1 - # steps: - # - uses: actions/checkout@v3 + steps: + - uses: actions/checkout@v3 - # - name: Checkout submodules - # run: git submodule update --init --recursive + - name: Checkout submodules + run: git submodule update --init --recursive - # - name: setup python - # uses: actions/setup-python@v4 - # with: - # python-version: '3.10' - - # - run: pip install SCons - - # - name: Set up .NET Core - # if: runner.os == 'Linux' - # uses: actions/setup-dotnet@v4 - # with: - # dotnet-version: 7.0.x - - # - name: Install cmake on ubuntu-latest - # if: runner.os == 'Linux' - # run: | - # sudo apt update -y - # sudo apt install -y cmake - - # - name: Install cmake on macos-latest - # if: runner.os == 'macOS' - # run: | - # brew update - # brew install cmake - - # - name: Install cmake on windows-latest - # if: runner.os == 'Windows' - # run: | - # choco install cmake - - # - name: Add msbuild to PATH - # if: runner.os == 'Windows' - # uses: microsoft/setup-msbuild@v1.1 + - name: setup python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + + - run: pip install SCons + + - name: Set up .NET Core + if: runner.os == 'Linux' + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 7.0.x + + - name: Install cmake on ubuntu-latest + if: runner.os == 'Linux' + run: | + sudo apt update -y + sudo apt install -y cmake + + - name: Install cmake on macos-latest + if: runner.os == 'macOS' + run: | + brew update + brew install cmake + + - name: Install cmake on windows-latest + if: runner.os == 'Windows' + run: | + choco install cmake + + - name: Add msbuild to PATH + if: runner.os == 'Windows' + uses: microsoft/setup-msbuild@v1.1 - # - name: Build flatbuffers - # run: python ExternalTools/BuildScripts/build_flatbuffers.py - - # - name: Build Godot - # run: python ExternalTools/BuildScripts/build_godot.py - - # - name: Build unity - # if: runner.os == 'Linux' - # uses: game-ci/unity-builder@v4 - # env: - # UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} - # UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} - # UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }} - # with: - # projectPath: Plugins/Unity/project - # buildMethod: GenUnityPackage.Export + - name: Build flatbuffers + run: python ExternalTools/BuildScripts/build_flatbuffers.py + + - name: Build Godot + run: python ExternalTools/BuildScripts/build_godot.py + + - name: Build unity + if: runner.os == 'Linux' + uses: game-ci/unity-builder@v4 + env: + UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} + UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} + UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }} + with: + projectPath: Plugins/Unity/project + buildMethod: GenUnityPackage.Export - # - name: Upload Artifact Unity - # uses: actions/upload-artifact@v3 - # with: - # name: Artifact-Unity-Plugin - # path: Plugins/Unity/Artifact - - # - name: Upload Artifact Godot - # uses: actions/upload-artifact@v3 - # with: - # name: Artifact-Godot-Plugin - # path: Plugins/Godot/project/addons - - # - name: Upload Artifact UnrealEngine - # uses: actions/upload-artifact@v3 - # with: - # name: Artifact-UnrealEngine-Plugin - # path: Plugins/UnrealEngine + - name: Upload Artifact Unity + uses: actions/upload-artifact@v3 + with: + name: Artifact-Unity-Plugin + path: Plugins/Unity/Artifact + + - name: Upload Artifact Godot + uses: actions/upload-artifact@v3 + with: + name: Artifact-Godot-Plugin + path: Plugins/Godot/project/addons + + - name: Upload Artifact UnrealEngine + uses: actions/upload-artifact@v3 + with: + name: Artifact-UnrealEngine-Plugin + path: Plugins/UnrealEngine upload-app-artifact: permissions: @@ -140,64 +140,62 @@ jobs: pattern: Artifact-* merge-multiple: true - - run: ls -R Artifacts - - # - name: Delete drafts - # uses: hugo19941994/delete-draft-releases@v1.0.0 - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Delete drafts + uses: hugo19941994/delete-draft-releases@v1.0.0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # - name: Create release draft - # uses: release-drafter/release-drafter@v5 - # id: create_draft - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - # - name: Archive UnrealEngine plugin - # run: Compress-Archive -Path "Plugins/UnrealEngine" -DestinationPath "UnrealEngine.zip" - - # - name: Archive Unity plugin - # run: Compress-Archive -Path "Plugins/Unity" -DestinationPath "Unity.zip" - - # - name: Archive Godot plugin - # run: Compress-Archive -Path "Plugins/Godot" -DestinationPath "Godot.zip" - - # - name: Upload Application - # uses: actions/upload-release-asset@v1 - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # with: - # upload_url: ${{ steps.create_draft.outputs.upload_url }} - # asset_path: ./BocchiTracker.zip - # asset_name: BocchiTracker.zip - # asset_content_type: application/zip + - name: Create release draft + uses: release-drafter/release-drafter@v5 + id: create_draft + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # - name: Upload UnrealEngine plugin - # uses: actions/upload-release-asset@v1 - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # with: - # upload_url: ${{ steps.create_draft.outputs.upload_url }} - # asset_path: ./UnrealEngine.zip - # asset_name: UnrealEngine.zip - # asset_content_type: application/zip - - # - name: Upload Unity plugin - # uses: actions/upload-release-asset@v1 - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # with: - # upload_url: ${{ steps.create_draft.outputs.upload_url }} - # asset_path: ./Unity.zip - # asset_name: Unity.zip - # asset_content_type: application/zip - - # - name: Upload Godot plugin - # uses: actions/upload-release-asset@v1 - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # with: - # upload_url: ${{ steps.create_draft.outputs.upload_url }} - # asset_path: ./Godot.zip - # asset_name: Godot.zip - # asset_content_type: application/zip + - name: Archive Application + run: Compress-Archive -Path "Artifacts/Artifact-BocchiTracker" -DestinationPath "BocchiTracker.zip" + + - name: Archive UnrealEngine plugin + run: Compress-Archive -Path "Artifacts/Artifact-UnrealEngine-Plugin" -DestinationPath "UnrealEngine.zip" + + - name: Archive Godot plugin + run: Compress-Archive -Path "Artifact-Godot-Plugin" -DestinationPath "Godot.zip" + + - name: Upload Application + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_draft.outputs.upload_url }} + asset_path: ./BocchiTracker.zip + asset_name: BocchiTracker.zip + asset_content_type: application/zip + + - name: Upload UnrealEngine plugin + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_draft.outputs.upload_url }} + asset_path: ./UnrealEngine.zip + asset_name: UnrealEngine.zip + asset_content_type: application/zip + + - name: Upload Unity plugin + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_draft.outputs.upload_url }} + asset_path: ./Unity.zip + asset_name: Unity.zip + asset_content_type: application/zip + + - name: Upload Godot plugin + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_draft.outputs.upload_url }} + asset_path: ./Artifacts/Artifact-Unity-Plugin/BocchiTracker.unitypackage + asset_name: BocchiTracker.unitypackage + asset_content_type: application/zip From 5cc742f21d781b566f2e239e1535776bb912f3e0 Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sun, 21 Jan 2024 14:46:42 +0900 Subject: [PATCH 37/40] Update release.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b8596ec..a5da102 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -125,7 +125,7 @@ jobs: path: Application/WPF/Artifact/Release/net7.0-windows create_draft_release: - needs: [upload-app-artifact] + needs: [upload-app-artifact, upload-plugins-artifact] permissions: contents: write pull-requests: write From 1d5fc2e682a2ac927421e3b71ee9a298812ac6b1 Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sun, 21 Jan 2024 15:32:53 +0900 Subject: [PATCH 38/40] Update release.yml --- .github/workflows/release.yml | 63 ++++++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 19 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a5da102..5d04b31 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,7 +10,49 @@ on: permissions: contents: read -jobs: +jobs: + upload-plugin-unity-artifact: + permissions: + contents: write + pull-requests: write + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Checkout submodules + run: git submodule update --init --recursive + + - name: Set up .NET Core + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 7.0.x + + - name: setup python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + + - name: Build flatbuffers + run: python ExternalTools/BuildScripts/build_flatbuffers_csharp.py + + - name: Setup unity + uses: game-ci/unity-builder@v4 + env: + UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} + UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} + UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }} + with: + projectPath: Plugins/Unity/project + buildMethod: GenUnityPackage.Export + + - name: Upload Artifact Unity + uses: actions/upload-artifact@v3 + with: + name: Artifact-Unity-Plugin + path: Plugins/Unity/Artifact + upload-plugins-artifact: permissions: contents: write @@ -70,23 +112,6 @@ jobs: - name: Build Godot run: python ExternalTools/BuildScripts/build_godot.py - - name: Build unity - if: runner.os == 'Linux' - uses: game-ci/unity-builder@v4 - env: - UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} - UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} - UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }} - with: - projectPath: Plugins/Unity/project - buildMethod: GenUnityPackage.Export - - - name: Upload Artifact Unity - uses: actions/upload-artifact@v3 - with: - name: Artifact-Unity-Plugin - path: Plugins/Unity/Artifact - - name: Upload Artifact Godot uses: actions/upload-artifact@v3 with: @@ -125,7 +150,7 @@ jobs: path: Application/WPF/Artifact/Release/net7.0-windows create_draft_release: - needs: [upload-app-artifact, upload-plugins-artifact] + needs: [upload-app-artifact, upload-plugins-artifact, upload-plugin-unity-artifact] permissions: contents: write pull-requests: write From a5f55d8d80fdce311255df85ad94c0ec490650fa Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sun, 21 Jan 2024 16:05:50 +0900 Subject: [PATCH 39/40] Update release.yml --- .github/workflows/release.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5d04b31..55c40a0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -177,13 +177,13 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Archive Application - run: Compress-Archive -Path "Artifacts/Artifact-BocchiTracker" -DestinationPath "BocchiTracker.zip" + run: Compress-Archive -Path "./Artifacts/Artifact-BocchiTracker" -DestinationPath "BocchiTracker.zip" - name: Archive UnrealEngine plugin - run: Compress-Archive -Path "Artifacts/Artifact-UnrealEngine-Plugin" -DestinationPath "UnrealEngine.zip" + run: Compress-Archive -Path "./Artifacts/Artifact-UnrealEngine-Plugin" -DestinationPath "UnrealEngine.zip" - name: Archive Godot plugin - run: Compress-Archive -Path "Artifact-Godot-Plugin" -DestinationPath "Godot.zip" + run: Compress-Archive -Path "./Artifacts/Artifact-Godot-Plugin" -DestinationPath "Godot.zip" - name: Upload Application uses: actions/upload-release-asset@v1 @@ -205,17 +205,17 @@ jobs: asset_name: UnrealEngine.zip asset_content_type: application/zip - - name: Upload Unity plugin + - name: Upload Godot plugin uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_draft.outputs.upload_url }} - asset_path: ./Unity.zip - asset_name: Unity.zip + asset_path: ./Godot.zip + asset_name: Godot.zip asset_content_type: application/zip - - name: Upload Godot plugin + - name: Upload Unity plugin uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 7c2cd1204232103ad242dbd04d2cbfdff9fa2833 Mon Sep 17 00:00:00 2001 From: AritaYuto Date: Sun, 21 Jan 2024 16:35:42 +0900 Subject: [PATCH 40/40] Update release.yml --- .github/workflows/release.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 55c40a0..05d0053 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -175,16 +175,16 @@ jobs: id: create_draft env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - + - name: Archive Application - run: Compress-Archive -Path "./Artifacts/Artifact-BocchiTracker" -DestinationPath "BocchiTracker.zip" + run: zip -r BocchiTracker.zip ./Artifacts/Artifact-BocchiTracker - name: Archive UnrealEngine plugin - run: Compress-Archive -Path "./Artifacts/Artifact-UnrealEngine-Plugin" -DestinationPath "UnrealEngine.zip" - + run: zip -r UnrealEngine.zip ./Artifacts/Artifact-UnrealEngine-Plugin + - name: Archive Godot plugin - run: Compress-Archive -Path "./Artifacts/Artifact-Godot-Plugin" -DestinationPath "Godot.zip" - + run: zip -r Godot.zip ./Artifacts/Artifact-Godot-Plugin + - name: Upload Application uses: actions/upload-release-asset@v1 env:

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