Full Code of gindemit/unity-rlottie for AI

dev d692157d1349 cached
697 files
36.2 MB
6.0M tokens
419 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (24,153K chars total). Download the full file to get everything.
Repository: gindemit/unity-rlottie
Branch: dev
Commit: d692157d1349
Files: 697
Total size: 36.2 MB

Directory structure:
gitextract_iryq256z/

├── .editorconfig
├── .gitattributes
├── .github/
│   └── workflows/
│       ├── activation.yaml
│       └── build_native_libraries.yaml
├── .gitignore
├── .gitmodules
├── AGENTS.md
├── LICENSE
├── README.md
├── dependency/
│   └── pixman/
│       ├── pixman-arm-intrisics.cpp
│       ├── pixman-arm-neon-asm.S
│       ├── pixman-arm-neon-asm.h
│       ├── pixman-arma64-neon-asm.S
│       ├── pixman-arma64-neon-asm.h
│       └── pixman-cpp-standard.cpp
├── projects/
│   ├── AndroidStudio/
│   │   ├── .gitignore
│   │   ├── .idea/
│   │   │   ├── .gitignore
│   │   │   ├── .name
│   │   │   ├── compiler.xml
│   │   │   ├── gradle.xml
│   │   │   ├── misc.xml
│   │   │   └── vcs.xml
│   │   ├── app/
│   │   │   ├── .gitignore
│   │   │   ├── build.gradle
│   │   │   ├── proguard-rules.pro
│   │   │   └── src/
│   │   │       ├── androidTest/
│   │   │       │   └── java/
│   │   │       │       └── com/
│   │   │       │           └── gindemit/
│   │   │       │               └── rlottie/
│   │   │       │                   └── ExampleInstrumentedTest.java
│   │   │       ├── main/
│   │   │       │   ├── AndroidManifest.xml
│   │   │       │   ├── java/
│   │   │       │   │   └── com/
│   │   │       │   │       └── gindemit/
│   │   │       │   │           └── rlottie/
│   │   │       │   │               └── MainActivity.java
│   │   │       │   └── res/
│   │   │       │       ├── drawable/
│   │   │       │       │   └── ic_launcher_background.xml
│   │   │       │       ├── drawable-v24/
│   │   │       │       │   └── ic_launcher_foreground.xml
│   │   │       │       ├── layout/
│   │   │       │       │   └── activity_main.xml
│   │   │       │       ├── mipmap-anydpi-v26/
│   │   │       │       │   ├── ic_launcher.xml
│   │   │       │       │   └── ic_launcher_round.xml
│   │   │       │       ├── values/
│   │   │       │       │   ├── colors.xml
│   │   │       │       │   ├── strings.xml
│   │   │       │       │   └── themes.xml
│   │   │       │       └── values-night/
│   │   │       │           └── themes.xml
│   │   │       └── test/
│   │   │           └── java/
│   │   │               └── com/
│   │   │                   └── gindemit/
│   │   │                       └── rlottie/
│   │   │                           └── ExampleUnitTest.java
│   │   ├── build.gradle
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradle.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   └── settings.gradle
│   └── CMake/
│       ├── .gitignore
│       ├── CMakeLists.txt
│       └── CMakeSettings.json
├── src/
│   ├── ExportApi.h
│   ├── LottiePlugin.cpp
│   └── LottiePlugin.h
└── unity/
    └── RLottieUnity/
        ├── .editorconfig
        ├── .gitignore
        ├── .vsconfig
        ├── Assets/
        │   ├── LottiePlugin/
        │   │   ├── Editor/
        │   │   │   ├── LottiePlugin.Editor.asmdef
        │   │   │   ├── LottiePlugin.Editor.asmdef.meta
        │   │   │   ├── src/
        │   │   │   │   ├── AnimatedButtonEditor.cs
        │   │   │   │   ├── AnimatedButtonEditor.cs.meta
        │   │   │   │   ├── AnimatedImageEditor.cs
        │   │   │   │   ├── AnimatedImageEditor.cs.meta
        │   │   │   │   ├── OpenPersistentDataPathFolder.cs
        │   │   │   │   └── OpenPersistentDataPathFolder.cs.meta
        │   │   │   └── src.meta
        │   │   ├── Editor.meta
        │   │   ├── Plugins/
        │   │   │   ├── Android/
        │   │   │   │   ├── arm64-v8a/
        │   │   │   │   │   └── libLottiePlugin.so.meta
        │   │   │   │   ├── arm64-v8a.meta
        │   │   │   │   ├── armeabi-v7a/
        │   │   │   │   │   └── libLottiePlugin.so.meta
        │   │   │   │   ├── armeabi-v7a.meta
        │   │   │   │   ├── x86/
        │   │   │   │   │   └── libLottiePlugin.so.meta
        │   │   │   │   ├── x86.meta
        │   │   │   │   ├── x86_64/
        │   │   │   │   │   └── libLottiePlugin.so.meta
        │   │   │   │   └── x86_64.meta
        │   │   │   ├── Android.meta
        │   │   │   ├── Linux/
        │   │   │   │   ├── x86_64/
        │   │   │   │   │   └── libLottiePlugin.so.meta
        │   │   │   │   └── x86_64.meta
        │   │   │   ├── Linux.meta
        │   │   │   ├── OSX/
        │   │   │   │   └── libLottiePlugin.dylib.meta
        │   │   │   ├── OSX.meta
        │   │   │   ├── WebGL/
        │   │   │   │   ├── LottiePlugin.bc
        │   │   │   │   ├── LottiePlugin.bc.meta
        │   │   │   │   ├── libLottiePlugin.a
        │   │   │   │   ├── libLottiePlugin.a.meta
        │   │   │   │   ├── librlottie.a
        │   │   │   │   └── librlottie.a.meta
        │   │   │   ├── WebGL.meta
        │   │   │   ├── Windows/
        │   │   │   │   ├── x86/
        │   │   │   │   │   └── LottiePlugin.dll.meta
        │   │   │   │   ├── x86.meta
        │   │   │   │   ├── x86_64/
        │   │   │   │   │   └── LottiePlugin.dll.meta
        │   │   │   │   └── x86_64.meta
        │   │   │   ├── Windows.meta
        │   │   │   ├── iOS/
        │   │   │   │   ├── libLottiePlugin.a
        │   │   │   │   ├── libLottiePlugin.a.meta
        │   │   │   │   ├── librlottie.a
        │   │   │   │   ├── librlottie.a.meta
        │   │   │   │   ├── x86_64/
        │   │   │   │   │   ├── libLottiePlugin.a
        │   │   │   │   │   ├── libLottiePlugin.a.meta
        │   │   │   │   │   ├── librlottie.a
        │   │   │   │   │   └── librlottie.a.meta
        │   │   │   │   └── x86_64.meta
        │   │   │   └── iOS.meta
        │   │   ├── Plugins.meta
        │   │   ├── Runtime/
        │   │   │   ├── AssemblyAttributes.cs
        │   │   │   ├── AssemblyAttributes.cs.meta
        │   │   │   ├── LottiePlugin.Runtime.asmdef
        │   │   │   ├── LottiePlugin.Runtime.asmdef.meta
        │   │   │   ├── src/
        │   │   │   │   ├── LottieAnimation.cs
        │   │   │   │   ├── LottieAnimation.cs.meta
        │   │   │   │   ├── LottieAnimationsAtlas.cs
        │   │   │   │   ├── LottieAnimationsAtlas.cs.meta
        │   │   │   │   ├── NativeBridge.cs
        │   │   │   │   ├── NativeBridge.cs.meta
        │   │   │   │   ├── Support/
        │   │   │   │   │   ├── FIleSizeFormatter.cs
        │   │   │   │   │   ├── FIleSizeFormatter.cs.meta
        │   │   │   │   │   ├── FilesHelper.cs
        │   │   │   │   │   ├── FilesHelper.cs.meta
        │   │   │   │   │   ├── StreamingAssetsHelper.cs
        │   │   │   │   │   └── StreamingAssetsHelper.cs.meta
        │   │   │   │   ├── Support.meta
        │   │   │   │   ├── UI/
        │   │   │   │   │   ├── AnimatedButton.cs
        │   │   │   │   │   ├── AnimatedButton.cs.meta
        │   │   │   │   │   ├── AnimatedImage.cs
        │   │   │   │   │   └── AnimatedImage.cs.meta
        │   │   │   │   ├── UI.meta
        │   │   │   │   ├── Utility/
        │   │   │   │   │   ├── ThrowIf.cs
        │   │   │   │   │   └── ThrowIf.cs.meta
        │   │   │   │   └── Utility.meta
        │   │   │   └── src.meta
        │   │   ├── Runtime.meta
        │   │   ├── Samples~/
        │   │   │   ├── SceneUI/
        │   │   │   │   ├── ExternalDlls/
        │   │   │   │   │   ├── Newtonsoft.Json.dll.meta
        │   │   │   │   │   ├── System.Buffers.dll.meta
        │   │   │   │   │   ├── System.Memory.dll.meta
        │   │   │   │   │   ├── System.Threading.Tasks.Extensions.dll.meta
        │   │   │   │   │   └── Telegram.Bot.dll.meta
        │   │   │   │   ├── ExternalDlls.meta
        │   │   │   │   ├── Graphy - Ultimate Stats Monitor/
        │   │   │   │   │   ├── Changelog.txt
        │   │   │   │   │   ├── Changelog.txt.meta
        │   │   │   │   │   ├── Editor/
        │   │   │   │   │   │   ├── GraphyDebuggerEditor.cs
        │   │   │   │   │   │   ├── GraphyDebuggerEditor.cs.meta
        │   │   │   │   │   │   ├── GraphyEditorStyle.cs
        │   │   │   │   │   │   ├── GraphyEditorStyle.cs.meta
        │   │   │   │   │   │   ├── GraphyManagerEditor.cs
        │   │   │   │   │   │   ├── GraphyManagerEditor.cs.meta
        │   │   │   │   │   │   ├── GraphyMenuItem.cs
        │   │   │   │   │   │   ├── GraphyMenuItem.cs.meta
        │   │   │   │   │   │   ├── Tayx.Graphy.Editor.asmdef
        │   │   │   │   │   │   └── Tayx.Graphy.Editor.asmdef.meta
        │   │   │   │   │   ├── Editor.meta
        │   │   │   │   │   ├── Font/
        │   │   │   │   │   │   ├── Northwest-Bold/
        │   │   │   │   │   │   │   ├── ERIC-TIRADO-NORTHWEST-LICENSE.txt
        │   │   │   │   │   │   │   ├── ERIC-TIRADO-NORTHWEST-LICENSE.txt.meta
        │   │   │   │   │   │   │   ├── NORTHWEST-B.otf
        │   │   │   │   │   │   │   └── NORTHWEST-B.otf.meta
        │   │   │   │   │   │   ├── Northwest-Bold.meta
        │   │   │   │   │   │   ├── Roboto/
        │   │   │   │   │   │   │   ├── LICENSE.txt
        │   │   │   │   │   │   │   ├── LICENSE.txt.meta
        │   │   │   │   │   │   │   ├── Roboto-Bold.ttf.meta
        │   │   │   │   │   │   │   └── Roboto-Regular.ttf.meta
        │   │   │   │   │   │   └── Roboto.meta
        │   │   │   │   │   ├── Font.meta
        │   │   │   │   │   ├── GUI/
        │   │   │   │   │   │   ├── GraphyGUISkin.guiskin
        │   │   │   │   │   │   └── GraphyGUISkin.guiskin.meta
        │   │   │   │   │   ├── GUI.meta
        │   │   │   │   │   ├── LICENSE
        │   │   │   │   │   ├── LICENSE.meta
        │   │   │   │   │   ├── Materials/
        │   │   │   │   │   │   ├── Audio_Spectrum_Graph.mat
        │   │   │   │   │   │   ├── Audio_Spectrum_Graph.mat.meta
        │   │   │   │   │   │   ├── Audio_Spectrum_Highest_Values_Graph.mat
        │   │   │   │   │   │   ├── Audio_Spectrum_Highest_Values_Graph.mat.meta
        │   │   │   │   │   │   ├── FPS_Graph.mat
        │   │   │   │   │   │   ├── FPS_Graph.mat.meta
        │   │   │   │   │   │   ├── RAM_Allocated_Graph.mat
        │   │   │   │   │   │   ├── RAM_Allocated_Graph.mat.meta
        │   │   │   │   │   │   ├── RAM_Mono_Graph.mat
        │   │   │   │   │   │   ├── RAM_Mono_Graph.mat.meta
        │   │   │   │   │   │   ├── RAM_Reserved_Graph.mat
        │   │   │   │   │   │   └── RAM_Reserved_Graph.mat.meta
        │   │   │   │   │   ├── Materials.meta
        │   │   │   │   │   ├── Prefab/
        │   │   │   │   │   │   ├── Internal/
        │   │   │   │   │   │   │   ├── ADVANCED - Module.prefab
        │   │   │   │   │   │   │   ├── ADVANCED - Module.prefab.meta
        │   │   │   │   │   │   │   ├── AUDIO - Module.prefab
        │   │   │   │   │   │   │   ├── AUDIO - Module.prefab.meta
        │   │   │   │   │   │   │   ├── FPS - Module.prefab
        │   │   │   │   │   │   │   ├── FPS - Module.prefab.meta
        │   │   │   │   │   │   │   ├── RAM - Module.prefab
        │   │   │   │   │   │   │   └── RAM - Module.prefab.meta
        │   │   │   │   │   │   ├── Internal.meta
        │   │   │   │   │   │   ├── [Graphy].prefab
        │   │   │   │   │   │   └── [Graphy].prefab.meta
        │   │   │   │   │   ├── Prefab.meta
        │   │   │   │   │   ├── README.md
        │   │   │   │   │   ├── README.md.meta
        │   │   │   │   │   ├── Readme! - Graphy - Documentation.pdf.meta
        │   │   │   │   │   ├── Runtime/
        │   │   │   │   │   │   ├── Advanced/
        │   │   │   │   │   │   │   ├── G_AdvancedData.cs
        │   │   │   │   │   │   │   └── G_AdvancedData.cs.meta
        │   │   │   │   │   │   ├── Advanced.meta
        │   │   │   │   │   │   ├── Audio/
        │   │   │   │   │   │   │   ├── G_AudioGraph.cs
        │   │   │   │   │   │   │   ├── G_AudioGraph.cs.meta
        │   │   │   │   │   │   │   ├── G_AudioManager.cs
        │   │   │   │   │   │   │   ├── G_AudioManager.cs.meta
        │   │   │   │   │   │   │   ├── G_AudioMonitor.cs
        │   │   │   │   │   │   │   ├── G_AudioMonitor.cs.meta
        │   │   │   │   │   │   │   ├── G_AudioText.cs
        │   │   │   │   │   │   │   └── G_AudioText.cs.meta
        │   │   │   │   │   │   ├── Audio.meta
        │   │   │   │   │   │   ├── Fps/
        │   │   │   │   │   │   │   ├── G_FpsGraph.cs
        │   │   │   │   │   │   │   ├── G_FpsGraph.cs.meta
        │   │   │   │   │   │   │   ├── G_FpsManager.cs
        │   │   │   │   │   │   │   ├── G_FpsManager.cs.meta
        │   │   │   │   │   │   │   ├── G_FpsMonitor.cs
        │   │   │   │   │   │   │   ├── G_FpsMonitor.cs.meta
        │   │   │   │   │   │   │   ├── G_FpsText.cs
        │   │   │   │   │   │   │   └── G_FpsText.cs.meta
        │   │   │   │   │   │   ├── Fps.meta
        │   │   │   │   │   │   ├── Graph/
        │   │   │   │   │   │   │   ├── G_Graph.cs
        │   │   │   │   │   │   │   └── G_Graph.cs.meta
        │   │   │   │   │   │   ├── Graph.meta
        │   │   │   │   │   │   ├── GraphyDebugger.cs
        │   │   │   │   │   │   ├── GraphyDebugger.cs.meta
        │   │   │   │   │   │   ├── GraphyManager.cs
        │   │   │   │   │   │   ├── GraphyManager.cs.meta
        │   │   │   │   │   │   ├── Ram/
        │   │   │   │   │   │   │   ├── G_RamGraph.cs
        │   │   │   │   │   │   │   ├── G_RamGraph.cs.meta
        │   │   │   │   │   │   │   ├── G_RamManager.cs
        │   │   │   │   │   │   │   ├── G_RamManager.cs.meta
        │   │   │   │   │   │   │   ├── G_RamMonitor.cs
        │   │   │   │   │   │   │   ├── G_RamMonitor.cs.meta
        │   │   │   │   │   │   │   ├── G_RamText.cs
        │   │   │   │   │   │   │   └── G_RamText.cs.meta
        │   │   │   │   │   │   ├── Ram.meta
        │   │   │   │   │   │   ├── Shader/
        │   │   │   │   │   │   │   ├── G_GraphShader.cs
        │   │   │   │   │   │   │   └── G_GraphShader.cs.meta
        │   │   │   │   │   │   ├── Shader.meta
        │   │   │   │   │   │   ├── Tayx.Graphy.asmdef
        │   │   │   │   │   │   ├── Tayx.Graphy.asmdef.meta
        │   │   │   │   │   │   ├── UI/
        │   │   │   │   │   │   │   ├── IModifiableState.cs
        │   │   │   │   │   │   │   ├── IModifiableState.cs.meta
        │   │   │   │   │   │   │   ├── IMovable.cs
        │   │   │   │   │   │   │   └── IMovable.cs.meta
        │   │   │   │   │   │   ├── UI.meta
        │   │   │   │   │   │   ├── Util/
        │   │   │   │   │   │   │   ├── G_ExtensionMethods.cs
        │   │   │   │   │   │   │   ├── G_ExtensionMethods.cs.meta
        │   │   │   │   │   │   │   ├── G_FloatString.cs
        │   │   │   │   │   │   │   ├── G_FloatString.cs.meta
        │   │   │   │   │   │   │   ├── G_Intstring.cs
        │   │   │   │   │   │   │   ├── G_Intstring.cs.meta
        │   │   │   │   │   │   │   ├── G_Singleton.cs
        │   │   │   │   │   │   │   └── G_Singleton.cs.meta
        │   │   │   │   │   │   └── Util.meta
        │   │   │   │   │   ├── Runtime.meta
        │   │   │   │   │   ├── Shaders/
        │   │   │   │   │   │   ├── GraphMobile.shader
        │   │   │   │   │   │   ├── GraphMobile.shader.meta
        │   │   │   │   │   │   ├── GraphStandard.shader
        │   │   │   │   │   │   └── GraphStandard.shader.meta
        │   │   │   │   │   ├── Shaders.meta
        │   │   │   │   │   ├── Textures/
        │   │   │   │   │   │   ├── 2x2_Texture.png.meta
        │   │   │   │   │   │   ├── Debugger_Logo_Dark.png.meta
        │   │   │   │   │   │   ├── Debugger_Logo_White.png.meta
        │   │   │   │   │   │   ├── Manager_Logo_Dark.png.meta
        │   │   │   │   │   │   ├── Manager_Logo_White.png.meta
        │   │   │   │   │   │   └── Rounded_Rect_10px.png.meta
        │   │   │   │   │   ├── Textures.meta
        │   │   │   │   │   ├── package.json
        │   │   │   │   │   └── package.json.meta
        │   │   │   │   ├── Graphy - Ultimate Stats Monitor.meta
        │   │   │   │   ├── LottieJsons/
        │   │   │   │   │   ├── UI/
        │   │   │   │   │   │   ├── Common/
        │   │   │   │   │   │   │   ├── loading_animation.json
        │   │   │   │   │   │   │   ├── loading_animation.json.meta
        │   │   │   │   │   │   │   ├── no_data_found_animation.json
        │   │   │   │   │   │   │   └── no_data_found_animation.json.meta
        │   │   │   │   │   │   ├── Common.meta
        │   │   │   │   │   │   ├── LottiePlayerScreen/
        │   │   │   │   │   │   │   ├── hamburger_menu.json
        │   │   │   │   │   │   │   ├── hamburger_menu.json.meta
        │   │   │   │   │   │   │   ├── next_track.json
        │   │   │   │   │   │   │   ├── next_track.json.meta
        │   │   │   │   │   │   │   ├── pause_play.json
        │   │   │   │   │   │   │   └── pause_play.json.meta
        │   │   │   │   │   │   ├── LottiePlayerScreen.meta
        │   │   │   │   │   │   ├── MainMenu/
        │   │   │   │   │   │   │   ├── 3d_cubes_icon.json
        │   │   │   │   │   │   │   ├── 3d_cubes_icon.json.meta
        │   │   │   │   │   │   │   ├── explore_icon.json
        │   │   │   │   │   │   │   ├── explore_icon.json.meta
        │   │   │   │   │   │   │   ├── home_icon.json
        │   │   │   │   │   │   │   ├── home_icon.json.meta
        │   │   │   │   │   │   │   ├── video_player_icon.json
        │   │   │   │   │   │   │   └── video_player_icon.json.meta
        │   │   │   │   │   │   └── MainMenu.meta
        │   │   │   │   │   └── UI.meta
        │   │   │   │   ├── LottieJsons.meta
        │   │   │   │   ├── Materials/
        │   │   │   │   │   ├── UIMaterial.mat
        │   │   │   │   │   └── UIMaterial.mat.meta
        │   │   │   │   ├── Materials.meta
        │   │   │   │   ├── Prefabs/
        │   │   │   │   │   ├── UI/
        │   │   │   │   │   │   ├── AnimationPreview.prefab
        │   │   │   │   │   │   ├── AnimationPreview.prefab.meta
        │   │   │   │   │   │   ├── LottieAnimationsPreview.prefab
        │   │   │   │   │   │   └── LottieAnimationsPreview.prefab.meta
        │   │   │   │   │   └── UI.meta
        │   │   │   │   ├── Prefabs.meta
        │   │   │   │   ├── README.txt
        │   │   │   │   ├── README.txt.meta
        │   │   │   │   ├── Scenes/
        │   │   │   │   │   ├── SampleScene.unity
        │   │   │   │   │   └── SampleScene.unity.meta
        │   │   │   │   ├── Scenes.meta
        │   │   │   │   ├── ScriptableObjects/
        │   │   │   │   │   ├── LottieAnimationsArray.asset
        │   │   │   │   │   └── LottieAnimationsArray.asset.meta
        │   │   │   │   ├── ScriptableObjects.meta
        │   │   │   │   ├── Scripts/
        │   │   │   │   │   ├── Editor/
        │   │   │   │   │   │   ├── LottiePlugin.Sample.SceneUI.Editor.asmdef
        │   │   │   │   │   │   ├── LottiePlugin.Sample.SceneUI.Editor.asmdef.meta
        │   │   │   │   │   │   ├── src/
        │   │   │   │   │   │   │   ├── PopulateLottieAnimations.cs
        │   │   │   │   │   │   │   ├── PopulateLottieAnimations.cs.meta
        │   │   │   │   │   │   │   ├── StreamingAssetsChecker.cs
        │   │   │   │   │   │   │   └── StreamingAssetsChecker.cs.meta
        │   │   │   │   │   │   └── src.meta
        │   │   │   │   │   ├── Editor.meta
        │   │   │   │   │   ├── Runtime/
        │   │   │   │   │   │   ├── LottiePlugin.Sample.SceneUI.Runtime.asmdef
        │   │   │   │   │   │   ├── LottiePlugin.Sample.SceneUI.Runtime.asmdef.meta
        │   │   │   │   │   │   ├── src/
        │   │   │   │   │   │   │   ├── Data/
        │   │   │   │   │   │   │   │   ├── LottieAnimations.cs
        │   │   │   │   │   │   │   │   └── LottieAnimations.cs.meta
        │   │   │   │   │   │   │   ├── Data.meta
        │   │   │   │   │   │   │   ├── State/
        │   │   │   │   │   │   │   │   ├── AppState.cs
        │   │   │   │   │   │   │   │   └── AppState.cs.meta
        │   │   │   │   │   │   │   ├── State.meta
        │   │   │   │   │   │   │   ├── Storage/
        │   │   │   │   │   │   │   │   ├── CanNotFindStickerPackException.cs
        │   │   │   │   │   │   │   │   ├── CanNotFindStickerPackException.cs.meta
        │   │   │   │   │   │   │   │   ├── TelegramStickerStorage.cs
        │   │   │   │   │   │   │   │   └── TelegramStickerStorage.cs.meta
        │   │   │   │   │   │   │   ├── Storage.meta
        │   │   │   │   │   │   │   ├── UI/
        │   │   │   │   │   │   │   │   ├── AnimationPreview.cs
        │   │   │   │   │   │   │   │   ├── AnimationPreview.cs.meta
        │   │   │   │   │   │   │   │   ├── AnimationsHomeScreen.cs
        │   │   │   │   │   │   │   │   ├── AnimationsHomeScreen.cs.meta
        │   │   │   │   │   │   │   │   ├── ExploreTelegramStickers.cs
        │   │   │   │   │   │   │   │   ├── ExploreTelegramStickers.cs.meta
        │   │   │   │   │   │   │   │   ├── LottieAnimationsPreview.cs
        │   │   │   │   │   │   │   │   ├── LottieAnimationsPreview.cs.meta
        │   │   │   │   │   │   │   │   ├── LottiePlayerScreen.cs
        │   │   │   │   │   │   │   │   ├── LottiePlayerScreen.cs.meta
        │   │   │   │   │   │   │   │   ├── MainMenu.cs
        │   │   │   │   │   │   │   │   └── MainMenu.cs.meta
        │   │   │   │   │   │   │   └── UI.meta
        │   │   │   │   │   │   └── src.meta
        │   │   │   │   │   └── Runtime.meta
        │   │   │   │   ├── Scripts.meta
        │   │   │   │   ├── Shaders/
        │   │   │   │   │   ├── UI-Default.shader
        │   │   │   │   │   ├── UI-Default.shader.meta
        │   │   │   │   │   ├── Unlit - Premultiplied Colored (TextureClip).shader
        │   │   │   │   │   ├── Unlit - Premultiplied Colored (TextureClip).shader.meta
        │   │   │   │   │   ├── Unlit - Premultiplied Colored 1.shader
        │   │   │   │   │   ├── Unlit - Premultiplied Colored 1.shader.meta
        │   │   │   │   │   ├── Unlit - Premultiplied Colored 2.shader
        │   │   │   │   │   ├── Unlit - Premultiplied Colored 2.shader.meta
        │   │   │   │   │   ├── Unlit - Premultiplied Colored 3.shader
        │   │   │   │   │   ├── Unlit - Premultiplied Colored 3.shader.meta
        │   │   │   │   │   ├── Unlit - Premultiplied Colored.shader
        │   │   │   │   │   ├── Unlit - Premultiplied Colored.shader.meta
        │   │   │   │   │   ├── Unlit - Text (TextureClip).shader
        │   │   │   │   │   ├── Unlit - Text (TextureClip).shader.meta
        │   │   │   │   │   ├── Unlit - Text 1.shader
        │   │   │   │   │   ├── Unlit - Text 1.shader.meta
        │   │   │   │   │   ├── Unlit - Text 2.shader
        │   │   │   │   │   ├── Unlit - Text 2.shader.meta
        │   │   │   │   │   ├── Unlit - Text 3.shader
        │   │   │   │   │   ├── Unlit - Text 3.shader.meta
        │   │   │   │   │   ├── Unlit - Text.shader
        │   │   │   │   │   ├── Unlit - Text.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Colored (Packed) (TextureClip).shader
        │   │   │   │   │   ├── Unlit - Transparent Colored (Packed) (TextureClip).shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Colored (TextureClip).shader
        │   │   │   │   │   ├── Unlit - Transparent Colored (TextureClip).shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Colored 1.shader
        │   │   │   │   │   ├── Unlit - Transparent Colored 1.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Colored 2.shader
        │   │   │   │   │   ├── Unlit - Transparent Colored 2.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Colored 3.shader
        │   │   │   │   │   ├── Unlit - Transparent Colored 3.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Colored.shader
        │   │   │   │   │   ├── Unlit - Transparent Colored.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Masked 1.shader
        │   │   │   │   │   ├── Unlit - Transparent Masked 1.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Masked 2.shader
        │   │   │   │   │   ├── Unlit - Transparent Masked 2.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Masked 3.shader
        │   │   │   │   │   ├── Unlit - Transparent Masked 3.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Masked.shader
        │   │   │   │   │   ├── Unlit - Transparent Masked.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Packed 1.shader
        │   │   │   │   │   ├── Unlit - Transparent Packed 1.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Packed 2.shader
        │   │   │   │   │   ├── Unlit - Transparent Packed 2.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Packed 3.shader
        │   │   │   │   │   ├── Unlit - Transparent Packed 3.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Packed.shader
        │   │   │   │   │   └── Unlit - Transparent Packed.shader.meta
        │   │   │   │   ├── Shaders.meta
        │   │   │   │   ├── StreamingAssets/
        │   │   │   │   │   ├── LottieSamples/
        │   │   │   │   │   │   ├── alright_sticker.json
        │   │   │   │   │   │   ├── alright_sticker.json.meta
        │   │   │   │   │   │   ├── black_friday_animation.json
        │   │   │   │   │   │   ├── black_friday_animation.json.meta
        │   │   │   │   │   │   ├── body_movin.json
        │   │   │   │   │   │   ├── body_movin.json.meta
        │   │   │   │   │   │   ├── butterfly_loading.json
        │   │   │   │   │   │   ├── butterfly_loading.json.meta
        │   │   │   │   │   │   ├── check_animation.json
        │   │   │   │   │   │   ├── check_animation.json.meta
        │   │   │   │   │   │   ├── concept_floral_branch_butterfly_and_tree.json
        │   │   │   │   │   │   ├── concept_floral_branch_butterfly_and_tree.json.meta
        │   │   │   │   │   │   ├── confetti.json
        │   │   │   │   │   │   ├── confetti.json.meta
        │   │   │   │   │   │   ├── favourite_app_icon.json
        │   │   │   │   │   │   ├── favourite_app_icon.json.meta
        │   │   │   │   │   │   ├── glow_loading.json
        │   │   │   │   │   │   ├── glow_loading.json.meta
        │   │   │   │   │   │   ├── hamburger_arrow_transition.json
        │   │   │   │   │   │   ├── hamburger_arrow_transition.json.meta
        │   │   │   │   │   │   ├── hubit.json
        │   │   │   │   │   │   ├── hubit.json.meta
        │   │   │   │   │   │   ├── lottiefiles_sticker_2.json
        │   │   │   │   │   │   ├── lottiefiles_sticker_2.json.meta
        │   │   │   │   │   │   ├── lottiefiles_sticker_5.json
        │   │   │   │   │   │   ├── lottiefiles_sticker_5.json.meta
        │   │   │   │   │   │   ├── marketing.json
        │   │   │   │   │   │   ├── marketing.json.meta
        │   │   │   │   │   │   ├── motorcycle.json
        │   │   │   │   │   │   ├── motorcycle.json.meta
        │   │   │   │   │   │   ├── phone.json
        │   │   │   │   │   │   ├── phone.json.meta
        │   │   │   │   │   │   ├── power_sticker.json
        │   │   │   │   │   │   ├── power_sticker.json.meta
        │   │   │   │   │   │   ├── preloader.json
        │   │   │   │   │   │   ├── preloader.json.meta
        │   │   │   │   │   │   ├── squid_game/
        │   │   │   │   │   │   │   ├── 0.json
        │   │   │   │   │   │   │   ├── 0.json.meta
        │   │   │   │   │   │   │   ├── 1.json
        │   │   │   │   │   │   │   ├── 1.json.meta
        │   │   │   │   │   │   │   ├── 10.json
        │   │   │   │   │   │   │   ├── 10.json.meta
        │   │   │   │   │   │   │   ├── 11.json
        │   │   │   │   │   │   │   ├── 11.json.meta
        │   │   │   │   │   │   │   ├── 12.json
        │   │   │   │   │   │   │   ├── 12.json.meta
        │   │   │   │   │   │   │   ├── 13.json
        │   │   │   │   │   │   │   ├── 13.json.meta
        │   │   │   │   │   │   │   ├── 14.json
        │   │   │   │   │   │   │   ├── 14.json.meta
        │   │   │   │   │   │   │   ├── 15.json
        │   │   │   │   │   │   │   ├── 15.json.meta
        │   │   │   │   │   │   │   ├── 16.json
        │   │   │   │   │   │   │   ├── 16.json.meta
        │   │   │   │   │   │   │   ├── 17.json
        │   │   │   │   │   │   │   ├── 17.json.meta
        │   │   │   │   │   │   │   ├── 18.json
        │   │   │   │   │   │   │   ├── 18.json.meta
        │   │   │   │   │   │   │   ├── 19.json
        │   │   │   │   │   │   │   ├── 19.json.meta
        │   │   │   │   │   │   │   ├── 2.json
        │   │   │   │   │   │   │   ├── 2.json.meta
        │   │   │   │   │   │   │   ├── 20.json
        │   │   │   │   │   │   │   ├── 20.json.meta
        │   │   │   │   │   │   │   ├── 21.json
        │   │   │   │   │   │   │   ├── 21.json.meta
        │   │   │   │   │   │   │   ├── 22.json
        │   │   │   │   │   │   │   ├── 22.json.meta
        │   │   │   │   │   │   │   ├── 23.json
        │   │   │   │   │   │   │   ├── 23.json.meta
        │   │   │   │   │   │   │   ├── 24.json
        │   │   │   │   │   │   │   ├── 24.json.meta
        │   │   │   │   │   │   │   ├── 3.json
        │   │   │   │   │   │   │   ├── 3.json.meta
        │   │   │   │   │   │   │   ├── 4.json
        │   │   │   │   │   │   │   ├── 4.json.meta
        │   │   │   │   │   │   │   ├── 5.json
        │   │   │   │   │   │   │   ├── 5.json.meta
        │   │   │   │   │   │   │   ├── 6.json
        │   │   │   │   │   │   │   ├── 6.json.meta
        │   │   │   │   │   │   │   ├── 7.json
        │   │   │   │   │   │   │   ├── 7.json.meta
        │   │   │   │   │   │   │   ├── 8.json
        │   │   │   │   │   │   │   ├── 8.json.meta
        │   │   │   │   │   │   │   ├── 9.json
        │   │   │   │   │   │   │   └── 9.json.meta
        │   │   │   │   │   │   ├── squid_game.meta
        │   │   │   │   │   │   ├── sticker.json
        │   │   │   │   │   │   ├── sticker.json.meta
        │   │   │   │   │   │   ├── taking_the_duggy_out.json
        │   │   │   │   │   │   └── taking_the_duggy_out.json.meta
        │   │   │   │   │   └── LottieSamples.meta
        │   │   │   │   └── StreamingAssets.meta
        │   │   │   └── SceneUI.meta
        │   │   ├── Tests/
        │   │   │   ├── Audio/
        │   │   │   │   ├── pause.mp3.meta
        │   │   │   │   ├── start.mp3.meta
        │   │   │   │   └── stop.mp3.meta
        │   │   │   ├── Audio.meta
        │   │   │   ├── Resources/
        │   │   │   │   ├── body_movin.json
        │   │   │   │   ├── body_movin.json.meta
        │   │   │   │   ├── video_player_icon.json
        │   │   │   │   └── video_player_icon.json.meta
        │   │   │   ├── Resources.meta
        │   │   │   ├── Runtime/
        │   │   │   │   ├── LottiePlugin.Tests.Runtime.asmdef
        │   │   │   │   ├── LottiePlugin.Tests.Runtime.asmdef.meta
        │   │   │   │   ├── src/
        │   │   │   │   │   ├── AnimatedImageTests.cs
        │   │   │   │   │   └── AnimatedImageTests.cs.meta
        │   │   │   │   └── src.meta
        │   │   │   └── Runtime.meta
        │   │   ├── Tests.meta
        │   │   ├── package.json
        │   │   └── package.json.meta
        │   ├── LottiePlugin.meta
        │   ├── Scenes/
        │   │   ├── Main.unity
        │   │   └── Main.unity.meta
        │   ├── Scenes.meta
        │   ├── StreamingAssets/
        │   │   ├── LottieSamples/
        │   │   │   ├── alright_sticker.json
        │   │   │   ├── alright_sticker.json.meta
        │   │   │   ├── black_friday_animation.json
        │   │   │   ├── black_friday_animation.json.meta
        │   │   │   ├── body_movin.json
        │   │   │   ├── body_movin.json.meta
        │   │   │   ├── butterfly_loading.json
        │   │   │   ├── butterfly_loading.json.meta
        │   │   │   ├── check_animation.json
        │   │   │   ├── check_animation.json.meta
        │   │   │   ├── concept_floral_branch_butterfly_and_tree.json
        │   │   │   ├── concept_floral_branch_butterfly_and_tree.json.meta
        │   │   │   ├── confetti.json
        │   │   │   ├── confetti.json.meta
        │   │   │   ├── favourite_app_icon.json
        │   │   │   ├── favourite_app_icon.json.meta
        │   │   │   ├── glow_loading.json
        │   │   │   ├── glow_loading.json.meta
        │   │   │   ├── hamburger_arrow_transition.json
        │   │   │   ├── hamburger_arrow_transition.json.meta
        │   │   │   ├── hubit.json
        │   │   │   ├── hubit.json.meta
        │   │   │   ├── lottiefiles_sticker_2.json
        │   │   │   ├── lottiefiles_sticker_2.json.meta
        │   │   │   ├── lottiefiles_sticker_5.json
        │   │   │   ├── lottiefiles_sticker_5.json.meta
        │   │   │   ├── marketing.json
        │   │   │   ├── marketing.json.meta
        │   │   │   ├── motorcycle.json
        │   │   │   ├── motorcycle.json.meta
        │   │   │   ├── phone.json
        │   │   │   ├── phone.json.meta
        │   │   │   ├── power_sticker.json
        │   │   │   ├── power_sticker.json.meta
        │   │   │   ├── preloader.json
        │   │   │   ├── preloader.json.meta
        │   │   │   ├── squid_game/
        │   │   │   │   ├── 0.json
        │   │   │   │   ├── 0.json.meta
        │   │   │   │   ├── 1.json
        │   │   │   │   ├── 1.json.meta
        │   │   │   │   ├── 10.json
        │   │   │   │   ├── 10.json.meta
        │   │   │   │   ├── 11.json
        │   │   │   │   ├── 11.json.meta
        │   │   │   │   ├── 12.json
        │   │   │   │   ├── 12.json.meta
        │   │   │   │   ├── 13.json
        │   │   │   │   ├── 13.json.meta
        │   │   │   │   ├── 14.json
        │   │   │   │   ├── 14.json.meta
        │   │   │   │   ├── 15.json
        │   │   │   │   ├── 15.json.meta
        │   │   │   │   ├── 16.json
        │   │   │   │   ├── 16.json.meta
        │   │   │   │   ├── 17.json
        │   │   │   │   ├── 17.json.meta
        │   │   │   │   ├── 18.json
        │   │   │   │   ├── 18.json.meta
        │   │   │   │   ├── 19.json
        │   │   │   │   ├── 19.json.meta
        │   │   │   │   ├── 2.json
        │   │   │   │   ├── 2.json.meta
        │   │   │   │   ├── 20.json
        │   │   │   │   ├── 20.json.meta
        │   │   │   │   ├── 21.json
        │   │   │   │   ├── 21.json.meta
        │   │   │   │   ├── 22.json
        │   │   │   │   ├── 22.json.meta
        │   │   │   │   ├── 23.json
        │   │   │   │   ├── 23.json.meta
        │   │   │   │   ├── 24.json
        │   │   │   │   ├── 24.json.meta
        │   │   │   │   ├── 3.json
        │   │   │   │   ├── 3.json.meta
        │   │   │   │   ├── 4.json
        │   │   │   │   ├── 4.json.meta
        │   │   │   │   ├── 5.json
        │   │   │   │   ├── 5.json.meta
        │   │   │   │   ├── 6.json
        │   │   │   │   ├── 6.json.meta
        │   │   │   │   ├── 7.json
        │   │   │   │   ├── 7.json.meta
        │   │   │   │   ├── 8.json
        │   │   │   │   ├── 8.json.meta
        │   │   │   │   ├── 9.json
        │   │   │   │   └── 9.json.meta
        │   │   │   ├── squid_game.meta
        │   │   │   ├── sticker.json
        │   │   │   ├── sticker.json.meta
        │   │   │   ├── taking_the_duggy_out.json
        │   │   │   └── taking_the_duggy_out.json.meta
        │   │   └── LottieSamples.meta
        │   ├── StreamingAssets.meta
        │   ├── TextMesh Pro/
        │   │   ├── Documentation/
        │   │   │   └── TextMesh Pro User Guide 2016.pdf.meta
        │   │   ├── Documentation.meta
        │   │   ├── Fonts/
        │   │   │   ├── LiberationSans - OFL.txt
        │   │   │   ├── LiberationSans - OFL.txt.meta
        │   │   │   └── LiberationSans.ttf.meta
        │   │   ├── Fonts.meta
        │   │   ├── Resources/
        │   │   │   ├── Fonts & Materials/
        │   │   │   │   ├── LiberationSans SDF - Drop Shadow.mat
        │   │   │   │   ├── LiberationSans SDF - Drop Shadow.mat.meta
        │   │   │   │   ├── LiberationSans SDF - Fallback.asset
        │   │   │   │   ├── LiberationSans SDF - Fallback.asset.meta
        │   │   │   │   ├── LiberationSans SDF - Outline.mat
        │   │   │   │   ├── LiberationSans SDF - Outline.mat.meta
        │   │   │   │   ├── LiberationSans SDF.asset
        │   │   │   │   └── LiberationSans SDF.asset.meta
        │   │   │   ├── Fonts & Materials.meta
        │   │   │   ├── LineBreaking Following Characters.txt
        │   │   │   ├── LineBreaking Following Characters.txt.meta
        │   │   │   ├── LineBreaking Leading Characters.txt
        │   │   │   ├── LineBreaking Leading Characters.txt.meta
        │   │   │   ├── Sprite Assets/
        │   │   │   │   ├── EmojiOne.asset
        │   │   │   │   └── EmojiOne.asset.meta
        │   │   │   ├── Sprite Assets.meta
        │   │   │   ├── Style Sheets/
        │   │   │   │   ├── Default Style Sheet.asset
        │   │   │   │   └── Default Style Sheet.asset.meta
        │   │   │   ├── Style Sheets.meta
        │   │   │   ├── TMP Settings.asset
        │   │   │   └── TMP Settings.asset.meta
        │   │   ├── Resources.meta
        │   │   ├── Shaders/
        │   │   │   ├── TMP_Bitmap-Custom-Atlas.shader
        │   │   │   ├── TMP_Bitmap-Custom-Atlas.shader.meta
        │   │   │   ├── TMP_Bitmap-Mobile.shader
        │   │   │   ├── TMP_Bitmap-Mobile.shader.meta
        │   │   │   ├── TMP_Bitmap.shader
        │   │   │   ├── TMP_Bitmap.shader.meta
        │   │   │   ├── TMP_SDF Overlay.shader
        │   │   │   ├── TMP_SDF Overlay.shader.meta
        │   │   │   ├── TMP_SDF SSD.shader
        │   │   │   ├── TMP_SDF SSD.shader.meta
        │   │   │   ├── TMP_SDF-Mobile Masking.shader
        │   │   │   ├── TMP_SDF-Mobile Masking.shader.meta
        │   │   │   ├── TMP_SDF-Mobile Overlay.shader
        │   │   │   ├── TMP_SDF-Mobile Overlay.shader.meta
        │   │   │   ├── TMP_SDF-Mobile SSD.shader
        │   │   │   ├── TMP_SDF-Mobile SSD.shader.meta
        │   │   │   ├── TMP_SDF-Mobile.shader
        │   │   │   ├── TMP_SDF-Mobile.shader.meta
        │   │   │   ├── TMP_SDF-Surface-Mobile.shader
        │   │   │   ├── TMP_SDF-Surface-Mobile.shader.meta
        │   │   │   ├── TMP_SDF-Surface.shader
        │   │   │   ├── TMP_SDF-Surface.shader.meta
        │   │   │   ├── TMP_SDF.shader
        │   │   │   ├── TMP_SDF.shader.meta
        │   │   │   ├── TMP_Sprite.shader
        │   │   │   ├── TMP_Sprite.shader.meta
        │   │   │   ├── TMPro.cginc
        │   │   │   ├── TMPro.cginc.meta
        │   │   │   ├── TMPro_Mobile.cginc
        │   │   │   ├── TMPro_Mobile.cginc.meta
        │   │   │   ├── TMPro_Properties.cginc
        │   │   │   ├── TMPro_Properties.cginc.meta
        │   │   │   ├── TMPro_Surface.cginc
        │   │   │   └── TMPro_Surface.cginc.meta
        │   │   ├── Shaders.meta
        │   │   ├── Sprites/
        │   │   │   ├── EmojiOne Attribution.txt
        │   │   │   ├── EmojiOne Attribution.txt.meta
        │   │   │   ├── EmojiOne.json
        │   │   │   ├── EmojiOne.json.meta
        │   │   │   └── EmojiOne.png.meta
        │   │   └── Sprites.meta
        │   └── TextMesh Pro.meta
        ├── Packages/
        │   ├── manifest.json
        │   └── packages-lock.json
        ├── ProjectSettings/
        │   ├── AudioManager.asset
        │   ├── ClusterInputManager.asset
        │   ├── DynamicsManager.asset
        │   ├── EditorBuildSettings.asset
        │   ├── EditorSettings.asset
        │   ├── GraphicsSettings.asset
        │   ├── InputManager.asset
        │   ├── MemorySettings.asset
        │   ├── NavMeshAreas.asset
        │   ├── PackageManagerSettings.asset
        │   ├── Physics2DSettings.asset
        │   ├── PresetManager.asset
        │   ├── ProjectSettings.asset
        │   ├── ProjectVersion.txt
        │   ├── QualitySettings.asset
        │   ├── TagManager.asset
        │   ├── TimeManager.asset
        │   ├── UnityConnectSettings.asset
        │   ├── VFXManager.asset
        │   ├── VersionControlSettings.asset
        │   └── XRSettings.asset
        └── UserSettings/
            ├── AndroidLogcatSettings.asset
            ├── EditorUserSettings.asset
            ├── Search.index
            └── Search.settings

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
# https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference?view=vs-2017

# top-most EditorConfig file
root = true

[*.cs]
indent_style = space
indent_size = 4
charset = utf-8

end_of_line  = lf
insert_final_newline = true

#  <<< ---------- Naming conventions ---------- >>>
# The following items need pascal case
dotnet_naming_symbols.pascal_case_items.applicable_kinds = namespace,class,struct,interface,enum,property,method,event,delegate,local_function
dotnet_naming_rule.must_be_pascal_case.symbols   = pascal_case_items
dotnet_naming_rule.must_be_pascal_case.style    = pascal_case_style
dotnet_naming_rule.must_be_pascal_case.severity = warning
dotnet_naming_style.pascal_case_style.capitalization = pascal_case

# Fields use camel case and begin with underscore, but not const and static
dotnet_naming_symbols.all_fields.applicable_kinds = field
dotnet_naming_symbols.all_fields.required_modifiers = *
dotnet_naming_rule.must_be_camel_case_with_underscore.symbols   = all_fields
dotnet_naming_rule.must_be_camel_case_with_underscore.style    = camel_case_style_with_underscore
dotnet_naming_rule.must_be_camel_case_with_underscore.severity = warning
dotnet_naming_style.camel_case_style_with_underscore.capitalization = camel_case
dotnet_naming_style.camel_case_style_with_underscore.required_prefix = _

# Const fields use upper case and underscore for words separation
dotnet_naming_symbols.all_const_fields.applicable_kinds = field
dotnet_naming_symbols.all_const_fields.required_modifiers = const
dotnet_naming_rule.must_be_upper_case.symbols   = all_const_fields
dotnet_naming_rule.must_be_upper_case.style    = upper_case_style
dotnet_naming_rule.must_be_upper_case.severity = warning
dotnet_naming_style.upper_case_style.capitalization = all_upper
dotnet_naming_style.upper_case_style.word_separator = _

# Static fields use camel case and 's' at the begin
dotnet_naming_symbols.all_static_fields.applicable_kinds = field
dotnet_naming_symbols.all_static_fields.required_modifiers = static
dotnet_naming_rule.must_be_pascal_case_with_s.symbols   = all_static_fields
dotnet_naming_rule.must_be_pascal_case_with_s.style    = pascal_case_with_s
dotnet_naming_rule.must_be_pascal_case_with_s.severity = warning
dotnet_naming_style.pascal_case_with_s.capitalization = pascal_case
dotnet_naming_style.pascal_case_with_s.required_prefix = s

# Readonly fields use camel case and 'm' at the begin
dotnet_naming_symbols.all_readonly_fields.applicable_kinds = field
dotnet_naming_symbols.all_readonly_fields.required_modifiers = readonly
dotnet_naming_rule.must_be_pascal_case_with_m.symbols   = all_readonly_fields
dotnet_naming_rule.must_be_pascal_case_with_m.style    = pascal_case_with_m
dotnet_naming_rule.must_be_pascal_case_with_m.severity = warning
dotnet_naming_style.pascal_case_with_m.capitalization = pascal_case
dotnet_naming_style.pascal_case_with_m.required_prefix = m

# Parameters use camel case
dotnet_naming_symbols.all_parameters.applicable_kinds = parameter
dotnet_naming_rule.parameters_must_be_camel_case.symbols   = all_parameters
dotnet_naming_rule.parameters_must_be_camel_case.style    = camel_case_style
dotnet_naming_rule.parameters_must_be_camel_case.severity = warning
dotnet_naming_style.camel_case_style.capitalization = camel_case

# Locals use camel case
dotnet_naming_symbols.all_locals.applicable_kinds = local
dotnet_naming_symbols.all_locals.required_modifiers = *
dotnet_naming_rule.locals_must_be_camel_case.symbols   = all_locals
dotnet_naming_rule.locals_must_be_camel_case.style    = camel_case_style
dotnet_naming_rule.locals_must_be_camel_case.severity = warning

# Const locals use upper case and underscore for words separation
dotnet_naming_symbols.all_const_locals.applicable_kinds = local
dotnet_naming_symbols.all_const_locals.required_modifiers = const
dotnet_naming_rule.const_local_must_be_upper_case.symbols   = all_const_locals
dotnet_naming_rule.const_local_must_be_upper_case.style    = upper_case_style
dotnet_naming_rule.const_local_must_be_upper_case.severity = warning

# Type parameters begin with T and use pascal case
dotnet_naming_symbols.all_type_parameters.applicable_kinds = type_parameter
dotnet_naming_rule.must_be_pascal_case_with_T.symbols   = all_type_parameters
dotnet_naming_rule.must_be_pascal_case_with_T.style    = pascal_case_with_T
dotnet_naming_rule.must_be_pascal_case_with_T.severity = warning
dotnet_naming_style.pascal_case_with_T.capitalization = pascal_case
dotnet_naming_style.pascal_case_with_T.required_prefix = T

#  >>> ---------- Naming conventions ---------- <<<
#  <<< ---------- Formatting conventions ---------- >>>
# Organize usings
dotnet_sort_system_directives_first = true
# Newline options
csharp_new_line_before_open_brace = types,control_blocks,local_functions,methods,accessors,properties
csharp_new_line_before_else = true
csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
csharp_new_line_between_query_expression_clauses = true
#Indentation options
csharp_indent_case_contents = true
csharp_indent_switch_labels = true
csharp_indent_labels = flush_left
# Spacing options
csharp_space_after_cast = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_parentheses = false
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_around_binary_operators = before_and_after
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
# Wrapping options
csharp_preserve_single_line_statements = false
csharp_preserve_single_line_blocks = true
#  >>> ---------- Formatting conventions ---------- <<<

#  <<< ---------- C# code style settings ---------- >>>
# Implicit and explicit types
csharp_style_var_for_built_in_types = false:warning
csharp_style_var_when_type_is_apparent = false:suggestion
csharp_style_var_elsewhere = false:suggestion
# Expression-bodied members
csharp_style_expression_bodied_methods = true:suggestion
csharp_style_expression_bodied_constructors = true:suggestion
csharp_style_expression_bodied_operators = true:suggestion
csharp_style_expression_bodied_properties = true:suggestion
csharp_style_expression_bodied_indexers = true:suggestion
csharp_style_expression_bodied_accessors = true:suggestion
# Pattern matching
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
# Inlined variable declarations
csharp_style_inlined_variable_declaration = true:warning
# Expression-level preferences
csharp_prefer_simple_default_expression = true:suggestion
csharp_style_deconstructed_variable_declaration = false:suggestion
csharp_style_pattern_local_over_anonymous_function = true:suggestion
# "Null" checking preferences
csharp_style_throw_expression = true:suggestion
csharp_style_conditional_delegate_call = true:warning
# Code block preferences
csharp_prefer_braces = true:warning
#  >>> ---------- C# code style settings ---------- <<<

# Null-checking preferences
dotnet_style_coalesce_expression = true:warning
dotnet_style_null_propagation = true:warning
# Expression-level preferences
dotnet_style_object_initializer = true:warning
dotnet_style_collection_initializer = true:warning
dotnet_style_explicit_tuple_names = true:suggestion
dotnet_style_prefer_inferred_tuple_names = true:suggestion
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
dotnet_style_prefer_auto_properties = true:warning
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
dotnet_style_prefer_conditional_expression_over_assignment = true:warning
dotnet_style_prefer_conditional_expression_over_return = true:warning
# Parentheses preferences
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:warning
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:warning
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:warning
dotnet_style_parentheses_in_other_operators =never_if_unnecessary:none
# Modifier preferences
dotnet_style_require_accessibility_modifiers = always:warning
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:warning
dotnet_style_readonly_field = true:suggestion
# Language keywords instead of framework type names for type references
dotnet_style_predefined_type_for_locals_parameters_members = true:warning
dotnet_style_predefined_type_for_member_access = true:warning
# "This." and "Me." qualifiers
dotnet_style_qualification_for_field = false:warning
dotnet_style_qualification_for_property = false:warning
dotnet_style_qualification_for_method = false:warning
dotnet_style_qualification_for_event = false:warning


================================================
FILE: .gitattributes
================================================
# Sources
*.c     text diff=c
*.cc    text diff=cpp
*.cxx   text diff=cpp
*.cpp   text diff=cpp
*.c++   text diff=cpp
*.hpp   text diff=cpp
*.h     text diff=c
*.h++   text diff=cpp
*.hh    text diff=cpp

# Compiled Object files
*.slo   binary
*.lo    binary
*.o     binary
*.obj   binary

# Precompiled Headers
*.gch   binary
*.pch   binary

# Compiled Dynamic libraries
*.so    binary
*.dylib binary
*.dll   binary

# Compiled Static libraries
*.lai   binary
*.la    binary
*.a     binary
*.lib   binary

# Executables
*.exe   binary
*.out   binary
*.app   binary

================================================
FILE: .github/workflows/activation.yaml
================================================
name: Acquire activation file
on:
  workflow_dispatch: {}
jobs:
  activation:
    name: Request manual activation file 🔑
    runs-on: ubuntu-latest
    steps:
      # Request manual activation file
      - name: Request manual activation file
        id: getManualLicenseFile
        uses: game-ci/unity-request-activation-file@v2
      # Upload artifact (Unity_v20XX.X.XXXX.alf)
      - name: Expose as artifact
        uses: actions/upload-artifact@v4
        with:
          name: ${{ steps.getManualLicenseFile.outputs.filePath }}
          path: ${{ steps.getManualLicenseFile.outputs.filePath }}


================================================
FILE: .github/workflows/build_native_libraries.yaml
================================================
name: Build and Test

on:
  push:
    branches:
      - dev
      - codex/remove-texture.apply-and-move-updates-to-native
    paths:
      - 'dependency/**'
      - 'projects/**'
      - 'src/**'
  pull_request:
    branches:
      - dev
      - codex/remove-texture.apply-and-move-updates-to-native
    paths:
      - 'dependency/**'
      - 'projects/**'
      - 'src/**'
jobs:
  build_windows:
    runs-on: windows-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          submodules: recursive

      - name: Build
        run: |
          cd projects/CMake
          cmake -S . -B ./build_x86    -A Win32 -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_STANDARD_REQUIRED=ON
          cmake -S . -B ./build_x86_64 -A x64   -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_STANDARD_REQUIRED=ON
          cmake --build ./build_x86 --config Release
          cmake --build ./build_x86_64 --config Release

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: LottiePluginWindowsArtifacts
          path: |
            out/Release/Plugins/Windows/x86/LottiePlugin.dll
            out/Release/Plugins/Windows/x86_64/LottiePlugin.dll

  build_android:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          submodules: recursive

      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'adopt'

      - name: Setup CMake
        uses: jwlawson/actions-setup-cmake@v1.14
        with:
          cmake-version: '3.25.2'

      - name: Set execution permissions for gradlew
        run: chmod +x projects/AndroidStudio/gradlew

      - name: Build Gradle project
        run: |
          echo $ANDROID_NDK_HOME
          result=$(find $ANDROID_NDK_HOME -name aarch64-linux-android-strip)
          echo $result
          cd projects/AndroidStudio
          ./gradlew -PANDROID_16K_PAGE=ON assembleRelease
          tree ../../out

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: LottiePluginAndroidArtifacts
          path: |
            out/RelWithDebInfo/Plugins/Android/arm64-v8a/libLottiePlugin.so
            out/RelWithDebInfo/Plugins/Android/armeabi-v7a/libLottiePlugin.so
            out/RelWithDebInfo/Plugins/Android/x86/libLottiePlugin.so
            out/RelWithDebInfo/Plugins/Android/x86_64/libLottiePlugin.so

  build_macos:
    runs-on: macos-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          submodules: recursive

      - name: Setup CMake
        uses: jwlawson/actions-setup-cmake@v1.14
        with:
          cmake-version: '3.29.6'

      - name: Build
        shell: bash
        run: |
          set -euxo pipefail
          cd projects/CMake

          # 1) Build universal (optional, kept because it’s already there)
          cmake -S . -B ./buildOSX -G Xcode -DRLOTTIE_OSX=1 -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64"
          cmake --build ./buildOSX --config Release 

          # 2) Build arm64 only
          cmake -S . -B ./buildOSX_arm64 -G Xcode -DRLOTTIE_OSX=1 -DCMAKE_OSX_ARCHITECTURES=arm64
          cmake --build ./buildOSX_arm64 --config Release

          # 3) Build x86_64 only
          cmake -S . -B ./buildOSX_x86_64 -G Xcode -DRLOTTIE_OSX=1 -DCMAKE_OSX_ARCHITECTURES=x86_64
          cmake --build ./buildOSX_x86_64 --config Release

          # 4) Find actual outputs produced by Xcode/CMake
          ARM64_DYLIB="$(find ./buildOSX_arm64 -type f -name libLottiePlugin.dylib | head -n1)"
          X64_DYLIB="$(find ./buildOSX_x86_64 -type f -name libLottiePlugin.dylib | head -n1)"
          ARM64_RLOTTIE="$(find ./buildOSX_arm64 -type f -name librlottie.a | head -n1)"
          X64_RLOTTIE="$(find ./buildOSX_x86_64 -type f -name librlottie.a | head -n1)"

          # 5) Prepare the expected out/ layout
          mkdir -p ../../out/Release/Plugins/Darwin/arm64
          mkdir -p ../../out/Release/Plugins/Darwin/x86_64

          # 6) Copy thin libs into arch-specific folders for inspection
          cp "$ARM64_DYLIB"    ../../out/Release/Plugins/Darwin/arm64/
          cp "$X64_DYLIB"      ../../out/Release/Plugins/Darwin/x86_64/
          cp "$ARM64_RLOTTIE"  ../../out/Release/Plugins/Darwin/arm64/ || true
          cp "$X64_RLOTTIE"    ../../out/Release/Plugins/Darwin/x86_64/ || true

          # 7) Create universal binaries into Darwin/ (no arch subfolder)
          lipo -create "$ARM64_DYLIB" "$X64_DYLIB" -output ../../out/Release/Plugins/Darwin/libLottiePlugin.dylib

          # librlottie is a static lib — lipo can merge it too if both variants exist
          if [[ -f "$ARM64_RLOTTIE" && -f "$X64_RLOTTIE" ]]; then
            lipo -create "$ARM64_RLOTTIE" "$X64_RLOTTIE" -output ../../out/Release/Plugins/Darwin/librlottie.a
          fi

          # 8) (Optional) show tree for debugging
          brew install tree
          tree ../../out

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: LottiePluginMacOSArtifacts
          path: |
            out/Release/Plugins/Darwin/arm64/libLottiePlugin.dylib
            out/Release/Plugins/Darwin/x86_64/libLottiePlugin.dylib
            out/Release/Plugins/Darwin/libLottiePlugin.dylib
            out/Release/Plugins/Darwin/librlottie.a
          if-no-files-found: error

  build_ios:
    runs-on: macos-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          submodules: recursive

      - name: Setup CMake
        uses: jwlawson/actions-setup-cmake@v1.14
        with:
          cmake-version: '3.29.6'

      - name: Build
        run: |
          cd projects/CMake
          cmake -S . -B ./buildIOS -G Xcode -DCMAKE_TOOLCHAIN_FILE=../../dependency/cmake-ios-toolchain/ios.toolchain.cmake -DPLATFORM=OS64 -DRLOTTIE_IOS=1
          cmake --build ./buildIOS --config Release --target LottiePlugin
          brew install tree
          tree ../../out

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: LottiePluginIOSArtifacts
          path: |
            out/Release/Plugins/iOS/aarch64/libLottiePlugin.a
            out/Release/Plugins/iOS/aarch64/librlottie.a

  build_ios_simulator_x64:
    runs-on: macos-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          submodules: recursive

      - name: Setup CMake
        uses: jwlawson/actions-setup-cmake@v1.14
        with:
          cmake-version: '3.29.6'

      - name: Build (iOS Simulator x86_64)
        shell: bash
        run: |
          set -euxo pipefail
          cd projects/CMake
          # Build iOS SIMULATOR (x86_64) using the ios-cmake toolchain
          cmake -S . -B ./buildIOSSim_x64 \
            -G Xcode \
            -DCMAKE_TOOLCHAIN_FILE=../../dependency/cmake-ios-toolchain/ios.toolchain.cmake \
            -DPLATFORM=SIMULATOR64 \
            -DARCHS=x86_64 \
            -DRLOTTIE_IOS=1
          cmake --build ./buildIOSSim_x64 --config Release --target LottiePlugin
          brew install tree
          tree ../../out || true

      - name: Upload artifacts (iOS Simulator x86_64)
        uses: actions/upload-artifact@v4
        with:
          name: LottiePluginIOSSimulatorX64Artifacts
          path: |
            out/Release/Plugins/iOS/x86_64/libLottiePlugin.a
            out/Release/Plugins/iOS/x86_64/librlottie.a
          if-no-files-found: error

  build_linux:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          submodules: recursive

      - name: Install CMake
        run: sudo apt-get install cmake

      - name: Build
        run: |
          cd projects/CMake
          cmake -S . -B ./buildLinux -G "Unix Makefiles" -DRLOTTIE_LINUX=1
          cmake --build ./buildLinux --config Release
          tree ../../out

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: LottiePluginLinuxArtifacts
          path: |
            out/Plugins/Linux/x86_64/libLottiePlugin.so

  build_webgl:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          submodules: recursive

      - name: Disable rlottie examples
        run: |
          sed -i '/add_subdirectory[[:space:]]*(example)/d' dependency/rlottie/CMakeLists.txt

      - name: Install Emscripten 3.1.39
        run: |
          git clone https://github.com/emscripten-core/emsdk.git
          cd emsdk
          ./emsdk install 3.1.39
          ./emsdk activate 3.1.39
          source ./emsdk_env.sh
          emcc -v || true

      - name: Build WebGL static libs (.a)
        run: |
          source emsdk/emsdk_env.sh
          cd projects/CMake
          emcmake cmake -S . -B ./buildWebGL \
            -DRLOTTIE_WEB_ASSEMBLY=1 \
            -DLOTTIE_MODULE=OFF \
            -DBUILD_SHARED_LIBS=OFF \
            -DCMAKE_BUILD_TYPE=Release \
            -DBUILD_TESTING=OFF
          cmake --build ./buildWebGL --config Release
          cd ../..
          ls -al out/Plugins/WebGL || true
          # sanity: list objects inside the archives
          emar t out/Plugins/WebGL/libLottiePlugin.a || true
          emar t out/Plugins/WebGL/librlottie.a || true

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: LottiePluginWebGLArtifacts
          path: |
            out/Plugins/WebGL/libLottiePlugin.a
            out/Plugins/WebGL/librlottie.a

  # run_tests_and_build_unity_ubuntulatest:
  #   needs: [build_windows, build_android, build_macos, build_ios, build_linux, build_webgl]
  #   runs-on: ubuntu-latest
  #   steps:
  #     - name: Checkout code
  #       uses: actions/checkout@v4
  #       with:
  #         submodules: recursive

  #     - name: Download artifacts
  #       uses: actions/download-artifact@v4
  #       with:
  #         name: LottiePluginLinuxArtifacts
  #         path: out/Plugins/Linux
          
  #     - name: Force replace the native libraries
  #       run: |
  #         tree out
  #         cp -f out/Plugins/Linux/libLottiePlugin.so unity/RLottieUnity/Assets/LottiePlugin/Plugins/Linux/x86_64/libLottiePlugin.so
  #         tree unity/RLottieUnity/Assets/LottiePlugin/Plugins/Linux

  #     - name: Run Tests in Unity
  #       uses: game-ci/unity-test-runner@v3
  #       env:
  #         UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
  #       with:
  #         projectPath: unity/RLottieUnity
  #         githubToken: ${{ secrets.GITHUB_TOKEN }}
  #         customParameters: -logFile -

  # run_tests_and_build_unity_windows:
  #   needs: [build_windows, build_android, build_macos, build_ios, build_linux, build_webgl]
  #   runs-on: windows-latest
  #   steps:
  #     - name: Checkout code
  #       uses: actions/checkout@v4
  #       with:
  #         submodules: recursive

  #     - name: Download artifacts
  #       uses: actions/download-artifact@v4
  #       with:
  #         name: LottiePluginWindowsArtifacts
  #         path: out/Plugins/Windows

  #     - name: Force replace the native libraries
  #       run: |
  #         Copy-Item -Force out/Plugins/Windows/x86/LottiePlugin.dll -Destination unity/RLottieUnity/Assets/LottiePlugin/Plugins/Windows/x86/LottiePlugin.dll
  #         Copy-Item -Force out/Plugins/Windows/x86_64/LottiePlugin.dll -Destination unity/RLottieUnity/Assets/LottiePlugin/Plugins/Windows/x86_64/LottiePlugin.dll

  #     - name: Run Tests in Unity
  #       uses: game-ci/unity-test-runner@v4
  #       env:
  #         UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
  #       with:
  #         projectPath: unity/RLottieUnity
  #         githubToken: ${{ secrets.GITHUB_TOKEN }}
  #         customParameters: -logFile -
            
  commit_and_push_native_libraries:
    needs: [build_windows, build_android, build_macos, build_ios, build_linux, build_webgl, build_ios_simulator_x64]
    runs-on: ubuntu-latest
    if: >
      github.event_name == 'push' ||
      (github.event_name == 'pull_request' &&
      github.event.pull_request.head.repo.full_name == github.repository)
    concurrency:
      group: ${{ github.workflow }}-${{ github.ref }}
      cancel-in-progress: true
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          repository: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name || github.repository }}
          ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || github.ref_name }}
          submodules: recursive
          fetch-depth: 0
          token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}

      - name: Download artifacts windows
        uses: actions/download-artifact@v4
        with:
          name: LottiePluginWindowsArtifacts
          path: out/Plugins/Windows

      - name: Download artifacts android
        uses: actions/download-artifact@v4
        with:
          name: LottiePluginAndroidArtifacts
          path: out/Plugins/Android

      - name: Download artifacts macos
        uses: actions/download-artifact@v4
        with:
          name: LottiePluginMacOSArtifacts
          path: out/Plugins/Darwin

      - name: Download artifacts ios
        uses: actions/download-artifact@v4
        with:
          name: LottiePluginIOSArtifacts
          path: out/Plugins/iOS/aarch64

      - name: Download artifacts ios-simulator-x64
        uses: actions/download-artifact@v4
        with:
          name: LottiePluginIOSSimulatorX64Artifacts
          path: out/Plugins/iOS/x86_64

      - name: Download artifacts linux
        uses: actions/download-artifact@v4
        with:
          name: LottiePluginLinuxArtifacts
          path: out/Plugins/Linux

      - name: Download artifacts webgl
        uses: actions/download-artifact@v4
        with:
          name: LottiePluginWebGLArtifacts
          path: out/Plugins/WebGL

      - name: Commit and push native libraries
        env:
          MY_SECRET: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
          TARGET_BRANCH: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref || (github.ref_name == 'dev' && 'development' || github.ref_name) }}
          TARGET_REPOSITORY: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name || github.repository }}
        run: |
          cp -f out/Plugins/Windows/x86/LottiePlugin.dll unity/RLottieUnity/Assets/LottiePlugin/Plugins/Windows/x86/LottiePlugin.dll
          cp -f out/Plugins/Windows/x86_64/LottiePlugin.dll unity/RLottieUnity/Assets/LottiePlugin/Plugins/Windows/x86_64/LottiePlugin.dll
          cp -f out/Plugins/Android/arm64-v8a/libLottiePlugin.so unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/arm64-v8a/libLottiePlugin.so
          cp -f out/Plugins/Android/armeabi-v7a/libLottiePlugin.so unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/armeabi-v7a/libLottiePlugin.so
          cp -f out/Plugins/Android/x86/libLottiePlugin.so unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/x86/libLottiePlugin.so
          cp -f out/Plugins/Android/x86_64/libLottiePlugin.so unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/x86_64/libLottiePlugin.so
          cp -f out/Plugins/Darwin/libLottiePlugin.dylib unity/RLottieUnity/Assets/LottiePlugin/Plugins/OSX/libLottiePlugin.dylib
          cp -f out/Plugins/iOS/aarch64/libLottiePlugin.a unity/RLottieUnity/Assets/LottiePlugin/Plugins/iOS/libLottiePlugin.a
          cp -f out/Plugins/iOS/aarch64/librlottie.a unity/RLottieUnity/Assets/LottiePlugin/Plugins/iOS/librlottie.a
          # iOS Simulator x86_64
          mkdir -p unity/RLottieUnity/Assets/LottiePlugin/Plugins/iOS/x86_64
          cp -f out/Plugins/iOS/x86_64/libLottiePlugin.a unity/RLottieUnity/Assets/LottiePlugin/Plugins/iOS/x86_64/libLottiePlugin.a
          cp -f out/Plugins/iOS/x86_64/librlottie.a     unity/RLottieUnity/Assets/LottiePlugin/Plugins/iOS/x86_64/librlottie.a
          cp -f out/Plugins/Linux/libLottiePlugin.so unity/RLottieUnity/Assets/LottiePlugin/Plugins/Linux/x86_64/libLottiePlugin.so
          mkdir -p unity/RLottieUnity/Assets/LottiePlugin/Plugins/WebGL
          cp -f out/Plugins/WebGL/libLottiePlugin.a unity/RLottieUnity/Assets/LottiePlugin/Plugins/WebGL/libLottiePlugin.a
          cp -f out/Plugins/WebGL/librlottie.a     unity/RLottieUnity/Assets/LottiePlugin/Plugins/WebGL/librlottie.a
          git add .
          git status
          git config --global user.email "konstantin.gindemit@gmail.com"
          git config --global user.name "Konstantin Gindemit"
          git remote -v
          git commit --allow-empty -m "[skip ci] New native libraries version: 0.5.0-dev.${{ github.run_number }}"
          git tag -a 0.5.0-dev.${{ github.run_number }} -m "[skip ci] New native libraries version: 0.5.0-dev.${{ github.run_number }}"
          git config -l | grep 'http\..*\.extraheader' | cut -d= -f1 | xargs -L1 git config --unset-all
          echo "Trying to push..."
          git remote set-url origin https://token:$MY_SECRET@github.com/${TARGET_REPOSITORY}.git
          echo "Pushing to ${TARGET_REPOSITORY}:${TARGET_BRANCH}"
          git push origin HEAD:${TARGET_BRANCH}
          git push origin --tags



================================================
FILE: .gitignore
================================================
.vs
.vscode
projects/CMake/build*
out/*
.DS_Store

================================================
FILE: .gitmodules
================================================
[submodule "dependency/rlottie"]
	path = dependency/rlottie
	url = git@github.com:gindemit/rlottie.git
	branch = unity-rlottie-win-fixes
[submodule "dependency/cmake-ios-toolchain"]
	path = dependency/cmake-ios-toolchain
	url = git@github.com:leetal/ios-cmake.git


================================================
FILE: AGENTS.md
================================================
# Unity RLottie Plugin

This repository hosts a Unity plugin that brings the [rlottie](https://github.com/Samsung/rlottie) animation library to the Unity ecosystem. The project builds native binaries for multiple platforms using CMake and provides C# scripts to integrate Lottie animations inside Unity games or applications.

## Repository layout

```
/ (root)
├── dependency/          # External dependencies as git submodules
│   ├── cmake-ios-toolchain/   # iOS toolchain for CMake (submodule)
│   ├── pixman/                # Assembly files required for rlottie on ARM
│   └── rlottie/               # rlottie library source (submodule)
├── projects/
│   ├── AndroidStudio/   # Android example project
│   └── CMake/           # CMake configuration to build the native plugin
├── src/                 # C++ implementation of the plugin interface
├── unity/
│   └── RLottieUnity/    # Unity package with assets, runtime and editor code
├── README.md            # Usage instructions
└── LICENSE              # MIT license information
```

### Native plugin
- **src/** contains three files that expose rlottie functions to Unity via a C style API.
- **projects/CMake/CMakeLists.txt** builds `LottiePlugin` along with the rlottie dependency for each target platform.
- The CMake script handles architecture specific flags (e.g. NEON assembly on Android) and copies the output into `out/Plugins` for Unity to consume.

### Unity package
- **unity/RLottieUnity/Assets** holds the Unity package contents.
  - `Runtime` contains C# wrappers around the native library (`LottieAnimation`, `NativeBridge`, etc.).
  - `Editor` includes custom inspector scripts.
  - `Samples~` provides sample scenes and prefabs demonstrating how to use the plugin.
- Prebuilt plugin binaries for platforms (Windows, Android, iOS, Linux, macOS, WebGL) reside under `Assets/LottiePlugin/Plugins`.

### Examples & Tools
- The Android Studio project under `projects/AndroidStudio` is a minimal Android application showcasing the plugin.
- Sample scenes in the Unity package (`Samples~/SceneUI`) show how to play Lottie JSON animations as `Texture2D`.

## Building
1. Initialise the git submodules to fetch rlottie and the iOS toolchain:
   ```bash
git submodule update --init --recursive
   ```
2. Use CMake from the `projects/CMake` directory to build the native library for your target platform. Generated binaries will appear in `out/Plugins/<Platform>/<arch>`.

## Usage in Unity
Import the Unity package found under `unity/RLottieUnity` into your project or reference it via Git using the path `unity/RLottieUnity/Assets/LottiePlugin`. The runtime scripts expose an `AnimatedImage` component that can play Lottie JSON files on UI `RawImage` elements.



================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2023 Gindemit Konstantin

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# Unity Lottie Animation Plugin
![GitHub release](https://img.shields.io/github/release/gindemit/unity-rlottie.svg)
![Unity version](https://img.shields.io/badge/unity-2019.4%2B-green.svg)
![License](https://img.shields.io/github/license/gindemit/unity-rlottie.svg)

> 🧪 **EXPERIMENTAL RELEASE AVAILABLE!**  
> We need your help testing [v0.5.0-experimental.1](https://github.com/gindemit/unity-rlottie/releases/tag/0.5.0-experimental.1) which introduces native rendering features and WebGL support!  
> This release moves texture updates to the native plugin layer for better performance. Please test and report any issues you encounter.

Welcome to the **Unity Lottie Animation** plugin! This Unity library enables you to play Lottie animations as Texture2D in your Unity projects. It's a powerful and easy-to-use solution that leverages Samsung's [rlottie](https://github.com/Samsung/rlottie) library to bring smooth Lottie animations to your games and applications.

Lottie loads and renders animations and vectors exported in the bodymovin JSON format. Bodymovin JSON can be created and exported from After Effects with bodymovin, Sketch with Lottie Sketch Export, and from Haiku.

For the first time, designers can create and ship beautiful animations without an engineer painstakingly recreating it by hand. Since the animation is backed by JSON they are extremely small in size but can be large in complexity!

## Features

* Play Lottie animations as Texture2D in Unity
* Easy integration and usage
* High performance and low memory footprint
* Uses Samsung's rlottie library internally
* Compatible with Unity 2019.4 and later

## Supported Platforms

* Android
* iOS
* Windows
* OSX
* Linux

## Installation

To install the Unity Lottie Animation to Texture2D plugin using the Unity Package Manager, follow these steps:

1. Open your Unity project and navigate to `Window` > `Package Manager`.
2. Click the `+` button in the top-left corner and select `Add package from git URL...`.
3. Enter the following URL and click `Add`:
   ```
   https://github.com/gindemit/unity-rlottie.git?path=/unity/RLottieUnity/Assets/LottiePlugin/#0.4.5
   ```

## Quick Start

The `LottiePlugin.UI` namespace includes a `AnimatedImage` class which allows you to use Lottie animations as `RawImage` in your Unity game.
Here are the steps to use the `AnimatedImage` class in your Unity project:

1. **Import the Class:** First, make sure the `AnimatedImage` class is included in your Unity project.

2. **Create an RawImage:** In your Unity scene, create a new RawImage UGUI game object and attach the `AnimatedImage` script to it.

3. **Assign Parameters:** In the `AnimatedImage` component, you will see several parameters:

    - **Animation Json**: A `TextAsset` representing the JSON data for your Lottie animation. You can drag and drop it from your Assets folder.
    - **Texture Width**: Defines the width of the texture for the animation. Increasing this value will improve the quality of the animation by increasing the number of pixels, but it may also impact performance, especially on lower-end hardware.
    - **Texture Height**: Defines the height of the texture for the animation. Similar to Texture Width, increasing this value enhances the quality of the animation by adding more pixels, but it could potentially degrade performance on less powerful devices.
    - **Animation Speed**: Speed at which animation plays. 1 is normal speed.
    - **Play On Awake**: If checked, the animation will start playing as soon as the scene starts.
    - **Loop**: If checked, the animation will keep playing in a loop.

    Fill these in according to your needs.

4. **Play/Stop the Animation:** You can use the `Play()` and `Stop()` methods to control the animation at runtime. You can call these from any other script.

    ```csharp
    // Get a reference to the AnimatedImage
    AnimatedImage animatedImage = gameObject.GetComponent<AnimatedImage>();

    // Play the animation
    animatedImage.Play();

    // Stop the animation
    animatedImage.Stop();
    ```
And that's it! You are now able to use Lottie animations in your Unity projects using the `AnimatedImage` class.

## Example

Here's an example of how to use the `AnimatedImage` class:

```csharp
// Attach this script to a GameObject with AnimatedImage component

using UnityEngine;
using LottiePlugin.UI;

public class AnimationController : MonoBehaviour
{
    private AnimatedImage animatedImage;

    private void Awake()
    {
        animatedImage = GetComponent<AnimatedImage>();
    }

    private void Start()
    {
        animatedImage.Play(); // Start the animation
    }

    private void OnDisable()
    {
        animatedImage.Stop(); // Stop the animation
    }
}
```
This script, when attached to the same GameObject as the `AnimatedImage` component, will start the animation when the game starts and stop it when the GameObject is disabled.

## Other Examples

Check out the 'Scene UI' Sample in Unity Package manager.

1. Open your Unity project and navigate to `Window` > `Package Manager`.
2. Select the installed Lottie Animation package on the left
3. Fold out the Samples section
4. Click 'Import' button on the Scene UI sample
5. After importing it will ask you to copy the sample animations to the Assets/StreaminAssets folder
6. Click 'Copy' button in the 'Missing lottie animations' dialog
7. Open the 'SampleScene' from the sample in 'Assets/Samples/Lottie Animation/[version]/Scene UI/Scenes/' folder
8. Hit play in Unity editor

https://github.com/gindemit/unity-rlottie/assets/5675979/3301d00e-fc9e-49c0-bc7f-7408f1f72ce4

## Support

If you encounter any issues or have questions, please [create an issue](https://github.com/gindemit/unity-rlottie/issues/new) on GitHub.

## Credits

This plugin is built on top of Samsung's [rlottie](https://github.com/Samsung/rlottie) library, which is used internally for Lottie animation rendering.

## License

This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.


================================================
FILE: dependency/pixman/pixman-arm-intrisics.cpp
================================================
#include <arm_neon.h>

extern "C" void pixman_composite_src_n_8888_asm_neon(int32_t w, int32_t h,
                                                     uint32_t *dst,
                                                     int32_t   dst_stride,
                                                     uint32_t  src)
{
    uint8x8_t v_src = vdup_n_u8(src);

    for (int32_t y = 0; y < h; y++)
    {
        for (int32_t x = 0; x < w; x += 8)
        {
            vst1_u8((uint8_t *)(dst + x), v_src);
        }
        dst += dst_stride;
    }
}

extern "C" void pixman_composite_over_n_8888_asm_neon(int32_t w, int32_t h,
                                                      uint32_t *dst,
                                                      int32_t   dst_stride,
                                                      uint32_t  src)
{
    // Extract the source alpha and replicate it to all 8 lanes of a NEON vector
    uint8x8_t v_src_alpha = vdup_n_u8(src >> 24);
    // Extract the source color and replicate it to all 8 lanes of a NEON vector
    uint8x8_t v_src_color = vdup_n_u8(src);

    for (int32_t y = 0; y < h; y++)
    {
        for (int32_t x = 0; x < w; x += 8)
        {
            // Load 8 destination pixels
            uint8x8_t v_dst_color = vld1_u8((uint8_t *)(dst + x));

            // Calculate the result color = source color * source alpha + destination color * (1 - source alpha)
            // Note that we need to shift right by 8 because the alpha blending operation can result in values greater than 255
            uint8x8_t v_res_color = vshrq_n_u8(vmlaq_u8(vmlsq_u8(v_dst_color, v_dst_color, v_src_alpha), v_src_color, v_src_alpha), 8);

            // Store the result to memory
            vst1_u8((uint8_t *)(dst + x), v_res_color);
        }
        dst += dst_stride;
    }
}


================================================
FILE: dependency/pixman/pixman-arm-neon-asm.S
================================================
/*
 * Copyright © 2009 Nokia Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 *
 * Author:  Siarhei Siamashka (siarhei.siamashka@nokia.com)
 */

/*
 * This file contains implementations of NEON optimized pixel processing
 * functions. There is no full and detailed tutorial, but some functions
 * (those which are exposing some new or interesting features) are
 * extensively commented and can be used as examples.
 *
 * You may want to have a look at the comments for following functions:
 *  - pixman_composite_over_8888_0565_asm_neon
 *  - pixman_composite_over_n_8_0565_asm_neon
 */

/* Prevent the stack from becoming executable for no reason... */
#if defined(__linux__) && defined(__ELF__)
.section .note.GNU-stack,"",%progbits
#endif

    .text
    .fpu neon
    .arch armv7a
    .object_arch armv4
    .eabi_attribute 10, 0 /* suppress Tag_FP_arch */
    .eabi_attribute 12, 0 /* suppress Tag_Advanced_SIMD_arch */
    .arm
    .altmacro
    .p2align 2


//#include "pixman-arm-asm.h"
/* Supplementary macro for setting function attributes */
.macro pixman_asm_function fname
    .func fname
    .global fname
#ifdef __ELF__
    .hidden fname
    .type fname, %function
#endif
fname:
.endm

//#include "pixman-private.h"
/*
 * The defines which are shared between C and assembly code
 */

/* bilinear interpolation precision (must be < 8) */
#define BILINEAR_INTERPOLATION_BITS 7
#define BILINEAR_INTERPOLATION_RANGE (1 << BILINEAR_INTERPOLATION_BITS)

#include "pixman-arm-neon-asm.h"

/* Global configuration options and preferences */

/*
 * The code can optionally make use of unaligned memory accesses to improve
 * performance of handling leading/trailing pixels for each scanline.
 * Configuration variable RESPECT_STRICT_ALIGNMENT can be set to 0 for
 * example in linux if unaligned memory accesses are not configured to
 * generate.exceptions.
 */
.set RESPECT_STRICT_ALIGNMENT, 1

/*
 * Set default prefetch type. There is a choice between the following options:
 *
 * PREFETCH_TYPE_NONE (may be useful for the ARM cores where PLD is set to work
 * as NOP to workaround some HW bugs or for whatever other reason)
 *
 * PREFETCH_TYPE_SIMPLE (may be useful for simple single-issue ARM cores where
 * advanced prefetch intruduces heavy overhead)
 *
 * PREFETCH_TYPE_ADVANCED (useful for superscalar cores such as ARM Cortex-A8
 * which can run ARM and NEON instructions simultaneously so that extra ARM
 * instructions do not add (many) extra cycles, but improve prefetch efficiency)
 *
 * Note: some types of function can't support advanced prefetch and fallback
 *       to simple one (those which handle 24bpp pixels)
 */
.set PREFETCH_TYPE_DEFAULT, PREFETCH_TYPE_ADVANCED

/* Prefetch distance in pixels for simple prefetch */
.set PREFETCH_DISTANCE_SIMPLE, 64

/*
 * Implementation of pixman_composite_over_8888_0565_asm_neon
 *
 * This function takes a8r8g8b8 source buffer, r5g6b5 destination buffer and
 * performs OVER compositing operation. Function fast_composite_over_8888_0565
 * from pixman-fast-path.c does the same in C and can be used as a reference.
 *
 * First we need to have some NEON assembly code which can do the actual
 * operation on the pixels and provide it to the template macro.
 *
 * Template macro quite conveniently takes care of emitting all the necessary
 * code for memory reading and writing (including quite tricky cases of
 * handling unaligned leading/trailing pixels), so we only need to deal with
 * the data in NEON registers.
 *
 * NEON registers allocation in general is recommented to be the following:
 * d0,  d1,  d2,  d3  - contain loaded source pixel data
 * d4,  d5,  d6,  d7  - contain loaded destination pixels (if they are needed)
 * d24, d25, d26, d27 - contain loading mask pixel data (if mask is used)
 * d28, d29, d30, d31 - place for storing the result (destination pixels)
 *
 * As can be seen above, four 64-bit NEON registers are used for keeping
 * intermediate pixel data and up to 8 pixels can be processed in one step
 * for 32bpp formats (16 pixels for 16bpp, 32 pixels for 8bpp).
 *
 * This particular function uses the following registers allocation:
 * d0,  d1,  d2,  d3  - contain loaded source pixel data
 * d4,  d5            - contain loaded destination pixels (they are needed)
 * d28, d29           - place for storing the result (destination pixels)
 */

/*
 * Step one. We need to have some code to do some arithmetics on pixel data.
 * This is implemented as a pair of macros: '*_head' and '*_tail'. When used
 * back-to-back, they take pixel data from {d0, d1, d2, d3} and {d4, d5},
 * perform all the needed calculations and write the result to {d28, d29}.
 * The rationale for having two macros and not just one will be explained
 * later. In practice, any single monolitic function which does the work can
 * be split into two parts in any arbitrary way without affecting correctness.
 *
 * There is one special trick here too. Common template macro can optionally
 * make our life a bit easier by doing R, G, B, A color components
 * deinterleaving for 32bpp pixel formats (and this feature is used in
 * 'pixman_composite_over_8888_0565_asm_neon' function). So it means that
 * instead of having 8 packed pixels in {d0, d1, d2, d3} registers, we
 * actually use d0 register for blue channel (a vector of eight 8-bit
 * values), d1 register for green, d2 for red and d3 for alpha. This
 * simple conversion can be also done with a few NEON instructions:
 *
 * Packed to planar conversion:
 *  vuzp.8 d0, d1
 *  vuzp.8 d2, d3
 *  vuzp.8 d1, d3
 *  vuzp.8 d0, d2
 *
 * Planar to packed conversion:
 *  vzip.8 d0, d2
 *  vzip.8 d1, d3
 *  vzip.8 d2, d3
 *  vzip.8 d0, d1
 *
 * But pixel can be loaded directly in planar format using VLD4.8 NEON
 * instruction. It is 1 cycle slower than VLD1.32, so this is not always
 * desirable, that's why deinterleaving is optional.
 *
 * But anyway, here is the code:
 */

/*
 * OK, now we got almost everything that we need. Using the above two
 * macros, the work can be done right. But now we want to optimize
 * it a bit. ARM Cortex-A8 is an in-order core, and benefits really
 * a lot from good code scheduling and software pipelining.
 *
 * Let's construct some code, which will run in the core main loop.
 * Some pseudo-code of the main loop will look like this:
 *   head
 *   while (...) {
 *     tail
 *     head
 *   }
 *   tail
 *
 * It may look a bit weird, but this setup allows to hide instruction
 * latencies better and also utilize dual-issue capability more
 * efficiently (make pairs of load-store and ALU instructions).
 *
 * So what we need now is a '*_tail_head' macro, which will be used
 * in the core main loop. A trivial straightforward implementation
 * of this macro would look like this:
 *
 *   pixman_composite_over_8888_0565_process_pixblock_tail
 *   vst1.16     {d28, d29}, [DST_W, :128]!
 *   vld1.16     {d4, d5}, [DST_R, :128]!
 *   vld4.32     {d0, d1, d2, d3}, [SRC]!
 *   pixman_composite_over_8888_0565_process_pixblock_head
 *   cache_preload 8, 8
 *
 * Now it also got some VLD/VST instructions. We simply can't move from
 * processing one block of pixels to the other one with just arithmetics.
 * The previously processed data needs to be written to memory and new
 * data needs to be fetched. Fortunately, this main loop does not deal
 * with partial leading/trailing pixels and can load/store a full block
 * of pixels in a bulk. Additionally, destination buffer is already
 * 16 bytes aligned here (which is good for performance).
 *
 * New things here are DST_R, DST_W, SRC and MASK identifiers. These
 * are the aliases for ARM registers which are used as pointers for
 * accessing data. We maintain separate pointers for reading and writing
 * destination buffer (DST_R and DST_W).
 *
 * Another new thing is 'cache_preload' macro. It is used for prefetching
 * data into CPU L2 cache and improve performance when dealing with large
 * images which are far larger than cache size. It uses one argument
 * (actually two, but they need to be the same here) - number of pixels
 * in a block. Looking into 'pixman-arm-neon-asm.h' can provide some
 * details about this macro. Moreover, if good performance is needed
 * the code from this macro needs to be copied into '*_tail_head' macro
 * and mixed with the rest of code for optimal instructions scheduling.
 * We are actually doing it below.
 *
 * Now after all the explanations, here is the optimized code.
 * Different instruction streams (originaling from '*_head', '*_tail'
 * and 'cache_preload' macro) use different indentation levels for
 * better readability. Actually taking the code from one of these
 * indentation levels and ignoring a few VLD/VST instructions would
 * result in exactly the code from '*_head', '*_tail' or 'cache_preload'
 * macro!
 */

/*
 * And now the final part. We are using 'generate_composite_function' macro
 * to put all the stuff together. We are specifying the name of the function
 * which we want to get, number of bits per pixel for the source, mask and
 * destination (0 if unused, like mask in this case). Next come some bit
 * flags:
 *   FLAG_DST_READWRITE      - tells that the destination buffer is both read
 *                             and written, for write-only buffer we would use
 *                             FLAG_DST_WRITEONLY flag instead
 *   FLAG_DEINTERLEAVE_32BPP - tells that we prefer to work with planar data
 *                             and separate color channels for 32bpp format.
 * The next things are:
 *  - the number of pixels processed per iteration (8 in this case, because
 *    that's the maximum what can fit into four 64-bit NEON registers).
 *  - prefetch distance, measured in pixel blocks. In this case it is 5 times
 *    by 8 pixels. That would be 40 pixels, or up to 160 bytes. Optimal
 *    prefetch distance can be selected by running some benchmarks.
 *
 * After that we specify some macros, these are 'default_init',
 * 'default_cleanup' here which are empty (but it is possible to have custom
 * init/cleanup macros to be able to save/restore some extra NEON registers
 * like d8-d15 or do anything else) followed by
 * 'pixman_composite_over_8888_0565_process_pixblock_head',
 * 'pixman_composite_over_8888_0565_process_pixblock_tail' and
 * 'pixman_composite_over_8888_0565_process_pixblock_tail_head'
 * which we got implemented above.
 *
 * The last part is the NEON registers allocation scheme.
 */

/******************************************************************************/

/******************************************************************************/
 .macro pixman_composite_out_reverse_8888_8888_process_pixblock_head
     vmvn.8      d24, d3  /* get inverted alpha */
     /* do alpha blending */
     vmull.u8    q8, d24, d4
     vmull.u8    q9, d24, d5
     vmull.u8    q10, d24, d6
     vmull.u8    q11, d24, d7
 .endm

 .macro pixman_composite_out_reverse_8888_8888_process_pixblock_tail
     vrshr.u16   q14, q8, #8
     vrshr.u16   q15, q9, #8
     vrshr.u16   q12, q10, #8
     vrshr.u16   q13, q11, #8
     vraddhn.u16 d28, q14, q8
     vraddhn.u16 d29, q15, q9
     vraddhn.u16 d30, q12, q10
     vraddhn.u16 d31, q13, q11
 .endm

/******************************************************************************/

.macro pixman_composite_over_8888_8888_process_pixblock_head
    pixman_composite_out_reverse_8888_8888_process_pixblock_head
.endm

.macro pixman_composite_over_8888_8888_process_pixblock_tail
    pixman_composite_out_reverse_8888_8888_process_pixblock_tail
    vqadd.u8    q14, q0, q14
    vqadd.u8    q15, q1, q15
.endm

.macro pixman_composite_over_8888_8888_process_pixblock_tail_head
    vld4.8      {d4, d5, d6, d7}, [DST_R, :128]!
        vrshr.u16   q14, q8, #8
                                    PF add PF_X, PF_X, #8
                                    PF tst PF_CTL, #0xF
        vrshr.u16   q15, q9, #8
        vrshr.u16   q12, q10, #8
        vrshr.u16   q13, q11, #8
                                    PF addne PF_X, PF_X, #8
                                    PF subne PF_CTL, PF_CTL, #1
        vraddhn.u16 d28, q14, q8
        vraddhn.u16 d29, q15, q9
                                    PF cmp PF_X, ORIG_W
        vraddhn.u16 d30, q12, q10
        vraddhn.u16 d31, q13, q11
        vqadd.u8    q14, q0, q14
        vqadd.u8    q15, q1, q15
    fetch_src_pixblock
                                    PF pld, [PF_SRC, PF_X, lsl #src_bpp_shift]
    vmvn.8      d22, d3
                                    PF pld, [PF_DST, PF_X, lsl #dst_bpp_shift]
        vst4.8      {d28, d29, d30, d31}, [DST_W, :128]!
                                    PF subge PF_X, PF_X, ORIG_W
    vmull.u8    q8, d22, d4
                                    PF subges PF_CTL, PF_CTL, #0x10
    vmull.u8    q9, d22, d5
                                    PF ldrgeb DUMMY, [PF_SRC, SRC_STRIDE, lsl #src_bpp_shift]!
    vmull.u8    q10, d22, d6
                                    PF ldrgeb DUMMY, [PF_DST, DST_STRIDE, lsl #dst_bpp_shift]!
    vmull.u8    q11, d22, d7
.endm

generate_composite_function \
    pixman_composite_over_8888_8888_asm_neon, 32, 0, 32, \
    FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \
    8, /* number of pixels, processed in a single block */ \
    5, /* prefetch distance */ \
    default_init, \
    default_cleanup, \
    pixman_composite_over_8888_8888_process_pixblock_head, \
    pixman_composite_over_8888_8888_process_pixblock_tail, \
    pixman_composite_over_8888_8888_process_pixblock_tail_head

generate_composite_function_single_scanline \
    pixman_composite_scanline_over_asm_neon, 32, 0, 32, \
    FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \
    8, /* number of pixels, processed in a single block */ \
    default_init, \
    default_cleanup, \
    pixman_composite_over_8888_8888_process_pixblock_head, \
    pixman_composite_over_8888_8888_process_pixblock_tail, \
    pixman_composite_over_8888_8888_process_pixblock_tail_head

/******************************************************************************/

.macro pixman_composite_over_n_8888_process_pixblock_head
    /* deinterleaved source pixels in {d0, d1, d2, d3} */
    /* inverted alpha in {d24} */
    /* destination pixels in {d4, d5, d6, d7} */
    vmull.u8    q8, d24, d4
    vmull.u8    q9, d24, d5
    vmull.u8    q10, d24, d6
    vmull.u8    q11, d24, d7
.endm

.macro pixman_composite_over_n_8888_process_pixblock_tail
    vrshr.u16   q14, q8, #8
    vrshr.u16   q15, q9, #8
    vrshr.u16   q2, q10, #8
    vrshr.u16   q3, q11, #8
    vraddhn.u16 d28, q14, q8
    vraddhn.u16 d29, q15, q9
    vraddhn.u16 d30, q2, q10
    vraddhn.u16 d31, q3, q11
    vqadd.u8    q14, q0, q14
    vqadd.u8    q15, q1, q15
.endm

.macro pixman_composite_over_n_8888_process_pixblock_tail_head
        vrshr.u16   q14, q8, #8
        vrshr.u16   q15, q9, #8
        vrshr.u16   q2, q10, #8
        vrshr.u16   q3, q11, #8
        vraddhn.u16 d28, q14, q8
        vraddhn.u16 d29, q15, q9
        vraddhn.u16 d30, q2, q10
        vraddhn.u16 d31, q3, q11
    vld4.8      {d4, d5, d6, d7}, [DST_R, :128]!
        vqadd.u8    q14, q0, q14
                                    PF add PF_X, PF_X, #8
                                    PF tst PF_CTL, #0x0F
                                    PF addne PF_X, PF_X, #8
                                    PF subne PF_CTL, PF_CTL, #1
        vqadd.u8    q15, q1, q15
                                    PF cmp PF_X, ORIG_W
    vmull.u8    q8, d24, d4
                                    PF pld, [PF_DST, PF_X, lsl #dst_bpp_shift]
    vmull.u8    q9, d24, d5
                                    PF subge PF_X, PF_X, ORIG_W
    vmull.u8    q10, d24, d6
                                    PF subges PF_CTL, PF_CTL, #0x10
    vmull.u8    q11, d24, d7
                                    PF ldrgeb DUMMY, [PF_DST, DST_STRIDE, lsl #dst_bpp_shift]!
        vst4.8      {d28, d29, d30, d31}, [DST_W, :128]!
.endm

.macro pixman_composite_over_n_8888_init
    add         DUMMY, sp, #ARGS_STACK_OFFSET
    vld1.32     {d3[0]}, [DUMMY]
    vdup.8      d0, d3[0]
    vdup.8      d1, d3[1]
    vdup.8      d2, d3[2]
    vdup.8      d3, d3[3]
    vmvn.8      d24, d3  /* get inverted alpha */
.endm

generate_composite_function \
    pixman_composite_over_n_8888_asm_neon, 0, 0, 32, \
    FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \
    8, /* number of pixels, processed in a single block */ \
    5, /* prefetch distance */ \
    pixman_composite_over_n_8888_init, \
    default_cleanup, \
    pixman_composite_over_8888_8888_process_pixblock_head, \
    pixman_composite_over_8888_8888_process_pixblock_tail, \
    pixman_composite_over_n_8888_process_pixblock_tail_head

/******************************************************************************/

.macro pixman_composite_src_n_8888_process_pixblock_head
.endm

.macro pixman_composite_src_n_8888_process_pixblock_tail
.endm

.macro pixman_composite_src_n_8888_process_pixblock_tail_head
    vst1.32 {d0, d1, d2, d3}, [DST_W, :128]!
.endm

.macro pixman_composite_src_n_8888_init
    add         DUMMY, sp, #ARGS_STACK_OFFSET
    vld1.32     {d0[0]}, [DUMMY]
    vsli.u64    d0, d0, #32
    vorr        d1, d0, d0
    vorr        q1, q0, q0
.endm

.macro pixman_composite_src_n_8888_cleanup
.endm

generate_composite_function \
    pixman_composite_src_n_8888_asm_neon, 0, 0, 32, \
    FLAG_DST_WRITEONLY, \
    8, /* number of pixels, processed in a single block */ \
    0, /* prefetch distance */ \
    pixman_composite_src_n_8888_init, \
    pixman_composite_src_n_8888_cleanup, \
    pixman_composite_src_n_8888_process_pixblock_head, \
    pixman_composite_src_n_8888_process_pixblock_tail, \
    pixman_composite_src_n_8888_process_pixblock_tail_head, \
    0, /* dst_w_basereg */ \
    0, /* dst_r_basereg */ \
    0, /* src_basereg   */ \
    0  /* mask_basereg  */

/******************************************************************************/

.macro pixman_composite_src_8888_8888_process_pixblock_head
.endm

.macro pixman_composite_src_8888_8888_process_pixblock_tail
.endm

.macro pixman_composite_src_8888_8888_process_pixblock_tail_head
    vst1.32 {d0, d1, d2, d3}, [DST_W, :128]!
    fetch_src_pixblock
    cache_preload 8, 8
.endm

generate_composite_function \
    pixman_composite_src_8888_8888_asm_neon, 32, 0, 32, \
    FLAG_DST_WRITEONLY, \
    8, /* number of pixels, processed in a single block */ \
    10, /* prefetch distance */ \
    default_init, \
    default_cleanup, \
    pixman_composite_src_8888_8888_process_pixblock_head, \
    pixman_composite_src_8888_8888_process_pixblock_tail, \
    pixman_composite_src_8888_8888_process_pixblock_tail_head, \
    0, /* dst_w_basereg */ \
    0, /* dst_r_basereg */ \
    0, /* src_basereg   */ \
    0  /* mask_basereg  */

/******************************************************************************/


================================================
FILE: dependency/pixman/pixman-arm-neon-asm.h
================================================
/*
 * Copyright © 2009 Nokia Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 *
 * Author:  Siarhei Siamashka (siarhei.siamashka@nokia.com)
 */

/*
 * This file contains a macro ('generate_composite_function') which can
 * construct 2D image processing functions, based on a common template.
 * Any combinations of source, destination and mask images with 8bpp,
 * 16bpp, 24bpp, 32bpp color formats are supported.
 *
 * This macro takes care of:
 *  - handling of leading and trailing unaligned pixels
 *  - doing most of the work related to L2 cache preload
 *  - encourages the use of software pipelining for better instructions
 *    scheduling
 *
 * The user of this macro has to provide some configuration parameters
 * (bit depths for the images, prefetch distance, etc.) and a set of
 * macros, which should implement basic code chunks responsible for
 * pixels processing. See 'pixman-arm-neon-asm.S' file for the usage
 * examples.
 *
 * TODO:
 *  - try overlapped pixel method (from Ian Rickards) when processing
 *    exactly two blocks of pixels
 *  - maybe add an option to do reverse scanline processing
 */

/*
 * Bit flags for 'generate_composite_function' macro which are used
 * to tune generated functions behavior.
 */
.set FLAG_DST_WRITEONLY,       0
.set FLAG_DST_READWRITE,       1
.set FLAG_DEINTERLEAVE_32BPP,  2

/*
 * Offset in stack where mask and source pointer/stride can be accessed
 * from 'init' macro. This is useful for doing special handling for solid mask.
 */
.set ARGS_STACK_OFFSET,        40

/*
 * Constants for selecting preferable prefetch type.
 */
.set PREFETCH_TYPE_NONE,       0 /* No prefetch at all */
.set PREFETCH_TYPE_SIMPLE,     1 /* A simple, fixed-distance-ahead prefetch */
.set PREFETCH_TYPE_ADVANCED,   2 /* Advanced fine-grained prefetch */

/*
 * Definitions of supplementary pixld/pixst macros (for partial load/store of
 * pixel data).
 */

.macro pixldst1 op, elem_size, reg1, mem_operand, abits
.if abits > 0
    op&.&elem_size {d&reg1}, [&mem_operand&, :&abits&]!
.else
    op&.&elem_size {d&reg1}, [&mem_operand&]!
.endif
.endm

.macro pixldst2 op, elem_size, reg1, reg2, mem_operand, abits
.if abits > 0
    op&.&elem_size {d&reg1, d&reg2}, [&mem_operand&, :&abits&]!
.else
    op&.&elem_size {d&reg1, d&reg2}, [&mem_operand&]!
.endif
.endm

.macro pixldst4 op, elem_size, reg1, reg2, reg3, reg4, mem_operand, abits
.if abits > 0
    op&.&elem_size {d&reg1, d&reg2, d&reg3, d&reg4}, [&mem_operand&, :&abits&]!
.else
    op&.&elem_size {d&reg1, d&reg2, d&reg3, d&reg4}, [&mem_operand&]!
.endif
.endm

.macro pixldst0 op, elem_size, reg1, idx, mem_operand, abits
    op&.&elem_size {d&reg1[idx]}, [&mem_operand&]!
.endm

.macro pixldst3 op, elem_size, reg1, reg2, reg3, mem_operand
    op&.&elem_size {d&reg1, d&reg2, d&reg3}, [&mem_operand&]!
.endm

.macro pixldst30 op, elem_size, reg1, reg2, reg3, idx, mem_operand
    op&.&elem_size {d&reg1[idx], d&reg2[idx], d&reg3[idx]}, [&mem_operand&]!
.endm

.macro pixldst numbytes, op, elem_size, basereg, mem_operand, abits
.if numbytes == 32
    pixldst4 op, elem_size, %(basereg+4), %(basereg+5), \
                              %(basereg+6), %(basereg+7), mem_operand, abits
.elseif numbytes == 16
    pixldst2 op, elem_size, %(basereg+2), %(basereg+3), mem_operand, abits
.elseif numbytes == 8
    pixldst1 op, elem_size, %(basereg+1), mem_operand, abits
.elseif numbytes == 4
    .if !RESPECT_STRICT_ALIGNMENT || (elem_size == 32)
        pixldst0 op, 32, %(basereg+0), 1, mem_operand, abits
    .elseif elem_size == 16
        pixldst0 op, 16, %(basereg+0), 2, mem_operand, abits
        pixldst0 op, 16, %(basereg+0), 3, mem_operand, abits
    .else
        pixldst0 op, 8, %(basereg+0), 4, mem_operand, abits
        pixldst0 op, 8, %(basereg+0), 5, mem_operand, abits
        pixldst0 op, 8, %(basereg+0), 6, mem_operand, abits
        pixldst0 op, 8, %(basereg+0), 7, mem_operand, abits
    .endif
.elseif numbytes == 2
    .if !RESPECT_STRICT_ALIGNMENT || (elem_size == 16)
        pixldst0 op, 16, %(basereg+0), 1, mem_operand, abits
    .else
        pixldst0 op, 8, %(basereg+0), 2, mem_operand, abits
        pixldst0 op, 8, %(basereg+0), 3, mem_operand, abits
    .endif
.elseif numbytes == 1
    pixldst0 op, 8, %(basereg+0), 1, mem_operand, abits
.else
    .error "unsupported size: numbytes"
.endif
.endm

.macro pixld numpix, bpp, basereg, mem_operand, abits=0
.if bpp > 0
.if (bpp == 32) && (numpix == 8) && (DEINTERLEAVE_32BPP_ENABLED != 0)
    pixldst4 vld4, 8, %(basereg+4), %(basereg+5), \
                      %(basereg+6), %(basereg+7), mem_operand, abits
.elseif (bpp == 24) && (numpix == 8)
    pixldst3 vld3, 8, %(basereg+3), %(basereg+4), %(basereg+5), mem_operand
.elseif (bpp == 24) && (numpix == 4)
    pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 4, mem_operand
    pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 5, mem_operand
    pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 6, mem_operand
    pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 7, mem_operand
.elseif (bpp == 24) && (numpix == 2)
    pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 2, mem_operand
    pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 3, mem_operand
.elseif (bpp == 24) && (numpix == 1)
    pixldst30 vld3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 1, mem_operand
.else
    pixldst %(numpix * bpp / 8), vld1, %(bpp), basereg, mem_operand, abits
.endif
.endif
.endm

.macro pixst numpix, bpp, basereg, mem_operand, abits=0
.if bpp > 0
.if (bpp == 32) && (numpix == 8) && (DEINTERLEAVE_32BPP_ENABLED != 0)
    pixldst4 vst4, 8, %(basereg+4), %(basereg+5), \
                      %(basereg+6), %(basereg+7), mem_operand, abits
.elseif (bpp == 24) && (numpix == 8)
    pixldst3 vst3, 8, %(basereg+3), %(basereg+4), %(basereg+5), mem_operand
.elseif (bpp == 24) && (numpix == 4)
    pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 4, mem_operand
    pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 5, mem_operand
    pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 6, mem_operand
    pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 7, mem_operand
.elseif (bpp == 24) && (numpix == 2)
    pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 2, mem_operand
    pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 3, mem_operand
.elseif (bpp == 24) && (numpix == 1)
    pixldst30 vst3, 8, %(basereg+0), %(basereg+1), %(basereg+2), 1, mem_operand
.else
    pixldst %(numpix * bpp / 8), vst1, %(bpp), basereg, mem_operand, abits
.endif
.endif
.endm

.macro pixld_a numpix, bpp, basereg, mem_operand
.if (bpp * numpix) <= 128
    pixld numpix, bpp, basereg, mem_operand, %(bpp * numpix)
.else
    pixld numpix, bpp, basereg, mem_operand, 128
.endif
.endm

.macro pixst_a numpix, bpp, basereg, mem_operand
.if (bpp * numpix) <= 128
    pixst numpix, bpp, basereg, mem_operand, %(bpp * numpix)
.else
    pixst numpix, bpp, basereg, mem_operand, 128
.endif
.endm

/*
 * Pixel fetcher for nearest scaling (needs TMP1, TMP2, VX, UNIT_X register
 * aliases to be defined)
 */
.macro pixld1_s elem_size, reg1, mem_operand
.if elem_size == 16
    mov     TMP1, VX, asr #16
    adds    VX, VX, UNIT_X
5:  subpls  VX, VX, SRC_WIDTH_FIXED
    bpl     5b
    add     TMP1, mem_operand, TMP1, asl #1
    mov     TMP2, VX, asr #16
    adds    VX, VX, UNIT_X
5:  subpls  VX, VX, SRC_WIDTH_FIXED
    bpl     5b
    add     TMP2, mem_operand, TMP2, asl #1
    vld1.16 {d&reg1&[0]}, [TMP1, :16]
    mov     TMP1, VX, asr #16
    adds    VX, VX, UNIT_X
5:  subpls  VX, VX, SRC_WIDTH_FIXED
    bpl     5b
    add     TMP1, mem_operand, TMP1, asl #1
    vld1.16 {d&reg1&[1]}, [TMP2, :16]
    mov     TMP2, VX, asr #16
    adds    VX, VX, UNIT_X
5:  subpls  VX, VX, SRC_WIDTH_FIXED
    bpl     5b
    add     TMP2, mem_operand, TMP2, asl #1
    vld1.16 {d&reg1&[2]}, [TMP1, :16]
    vld1.16 {d&reg1&[3]}, [TMP2, :16]
.elseif elem_size == 32
    mov     TMP1, VX, asr #16
    adds    VX, VX, UNIT_X
5:  subpls  VX, VX, SRC_WIDTH_FIXED
    bpl     5b
    add     TMP1, mem_operand, TMP1, asl #2
    mov     TMP2, VX, asr #16
    adds    VX, VX, UNIT_X
5:  subpls  VX, VX, SRC_WIDTH_FIXED
    bpl     5b
    add     TMP2, mem_operand, TMP2, asl #2
    vld1.32 {d&reg1&[0]}, [TMP1, :32]
    vld1.32 {d&reg1&[1]}, [TMP2, :32]
.else
    .error "unsupported"
.endif
.endm

.macro pixld2_s elem_size, reg1, reg2, mem_operand
.if 0 /* elem_size == 32 */
    mov     TMP1, VX, asr #16
    add     VX, VX, UNIT_X, asl #1
    add     TMP1, mem_operand, TMP1, asl #2
    mov     TMP2, VX, asr #16
    sub     VX, VX, UNIT_X
    add     TMP2, mem_operand, TMP2, asl #2
    vld1.32 {d&reg1&[0]}, [TMP1, :32]
    mov     TMP1, VX, asr #16
    add     VX, VX, UNIT_X, asl #1
    add     TMP1, mem_operand, TMP1, asl #2
    vld1.32 {d&reg2&[0]}, [TMP2, :32]
    mov     TMP2, VX, asr #16
    add     VX, VX, UNIT_X
    add     TMP2, mem_operand, TMP2, asl #2
    vld1.32 {d&reg1&[1]}, [TMP1, :32]
    vld1.32 {d&reg2&[1]}, [TMP2, :32]
.else
    pixld1_s elem_size, reg1, mem_operand
    pixld1_s elem_size, reg2, mem_operand
.endif
.endm

.macro pixld0_s elem_size, reg1, idx, mem_operand
.if elem_size == 16
    mov     TMP1, VX, asr #16
    adds    VX, VX, UNIT_X
5:  subpls  VX, VX, SRC_WIDTH_FIXED
    bpl     5b
    add     TMP1, mem_operand, TMP1, asl #1
    vld1.16 {d&reg1&[idx]}, [TMP1, :16]
.elseif elem_size == 32
    mov     TMP1, VX, asr #16
    adds    VX, VX, UNIT_X
5:  subpls  VX, VX, SRC_WIDTH_FIXED
    bpl     5b
    add     TMP1, mem_operand, TMP1, asl #2
    vld1.32 {d&reg1&[idx]}, [TMP1, :32]
.endif
.endm

.macro pixld_s_internal numbytes, elem_size, basereg, mem_operand
.if numbytes == 32
    pixld2_s elem_size, %(basereg+4), %(basereg+5), mem_operand
    pixld2_s elem_size, %(basereg+6), %(basereg+7), mem_operand
    pixdeinterleave elem_size, %(basereg+4)
.elseif numbytes == 16
    pixld2_s elem_size, %(basereg+2), %(basereg+3), mem_operand
.elseif numbytes == 8
    pixld1_s elem_size, %(basereg+1), mem_operand
.elseif numbytes == 4
    .if elem_size == 32
        pixld0_s elem_size, %(basereg+0), 1, mem_operand
    .elseif elem_size == 16
        pixld0_s elem_size, %(basereg+0), 2, mem_operand
        pixld0_s elem_size, %(basereg+0), 3, mem_operand
    .else
        pixld0_s elem_size, %(basereg+0), 4, mem_operand
        pixld0_s elem_size, %(basereg+0), 5, mem_operand
        pixld0_s elem_size, %(basereg+0), 6, mem_operand
        pixld0_s elem_size, %(basereg+0), 7, mem_operand
    .endif
.elseif numbytes == 2
    .if elem_size == 16
        pixld0_s elem_size, %(basereg+0), 1, mem_operand
    .else
        pixld0_s elem_size, %(basereg+0), 2, mem_operand
        pixld0_s elem_size, %(basereg+0), 3, mem_operand
    .endif
.elseif numbytes == 1
    pixld0_s elem_size, %(basereg+0), 1, mem_operand
.else
    .error "unsupported size: numbytes"
.endif
.endm

.macro pixld_s numpix, bpp, basereg, mem_operand
.if bpp > 0
    pixld_s_internal %(numpix * bpp / 8), %(bpp), basereg, mem_operand
.endif
.endm

.macro vuzp8 reg1, reg2
    vuzp.8 d&reg1, d&reg2
.endm

.macro vzip8 reg1, reg2
    vzip.8 d&reg1, d&reg2
.endm

/* deinterleave B, G, R, A channels for eight 32bpp pixels in 4 registers */
.macro pixdeinterleave bpp, basereg
.if (bpp == 32) && (DEINTERLEAVE_32BPP_ENABLED != 0)
    vuzp8 %(basereg+0), %(basereg+1)
    vuzp8 %(basereg+2), %(basereg+3)
    vuzp8 %(basereg+1), %(basereg+3)
    vuzp8 %(basereg+0), %(basereg+2)
.endif
.endm

/* interleave B, G, R, A channels for eight 32bpp pixels in 4 registers */
.macro pixinterleave bpp, basereg
.if (bpp == 32) && (DEINTERLEAVE_32BPP_ENABLED != 0)
    vzip8 %(basereg+0), %(basereg+2)
    vzip8 %(basereg+1), %(basereg+3)
    vzip8 %(basereg+2), %(basereg+3)
    vzip8 %(basereg+0), %(basereg+1)
.endif
.endm

/*
 * This is a macro for implementing cache preload. The main idea is that
 * cache preload logic is mostly independent from the rest of pixels
 * processing code. It starts at the top left pixel and moves forward
 * across pixels and can jump across scanlines. Prefetch distance is
 * handled in an 'incremental' way: it starts from 0 and advances to the
 * optimal distance over time. After reaching optimal prefetch distance,
 * it is kept constant. There are some checks which prevent prefetching
 * unneeded pixel lines below the image (but it still can prefetch a bit
 * more data on the right side of the image - not a big issue and may
 * be actually helpful when rendering text glyphs). Additional trick is
 * the use of LDR instruction for prefetch instead of PLD when moving to
 * the next line, the point is that we have a high chance of getting TLB
 * miss in this case, and PLD would be useless.
 *
 * This sounds like it may introduce a noticeable overhead (when working with
 * fully cached data). But in reality, due to having a separate pipeline and
 * instruction queue for NEON unit in ARM Cortex-A8, normal ARM code can
 * execute simultaneously with NEON and be completely shadowed by it. Thus
 * we get no performance overhead at all (*). This looks like a very nice
 * feature of Cortex-A8, if used wisely. We don't have a hardware prefetcher,
 * but still can implement some rather advanced prefetch logic in software
 * for almost zero cost!
 *
 * (*) The overhead of the prefetcher is visible when running some trivial
 * pixels processing like simple copy. Anyway, having prefetch is a must
 * when working with the graphics data.
 */
.macro PF a, x:vararg
.if (PREFETCH_TYPE_CURRENT == PREFETCH_TYPE_ADVANCED)
    a x
.endif
.endm

.macro cache_preload std_increment, boost_increment
.if (src_bpp_shift >= 0) || (dst_r_bpp != 0) || (mask_bpp_shift >= 0)
.if regs_shortage
    PF ldr ORIG_W, [sp] /* If we are short on regs, ORIG_W is kept on stack */
.endif
.if std_increment != 0
    PF add PF_X, PF_X, #std_increment
.endif
    PF tst PF_CTL, #0xF
    PF addne PF_X, PF_X, #boost_increment
    PF subne PF_CTL, PF_CTL, #1
    PF cmp PF_X, ORIG_W
.if src_bpp_shift >= 0
    PF pld, [PF_SRC, PF_X, lsl #src_bpp_shift]
.endif
.if dst_r_bpp != 0
    PF pld, [PF_DST, PF_X, lsl #dst_bpp_shift]
.endif
.if mask_bpp_shift >= 0
    PF pld, [PF_MASK, PF_X, lsl #mask_bpp_shift]
.endif
    PF subge PF_X, PF_X, ORIG_W
    PF subges PF_CTL, PF_CTL, #0x10
.if src_bpp_shift >= 0
    PF ldrgeb DUMMY, [PF_SRC, SRC_STRIDE, lsl #src_bpp_shift]!
.endif
.if dst_r_bpp != 0
    PF ldrgeb DUMMY, [PF_DST, DST_STRIDE, lsl #dst_bpp_shift]!
.endif
.if mask_bpp_shift >= 0
    PF ldrgeb DUMMY, [PF_MASK, MASK_STRIDE, lsl #mask_bpp_shift]!
.endif
.endif
.endm

.macro cache_preload_simple
.if (PREFETCH_TYPE_CURRENT == PREFETCH_TYPE_SIMPLE)
.if src_bpp > 0
    pld [SRC, #(PREFETCH_DISTANCE_SIMPLE * src_bpp / 8)]
.endif
.if dst_r_bpp > 0
    pld [DST_R, #(PREFETCH_DISTANCE_SIMPLE * dst_r_bpp / 8)]
.endif
.if mask_bpp > 0
    pld [MASK, #(PREFETCH_DISTANCE_SIMPLE * mask_bpp / 8)]
.endif
.endif
.endm

.macro fetch_mask_pixblock
    pixld       pixblock_size, mask_bpp, \
                (mask_basereg - pixblock_size * mask_bpp / 64), MASK
.endm

/*
 * Macro which is used to process leading pixels until destination
 * pointer is properly aligned (at 16 bytes boundary). When destination
 * buffer uses 16bpp format, this is unnecessary, or even pointless.
 */
.macro ensure_destination_ptr_alignment process_pixblock_head, \
                                        process_pixblock_tail, \
                                        process_pixblock_tail_head
.if dst_w_bpp != 24
    tst         DST_R, #0xF
    beq         2f

.irp lowbit, 1, 2, 4, 8, 16
local skip1
.if (dst_w_bpp <= (lowbit * 8)) && ((lowbit * 8) < (pixblock_size * dst_w_bpp))
.if lowbit < 16 /* we don't need more than 16-byte alignment */
    tst         DST_R, #lowbit
    beq         1f
.endif
    pixld_src   (lowbit * 8 / dst_w_bpp), src_bpp, src_basereg, SRC
    pixld       (lowbit * 8 / dst_w_bpp), mask_bpp, mask_basereg, MASK
.if dst_r_bpp > 0
    pixld_a     (lowbit * 8 / dst_r_bpp), dst_r_bpp, dst_r_basereg, DST_R
.else
    add         DST_R, DST_R, #lowbit
.endif
    PF add      PF_X, PF_X, #(lowbit * 8 / dst_w_bpp)
    sub         W, W, #(lowbit * 8 / dst_w_bpp)
1:
.endif
.endr
    pixdeinterleave src_bpp, src_basereg
    pixdeinterleave mask_bpp, mask_basereg
    pixdeinterleave dst_r_bpp, dst_r_basereg

    process_pixblock_head
    cache_preload 0, pixblock_size
    cache_preload_simple
    process_pixblock_tail

    pixinterleave dst_w_bpp, dst_w_basereg
.irp lowbit, 1, 2, 4, 8, 16
.if (dst_w_bpp <= (lowbit * 8)) && ((lowbit * 8) < (pixblock_size * dst_w_bpp))
.if lowbit < 16 /* we don't need more than 16-byte alignment */
    tst         DST_W, #lowbit
    beq         1f
.endif
    pixst_a     (lowbit * 8 / dst_w_bpp), dst_w_bpp, dst_w_basereg, DST_W
1:
.endif
.endr
.endif
2:
.endm

/*
 * Special code for processing up to (pixblock_size - 1) remaining
 * trailing pixels. As SIMD processing performs operation on
 * pixblock_size pixels, anything smaller than this has to be loaded
 * and stored in a special way. Loading and storing of pixel data is
 * performed in such a way that we fill some 'slots' in the NEON
 * registers (some slots naturally are unused), then perform compositing
 * operation as usual. In the end, the data is taken from these 'slots'
 * and saved to memory.
 *
 * cache_preload_flag - allows to suppress prefetch if
 *                      set to 0
 * dst_aligned_flag   - selects whether destination buffer
 *                      is aligned
 */
.macro process_trailing_pixels cache_preload_flag, \
                               dst_aligned_flag, \
                               process_pixblock_head, \
                               process_pixblock_tail, \
                               process_pixblock_tail_head
    tst         W, #(pixblock_size - 1)
    beq         2f
.irp chunk_size, 16, 8, 4, 2, 1
.if pixblock_size > chunk_size
    tst         W, #chunk_size
    beq         1f
    pixld_src   chunk_size, src_bpp, src_basereg, SRC
    pixld       chunk_size, mask_bpp, mask_basereg, MASK
.if dst_aligned_flag != 0
    pixld_a     chunk_size, dst_r_bpp, dst_r_basereg, DST_R
.else
    pixld       chunk_size, dst_r_bpp, dst_r_basereg, DST_R
.endif
.if cache_preload_flag != 0
    PF add      PF_X, PF_X, #chunk_size
.endif
1:
.endif
.endr
    pixdeinterleave src_bpp, src_basereg
    pixdeinterleave mask_bpp, mask_basereg
    pixdeinterleave dst_r_bpp, dst_r_basereg

    process_pixblock_head
.if cache_preload_flag != 0
    cache_preload 0, pixblock_size
    cache_preload_simple
.endif
    process_pixblock_tail
    pixinterleave dst_w_bpp, dst_w_basereg
.irp chunk_size, 16, 8, 4, 2, 1
.if pixblock_size > chunk_size
    tst         W, #chunk_size
    beq         1f
.if dst_aligned_flag != 0
    pixst_a     chunk_size, dst_w_bpp, dst_w_basereg, DST_W
.else
    pixst       chunk_size, dst_w_bpp, dst_w_basereg, DST_W
.endif
1:
.endif
.endr
2:
.endm

/*
 * Macro, which performs all the needed operations to switch to the next
 * scanline and start the next loop iteration unless all the scanlines
 * are already processed.
 */
.macro advance_to_next_scanline start_of_loop_label
.if regs_shortage
    ldrd        W, [sp] /* load W and H (width and height) from stack */
.else
    mov         W, ORIG_W
.endif
    add         DST_W, DST_W, DST_STRIDE, lsl #dst_bpp_shift
.if src_bpp != 0
    add         SRC, SRC, SRC_STRIDE, lsl #src_bpp_shift
.endif
.if mask_bpp != 0
    add         MASK, MASK, MASK_STRIDE, lsl #mask_bpp_shift
.endif
.if (dst_w_bpp != 24)
    sub         DST_W, DST_W, W, lsl #dst_bpp_shift
.endif
.if (src_bpp != 24) && (src_bpp != 0)
    sub         SRC, SRC, W, lsl #src_bpp_shift
.endif
.if (mask_bpp != 24) && (mask_bpp != 0)
    sub         MASK, MASK, W, lsl #mask_bpp_shift
.endif
    subs        H, H, #1
    mov         DST_R, DST_W
.if regs_shortage
    str         H, [sp, #4] /* save updated height to stack */
.endif
    bge         start_of_loop_label
.endm

/*
 * Registers are allocated in the following way by default:
 * d0, d1, d2, d3     - reserved for loading source pixel data
 * d4, d5, d6, d7     - reserved for loading destination pixel data
 * d24, d25, d26, d27 - reserved for loading mask pixel data
 * d28, d29, d30, d31 - final destination pixel data for writeback to memory
 */
.macro generate_composite_function fname, \
                                   src_bpp_, \
                                   mask_bpp_, \
                                   dst_w_bpp_, \
                                   flags, \
                                   pixblock_size_, \
                                   prefetch_distance, \
                                   init, \
                                   cleanup, \
                                   process_pixblock_head, \
                                   process_pixblock_tail, \
                                   process_pixblock_tail_head, \
                                   dst_w_basereg_ = 28, \
                                   dst_r_basereg_ = 4, \
                                   src_basereg_   = 0, \
                                   mask_basereg_  = 24

    pixman_asm_function fname

    push        {r4-r12, lr}        /* save all registers */

/*
 * Select prefetch type for this function. If prefetch distance is
 * set to 0 or one of the color formats is 24bpp, SIMPLE prefetch
 * has to be used instead of ADVANCED.
 */
    .set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_DEFAULT
.if prefetch_distance == 0
    .set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_NONE
.elseif (PREFETCH_TYPE_CURRENT > PREFETCH_TYPE_SIMPLE) && \
        ((src_bpp_ == 24) || (mask_bpp_ == 24) || (dst_w_bpp_ == 24))
    .set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_SIMPLE
.endif

/*
 * Make some macro arguments globally visible and accessible
 * from other macros
 */
    .set src_bpp, src_bpp_
    .set mask_bpp, mask_bpp_
    .set dst_w_bpp, dst_w_bpp_
    .set pixblock_size, pixblock_size_
    .set dst_w_basereg, dst_w_basereg_
    .set dst_r_basereg, dst_r_basereg_
    .set src_basereg, src_basereg_
    .set mask_basereg, mask_basereg_

    .macro pixld_src x:vararg
        pixld x
    .endm
    .macro fetch_src_pixblock
        pixld_src   pixblock_size, src_bpp, \
                    (src_basereg - pixblock_size * src_bpp / 64), SRC
    .endm
/*
 * Assign symbolic names to registers
 */
    W           .req        r0      /* width (is updated during processing) */
    H           .req        r1      /* height (is updated during processing) */
    DST_W       .req        r2      /* destination buffer pointer for writes */
    DST_STRIDE  .req        r3      /* destination image stride */
    SRC         .req        r4      /* source buffer pointer */
    SRC_STRIDE  .req        r5      /* source image stride */
    DST_R       .req        r6      /* destination buffer pointer for reads */

    MASK        .req        r7      /* mask pointer */
    MASK_STRIDE .req        r8      /* mask stride */

    PF_CTL      .req        r9      /* combined lines counter and prefetch */
                                    /* distance increment counter */
    PF_X        .req        r10     /* pixel index in a scanline for current */
                                    /* pretetch position */
    PF_SRC      .req        r11     /* pointer to source scanline start */
                                    /* for prefetch purposes */
    PF_DST      .req        r12     /* pointer to destination scanline start */
                                    /* for prefetch purposes */
    PF_MASK     .req        r14     /* pointer to mask scanline start */
                                    /* for prefetch purposes */
/*
 * Check whether we have enough registers for all the local variables.
 * If we don't have enough registers, original width and height are
 * kept on top of stack (and 'regs_shortage' variable is set to indicate
 * this for the rest of code). Even if there are enough registers, the
 * allocation scheme may be a bit different depending on whether source
 * or mask is not used.
 */
.if (PREFETCH_TYPE_CURRENT < PREFETCH_TYPE_ADVANCED)
    ORIG_W      .req        r10     /* saved original width */
    DUMMY       .req        r12     /* temporary register */
    .set        regs_shortage, 0
.elseif mask_bpp == 0
    ORIG_W      .req        r7      /* saved original width */
    DUMMY       .req        r8      /* temporary register */
    .set        regs_shortage, 0
.elseif src_bpp == 0
    ORIG_W      .req        r4      /* saved original width */
    DUMMY       .req        r5      /* temporary register */
    .set        regs_shortage, 0
.else
    ORIG_W      .req        r1      /* saved original width */
    DUMMY       .req        r1      /* temporary register */
    .set        regs_shortage, 1
.endif

    .set mask_bpp_shift, -1
.if src_bpp == 32
    .set src_bpp_shift, 2
.elseif src_bpp == 24
    .set src_bpp_shift, 0
.elseif src_bpp == 16
    .set src_bpp_shift, 1
.elseif src_bpp == 8
    .set src_bpp_shift, 0
.elseif src_bpp == 0
    .set src_bpp_shift, -1
.else
    .error "requested src bpp (src_bpp) is not supported"
.endif
.if mask_bpp == 32
    .set mask_bpp_shift, 2
.elseif mask_bpp == 24
    .set mask_bpp_shift, 0
.elseif mask_bpp == 8
    .set mask_bpp_shift, 0
.elseif mask_bpp == 0
    .set mask_bpp_shift, -1
.else
    .error "requested mask bpp (mask_bpp) is not supported"
.endif
.if dst_w_bpp == 32
    .set dst_bpp_shift, 2
.elseif dst_w_bpp == 24
    .set dst_bpp_shift, 0
.elseif dst_w_bpp == 16
    .set dst_bpp_shift, 1
.elseif dst_w_bpp == 8
    .set dst_bpp_shift, 0
.else
    .error "requested dst bpp (dst_w_bpp) is not supported"
.endif

.if (((flags) & FLAG_DST_READWRITE) != 0)
    .set dst_r_bpp, dst_w_bpp
.else
    .set dst_r_bpp, 0
.endif
.if (((flags) & FLAG_DEINTERLEAVE_32BPP) != 0)
    .set DEINTERLEAVE_32BPP_ENABLED, 1
.else
    .set DEINTERLEAVE_32BPP_ENABLED, 0
.endif

.if prefetch_distance < 0 || prefetch_distance > 15
    .error "invalid prefetch distance (prefetch_distance)"
.endif

.if src_bpp > 0
    ldr         SRC, [sp, #40]
.endif
.if mask_bpp > 0
    ldr         MASK, [sp, #48]
.endif
    PF mov      PF_X, #0
.if src_bpp > 0
    ldr         SRC_STRIDE, [sp, #44]
.endif
.if mask_bpp > 0
    ldr         MASK_STRIDE, [sp, #52]
.endif
    mov         DST_R, DST_W

.if src_bpp == 24
    sub         SRC_STRIDE, SRC_STRIDE, W
    sub         SRC_STRIDE, SRC_STRIDE, W, lsl #1
.endif
.if mask_bpp == 24
    sub         MASK_STRIDE, MASK_STRIDE, W
    sub         MASK_STRIDE, MASK_STRIDE, W, lsl #1
.endif
.if dst_w_bpp == 24
    sub         DST_STRIDE, DST_STRIDE, W
    sub         DST_STRIDE, DST_STRIDE, W, lsl #1
.endif

/*
 * Setup advanced prefetcher initial state
 */
    PF mov      PF_SRC, SRC
    PF mov      PF_DST, DST_R
    PF mov      PF_MASK, MASK
    /* PF_CTL = prefetch_distance | ((h - 1) << 4) */
    PF mov      PF_CTL, H, lsl #4
    PF add      PF_CTL, #(prefetch_distance - 0x10)

    init
.if regs_shortage
    push        {r0, r1}
.endif
    subs        H, H, #1
.if regs_shortage
    str         H, [sp, #4] /* save updated height to stack */
.else
    mov         ORIG_W, W
.endif
    blt         9f
    cmp         W, #(pixblock_size * 2)
    blt         8f
/*
 * This is the start of the pipelined loop, which if optimized for
 * long scanlines
 */
0:
    ensure_destination_ptr_alignment process_pixblock_head, \
                                     process_pixblock_tail, \
                                     process_pixblock_tail_head

    /* Implement "head (tail_head) ... (tail_head) tail" loop pattern */
    pixld_a     pixblock_size, dst_r_bpp, \
                (dst_r_basereg - pixblock_size * dst_r_bpp / 64), DST_R
    fetch_src_pixblock
    pixld       pixblock_size, mask_bpp, \
                (mask_basereg - pixblock_size * mask_bpp / 64), MASK
    PF add      PF_X, PF_X, #pixblock_size
    process_pixblock_head
    cache_preload 0, pixblock_size
    cache_preload_simple
    subs        W, W, #(pixblock_size * 2)
    blt         2f
1:
    process_pixblock_tail_head
    cache_preload_simple
    subs        W, W, #pixblock_size
    bge         1b
2:
    process_pixblock_tail
    pixst_a     pixblock_size, dst_w_bpp, \
                (dst_w_basereg - pixblock_size * dst_w_bpp / 64), DST_W

    /* Process the remaining trailing pixels in the scanline */
    process_trailing_pixels 1, 1, \
                            process_pixblock_head, \
                            process_pixblock_tail, \
                            process_pixblock_tail_head
    advance_to_next_scanline 0b

.if regs_shortage
    pop         {r0, r1}
.endif
    cleanup
    pop         {r4-r12, pc}  /* exit */
/*
 * This is the start of the loop, designed to process images with small width
 * (less than pixblock_size * 2 pixels). In this case neither pipelining
 * nor prefetch are used.
 */
8:
    /* Process exactly pixblock_size pixels if needed */
    tst         W, #pixblock_size
    beq         1f
    pixld       pixblock_size, dst_r_bpp, \
                (dst_r_basereg - pixblock_size * dst_r_bpp / 64), DST_R
    fetch_src_pixblock
    pixld       pixblock_size, mask_bpp, \
                (mask_basereg - pixblock_size * mask_bpp / 64), MASK
    process_pixblock_head
    process_pixblock_tail
    pixst       pixblock_size, dst_w_bpp, \
                (dst_w_basereg - pixblock_size * dst_w_bpp / 64), DST_W
1:
    /* Process the remaining trailing pixels in the scanline */
    process_trailing_pixels 0, 0, \
                            process_pixblock_head, \
                            process_pixblock_tail, \
                            process_pixblock_tail_head
    advance_to_next_scanline 8b
9:
.if regs_shortage
    pop         {r0, r1}
.endif
    cleanup
    pop         {r4-r12, pc}  /* exit */

    .purgem     fetch_src_pixblock
    .purgem     pixld_src

    .unreq      SRC
    .unreq      MASK
    .unreq      DST_R
    .unreq      DST_W
    .unreq      ORIG_W
    .unreq      W
    .unreq      H
    .unreq      SRC_STRIDE
    .unreq      DST_STRIDE
    .unreq      MASK_STRIDE
    .unreq      PF_CTL
    .unreq      PF_X
    .unreq      PF_SRC
    .unreq      PF_DST
    .unreq      PF_MASK
    .unreq      DUMMY
    .endfunc
.endm

/*
 * A simplified variant of function generation template for a single
 * scanline processing (for implementing pixman combine functions)
 */
.macro generate_composite_function_scanline        use_nearest_scaling, \
                                                   fname, \
                                                   src_bpp_, \
                                                   mask_bpp_, \
                                                   dst_w_bpp_, \
                                                   flags, \
                                                   pixblock_size_, \
                                                   init, \
                                                   cleanup, \
                                                   process_pixblock_head, \
                                                   process_pixblock_tail, \
                                                   process_pixblock_tail_head, \
                                                   dst_w_basereg_ = 28, \
                                                   dst_r_basereg_ = 4, \
                                                   src_basereg_   = 0, \
                                                   mask_basereg_  = 24

    pixman_asm_function fname

    .set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_NONE
/*
 * Make some macro arguments globally visible and accessible
 * from other macros
 */
    .set src_bpp, src_bpp_
    .set mask_bpp, mask_bpp_
    .set dst_w_bpp, dst_w_bpp_
    .set pixblock_size, pixblock_size_
    .set dst_w_basereg, dst_w_basereg_
    .set dst_r_basereg, dst_r_basereg_
    .set src_basereg, src_basereg_
    .set mask_basereg, mask_basereg_

.if use_nearest_scaling != 0
    /*
     * Assign symbolic names to registers for nearest scaling
     */
    W           .req        r0
    DST_W       .req        r1
    SRC         .req        r2
    VX          .req        r3
    UNIT_X      .req        ip
    MASK        .req        lr
    TMP1        .req        r4
    TMP2        .req        r5
    DST_R       .req        r6
    SRC_WIDTH_FIXED .req        r7

    .macro pixld_src x:vararg
        pixld_s x
    .endm

    ldr         UNIT_X, [sp]
    push        {r4-r8, lr}
    ldr         SRC_WIDTH_FIXED, [sp, #(24 + 4)]
    .if mask_bpp != 0
    ldr         MASK, [sp, #(24 + 8)]
    .endif
.else
    /*
     * Assign symbolic names to registers
     */
    W           .req        r0      /* width (is updated during processing) */
    DST_W       .req        r1      /* destination buffer pointer for writes */
    SRC         .req        r2      /* source buffer pointer */
    DST_R       .req        ip      /* destination buffer pointer for reads */
    MASK        .req        r3      /* mask pointer */

    .macro pixld_src x:vararg
        pixld x
    .endm
.endif

.if (((flags) & FLAG_DST_READWRITE) != 0)
    .set dst_r_bpp, dst_w_bpp
.else
    .set dst_r_bpp, 0
.endif
.if (((flags) & FLAG_DEINTERLEAVE_32BPP) != 0)
    .set DEINTERLEAVE_32BPP_ENABLED, 1
.else
    .set DEINTERLEAVE_32BPP_ENABLED, 0
.endif

    .macro fetch_src_pixblock
        pixld_src   pixblock_size, src_bpp, \
                    (src_basereg - pixblock_size * src_bpp / 64), SRC
    .endm

    init
    mov         DST_R, DST_W

    cmp         W, #pixblock_size
    blt         8f

    ensure_destination_ptr_alignment process_pixblock_head, \
                                     process_pixblock_tail, \
                                     process_pixblock_tail_head

    subs        W, W, #pixblock_size
    blt         7f

    /* Implement "head (tail_head) ... (tail_head) tail" loop pattern */
    pixld_a     pixblock_size, dst_r_bpp, \
                (dst_r_basereg - pixblock_size * dst_r_bpp / 64), DST_R
    fetch_src_pixblock
    pixld       pixblock_size, mask_bpp, \
                (mask_basereg - pixblock_size * mask_bpp / 64), MASK
    process_pixblock_head
    subs        W, W, #pixblock_size
    blt         2f
1:
    process_pixblock_tail_head
    subs        W, W, #pixblock_size
    bge         1b
2:
    process_pixblock_tail
    pixst_a     pixblock_size, dst_w_bpp, \
                (dst_w_basereg - pixblock_size * dst_w_bpp / 64), DST_W
7:
    /* Process the remaining trailing pixels in the scanline (dst aligned) */
    process_trailing_pixels 0, 1, \
                            process_pixblock_head, \
                            process_pixblock_tail, \
                            process_pixblock_tail_head

    cleanup
.if use_nearest_scaling != 0
    pop         {r4-r8, pc}  /* exit */
.else
    bx          lr  /* exit */
.endif
8:
    /* Process the remaining trailing pixels in the scanline (dst unaligned) */
    process_trailing_pixels 0, 0, \
                            process_pixblock_head, \
                            process_pixblock_tail, \
                            process_pixblock_tail_head

    cleanup

.if use_nearest_scaling != 0
    pop         {r4-r8, pc}  /* exit */

    .unreq      DST_R
    .unreq      SRC
    .unreq      W
    .unreq      VX
    .unreq      UNIT_X
    .unreq      TMP1
    .unreq      TMP2
    .unreq      DST_W
    .unreq      MASK
    .unreq      SRC_WIDTH_FIXED

.else
    bx          lr  /* exit */

    .unreq      SRC
    .unreq      MASK
    .unreq      DST_R
    .unreq      DST_W
    .unreq      W
.endif

    .purgem     fetch_src_pixblock
    .purgem     pixld_src

    .endfunc
.endm

.macro generate_composite_function_single_scanline x:vararg
    generate_composite_function_scanline 0, x
.endm

.macro generate_composite_function_nearest_scanline x:vararg
    generate_composite_function_scanline 1, x
.endm

/* Default prologue/epilogue, nothing special needs to be done */

.macro default_init
.endm

.macro default_cleanup
.endm

/*
 * Prologue/epilogue variant which additionally saves/restores d8-d15
 * registers (they need to be saved/restored by callee according to ABI).
 * This is required if the code needs to use all the NEON registers.
 */

.macro default_init_need_all_regs
    vpush       {d8-d15}
.endm

.macro default_cleanup_need_all_regs
    vpop        {d8-d15}
.endm

/******************************************************************************/


================================================
FILE: dependency/pixman/pixman-arma64-neon-asm.S
================================================
/*
 * Copyright © 2009 Nokia Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 *
 * Author:  Siarhei Siamashka (siarhei.siamashka@nokia.com)
 */

/*
 * This file contains implementations of NEON optimized pixel processing
 * functions. There is no full and detailed tutorial, but some functions
 * (those which are exposing some new or interesting features) are
 * extensively commented and can be used as examples.
 *
 * You may want to have a look at the comments for following functions:
 *  - pixman_composite_over_8888_0565_asm_neon
 *  - pixman_composite_over_n_8_0565_asm_neon
 */

/* Prevent the stack from becoming executable for no reason... */
#if defined(__linux__) && defined(__ELF__)
.section .note.GNU-stack,"",%progbits
#endif

.text
.arch armv8-a
.altmacro
.p2align 2

/* Supplementary macro for setting function attributes */
.macro pixman_asm_function fname
.func fname
.global fname
#ifdef __ELF__
.hidden fname
.type fname, %function
#endif
fname:
.endm

#include "pixman-arma64-neon-asm.h"

/* Global configuration options and preferences */

/*
 * The code can optionally make use of unaligned memory accesses to improve
 * performance of handling leading/trailing pixels for each scanline.
 * Configuration variable RESPECT_STRICT_ALIGNMENT can be set to 0 for
 * example in linux if unaligned memory accesses are not configured to
 * generate.exceptions.
 */
.set RESPECT_STRICT_ALIGNMENT, 1

/*
 * Set default prefetch type. There is a choice between the following options:
 *
 * PREFETCH_TYPE_NONE (may be useful for the ARM cores where PLD is set to work
 * as NOP to workaround some HW bugs or for whatever other reason)
 *
 * PREFETCH_TYPE_SIMPLE (may be useful for simple single-issue ARM cores where
 * advanced prefetch intruduces heavy overhead)
 *
 * PREFETCH_TYPE_ADVANCED (useful for superscalar cores such as ARM Cortex-A8
 * which can run ARM and NEON instructions simultaneously so that extra ARM
 * instructions do not add (many) extra cycles, but improve prefetch efficiency)
 *
 * Note: some types of function can't support advanced prefetch and fallback
 *       to simple one (those which handle 24bpp pixels)
 */
.set PREFETCH_TYPE_DEFAULT, PREFETCH_TYPE_ADVANCED

/* Prefetch distance in pixels for simple prefetch */
.set PREFETCH_DISTANCE_SIMPLE, 64

/*
 * Implementation of pixman_composite_over_8888_0565_asm_neon
 *
 * This function takes a8r8g8b8 source buffer, r5g6b5 destination buffer and
 * performs OVER compositing operation. Function fast_composite_over_8888_0565
 * from pixman-fast-path.c does the same in C and can be used as a reference.
 *
 * First we need to have some NEON assembly code which can do the actual
 * operation on the pixels and provide it to the template macro.
 *
 * Template macro quite conveniently takes care of emitting all the necessary
 * code for memory reading and writing (including quite tricky cases of
 * handling unaligned leading/trailing pixels), so we only need to deal with
 * the data in NEON registers.
 *
 * NEON registers allocation in general is recommented to be the following:
 * v0,  v1,  v2,  v3  - contain loaded source pixel data
 * v4,  v5,  v6,  v7  - contain loaded destination pixels (if they are needed)
 * v24, v25, v26, v27 - contain loading mask pixel data (if mask is used)
 * v28, v29, v30, v31 - place for storing the result (destination pixels)
 *
 * As can be seen above, four 64-bit NEON registers are used for keeping
 * intermediate pixel data and up to 8 pixels can be processed in one step
 * for 32bpp formats (16 pixels for 16bpp, 32 pixels for 8bpp).
 *
 * This particular function uses the following registers allocation:
 * v0,  v1,  v2,  v3  - contain loaded source pixel data
 * v4,  v5            - contain loaded destination pixels (they are needed)
 * v28, v29           - place for storing the result (destination pixels)
 */

/*
 * Step one. We need to have some code to do some arithmetics on pixel data.
 * This is implemented as a pair of macros: '*_head' and '*_tail'. When used
 * back-to-back, they take pixel data from {v0, v1, v2, v3} and {v4, v5},
 * perform all the needed calculations and write the result to {v28, v29}.
 * The rationale for having two macros and not just one will be explained
 * later. In practice, any single monolitic function which does the work can
 * be split into two parts in any arbitrary way without affecting correctness.
 *
 * There is one special trick here too. Common template macro can optionally
 * make our life a bit easier by doing R, G, B, A color components
 * deinterleaving for 32bpp pixel formats (and this feature is used in
 * 'pixman_composite_over_8888_0565_asm_neon' function). So it means that
 * instead of having 8 packed pixels in {v0, v1, v2, v3} registers, we
 * actually use v0 register for blue channel (a vector of eight 8-bit
 * values), v1 register for green, v2 for red and v3 for alpha. This
 * simple conversion can be also done with a few NEON instructions:
 *
 * Packed to planar conversion: // vuzp8 is a wrapper macro
 *  vuzp8 v0, v1
 *  vuzp8 v2, v3
 *  vuzp8 v1, v3
 *  vuzp8 v0, v2
 *
 * Planar to packed conversion: // vzip8 is a wrapper macro
 *  vzip8 v0, v2
 *  vzip8 v1, v3
 *  vzip8 v2, v3
 *  vzip8 v0, v1
 *
 * But pixel can be loaded directly in planar format using LD4 / b NEON
 * instruction. It is 1 cycle slower than LD1 / s, so this is not always
 * desirable, that's why deinterleaving is optional.
 *
 * But anyway, here is the code:
 */

.macro pixman_composite_out_reverse_8888_8888_process_pixblock_head
    mvn         v24.8b, v3.8b  /* get inverted alpha */
    /* do alpha blending */
    umull       v8.8h, v24.8b, v4.8b
    umull       v9.8h, v24.8b, v5.8b
    umull       v10.8h, v24.8b, v6.8b
    umull       v11.8h, v24.8b, v7.8b
.endm

.macro pixman_composite_out_reverse_8888_8888_process_pixblock_tail
    urshr       v14.8h, v8.8h, #8
    urshr       v15.8h, v9.8h, #8
    urshr       v16.8h, v10.8h, #8
    urshr       v17.8h, v11.8h, #8
    raddhn      v28.8b, v14.8h, v8.8h
    raddhn      v29.8b, v15.8h, v9.8h
    raddhn      v30.8b, v16.8h, v10.8h
    raddhn      v31.8b, v17.8h, v11.8h
.endm

/******************************************************************************/

.macro pixman_composite_over_8888_8888_process_pixblock_head
    pixman_composite_out_reverse_8888_8888_process_pixblock_head
.endm

.macro pixman_composite_over_8888_8888_process_pixblock_tail
    pixman_composite_out_reverse_8888_8888_process_pixblock_tail
    uqadd       v28.8b, v0.8b, v28.8b
    uqadd       v29.8b, v1.8b, v29.8b
    uqadd       v30.8b, v2.8b, v30.8b
    uqadd       v31.8b, v3.8b, v31.8b
.endm

.macro pixman_composite_over_8888_8888_process_pixblock_tail_head
     ld4        {v4.8b, v5.8b, v6.8b, v7.8b}, [DST_R], #32
        urshr       v14.8h, v8.8h, #8
                                    PF add PF_X, PF_X, #8
                                    PF tst PF_CTL, #0xF
        urshr       v15.8h, v9.8h, #8
        urshr       v16.8h, v10.8h, #8
        urshr       v17.8h, v11.8h, #8
                                    PF beq 10f
                                    PF add PF_X, PF_X, #8
                                    PF sub PF_CTL, PF_CTL, #1
10:
        raddhn      v28.8b, v14.8h, v8.8h
        raddhn      v29.8b, v15.8h, v9.8h
                                    PF cmp PF_X, ORIG_W
        raddhn      v30.8b, v16.8h, v10.8h
        raddhn      v31.8b, v17.8h, v11.8h
        uqadd       v28.8b, v0.8b, v28.8b
        uqadd       v29.8b, v1.8b, v29.8b
        uqadd       v30.8b, v2.8b, v30.8b
        uqadd       v31.8b, v3.8b, v31.8b
    fetch_src_pixblock
                                    PF lsl DUMMY, PF_X, #src_bpp_shift
                                    PF prfm PREFETCH_MODE, [PF_SRC, DUMMY]
    mvn        v22.8b, v3.8b
                                    PF lsl DUMMY, PF_X, #dst_bpp_shift
                                    PF prfm PREFETCH_MODE, [PF_DST, DUMMY]
         st4        {v28.8b, v29.8b, v30.8b, v31.8b}, [DST_W], #32
                                    PF ble 10f
                                    PF sub PF_X, PF_X, ORIG_W
10:
    umull      v8.8h, v22.8b, v4.8b
                                    PF ble 10f
                                    PF subs PF_CTL, PF_CTL, #0x10
10:
    umull      v9.8h, v22.8b, v5.8b
                                    PF ble 10f
                                    PF lsl DUMMY, SRC_STRIDE, #src_bpp_shift
                                    PF ldrsb DUMMY, [PF_SRC, DUMMY]
                                    PF add PF_SRC, PF_SRC, #1
10:
    umull      v10.8h, v22.8b, v6.8b
                                    PF ble 10f
                                    PF lsl DUMMY, DST_STRIDE, #dst_bpp_shift
                                    PF ldrsb DUMMY, [PF_DST, DUMMY]
                                    PF add PF_DST, PF_DST, #1
10:
    umull      v11.8h, v22.8b, v7.8b
.endm

generate_composite_function \
    pixman_composite_over_8888_8888_asm_neon, 32, 0, 32, \
    FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \
    8, /* number of pixels, processed in a single block */ \
    5, /* prefetch distance */ \
    default_init, \
    default_cleanup, \
    pixman_composite_over_8888_8888_process_pixblock_head, \
    pixman_composite_over_8888_8888_process_pixblock_tail, \
    pixman_composite_over_8888_8888_process_pixblock_tail_head

generate_composite_function_single_scanline \
    pixman_composite_scanline_over_asm_neon, 32, 0, 32, \
    FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \
    8, /* number of pixels, processed in a single block */ \
    default_init, \
    default_cleanup, \
    pixman_composite_over_8888_8888_process_pixblock_head, \
    pixman_composite_over_8888_8888_process_pixblock_tail, \
    pixman_composite_over_8888_8888_process_pixblock_tail_head

/******************************************************************************/

.macro pixman_composite_over_n_8888_process_pixblock_head
    /* deinterleaved source pixels in {v0, v1, v2, v3} */
    /* inverted alpha in {v24} */
    /* destination pixels in {v4, v5, v6, v7} */
    umull       v8.8h, v24.8b, v4.8b
    umull       v9.8h, v24.8b, v5.8b
    umull       v10.8h, v24.8b, v6.8b
    umull       v11.8h, v24.8b, v7.8b
.endm

.macro pixman_composite_over_n_8888_process_pixblock_tail
    urshr       v14.8h, v8.8h, #8
    urshr       v15.8h, v9.8h, #8
    urshr       v16.8h, v10.8h, #8
    urshr       v17.8h, v11.8h, #8
    raddhn      v28.8b, v14.8h, v8.8h
    raddhn      v29.8b, v15.8h, v9.8h
    raddhn      v30.8b, v16.8h, v10.8h
    raddhn      v31.8b, v17.8h, v11.8h
    uqadd       v28.8b, v0.8b, v28.8b
    uqadd       v29.8b, v1.8b, v29.8b
    uqadd       v30.8b, v2.8b, v30.8b
    uqadd       v31.8b, v3.8b, v31.8b
.endm

.macro pixman_composite_over_n_8888_process_pixblock_tail_head
        urshr       v14.8h, v8.8h, #8
        urshr       v15.8h, v9.8h, #8
        urshr       v16.8h, v10.8h, #8
        urshr       v17.8h, v11.8h, #8
        raddhn      v28.8b, v14.8h, v8.8h
        raddhn      v29.8b, v15.8h, v9.8h
        raddhn      v30.8b, v16.8h, v10.8h
        raddhn      v31.8b, v17.8h, v11.8h
    ld4         {v4.8b, v5.8b, v6.8b, v7.8b}, [DST_R], #32
        uqadd       v28.8b, v0.8b, v28.8b
                                    PF add PF_X, PF_X, #8
                                    PF tst PF_CTL, #0x0F
                                    PF beq 10f
                                    PF add PF_X, PF_X, #8
                                    PF sub PF_CTL, PF_CTL, #1
10:
        uqadd       v29.8b, v1.8b, v29.8b
        uqadd       v30.8b, v2.8b, v30.8b
        uqadd       v31.8b, v3.8b, v31.8b
                                    PF cmp PF_X, ORIG_W
    umull       v8.8h, v24.8b, v4.8b
                                    PF lsl DUMMY, PF_X, #dst_bpp_shift
                                    PF prfm PREFETCH_MODE, [PF_DST, DUMMY]
    umull       v9.8h, v24.8b, v5.8b
                                    PF ble 10f
                                    PF sub PF_X, PF_X, ORIG_W
10:
    umull       v10.8h, v24.8b, v6.8b
                                    PF subs PF_CTL, PF_CTL, #0x10
    umull       v11.8h, v24.8b, v7.8b
                                    PF ble 10f
                                    PF lsl DUMMY, DST_STRIDE, #dst_bpp_shift
                                    PF ldrsb DUMMY, [PF_DST, DUMMY]
                                    PF add PF_DST, PF_DST, #1
10:
        st4         {v28.8b, v29.8b, v30.8b, v31.8b}, [DST_W], #32
.endm

.macro pixman_composite_over_n_8888_init
    mov         v3.s[0], w4
    dup         v0.8b, v3.b[0]
    dup         v1.8b, v3.b[1]
    dup         v2.8b, v3.b[2]
    dup         v3.8b, v3.b[3]
    mvn         v24.8b, v3.8b  /* get inverted alpha */
.endm

generate_composite_function \
    pixman_composite_over_n_8888_asm_neon, 0, 0, 32, \
    FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \
    8, /* number of pixels, processed in a single block */ \
    5, /* prefetch distance */ \
    pixman_composite_over_n_8888_init, \
    default_cleanup, \
    pixman_composite_over_8888_8888_process_pixblock_head, \
    pixman_composite_over_8888_8888_process_pixblock_tail, \
    pixman_composite_over_n_8888_process_pixblock_tail_head

/******************************************************************************/

.macro pixman_composite_src_n_8888_process_pixblock_head
.endm

.macro pixman_composite_src_n_8888_process_pixblock_tail
.endm

.macro pixman_composite_src_n_8888_process_pixblock_tail_head
    st1         {v0.2s, v1.2s, v2.2s, v3.2s}, [DST_W], #32
.endm

.macro pixman_composite_src_n_8888_init
    mov         v0.s[0], w4
    dup         v3.2s, v0.s[0]
    dup         v2.2s, v0.s[0]
    dup         v1.2s, v0.s[0]
    dup         v0.2s, v0.s[0]
.endm

.macro pixman_composite_src_n_8888_cleanup
.endm

generate_composite_function \
    pixman_composite_src_n_8888_asm_neon, 0, 0, 32, \
    FLAG_DST_WRITEONLY, \
    8, /* number of pixels, processed in a single block */ \
    0, /* prefetch distance */ \
    pixman_composite_src_n_8888_init, \
    pixman_composite_src_n_8888_cleanup, \
    pixman_composite_src_n_8888_process_pixblock_head, \
    pixman_composite_src_n_8888_process_pixblock_tail, \
    pixman_composite_src_n_8888_process_pixblock_tail_head, \
    0, /* dst_w_basereg */ \
    0, /* dst_r_basereg */ \
    0, /* src_basereg   */ \
    0  /* mask_basereg  */

/******************************************************************************/

.macro pixman_composite_src_8888_8888_process_pixblock_head
.endm

.macro pixman_composite_src_8888_8888_process_pixblock_tail
.endm

.macro pixman_composite_src_8888_8888_process_pixblock_tail_head
    st1  {v0.2s, v1.2s, v2.2s, v3.2s}, [DST_W], #32
    fetch_src_pixblock
    cache_preload 8, 8
.endm

generate_composite_function \
    pixman_composite_src_8888_8888_asm_neon, 32, 0, 32, \
    FLAG_DST_WRITEONLY, \
    8, /* number of pixels, processed in a single block */ \
    10, /* prefetch distance */ \
    default_init, \
    default_cleanup, \
    pixman_composite_src_8888_8888_process_pixblock_head, \
    pixman_composite_src_8888_8888_process_pixblock_tail, \
    pixman_composite_src_8888_8888_process_pixblock_tail_head, \
    0, /* dst_w_basereg */ \
    0, /* dst_r_basereg */ \
    0, /* src_basereg   */ \
    0  /* mask_basereg  */

/******************************************************************************/


================================================
FILE: dependency/pixman/pixman-arma64-neon-asm.h
================================================
/*
 * Copyright © 2009 Nokia Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 *
 * Author:  Siarhei Siamashka (siarhei.siamashka@nokia.com)
 */

/*
 * This file contains a macro ('generate_composite_function') which can
 * construct 2D image processing functions, based on a common template.
 * Any combinations of source, destination and mask images with 8bpp,
 * 16bpp, 24bpp, 32bpp color formats are supported.
 *
 * This macro takes care of:
 *  - handling of leading and trailing unaligned pixels
 *  - doing most of the work related to L2 cache preload
 *  - encourages the use of software pipelining for better instructions
 *    scheduling
 *
 * The user of this macro has to provide some configuration parameters
 * (bit depths for the images, prefetch distance, etc.) and a set of
 * macros, which should implement basic code chunks responsible for
 * pixels processing. See 'pixman-armv8-neon-asm.S' file for the usage
 * examples.
 *
 * TODO:
 *  - try overlapped pixel method (from Ian Rickards) when processing
 *    exactly two blocks of pixels
 *  - maybe add an option to do reverse scanline processing
 */

/*
 * Bit flags for 'generate_composite_function' macro which are used
 * to tune generated functions behavior.
 */
.set FLAG_DST_WRITEONLY,       0
.set FLAG_DST_READWRITE,       1
.set FLAG_DEINTERLEAVE_32BPP,  2

/*
 * Constants for selecting preferable prefetch type.
 */
.set PREFETCH_TYPE_NONE,       0 /* No prefetch at all */
.set PREFETCH_TYPE_SIMPLE,     1 /* A simple, fixed-distance-ahead prefetch */
.set PREFETCH_TYPE_ADVANCED,   2 /* Advanced fine-grained prefetch */

/*
 * prefetch mode
 * available modes are:
 * pldl1keep
 * pldl1strm
 * pldl2keep
 * pldl2strm
 * pldl3keep
 * pldl3strm
 */
#define PREFETCH_MODE pldl1keep

/*
 * Definitions of supplementary pixld/pixst macros (for partial load/store of
 * pixel data).
 */

.macro pixldst1 op, elem_size, reg1, mem_operand, abits
    op {v&reg1&.&elem_size}, [&mem_operand&], #8
.endm

.macro pixldst2 op, elem_size, reg1, reg2, mem_operand, abits
    op {v&reg1&.&elem_size, v&reg2&.&elem_size}, [&mem_operand&], #16
.endm

.macro pixldst4 op, elem_size, reg1, reg2, reg3, reg4, mem_operand, abits
    op {v&reg1&.&elem_size, v&reg2&.&elem_size, v&reg3&.&elem_size, v&reg4&.&elem_size}, [&mem_operand&], #32
.endm

.macro pixldst0 op, elem_size, reg1, idx, mem_operand, abits, bytes
    op {v&reg1&.&elem_size}[idx], [&mem_operand&], #&bytes&
.endm

.macro pixldst3 op, elem_size, reg1, reg2, reg3, mem_operand
    op {v&reg1&.&elem_size, v&reg2&.&elem_size, v&reg3&.&elem_size}, [&mem_operand&], #24
.endm

.macro pixldst30 op, elem_size, reg1, reg2, reg3, idx, mem_operand
    op {v&reg1&.&elem_size, v&reg2&.&elem_size, v&reg3&.&elem_size}[idx], [&mem_operand&], #3
.endm

.macro pixldst numbytes, op, elem_size, basereg, mem_operand, abits
.if numbytes == 32
    .if elem_size==32
        pixldst4 op, 2s, %(basereg+4), %(basereg+5), \
                              %(basereg+6), %(basereg+7), mem_operand, abits
    .elseif elem_size==16
        pixldst4 op, 4h, %(basereg+4), %(basereg+5), \
                              %(basereg+6), %(basereg+7), mem_operand, abits
    .else
        pixldst4 op, 8b, %(basereg+4), %(basereg+5), \
                              %(basereg+6), %(basereg+7), mem_operand, abits
    .endif
.elseif numbytes == 16
    .if elem_size==32
          pixldst2 op, 2s, %(basereg+2), %(basereg+3), mem_operand, abits
    .elseif elem_size==16
          pixldst2 op, 4h, %(basereg+2), %(basereg+3), mem_operand, abits
    .else
          pixldst2 op, 8b, %(basereg+2), %(basereg+3), mem_operand, abits
    .endif
.elseif numbytes == 8
    .if elem_size==32
        pixldst1 op, 2s, %(basereg+1), mem_operand, abits
    .elseif elem_size==16
        pixldst1 op, 4h, %(basereg+1), mem_operand, abits
    .else
        pixldst1 op, 8b, %(basereg+1), mem_operand, abits
    .endif
.elseif numbytes == 4
    .if !RESPECT_STRICT_ALIGNMENT || (elem_size == 32)
        pixldst0 op, s, %(basereg+0), 1, mem_operand, abits, 4
    .elseif elem_size == 16
        pixldst0 op, h, %(basereg+0), 2, mem_operand, abits, 2
        pixldst0 op, h, %(basereg+0), 3, mem_operand, abits, 2
    .else
        pixldst0 op, b, %(basereg+0), 4, mem_operand, abits, 1
        pixldst0 op, b, %(basereg+0), 5, mem_operand, abits, 1
        pixldst0 op, b, %(basereg+0), 6, mem_operand, abits, 1
        pixldst0 op, b, %(basereg+0), 7, mem_operand, abits, 1
    .endif
.elseif numbytes == 2
    .if !RESPECT_STRICT_ALIGNMENT || (elem_size == 16)
        pixldst0 op, h, %(basereg+0), 1, mem_operand, abits, 2
    .else
        pixldst0 op, b, %(basereg+0), 2, mem_operand, abits, 1
        pixldst0 op, b, %(basereg+0), 3, mem_operand, abits, 1
    .endif
.elseif numbytes == 1
        pixldst0 op, b, %(basereg+0), 1, mem_operand, abits, 1
.else
    .error "unsupported size: numbytes"
.endif
.endm

.macro pixld numpix, bpp, basereg, mem_operand, abits=0
.if bpp > 0
.if (bpp == 32) && (numpix == 8) && (DEINTERLEAVE_32BPP_ENABLED != 0)
    pixldst4 ld4, 8b, %(basereg+4), %(basereg+5), \
                      %(basereg+6), %(basereg+7), mem_operand, abits
.elseif (bpp == 24) && (numpix == 8)
    pixldst3 ld3, 8b, %(basereg+3), %(basereg+4), %(basereg+5), mem_operand
.elseif (bpp == 24) && (numpix == 4)
    pixldst30 ld3, b, %(basereg+0), %(basereg+1), %(basereg+2), 4, mem_operand
    pixldst30 ld3, b, %(basereg+0), %(basereg+1), %(basereg+2), 5, mem_operand
    pixldst30 ld3, b, %(basereg+0), %(basereg+1), %(basereg+2), 6, mem_operand
    pixldst30 ld3, b, %(basereg+0), %(basereg+1), %(basereg+2), 7, mem_operand
.elseif (bpp == 24) && (numpix == 2)
    pixldst30 ld3, b, %(basereg+0), %(basereg+1), %(basereg+2), 2, mem_operand
    pixldst30 ld3, b, %(basereg+0), %(basereg+1), %(basereg+2), 3, mem_operand
.elseif (bpp == 24) && (numpix == 1)
    pixldst30 ld3, b, %(basereg+0), %(basereg+1), %(basereg+2), 1, mem_operand
.else
    pixldst %(numpix * bpp / 8), ld1, %(bpp), basereg, mem_operand, abits
.endif
.endif
.endm

.macro pixst numpix, bpp, basereg, mem_operand, abits=0
.if bpp > 0
.if (bpp == 32) && (numpix == 8) && (DEINTERLEAVE_32BPP_ENABLED != 0)
    pixldst4 st4, 8b, %(basereg+4), %(basereg+5), \
                      %(basereg+6), %(basereg+7), mem_operand, abits
.elseif (bpp == 24) && (numpix == 8)
    pixldst3 st3, 8b, %(basereg+3), %(basereg+4), %(basereg+5), mem_operand
.elseif (bpp == 24) && (numpix == 4)
    pixldst30 st3, b, %(basereg+0), %(basereg+1), %(basereg+2), 4, mem_operand
    pixldst30 st3, b, %(basereg+0), %(basereg+1), %(basereg+2), 5, mem_operand
    pixldst30 st3, b, %(basereg+0), %(basereg+1), %(basereg+2), 6, mem_operand
    pixldst30 st3, b, %(basereg+0), %(basereg+1), %(basereg+2), 7, mem_operand
.elseif (bpp == 24) && (numpix == 2)
    pixldst30 st3, b, %(basereg+0), %(basereg+1), %(basereg+2), 2, mem_operand
    pixldst30 st3, b, %(basereg+0), %(basereg+1), %(basereg+2), 3, mem_operand
.elseif (bpp == 24) && (numpix == 1)
    pixldst30 st3, b, %(basereg+0), %(basereg+1), %(basereg+2), 1, mem_operand
.else
    pixldst %(numpix * bpp / 8), st1, %(bpp), basereg, mem_operand, abits
.endif
.endif
.endm

.macro pixld_a numpix, bpp, basereg, mem_operand
.if (bpp * numpix) <= 128
    pixld numpix, bpp, basereg, mem_operand, %(bpp * numpix)
.else
    pixld numpix, bpp, basereg, mem_operand, 128
.endif
.endm

.macro pixst_a numpix, bpp, basereg, mem_operand
.if (bpp * numpix) <= 128
    pixst numpix, bpp, basereg, mem_operand, %(bpp * numpix)
.else
    pixst numpix, bpp, basereg, mem_operand, 128
.endif
.endm

/*
 * Pixel fetcher for nearest scaling (needs TMP1, TMP2, VX, UNIT_X register
 * aliases to be defined)
 */
.macro pixld1_s elem_size, reg1, mem_operand
.if elem_size == 16
    asr     TMP1, VX, #16
    adds    VX, VX, UNIT_X
    bmi     55f
5:  subs    VX, VX, SRC_WIDTH_FIXED
    bpl     5b
55:
    add     TMP1, mem_operand, TMP1, lsl #1
    asr     TMP2, VX, #16
    adds    VX, VX, UNIT_X
    bmi     55f
5:  subs    VX, VX, SRC_WIDTH_FIXED
    bpl     5b
55:
    add     TMP2, mem_operand, TMP2, lsl #1
    ld1     {v&reg1&.h}[0], [TMP1]
    asr     TMP1, VX, #16
    adds    VX, VX, UNIT_X
    bmi     55f
5:  subs    VX, VX, SRC_WIDTH_FIXED
    bpl     5b
55:
    add     TMP1, mem_operand, TMP1, lsl #1
    ld1     {v&reg1&.h}[1], [TMP2]
    asr     TMP2, VX, #16
    adds    VX, VX, UNIT_X
    bmi     55f
5:  subs    VX, VX, SRC_WIDTH_FIXED
    bpl     5b
55:
    add     TMP2, mem_operand, TMP2, lsl #1
    ld1     {v&reg1&.h}[2], [TMP1]
    ld1     {v&reg1&.h}[3], [TMP2]
.elseif elem_size == 32
    asr     TMP1, VX, #16
    adds    VX, VX, UNIT_X
    bmi     55f
5:  subs    VX, VX, SRC_WIDTH_FIXED
    bpl     5b
55:
    add     TMP1, mem_operand, TMP1, lsl #2
    asr     TMP2, VX, #16
    adds    VX, VX, UNIT_X
    bmi     55f
5:  subs    VX, VX, SRC_WIDTH_FIXED
    bpl     5b
55:
    add     TMP2, mem_operand, TMP2, lsl #2
    ld1     {v&reg1&.s}[0], [TMP1]
    ld1     {v&reg1&.s}[1], [TMP2]
.else
    .error "unsupported"
.endif
.endm

.macro pixld2_s elem_size, reg1, reg2, mem_operand
.if 0 /* elem_size == 32 */
    mov     TMP1, VX, asr #16
    add     VX, VX, UNIT_X, asl #1
    add     TMP1, mem_operand, TMP1, asl #2
    mov     TMP2, VX, asr #16
    sub     VX, VX, UNIT_X
    add     TMP2, mem_operand, TMP2, asl #2
    ld1     {v&reg1&.s}[0], [TMP1]
    mov     TMP1, VX, asr #16
    add     VX, VX, UNIT_X, asl #1
    add     TMP1, mem_operand, TMP1, asl #2
    ld1     {v&reg2&.s}[0], [TMP2, :32]
    mov     TMP2, VX, asr #16
    add     VX, VX, UNIT_X
    add     TMP2, mem_operand, TMP2, asl #2
    ld1     {v&reg1&.s}[1], [TMP1]
    ld1     {v&reg2&.s}[1], [TMP2]
.else
    pixld1_s elem_size, reg1, mem_operand
    pixld1_s elem_size, reg2, mem_operand
.endif
.endm

.macro pixld0_s elem_size, reg1, idx, mem_operand
.if elem_size == 16
    asr     TMP1, VX, #16
    adds    VX, VX, UNIT_X
    bmi     55f
5:  subs    VX, VX, SRC_WIDTH_FIXED
    bpl     5b
55:
    add     TMP1, mem_operand, TMP1, lsl #1
    ld1     {v&reg1&.h}[idx], [TMP1]
.elseif elem_size == 32
    asr     DUMMY, VX, #16
    mov     TMP1, DUMMY
    adds    VX, VX, UNIT_X
    bmi     55f
5:  subs    VX, VX, SRC_WIDTH_FIXED
    bpl     5b
55:
    add     TMP1, mem_operand, TMP1, lsl #2
    ld1     {v&reg1&.s}[idx], [TMP1]
.endif
.endm

.macro pixld_s_internal numbytes, elem_size, basereg, mem_operand
.if numbytes == 32
    pixld2_s elem_size, %(basereg+4), %(basereg+5), mem_operand
    pixld2_s elem_size, %(basereg+6), %(basereg+7), mem_operand
    pixdeinterleave elem_size, %(basereg+4)
.elseif numbytes == 16
    pixld2_s elem_size, %(basereg+2), %(basereg+3), mem_operand
.elseif numbytes == 8
    pixld1_s elem_size, %(basereg+1), mem_operand
.elseif numbytes == 4
    .if elem_size == 32
        pixld0_s elem_size, %(basereg+0), 1, mem_operand
    .elseif elem_size == 16
        pixld0_s elem_size, %(basereg+0), 2, mem_operand
        pixld0_s elem_size, %(basereg+0), 3, mem_operand
    .else
        pixld0_s elem_size, %(basereg+0), 4, mem_operand
        pixld0_s elem_size, %(basereg+0), 5, mem_operand
        pixld0_s elem_size, %(basereg+0), 6, mem_operand
        pixld0_s elem_size, %(basereg+0), 7, mem_operand
    .endif
.elseif numbytes == 2
    .if elem_size == 16
        pixld0_s elem_size, %(basereg+0), 1, mem_operand
    .else
        pixld0_s elem_size, %(basereg+0), 2, mem_operand
        pixld0_s elem_size, %(basereg+0), 3, mem_operand
    .endif
.elseif numbytes == 1
    pixld0_s elem_size, %(basereg+0), 1, mem_operand
.else
    .error "unsupported size: numbytes"
.endif
.endm

.macro pixld_s numpix, bpp, basereg, mem_operand
.if bpp > 0
    pixld_s_internal %(numpix * bpp / 8), %(bpp), basereg, mem_operand
.endif
.endm

.macro vuzp8 reg1, reg2
    umov DUMMY, v16.d[0]
    uzp1 v16.8b,     v&reg1&.8b, v&reg2&.8b
    uzp2 v&reg2&.8b, v&reg1&.8b, v&reg2&.8b
    mov  v&reg1&.8b, v16.8b
    mov  v16.d[0], DUMMY
.endm

.macro vzip8 reg1, reg2
    umov DUMMY, v16.d[0]
    zip1 v16.8b,     v&reg1&.8b, v&reg2&.8b
    zip2 v&reg2&.8b, v&reg1&.8b, v&reg2&.8b
    mov  v&reg1&.8b, v16.8b
    mov  v16.d[0], DUMMY
.endm

/* deinterleave B, G, R, A channels for eight 32bpp pixels in 4 registers */
.macro pixdeinterleave bpp, basereg
.if (bpp == 32) && (DEINTERLEAVE_32BPP_ENABLED != 0)
    vuzp8 %(basereg+0), %(basereg+1)
    vuzp8 %(basereg+2), %(basereg+3)
    vuzp8 %(basereg+1), %(basereg+3)
    vuzp8 %(basereg+0), %(basereg+2)
.endif
.endm

/* interleave B, G, R, A channels for eight 32bpp pixels in 4 registers */
.macro pixinterleave bpp, basereg
.if (bpp == 32) && (DEINTERLEAVE_32BPP_ENABLED != 0)
    vzip8 %(basereg+0), %(basereg+2)
    vzip8 %(basereg+1), %(basereg+3)
    vzip8 %(basereg+2), %(basereg+3)
    vzip8 %(basereg+0), %(basereg+1)
.endif
.endm

/*
 * This is a macro for implementing cache preload. The main idea is that
 * cache preload logic is mostly independent from the rest of pixels
 * processing code. It starts at the top left pixel and moves forward
 * across pixels and can jump across scanlines. Prefetch distance is
 * handled in an 'incremental' way: it starts from 0 and advances to the
 * optimal distance over time. After reaching optimal prefetch distance,
 * it is kept constant. There are some checks which prevent prefetching
 * unneeded pixel lines below the image (but it still can prefetch a bit
 * more data on the right side of the image - not a big issue and may
 * be actually helpful when rendering text glyphs). Additional trick is
 * the use of LDR instruction for prefetch instead of PLD when moving to
 * the next line, the point is that we have a high chance of getting TLB
 * miss in this case, and PLD would be useless.
 *
 * This sounds like it may introduce a noticeable overhead (when working with
 * fully cached data). But in reality, due to having a separate pipeline and
 * instruction queue for NEON unit in ARM Cortex-A8, normal ARM code can
 * execute simultaneously with NEON and be completely shadowed by it. Thus
 * we get no performance overhead at all (*). This looks like a very nice
 * feature of Cortex-A8, if used wisely. We don't have a hardware prefetcher,
 * but still can implement some rather advanced prefetch logic in software
 * for almost zero cost!
 *
 * (*) The overhead of the prefetcher is visible when running some trivial
 * pixels processing like simple copy. Anyway, having prefetch is a must
 * when working with the graphics data.
 */
.macro PF a, x:vararg
.if (PREFETCH_TYPE_CURRENT == PREFETCH_TYPE_ADVANCED)
    a x
.endif
.endm

.macro cache_preload std_increment, boost_increment
.if (src_bpp_shift >= 0) || (dst_r_bpp != 0) || (mask_bpp_shift >= 0)
.if std_increment != 0
    PF add PF_X, PF_X, #std_increment
.endif
    PF tst PF_CTL, #0xF
    PF beq 71f
    PF add PF_X, PF_X, #boost_increment
    PF sub PF_CTL, PF_CTL, #1
71:
    PF cmp PF_X, ORIG_W
.if src_bpp_shift >= 0
    PF lsl DUMMY, PF_X, #src_bpp_shift
    PF prfm PREFETCH_MODE, [PF_SRC, DUMMY]
.endif
.if dst_r_bpp != 0
    PF lsl DUMMY, PF_X, #dst_bpp_shift
    PF prfm PREFETCH_MODE, [PF_DST, DUMMY]
.endif
.if mask_bpp_shift >= 0
    PF lsl DUMMY, PF_X, #mask_bpp_shift
    PF prfm PREFETCH_MODE, [PF_MASK, DUMMY]
.endif
    PF ble 71f
    PF sub PF_X, PF_X, ORIG_W
    PF subs PF_CTL, PF_CTL, #0x10
71:
    PF ble 72f
.if src_bpp_shift >= 0
    PF lsl DUMMY, SRC_STRIDE, #src_bpp_shift
    PF ldrsb DUMMY, [PF_SRC, DUMMY]
    PF add PF_SRC, PF_SRC, #1
.endif
.if dst_r_bpp != 0
    PF lsl DUMMY, DST_STRIDE, #dst_bpp_shift
    PF ldrsb DUMMY, [PF_DST, DUMMY]
    PF add PF_DST, PF_DST, #1
.endif
.if mask_bpp_shift >= 0
    PF lsl DUMMY, MASK_STRIDE, #mask_bpp_shift
    PF ldrsb DUMMY, [PF_MASK, DUMMY]
    PF add PF_MASK, PF_MASK, #1
.endif
72:
.endif
.endm

.macro cache_preload_simple
.if (PREFETCH_TYPE_CURRENT == PREFETCH_TYPE_SIMPLE)
.if src_bpp > 0
    prfm PREFETCH_MODE, [SRC, #(PREFETCH_DISTANCE_SIMPLE * src_bpp / 8)]
.endif
.if dst_r_bpp > 0
    prfm PREFETCH_MODE, [DST_R, #(PREFETCH_DISTANCE_SIMPLE * dst_r_bpp / 8)]
.endif
.if mask_bpp > 0
    prfm PREFETCH_MODE, [MASK, #(PREFETCH_DISTANCE_SIMPLE * mask_bpp / 8)]
.endif
.endif
.endm

.macro fetch_mask_pixblock
    pixld       pixblock_size, mask_bpp, \
                (mask_basereg - pixblock_size * mask_bpp / 64), MASK
.endm

/*
 * Macro which is used to process leading pixels until destination
 * pointer is properly aligned (at 16 bytes boundary). When destination
 * buffer uses 16bpp format, this is unnecessary, or even pointless.
 */
.macro ensure_destination_ptr_alignment process_pixblock_head, \
                                        process_pixblock_tail, \
                                        process_pixblock_tail_head
.if dst_w_bpp != 24
    tst         DST_R, #0xF
    beq         52f
.irp lowbit, 1, 2, 4, 8, 16
local skip1
.if (dst_w_bpp <= (lowbit * 8)) && ((lowbit * 8) < (pixblock_size * dst_w_bpp))
.if lowbit < 16 /* we don't need more than 16-byte alignment */
    tst         DST_R, #lowbit
    beq         51f
.endif
    pixld_src   (lowbit * 8 / dst_w_bpp), src_bpp, src_basereg, SRC
    pixld       (lowbit * 8 / dst_w_bpp), mask_bpp, mask_basereg, MASK
.if dst_r_bpp > 0
    pixld_a     (lowbit * 8 / dst_r_bpp), dst_r_bpp, dst_r_basereg, DST_R
.else
    add         DST_R, DST_R, #lowbit
.endif
    PF add      PF_X, PF_X, #(lowbit * 8 / dst_w_bpp)
    sub         W, W, #(lowbit * 8 / dst_w_bpp)
51:
.endif
.endr
    pixdeinterleave src_bpp, src_basereg
    pixdeinterleave mask_bpp, mask_basereg
    pixdeinterleave dst_r_bpp, dst_r_basereg

    process_pixblock_head
    cache_preload 0, pixblock_size
    cache_preload_simple
    process_pixblock_tail

    pixinterleave dst_w_bpp, dst_w_basereg

.irp lowbit, 1, 2, 4, 8, 16
.if (dst_w_bpp <= (lowbit * 8)) && ((lowbit * 8) < (pixblock_size * dst_w_bpp))
.if lowbit < 16 /* we don't need more than 16-byte alignment */
    tst         DST_W, #lowbit
    beq         51f
.endif
    pixst_a     (lowbit * 8 / dst_w_bpp), dst_w_bpp, dst_w_basereg, DST_W
51:
.endif
.endr
.endif
52:
.endm

/*
 * Special code for processing up to (pixblock_size - 1) remaining
 * trailing pixels. As SIMD processing performs operation on
 * pixblock_size pixels, anything smaller than this has to be loaded
 * and stored in a special way. Loading and storing of pixel data is
 * performed in such a way that we fill some 'slots' in the NEON
 * registers (some slots naturally are unused), then perform compositing
 * operation as usual. In the end, the data is taken from these 'slots'
 * and saved to memory.
 *
 * cache_preload_flag - allows to suppress prefetch if
 *                      set to 0
 * dst_aligned_flag   - selects whether destination buffer
 *                      is aligned
 */
.macro process_trailing_pixels cache_preload_flag, \
                               dst_aligned_flag, \
                               process_pixblock_head, \
                               process_pixblock_tail, \
                               process_pixblock_tail_head
    tst         W, #(pixblock_size - 1)
    beq         52f
.irp chunk_size, 16, 8, 4, 2, 1
.if pixblock_size > chunk_size
    tst         W, #chunk_size
    beq         51f
    pixld_src   chunk_size, src_bpp, src_basereg, SRC
    pixld       chunk_size, mask_bpp, mask_basereg, MASK
.if dst_aligned_flag != 0
    pixld_a     chunk_size, dst_r_bpp, dst_r_basereg, DST_R
.else
    pixld       chunk_size, dst_r_bpp, dst_r_basereg, DST_R
.endif
.if cache_preload_flag != 0
    PF add      PF_X, PF_X, #chunk_size
.endif
51:
.endif
.endr
    pixdeinterleave src_bpp, src_basereg
    pixdeinterleave mask_bpp, mask_basereg
    pixdeinterleave dst_r_bpp, dst_r_basereg

    process_pixblock_head
.if cache_preload_flag != 0
    cache_preload 0, pixblock_size
    cache_preload_simple
.endif
    process_pixblock_tail
    pixinterleave dst_w_bpp, dst_w_basereg
.irp chunk_size, 16, 8, 4, 2, 1
.if pixblock_size > chunk_size
    tst         W, #chunk_size
    beq         51f
.if dst_aligned_flag != 0
    pixst_a     chunk_size, dst_w_bpp, dst_w_basereg, DST_W
.else
    pixst       chunk_size, dst_w_bpp, dst_w_basereg, DST_W
.endif
51:
.endif
.endr
52:
.endm

/*
 * Macro, which performs all the needed operations to switch to the next
 * scanline and start the next loop iteration unless all the scanlines
 * are already processed.
 */
.macro advance_to_next_scanline start_of_loop_label
    mov         W, ORIG_W
    add         DST_W, DST_W, DST_STRIDE, lsl #dst_bpp_shift
.if src_bpp != 0
    add         SRC, SRC, SRC_STRIDE, lsl #src_bpp_shift
.endif
.if mask_bpp != 0
    add         MASK, MASK, MASK_STRIDE, lsl #mask_bpp_shift
.endif
.if (dst_w_bpp != 24)
    sub         DST_W, DST_W, W, lsl #dst_bpp_shift
.endif
.if (src_bpp != 24) && (src_bpp != 0)
    sub         SRC, SRC, W, lsl #src_bpp_shift
.endif
.if (mask_bpp != 24) && (mask_bpp != 0)
    sub         MASK, MASK, W, lsl #mask_bpp_shift
.endif
    subs        H, H, #1
    mov         DST_R, DST_W
    bge         start_of_loop_label
.endm

/*
 * Registers are allocated in the following way by default:
 * v0, v1, v2, v3     - reserved for loading source pixel data
 * v4, v5, v6, v7     - reserved for loading destination pixel data
 * v24, v25, v26, v27 - reserved for loading mask pixel data
 * v28, v29, v30, v31 - final destination pixel data for writeback to memory
 */
.macro generate_composite_function fname, \
                                   src_bpp_, \
                                   mask_bpp_, \
                                   dst_w_bpp_, \
                                   flags, \
                                   pixblock_size_, \
                                   prefetch_distance, \
                                   init, \
                                   cleanup, \
                                   process_pixblock_head, \
                                   process_pixblock_tail, \
                                   process_pixblock_tail_head, \
                                   dst_w_basereg_ = 28, \
                                   dst_r_basereg_ = 4, \
                                   src_basereg_   = 0, \
                                   mask_basereg_  = 24

    pixman_asm_function fname
    stp         x29, x30, [sp, -16]!
    mov         x29, sp
    sub         sp,   sp, 232  /* push all registers */
    sub         x29, x29, 64
    st1         {v8.8b, v9.8b, v10.8b, v11.8b}, [x29], #32
    st1         {v12.8b, v13.8b, v14.8b, v15.8b}, [x29], #32
    stp          x8,   x9, [x29, -80]
    stp         x10,  x11, [x29, -96]
    stp         x12,  x13, [x29, -112]
    stp         x14,  x15, [x29, -128]
    stp         x16,  x17, [x29, -144]
    stp         x18,  x19, [x29, -160]
    stp         x20,  x21, [x29, -176]
    stp         x22,  x23, [x29, -192]
    stp         x24,  x25, [x29, -208]
    stp         x26,  x27, [x29, -224]
    str         x28, [x29, -232]

/*
 * Select prefetch type for this function. If prefetch distance is
 * set to 0 or one of the color formats is 24bpp, SIMPLE prefetch
 * has to be used instead of ADVANCED.
 */
    .set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_DEFAULT
.if prefetch_distance == 0
    .set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_NONE
.elseif (PREFETCH_TYPE_CURRENT > PREFETCH_TYPE_SIMPLE) && \
        ((src_bpp_ == 24) || (mask_bpp_ == 24) || (dst_w_bpp_ == 24))
    .set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_SIMPLE
.endif

/*
 * Make some macro arguments globally visible and accessible
 * from other macros
 */
    .set src_bpp, src_bpp_
    .set mask_bpp, mask_bpp_
    .set dst_w_bpp, dst_w_bpp_
    .set pixblock_size, pixblock_size_
    .set dst_w_basereg, dst_w_basereg_
    .set dst_r_basereg, dst_r_basereg_
    .set src_basereg, src_basereg_
    .set mask_basereg, mask_basereg_

    .macro pixld_src x:vararg
        pixld x
    .endm
    .macro fetch_src_pixblock
        pixld_src   pixblock_size, src_bpp, \
                    (src_basereg - pixblock_size * src_bpp / 64), SRC
    .endm
/*
 * Assign symbolic names to registers
 */
    W           .req       x0      /* width (is updated during processing) */
    H           .req       x1      /* height (is updated during processing) */
    DST_W       .req       x2      /* destination buffer pointer for writes */
    DST_STRIDE  .req       x3      /* destination image stride */
    SRC         .req       x4      /* source buffer pointer */
    SRC_STRIDE  .req       x5      /* source image stride */
    MASK        .req       x6      /* mask pointer */
    MASK_STRIDE .req       x7      /* mask stride */

    DST_R       .req       x8      /* destination buffer pointer for reads */

    PF_CTL      .req       x9      /* combined lines counter and prefetch */
                                    /* distance increment counter */
    PF_X        .req       x10     /* pixel index in a scanline for current */
                                    /* pretetch position */
    PF_SRC      .req       x11     /* pointer to source scanline start */
                                    /* for prefetch purposes */
    PF_DST      .req       x12     /* pointer to destination scanline start */
                                    /* for prefetch purposes */
    PF_MASK     .req       x13     /* pointer to mask scanline start */
                                    /* for prefetch purposes */

    ORIG_W      .req       x14     /* saved original width */
    DUMMY       .req       x15     /* temporary register */

    sxtw        x0, w0
    sxtw        x1, w1
    sxtw        x3, w3
    sxtw        x5, w5
    sxtw        x7, w7

    .set mask_bpp_shift, -1
.if src_bpp == 32
    .set src_bpp_shift, 2
.elseif src_bpp == 24
    .set src_bpp_shift, 0
.elseif src_bpp == 16
    .set src_bpp_shift, 1
.elseif src_bpp == 8
    .set src_bpp_shift, 0
.elseif src_bpp == 0
    .set src_bpp_shift, -1
.else
    .error "requested src bpp (src_bpp) is not supported"
.endif
.if mask_bpp == 32
    .set mask_bpp_shift, 2
.elseif mask_bpp == 24
    .set mask_bpp_shift, 0
.elseif mask_bpp == 8
    .set mask_bpp_shift, 0
.elseif mask_bpp == 0
    .set mask_bpp_shift, -1
.else
    .error "requested mask bpp (mask_bpp) is not supported"
.endif
.if dst_w_bpp == 32
    .set dst_bpp_shift, 2
.elseif dst_w_bpp == 24
    .set dst_bpp_shift, 0
.elseif dst_w_bpp == 16
    .set dst_bpp_shift, 1
.elseif dst_w_bpp == 8
    .set dst_bpp_shift, 0
.else
    .error "requested dst bpp (dst_w_bpp) is not supported"
.endif

.if (((flags) & FLAG_DST_READWRITE) != 0)
    .set dst_r_bpp, dst_w_bpp
.else
    .set dst_r_bpp, 0
.endif
.if (((flags) & FLAG_DEINTERLEAVE_32BPP) != 0)
    .set DEINTERLEAVE_32BPP_ENABLED, 1
.else
    .set DEINTERLEAVE_32BPP_ENABLED, 0
.endif

.if prefetch_distance < 0 || prefetch_distance > 15
    .error "invalid prefetch distance (prefetch_distance)"
.endif

    PF mov      PF_X, #0
    mov         DST_R, DST_W

.if src_bpp == 24
    sub         SRC_STRIDE, SRC_STRIDE, W
    sub         SRC_STRIDE, SRC_STRIDE, W, lsl #1
.endif
.if mask_bpp == 24
    sub         MASK_STRIDE, MASK_STRIDE, W
    sub         MASK_STRIDE, MASK_STRIDE, W, lsl #1
.endif
.if dst_w_bpp == 24
    sub         DST_STRIDE, DST_STRIDE, W
    sub         DST_STRIDE, DST_STRIDE, W, lsl #1
.endif

/*
 * Setup advanced prefetcher initial state
 */
    PF mov      PF_SRC, SRC
    PF mov      PF_DST, DST_R
    PF mov      PF_MASK, MASK
    /* PF_CTL = prefetch_distance | ((h - 1) << 4) */
    PF lsl      DUMMY, H, #4
    PF mov      PF_CTL, DUMMY
    PF add      PF_CTL, PF_CTL, #(prefetch_distance - 0x10)

    init
    subs        H, H, #1
    mov         ORIG_W, W
    blt         9f
    cmp         W, #(pixblock_size * 2)
    blt         800f
/*
 * This is the start of the pipelined loop, which if optimized for
 * long scanlines
 */
0:
    ensure_destination_ptr_alignment process_pixblock_head, \
                                     process_pixblock_tail, \
                                     process_pixblock_tail_head

    /* Implement "head (tail_head) ... (tail_head) tail" loop pattern */
    pixld_a     pixblock_size, dst_r_bpp, \
                (dst_r_basereg - pixblock_size * dst_r_bpp / 64), DST_R
    fetch_src_pixblock
    pixld       pixblock_size, mask_bpp, \
                (mask_basereg - pixblock_size * mask_bpp / 64), MASK
    PF add      PF_X, PF_X, #pixblock_size
    process_pixblock_head
    cache_preload 0, pixblock_size
    cache_preload_simple
    subs        W, W, #(pixblock_size * 2)
    blt         200f

100:
    process_pixblock_tail_head
    cache_preload_simple
    subs        W, W, #pixblock_size
    bge         100b

200:
    process_pixblock_tail
    pixst_a     pixblock_size, dst_w_bpp, \
                (dst_w_basereg - pixblock_size * dst_w_bpp / 64), DST_W

    /* Process the remaining trailing pixels in the scanline */
    process_trailing_pixels 1, 1, \
                            process_pixblock_head, \
                            process_pixblock_tail, \
                            process_pixblock_tail_head
    advance_to_next_scanline 0b

    cleanup
1000:
    /* pop all registers */
    sub         x29, x29, 64
    ld1         {v8.8b, v9.8b, v10.8b, v11.8b}, [x29], 32
    ld1         {v12.8b, v13.8b, v14.8b, v15.8b}, [x29], 32
    ldp          x8,   x9, [x29, -80]
    ldp         x10,  x11, [x29, -96]
    ldp         x12,  x13, [x29, -112]
    ldp         x14,  x15, [x29, -128]
    ldp         x16,  x17, [x29, -144]
    ldp         x18,  x19, [x29, -160]
    ldp         x20,  x21, [x29, -176]
    ldp         x22,  x23, [x29, -192]
    ldp         x24,  x25, [x29, -208]
    ldp         x26,  x27, [x29, -224]
    ldr         x28, [x29, -232]
    mov         sp, x29
    ldp         x29, x30, [sp], 16 
    ret  /* exit */
/*
 * This is the start of the loop, designed to process images with small width
 * (less than pixblock_size * 2 pixels). In this case neither pipelining
 * nor prefetch are used.
 */
800:
    /* Process exactly pixblock_size pixels if needed */
    tst         W, #pixblock_size
    beq         100f
    pixld       pixblock_size, dst_r_bpp, \
                (dst_r_basereg - pixblock_size * dst_r_bpp / 64), DST_R
    fetch_src_pixblock
    pixld       pixblock_size, mask_bpp, \
                (mask_basereg - pixblock_size * mask_bpp / 64), MASK
    process_pixblock_head
    process_pixblock_tail
    pixst       pixblock_size, dst_w_bpp, \
                (dst_w_basereg - pixblock_size * dst_w_bpp / 64), DST_W
100:
    /* Process the remaining trailing pixels in the scanline */
    process_trailing_pixels 0, 0, \
                            process_pixblock_head, \
                            process_pixblock_tail, \
                            process_pixblock_tail_head
    advance_to_next_scanline 800b
9:
    cleanup
    /* pop all registers */
    sub         x29, x29, 64
    ld1         {v8.8b, v9.8b, v10.8b, v11.8b}, [x29], 32
    ld1         {v12.8b, v13.8b, v14.8b, v15.8b}, [x29], 32
    ldp          x8,   x9, [x29, -80]
    ldp         x10,  x11, [x29, -96]
    ldp         x12,  x13, [x29, -112]
    ldp         x14,  x15, [x29, -128]
    ldp         x16,  x17, [x29, -144]
    ldp         x18,  x19, [x29, -160]
    ldp         x20,  x21, [x29, -176]
    ldp         x22,  x23, [x29, -192]
    ldp         x24,  x25, [x29, -208]
    ldp         x26,  x27, [x29, -224]
    ldr         x28, [x29, -232]
    mov         sp, x29
    ldp         x29, x30, [sp], 16 
    ret  /* exit */

    .purgem     fetch_src_pixblock
    .purgem     pixld_src

    .unreq      SRC
    .unreq      MASK
    .unreq      DST_R
    .unreq      DST_W
    .unreq      ORIG_W
    .unreq      W
    .unreq      H
    .unreq      SRC_STRIDE
    .unreq      DST_STRIDE
    .unreq      MASK_STRIDE
    .unreq      PF_CTL
    .unreq      PF_X
    .unreq      PF_SRC
    .unreq      PF_DST
    .unreq      PF_MASK
    .unreq      DUMMY
    .endfunc
.endm

/*
 * A simplified variant of function generation template for a single
 * scanline processing (for implementing pixman combine functions)
 */
.macro generate_composite_function_scanline        use_nearest_scaling, \
                                                   fname, \
                                                   src_bpp_, \
                                                   mask_bpp_, \
                                                   dst_w_bpp_, \
                                                   flags, \
                                                   pixblock_size_, \
                                                   init, \
                                                   cleanup, \
                                                   process_pixblock_head, \
                                                   process_pixblock_tail, \
                                                   process_pixblock_tail_head, \
                                                   dst_w_basereg_ = 28, \
                                                   dst_r_basereg_ = 4, \
                                                   src_basereg_   = 0, \
                                                   mask_basereg_  = 24

    pixman_asm_function fname
    .set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_NONE

/*
 * Make some macro arguments globally visible and accessible
 * from other macros
 */
    .set src_bpp, src_bpp_
    .set mask_bpp, mask_bpp_
    .set dst_w_bpp, dst_w_bpp_
    .set pixblock_size, pixblock_size_
    .set dst_w_basereg, dst_w_basereg_
    .set dst_r_basereg, dst_r_basereg_
    .set src_basereg, src_basereg_
    .set mask_basereg, mask_basereg_
    
.if use_nearest_scaling != 0
    /*
     * Assign symbolic names to registers for nearest scaling
     */
    W           .req        x0
    DST_W       .req        x1
    SRC         .req        x2
    VX          .req        x3
    UNIT_X      .req        x4
    SRC_WIDTH_FIXED .req    x5
    MASK        .req        x6
    TMP1        .req        x8
    TMP2        .req        x9
    DST_R       .req        x10
    DUMMY       .req        x30

    .macro pixld_src x:vararg
        pixld_s x
    .endm

    sxtw        x0, w0
    sxtw        x3, w3
    sxtw        x4, w4
    sxtw        x5, w5

    stp         x29, x30, [sp, -16]!
    mov         x29, sp
    sub         sp, sp, 88
    sub         x29, x29, 64
    st1         {v8.8b, v9.8b, v10.8b, v11.8b}, [x29], 32
    st1         {v12.8b, v13.8b, v14.8b, v15.8b}, [x29], 32
    stp         x8, x9, [x29, -80]
    str         x10, [x29, -88]
.else
    /*
     * Assign symbolic names to registers
     */
    W           .req        x0      /* width (is updated during processing) */
    DST_W       .req        x1      /* destination buffer pointer for writes */
    SRC         .req        x2      /* source buffer pointer */
    MASK        .req        x3      /* mask pointer */
    DST_R       .req        x4      /* destination buffer pointer for reads */
    DUMMY       .req        x30

    .macro pixld_src x:vararg
        pixld x
    .endm

    sxtw        x0, w0

    stp         x29, x30, [sp, -16]!
    mov         x29, sp
    sub         sp, sp, 64
    sub         x29, x29, 64
    st1         {v8.8b, v9.8b, v10.8b, v11.8b}, [x29], 32
    st1         {v12.8b, v13.8b, v14.8b, v15.8b}, [x29], 32
.endif

.if (((flags) & FLAG_DST_READWRITE) != 0)
    .set dst_r_bpp, dst_w_bpp
.else
    .set dst_r_bpp, 0
.endif
.if (((flags) & FLAG_DEINTERLEAVE_32BPP) != 0)
    .set DEINTERLEAVE_32BPP_ENABLED, 1
.else
    .set DEINTERLEAVE_32BPP_ENABLED, 0
.endif

    .macro fetch_src_pixblock
        pixld_src   pixblock_size, src_bpp, \
                    (src_basereg - pixblock_size * src_bpp / 64), SRC
    .endm

    init
    mov         DST_R, DST_W

    cmp         W, #pixblock_size
    blt         800f

    ensure_destination_ptr_alignment process_pixblock_head, \
                                     process_pixblock_tail, \
                                     process_pixblock_tail_head

    subs        W, W, #pixblock_size
    blt         700f

    /* Implement "head (tail_head) ... (tail_head) tail" loop pattern */
    pixld_a     pixblock_size, dst_r_bpp, \
                (dst_r_basereg - pixblock_size * dst_r_bpp / 64), DST_R
    fetch_src_pixblock
    pixld       pixblock_size, mask_bpp, \
                (mask_basereg - pixblock_size * mask_bpp / 64), MASK
    process_pixblock_head
    subs        W, W, #pixblock_size
    blt         200f
100:
    process_pixblock_tail_head
    subs        W, W, #pixblock_size
    bge         100b
200:
    process_pixblock_tail
    pixst_a     pixblock_size, dst_w_bpp, \
                (dst_w_basereg - pixblock_size * dst_w_bpp / 64), DST_W
700:
    /* Process the remaining trailing pixels in the scanline (dst aligned) */
    process_trailing_pixels 0, 1, \
                            process_pixblock_head, \
                            process_pixblock_tail, \
                            process_pixblock_tail_head

    cleanup
.if use_nearest_scaling != 0
    sub         x29, x29, 64
    ld1         {v8.8b, v9.8b, v10.8b, v11.8b}, [x29], 32
    ld1         {v12.8b, v13.8b, v14.8b, v15.8b}, [x29], 32
    ldp         x8, x9, [x29, -80]
    ldr         x10, [x29, -96]
    mov         sp, x29
    ldp         x29, x30, [sp], 16 
    ret  /* exit */
.else
    sub         x29, x29, 64
    ld1         {v8.8b, v9.8b, v10.8b, v11.8b}, [x29], 32
    ld1         {v12.8b, v13.8b, v14.8b, v15.8b}, [x29], 32
    mov         sp, x29
    ldp         x29, x30, [sp], 16 
    ret  /* exit */
.endif
800:
    /* Process the remaining trailing pixels in the scanline (dst unaligned) */
    process_trailing_pixels 0, 0, \
                            process_pixblock_head, \
                            process_pixblock_tail, \
                            process_pixblock_tail_head

    cleanup
.if use_nearest_scaling != 0
    sub         x29, x29, 64
    ld1         {v8.8b, v9.8b, v10.8b, v11.8b}, [x29], 32
    ld1         {v12.8b, v13.8b, v14.8b, v15.8b}, [x29], 32
    ldp         x8, x9, [x29, -80]
    ldr         x10, [x29, -88]
    mov         sp, x29
    ldp         x29, x30, [sp], 16 
    ret  /* exit */

    .unreq      DUMMY
    .unreq      DST_R
    .unreq      SRC
    .unreq      W
    .unreq      VX
    .unreq      UNIT_X
    .unreq      TMP1
    .unreq      TMP2
    .unreq      DST_W
    .unreq      MASK
    .unreq      SRC_WIDTH_FIXED

.else
    sub         x29, x29, 64
    ld1         {v8.8b, v9.8b, v10.8b, v11.8b}, [x29], 32
    ld1         {v12.8b, v13.8b, v14.8b, v15.8b}, [x29], 32
    mov          sp, x29
    ldp          x29, x30, [sp], 16 
    ret  /* exit */

    .unreq      DUMMY
    .unreq      SRC
    .unreq      MASK
    .unreq      DST_R
    .unreq      DST_W
    .unreq      W
.endif

    .purgem     fetch_src_pixblock
    .purgem     pixld_src

    .endfunc
.endm

.macro generate_composite_function_single_scanline x:vararg
    generate_composite_function_scanline 0, x
.endm

.macro generate_composite_function_nearest_scanline x:vararg
    generate_composite_function_scanline 1, x
.endm

/* Default prologue/epilogue, nothing special needs to be done */

.macro default_init
.endm

.macro default_cleanup
.endm

/*
 * Prologue/epilogue variant which additionally saves/restores v8-v15
 * registers (they need to be saved/restored by callee according to ABI).
 * This is required if the code needs to use all the NEON registers.
 */

.macro default_init_need_all_regs
.endm

.macro default_cleanup_need_all_regs
.endm

/******************************************************************************/


================================================
FILE: dependency/pixman/pixman-cpp-standard.cpp
================================================
#include <memory>

#define BYTE_MUL(c, a)                                  \
    ((((((c) >> 8) & 0x00ff00ff) * (a)) & 0xff00ff00) + \
     (((((c)&0x00ff00ff) * (a)) >> 8) & 0x00ff00ff))

extern "C" void pixman_composite_src_n_8888_asm_neon(int32_t w, int32_t h,
                                                     uint32_t *dst,
                                                     int32_t   dst_stride,
                                                     uint32_t  src)
{
    int total_len = w * h;
    memset(dst, src, total_len);
}

inline constexpr int vAlpha(uint32_t c)
{
    return c >> 24;
}

extern "C" void pixman_composite_over_n_8888_asm_neon(int32_t w, int32_t h,
                                                      uint32_t *dst,
                                                      int32_t   dst_stride,
                                                      uint32_t  color) {
    int total_len = w * h;
    int ialpha = 255 - vAlpha(color);
    for (int i = 0; i < total_len; ++i)
    {
      dst[i] = color + BYTE_MUL(dst[i], ialpha);
    }
}

================================================
FILE: projects/AndroidStudio/.gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties


================================================
FILE: projects/AndroidStudio/.idea/.gitignore
================================================
# Default ignored files
/shelf/
/workspace.xml


================================================
FILE: projects/AndroidStudio/.idea/.name
================================================
UnityRLottie

================================================
FILE: projects/AndroidStudio/.idea/compiler.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="CompilerConfiguration">
    <bytecodeTargetLevel target="11" />
  </component>
</project>

================================================
FILE: projects/AndroidStudio/.idea/gradle.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="GradleMigrationSettings" migrationVersion="1" />
  <component name="GradleSettings">
    <option name="linkedExternalProjectsSettings">
      <GradleProjectSettings>
        <option name="testRunner" value="GRADLE" />
        <option name="distributionType" value="DEFAULT_WRAPPED" />
        <option name="externalProjectPath" value="$PROJECT_DIR$" />
        <option name="gradleJvm" value="11" />
        <option name="modules">
          <set>
            <option value="$PROJECT_DIR$" />
            <option value="$PROJECT_DIR$/app" />
          </set>
        </option>
        <option name="resolveModulePerSourceSet" value="false" />
      </GradleProjectSettings>
    </option>
  </component>
</project>

================================================
FILE: projects/AndroidStudio/.idea/misc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="1.8" project-jdk-type="JavaSDK">
    <output url="file://$PROJECT_DIR$/build/classes" />
  </component>
  <component name="ProjectType">
    <option name="id" value="Android" />
  </component>
</project>

================================================
FILE: projects/AndroidStudio/.idea/vcs.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="VcsDirectoryMappings">
    <mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
  </component>
</project>

================================================
FILE: projects/AndroidStudio/app/.gitignore
================================================
/build
/.cxx

================================================
FILE: projects/AndroidStudio/app/build.gradle
================================================
plugins {
    id 'com.android.application'
}

android {
    namespace 'com.gindemit.rlottie'
    compileSdk 33
    ndkVersion '22.1.7171670'

    defaultConfig {
        applicationId "com.gindemit.rlottie"
        minSdk 21
        targetSdk 33
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        ndk {
            abiFilters "arm64-v8a", "armeabi-v7a", "x86", "x86_64"
        }
        externalNativeBuild {
            cmake {
                cppFlags '-std=c++14'
                if (project.hasProperty('ANDROID_16K_PAGE') && project.getProperty('ANDROID_16K_PAGE') == 'ON') {
                    arguments "-DRLOTTIE_ANDROID_PAGE_SIZE_16K=ON"
                }
            }
        }

    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    externalNativeBuild {
        cmake {
            path file('../../CMake/CMakeLists.txt')
            version '3.25.2'
        }
    }
    buildFeatures {
        viewBinding true
    }
}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.3.1'
    implementation 'com.google.android.material:material:1.4.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

================================================
FILE: projects/AndroidStudio/app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

================================================
FILE: projects/AndroidStudio/app/src/androidTest/java/com/gindemit/rlottie/ExampleInstrumentedTest.java
================================================
package com.gindemit.rlottie;

import android.content.Context;

import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;

/**
 * Instrumented test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
        assertEquals("com.gindemit.rlottie", appContext.getPackageName());
    }
}

================================================
FILE: projects/AndroidStudio/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.UnityRLottie">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

================================================
FILE: projects/AndroidStudio/app/src/main/java/com/gindemit/rlottie/MainActivity.java
================================================
package com.gindemit.rlottie;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

import com.gindemit.rlottie.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    // Used to load the 'rlottie' library on application startup.
    static {
        System.loadLibrary("rlottie");
    }

    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        // Example of a call to a native method
        TextView tv = binding.sampleText;
        tv.setText(stringFromJNI());
    }

    /**
     * A native method that is implemented by the 'rlottie' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();
}

================================================
FILE: projects/AndroidStudio/app/src/main/res/drawable/ic_launcher_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="108dp"
    android:height="108dp"
    android:viewportWidth="108"
    android:viewportHeight="108">
    <path
        android:fillColor="#3DDC84"
        android:pathData="M0,0h108v108h-108z" />
    <path
        android:fillColor="#00000000"
        android:pathData="M9,0L9,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,0L19,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M29,0L29,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M39,0L39,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M49,0L49,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M59,0L59,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M69,0L69,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M79,0L79,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M89,0L89,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M99,0L99,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,9L108,9"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,19L108,19"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,29L108,29"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,39L108,39"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,49L108,49"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,59L108,59"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,69L108,69"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,79L108,79"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,89L108,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,99L108,99"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,29L89,29"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,39L89,39"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,49L89,49"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,59L89,59"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,69L89,69"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,79L89,79"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M29,19L29,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M39,19L39,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M49,19L49,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M59,19L59,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M69,19L69,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M79,19L79,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
</vector>


================================================
FILE: projects/AndroidStudio/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt"
    android:width="108dp"
    android:height="108dp"
    android:viewportWidth="108"
    android:viewportHeight="108">
    <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
        <aapt:attr name="android:fillColor">
            <gradient
                android:endX="85.84757"
                android:endY="92.4963"
                android:startX="42.9492"
                android:startY="49.59793"
                android:type="linear">
                <item
                    android:color="#44000000"
                    android:offset="0.0" />
                <item
                    android:color="#00000000"
                    android:offset="1.0" />
            </gradient>
        </aapt:attr>
    </path>
    <path
        android:fillColor="#FFFFFF"
        android:fillType="nonZero"
        android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
        android:strokeWidth="1"
        android:strokeColor="#00000000" />
</vector>

================================================
FILE: projects/AndroidStudio/app/src/main/res/layout/activity_main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/sample_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

================================================
FILE: projects/AndroidStudio/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@drawable/ic_launcher_background" />
    <foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

================================================
FILE: projects/AndroidStudio/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@drawable/ic_launcher_background" />
    <foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

================================================
FILE: projects/AndroidStudio/app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="purple_200">#FFBB86FC</color>
    <color name="purple_500">#FF6200EE</color>
    <color name="purple_700">#FF3700B3</color>
    <color name="teal_200">#FF03DAC5</color>
    <color name="teal_700">#FF018786</color>
    <color name="black">#FF000000</color>
    <color name="white">#FFFFFFFF</color>
</resources>

================================================
FILE: projects/AndroidStudio/app/src/main/res/values/strings.xml
================================================
<resources>
    <string name="app_name">UnityRLottie</string>
</resources>

================================================
FILE: projects/AndroidStudio/app/src/main/res/values/themes.xml
================================================
<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.UnityRLottie" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/purple_500</item>
        <item name="colorPrimaryVariant">@color/purple_700</item>
        <item name="colorOnPrimary">@color/white</item>
        <!-- Secondary brand color. -->
        <item name="colorSecondary">@color/teal_200</item>
        <item name="colorSecondaryVariant">@color/teal_700</item>
        <item name="colorOnSecondary">@color/black</item>
        <!-- Status bar color. -->
        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
        <!-- Customize your theme here. -->
    </style>
</resources>

================================================
FILE: projects/AndroidStudio/app/src/main/res/values-night/themes.xml
================================================
<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.UnityRLottie" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/purple_200</item>
        <item name="colorPrimaryVariant">@color/purple_700</item>
        <item name="colorOnPrimary">@color/black</item>
        <!-- Secondary brand color. -->
        <item name="colorSecondary">@color/teal_200</item>
        <item name="colorSecondaryVariant">@color/teal_200</item>
        <item name="colorOnSecondary">@color/black</item>
        <!-- Status bar color. -->
        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
        <!-- Customize your theme here. -->
    </style>
</resources>

================================================
FILE: projects/AndroidStudio/app/src/test/java/com/gindemit/rlottie/ExampleUnitTest.java
================================================
package com.gindemit.rlottie;

import org.junit.Test;

import static org.junit.Assert.*;

/**
 * Example local unit test, which will execute on the development machine (host).
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() {
        assertEquals(4, 2 + 2);
    }
}

================================================
FILE: projects/AndroidStudio/build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:8.0.2"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

================================================
FILE: projects/AndroidStudio/gradle/wrapper/gradle-wrapper.properties
================================================
#Sat Nov 13 22:19:53 CET 2021
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-all.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME


================================================
FILE: projects/AndroidStudio/gradle.properties
================================================
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app"s APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true

================================================
FILE: projects/AndroidStudio/gradlew
================================================
#!/usr/bin/env sh

#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn () {
    echo "$*"
}

die () {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
  NONSTOP* )
    nonstop=true
    ;;
esac

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar


# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`

    JAVACMD=`cygpath --unix "$JAVACMD"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=`expr $i + 1`
    done
    case $i in
        0) set -- ;;
        1) set -- "$args0" ;;
        2) set -- "$args0" "$args1" ;;
        3) set -- "$args0" "$args1" "$args2" ;;
        4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Escape application args
save () {
    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
    echo " "
}
APP_ARGS=`save "$@"`

# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"

exec "$JAVACMD" "$@"


================================================
FILE: projects/AndroidStudio/gradlew.bat
================================================
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem      https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem

@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto execute

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar


@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: projects/AndroidStudio/settings.gradle
================================================
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        jcenter() // Warning: this repository is going to shut down soon
    }
}
rootProject.name = "UnityRLottie"
include ':app'


================================================
FILE: projects/CMake/.gitignore
================================================
CMakeLists.txt.user
CMakeCache.txt
CMakeFiles
CMakeScripts
Testing
Makefile
cmake_install.cmake
install_manifest.txt
compile_commands.json
CTestTestfile.cmake
_deps
out
.vs

================================================
FILE: projects/CMake/CMakeLists.txt
================================================
# CMakeList.txt : CMake project for LottiePlugin, include source and define
cmake_minimum_required (VERSION 3.6)

#set (MSVC_RUNTIME_LIBRARY MultiThreadedDebugDLL)
project(LottiePlugin)

option(RLOTTIE_ANDROID_PAGE_SIZE_16K "Build Android libraries with 16KB page size" OFF)

set(BUILD_SHARED_LIBS FALSE)
set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)

set (RLOTTIE_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../dependency/rlottie)
set (PIXMAN_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../dependency/pixman)

# Disable the LOTTIE_MODULE in rlottie
set(LOTTIE_MODULE OFF CACHE BOOL "Disable LOTTIE MODULE SUPPORT" FORCE)

if (RLOTTIE_IOS)
    set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE NO)
    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/LottiePluginBuild)
elseif (RLOTTIE_OSX)
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/LottiePluginBuild)
endif()

if (WIN32)
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
endif()

add_subdirectory(${RLOTTIE_ROOT} ${CMAKE_CURRENT_BINARY_DIR}/rlottie_build)
# Make rlottie compile as C++17 (doesn't affect your plugin target)
target_compile_features(rlottie PUBLIC cxx_std_17)

target_compile_definitions(rlottie PRIVATE LOTTIE_LOGGING_SUPPORT)
include_directories ($<BUILD_INTERFACE:${RLOTTIE_ROOT}/inc> ${RLOTTIE_ROOT}/src/vector/ ${RLOTTIE_ROOT}/vs2019/)
message("Lottie root directory: ${RLOTTIE_ROOT}")

set (RLOTTIE_PLUGIN_LIBRARY_SOURCES 
    ../../src/LottiePlugin.cpp)

message("CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")

if (RLOTTIE_IOS OR RLOTTIE_WEB_ASSEMBLY)
  add_library (LottiePlugin STATIC ${RLOTTIE_PLUGIN_LIBRARY_SOURCES})
else()
  add_library (LottiePlugin SHARED ${RLOTTIE_PLUGIN_LIBRARY_SOURCES})
endif()

target_compile_definitions(LottiePlugin PRIVATE LOTTIE_LOGGING_SUPPORT)

# Add WebGL to platforms that need pixman-cpp shim:
if (RLOTTIE_IOS OR ANDROID OR RLOTTIE_OSX OR RLOTTIE_WEB_ASSEMBLY)
  message("Compile cpp source for iOS/Android/macOS/WebAssembly")
  target_sources(rlottie PRIVATE ${PIXMAN_ROOT}/pixman-cpp-standard.cpp)
endif()

# Build static lib for WebAssembly
if (RLOTTIE_WEB_ASSEMBLY)
  set(BUILD_SHARED_LIBS OFF)
endif()

if (WIN32)
  set(RLOTTIE_LIBRARY_NAME rlottie.lib)
elseif(RLOTTIE_OSX)
  set(RLOTTIE_LIBRARY_NAME Release/rlottie.a)
  add_compile_definitions(RLOTTIE_OSX)
  #set_target_properties(LottiePlugin PROPERTIES BUNDLE TRUE)
  #set_target_properties(LottiePlugin PROPERTIES SUFFIX ".bundle")
else()
  set(RLOTTIE_LIBRARY_NAME librlottie.a)
endif()

#declare common target compilation options
if(MSVC)
    target_compile_options(rlottie
                        PRIVATE
                            /std:c++17
                            /EHsc # enable exceptions
                            /Zc:__cplusplus # enable C++17 features
                            /permissive-) # standards compliant mode
    target_compile_options(LottiePlugin
                        PUBLIC
                        PRIVATE
                            /std:c++17
                            /EHsc- # disable exceptions
                            /Zc:__cplusplus # enable C++17 features
                            /permissive- # standards compliant mode
                            /W3 # warning level
                        )
else()
    target_compile_options(LottiePlugin
                        PUBLIC
                        PRIVATE
                            -std=c++14
                            -fno-exceptions
                            -fno-unwind-tables
                            -fno-asynchronous-unwind-tables
                            -fno-rtti
                            -Wall
                            -fvisibility=hidden
                            -Wnon-virtual-dtor
                            -Woverloaded-virtual
                            -Wno-unused-parameter
                        )
endif()

add_dependencies(LottiePlugin rlottie)
target_link_libraries(LottiePlugin rlottie)

if(ANDROID AND RLOTTIE_ANDROID_PAGE_SIZE_16K)
  target_link_options(LottiePlugin PRIVATE "-Wl,-z,max-page-size=16384" "-Wl,-z,common-page-size=16384")
  target_link_options(rlottie PRIVATE "-Wl,-z,max-page-size=16384" "-Wl,-z,common-page-size=16384")
endif()
message(${CMAKE_CURRENT_BINARY_DIR}/rlottie_build/${RLOTTIE_LIBRARY_NAME})

#Adding simple test program:
#add_executable(LottiePluginTest ../../src/PluginTest.c)
#target_link_libraries(LottiePluginTest LottiePlugin)
# if (RLOTTIE_IOS)
#   set_xcode_property(LottiePluginTest PRODUCT_BUNDLE_IDENTIFIER "com.soulside.app" All)
# endif()

if (WIN32)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
    set (RLOTTIE_PLUGIN_TARGET_ARCHITECTURE x86_64)
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
    set (RLOTTIE_PLUGIN_TARGET_ARCHITECTURE x86)
endif()
elseif(ANDROID)
    set (RLOTTIE_PLUGIN_TARGET_ARCHITECTURE ${CMAKE_ANDROID_ARCH_ABI})
else()
    set (RLOTTIE_PLUGIN_TARGET_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR})
endif()
add_custom_command(
    TARGET LottiePlugin POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E make_directory
    "${CMAKE_CURRENT_SOURCE_DIR}/../../out/$<CONFIG>/Plugins/$<PLATFORM_ID>/${RLOTTIE_PLUGIN_TARGET_ARCHITECTURE}")

add_custom_command(
    TARGET LottiePlugin POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        "$<TARGET_FILE:LottiePlugin>"
        "${CMAKE_CURRENT_SOURCE_DIR}/../../out/$<CONFIG>/Plugins/$<PLATFORM_ID>/${RLOTTIE_PLUGIN_TARGET_ARCHITECTURE}/$<TARGET_FILE_NAME:LottiePlugin>"
    COMMENT "Copied final library to out directory")

add_custom_command(
    TARGET LottiePlugin POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        "$<TARGET_FILE:rlottie>"
        "${CMAKE_CURRENT_SOURCE_DIR}/../../out/$<CONFIG>/Plugins/$<PLATFORM_ID>/${RLOTTIE_PLUGIN_TARGET_ARCHITECTURE}/$<TARGET_FILE_NAME:rlottie>"
    COMMENT "Copied final library to out directory")

if (RLOTTIE_WEB_ASSEMBLY)
  add_custom_command(
      TARGET LottiePlugin POST_BUILD
      COMMAND ${CMAKE_COMMAND} -E make_directory
          "${CMAKE_CURRENT_SOURCE_DIR}/../../out/Plugins/WebGL"
  )
  add_custom_command(
      TARGET LottiePlugin POST_BUILD
      COMMAND ${CMAKE_COMMAND} -E copy_if_different
          "$<TARGET_FILE:LottiePlugin>"
          "${CMAKE_CURRENT_SOURCE_DIR}/../../out/Plugins/WebGL/libLottiePlugin.a"
      COMMENT "Copied libLottiePlugin.a to out/Plugins/WebGL"
  )
  add_custom_command(
      TARGET LottiePlugin POST_BUILD
      COMMAND ${CMAKE_COMMAND} -E copy_if_different
          "$<TARGET_FILE:rlottie>"
          "${CMAKE_CURRENT_SOURCE_DIR}/../../out/Plugins/WebGL/librlottie.a"
      COMMENT "Copied librlottie.a to out/Plugins/WebGL"
  )
endif()

# Uncomment following lines if you want to copy the pdb files for Debug builds:
#if (WIN32)
# add_custom_command(
#     TARGET LottiePlugin POST_BUILD
#     COMMAND ${CMAKE_COMMAND} -E copy_if_different
#         "$<TARGET_PDB_FILE:LottiePlugin>"
#         "${CMAKE_CURRENT_SOURCE_DIR}/../../out/$<CONFIG>/Plugins/$<PLATFORM_ID>/${RLOTTIE_PLUGIN_TARGET_ARCHITECTURE}/$<TARGET_PDB_FILE_NAME:LottiePlugin>")
# endif()
# uncomment end
if (ANDROID)
  add_custom_command(
      TARGET LottiePlugin POST_BUILD
      COMMAND "${ANDROID_TOOLCHAIN_PREFIX}strip" -g -S -d --strip-debug --verbose
              "${CMAKE_CURRENT_SOURCE_DIR}/../../out/$<CONFIG>/Plugins/$<PLATFORM_ID>/${RLOTTIE_PLUGIN_TARGET_ARCHITECTURE}/$<TARGET_FILE_NAME:LottiePlugin>"
      COMMENT "Strip debug symbols done on final binary.")
  add_custom_command(
        TARGET LottiePlugin POST_BUILD
        COMMAND "${ANDROID_TOOLCHAIN_PREFIX}strip" -g -S -d --strip-debug --verbose
                "${CMAKE_CURRENT_SOURCE_DIR}/../../out/$<CONFIG>/Plugins/$<PLATFORM_ID>/${RLOTTIE_PLUGIN_TARGET_ARCHITECTURE}/$<TARGET_FILE_NAME:rlottie>"
        COMMENT "Strip debug symbols done on final binary.")
endif()


================================================
FILE: projects/CMake/CMakeSettings.json
================================================
{
  "configurations": [
    {
      "name": "x64-Debug",
      "generator": "Ninja",
      "configurationType": "Debug",
      "inheritEnvironments": [ "msvc_x64_x64" ],
      "buildRoot": "${projectDir}\\out\\build\\${name}",
      "installRoot": "${projectDir}\\out\\install\\${name}",
      "buildCommandArgs": "-v",
      "ctestCommandArgs": ""
    },
    {
      "name": "x64-Release",
      "generator": "Ninja",
      "configurationType": "Release",
      "buildRoot": "${projectDir}\\out\\build\\${name}",
      "installRoot": "${projectDir}\\out\\install\\${name}",
      "cmakeCommandArgs": "",
     
Download .txt
gitextract_iryq256z/

├── .editorconfig
├── .gitattributes
├── .github/
│   └── workflows/
│       ├── activation.yaml
│       └── build_native_libraries.yaml
├── .gitignore
├── .gitmodules
├── AGENTS.md
├── LICENSE
├── README.md
├── dependency/
│   └── pixman/
│       ├── pixman-arm-intrisics.cpp
│       ├── pixman-arm-neon-asm.S
│       ├── pixman-arm-neon-asm.h
│       ├── pixman-arma64-neon-asm.S
│       ├── pixman-arma64-neon-asm.h
│       └── pixman-cpp-standard.cpp
├── projects/
│   ├── AndroidStudio/
│   │   ├── .gitignore
│   │   ├── .idea/
│   │   │   ├── .gitignore
│   │   │   ├── .name
│   │   │   ├── compiler.xml
│   │   │   ├── gradle.xml
│   │   │   ├── misc.xml
│   │   │   └── vcs.xml
│   │   ├── app/
│   │   │   ├── .gitignore
│   │   │   ├── build.gradle
│   │   │   ├── proguard-rules.pro
│   │   │   └── src/
│   │   │       ├── androidTest/
│   │   │       │   └── java/
│   │   │       │       └── com/
│   │   │       │           └── gindemit/
│   │   │       │               └── rlottie/
│   │   │       │                   └── ExampleInstrumentedTest.java
│   │   │       ├── main/
│   │   │       │   ├── AndroidManifest.xml
│   │   │       │   ├── java/
│   │   │       │   │   └── com/
│   │   │       │   │       └── gindemit/
│   │   │       │   │           └── rlottie/
│   │   │       │   │               └── MainActivity.java
│   │   │       │   └── res/
│   │   │       │       ├── drawable/
│   │   │       │       │   └── ic_launcher_background.xml
│   │   │       │       ├── drawable-v24/
│   │   │       │       │   └── ic_launcher_foreground.xml
│   │   │       │       ├── layout/
│   │   │       │       │   └── activity_main.xml
│   │   │       │       ├── mipmap-anydpi-v26/
│   │   │       │       │   ├── ic_launcher.xml
│   │   │       │       │   └── ic_launcher_round.xml
│   │   │       │       ├── values/
│   │   │       │       │   ├── colors.xml
│   │   │       │       │   ├── strings.xml
│   │   │       │       │   └── themes.xml
│   │   │       │       └── values-night/
│   │   │       │           └── themes.xml
│   │   │       └── test/
│   │   │           └── java/
│   │   │               └── com/
│   │   │                   └── gindemit/
│   │   │                       └── rlottie/
│   │   │                           └── ExampleUnitTest.java
│   │   ├── build.gradle
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradle.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   └── settings.gradle
│   └── CMake/
│       ├── .gitignore
│       ├── CMakeLists.txt
│       └── CMakeSettings.json
├── src/
│   ├── ExportApi.h
│   ├── LottiePlugin.cpp
│   └── LottiePlugin.h
└── unity/
    └── RLottieUnity/
        ├── .editorconfig
        ├── .gitignore
        ├── .vsconfig
        ├── Assets/
        │   ├── LottiePlugin/
        │   │   ├── Editor/
        │   │   │   ├── LottiePlugin.Editor.asmdef
        │   │   │   ├── LottiePlugin.Editor.asmdef.meta
        │   │   │   ├── src/
        │   │   │   │   ├── AnimatedButtonEditor.cs
        │   │   │   │   ├── AnimatedButtonEditor.cs.meta
        │   │   │   │   ├── AnimatedImageEditor.cs
        │   │   │   │   ├── AnimatedImageEditor.cs.meta
        │   │   │   │   ├── OpenPersistentDataPathFolder.cs
        │   │   │   │   └── OpenPersistentDataPathFolder.cs.meta
        │   │   │   └── src.meta
        │   │   ├── Editor.meta
        │   │   ├── Plugins/
        │   │   │   ├── Android/
        │   │   │   │   ├── arm64-v8a/
        │   │   │   │   │   └── libLottiePlugin.so.meta
        │   │   │   │   ├── arm64-v8a.meta
        │   │   │   │   ├── armeabi-v7a/
        │   │   │   │   │   └── libLottiePlugin.so.meta
        │   │   │   │   ├── armeabi-v7a.meta
        │   │   │   │   ├── x86/
        │   │   │   │   │   └── libLottiePlugin.so.meta
        │   │   │   │   ├── x86.meta
        │   │   │   │   ├── x86_64/
        │   │   │   │   │   └── libLottiePlugin.so.meta
        │   │   │   │   └── x86_64.meta
        │   │   │   ├── Android.meta
        │   │   │   ├── Linux/
        │   │   │   │   ├── x86_64/
        │   │   │   │   │   └── libLottiePlugin.so.meta
        │   │   │   │   └── x86_64.meta
        │   │   │   ├── Linux.meta
        │   │   │   ├── OSX/
        │   │   │   │   └── libLottiePlugin.dylib.meta
        │   │   │   ├── OSX.meta
        │   │   │   ├── WebGL/
        │   │   │   │   ├── LottiePlugin.bc
        │   │   │   │   ├── LottiePlugin.bc.meta
        │   │   │   │   ├── libLottiePlugin.a
        │   │   │   │   ├── libLottiePlugin.a.meta
        │   │   │   │   ├── librlottie.a
        │   │   │   │   └── librlottie.a.meta
        │   │   │   ├── WebGL.meta
        │   │   │   ├── Windows/
        │   │   │   │   ├── x86/
        │   │   │   │   │   └── LottiePlugin.dll.meta
        │   │   │   │   ├── x86.meta
        │   │   │   │   ├── x86_64/
        │   │   │   │   │   └── LottiePlugin.dll.meta
        │   │   │   │   └── x86_64.meta
        │   │   │   ├── Windows.meta
        │   │   │   ├── iOS/
        │   │   │   │   ├── libLottiePlugin.a
        │   │   │   │   ├── libLottiePlugin.a.meta
        │   │   │   │   ├── librlottie.a
        │   │   │   │   ├── librlottie.a.meta
        │   │   │   │   ├── x86_64/
        │   │   │   │   │   ├── libLottiePlugin.a
        │   │   │   │   │   ├── libLottiePlugin.a.meta
        │   │   │   │   │   ├── librlottie.a
        │   │   │   │   │   └── librlottie.a.meta
        │   │   │   │   └── x86_64.meta
        │   │   │   └── iOS.meta
        │   │   ├── Plugins.meta
        │   │   ├── Runtime/
        │   │   │   ├── AssemblyAttributes.cs
        │   │   │   ├── AssemblyAttributes.cs.meta
        │   │   │   ├── LottiePlugin.Runtime.asmdef
        │   │   │   ├── LottiePlugin.Runtime.asmdef.meta
        │   │   │   ├── src/
        │   │   │   │   ├── LottieAnimation.cs
        │   │   │   │   ├── LottieAnimation.cs.meta
        │   │   │   │   ├── LottieAnimationsAtlas.cs
        │   │   │   │   ├── LottieAnimationsAtlas.cs.meta
        │   │   │   │   ├── NativeBridge.cs
        │   │   │   │   ├── NativeBridge.cs.meta
        │   │   │   │   ├── Support/
        │   │   │   │   │   ├── FIleSizeFormatter.cs
        │   │   │   │   │   ├── FIleSizeFormatter.cs.meta
        │   │   │   │   │   ├── FilesHelper.cs
        │   │   │   │   │   ├── FilesHelper.cs.meta
        │   │   │   │   │   ├── StreamingAssetsHelper.cs
        │   │   │   │   │   └── StreamingAssetsHelper.cs.meta
        │   │   │   │   ├── Support.meta
        │   │   │   │   ├── UI/
        │   │   │   │   │   ├── AnimatedButton.cs
        │   │   │   │   │   ├── AnimatedButton.cs.meta
        │   │   │   │   │   ├── AnimatedImage.cs
        │   │   │   │   │   └── AnimatedImage.cs.meta
        │   │   │   │   ├── UI.meta
        │   │   │   │   ├── Utility/
        │   │   │   │   │   ├── ThrowIf.cs
        │   │   │   │   │   └── ThrowIf.cs.meta
        │   │   │   │   └── Utility.meta
        │   │   │   └── src.meta
        │   │   ├── Runtime.meta
        │   │   ├── Samples~/
        │   │   │   ├── SceneUI/
        │   │   │   │   ├── ExternalDlls/
        │   │   │   │   │   ├── Newtonsoft.Json.dll.meta
        │   │   │   │   │   ├── System.Buffers.dll.meta
        │   │   │   │   │   ├── System.Memory.dll.meta
        │   │   │   │   │   ├── System.Threading.Tasks.Extensions.dll.meta
        │   │   │   │   │   └── Telegram.Bot.dll.meta
        │   │   │   │   ├── ExternalDlls.meta
        │   │   │   │   ├── Graphy - Ultimate Stats Monitor/
        │   │   │   │   │   ├── Changelog.txt
        │   │   │   │   │   ├── Changelog.txt.meta
        │   │   │   │   │   ├── Editor/
        │   │   │   │   │   │   ├── GraphyDebuggerEditor.cs
        │   │   │   │   │   │   ├── GraphyDebuggerEditor.cs.meta
        │   │   │   │   │   │   ├── GraphyEditorStyle.cs
        │   │   │   │   │   │   ├── GraphyEditorStyle.cs.meta
        │   │   │   │   │   │   ├── GraphyManagerEditor.cs
        │   │   │   │   │   │   ├── GraphyManagerEditor.cs.meta
        │   │   │   │   │   │   ├── GraphyMenuItem.cs
        │   │   │   │   │   │   ├── GraphyMenuItem.cs.meta
        │   │   │   │   │   │   ├── Tayx.Graphy.Editor.asmdef
        │   │   │   │   │   │   └── Tayx.Graphy.Editor.asmdef.meta
        │   │   │   │   │   ├── Editor.meta
        │   │   │   │   │   ├── Font/
        │   │   │   │   │   │   ├── Northwest-Bold/
        │   │   │   │   │   │   │   ├── ERIC-TIRADO-NORTHWEST-LICENSE.txt
        │   │   │   │   │   │   │   ├── ERIC-TIRADO-NORTHWEST-LICENSE.txt.meta
        │   │   │   │   │   │   │   ├── NORTHWEST-B.otf
        │   │   │   │   │   │   │   └── NORTHWEST-B.otf.meta
        │   │   │   │   │   │   ├── Northwest-Bold.meta
        │   │   │   │   │   │   ├── Roboto/
        │   │   │   │   │   │   │   ├── LICENSE.txt
        │   │   │   │   │   │   │   ├── LICENSE.txt.meta
        │   │   │   │   │   │   │   ├── Roboto-Bold.ttf.meta
        │   │   │   │   │   │   │   └── Roboto-Regular.ttf.meta
        │   │   │   │   │   │   └── Roboto.meta
        │   │   │   │   │   ├── Font.meta
        │   │   │   │   │   ├── GUI/
        │   │   │   │   │   │   ├── GraphyGUISkin.guiskin
        │   │   │   │   │   │   └── GraphyGUISkin.guiskin.meta
        │   │   │   │   │   ├── GUI.meta
        │   │   │   │   │   ├── LICENSE
        │   │   │   │   │   ├── LICENSE.meta
        │   │   │   │   │   ├── Materials/
        │   │   │   │   │   │   ├── Audio_Spectrum_Graph.mat
        │   │   │   │   │   │   ├── Audio_Spectrum_Graph.mat.meta
        │   │   │   │   │   │   ├── Audio_Spectrum_Highest_Values_Graph.mat
        │   │   │   │   │   │   ├── Audio_Spectrum_Highest_Values_Graph.mat.meta
        │   │   │   │   │   │   ├── FPS_Graph.mat
        │   │   │   │   │   │   ├── FPS_Graph.mat.meta
        │   │   │   │   │   │   ├── RAM_Allocated_Graph.mat
        │   │   │   │   │   │   ├── RAM_Allocated_Graph.mat.meta
        │   │   │   │   │   │   ├── RAM_Mono_Graph.mat
        │   │   │   │   │   │   ├── RAM_Mono_Graph.mat.meta
        │   │   │   │   │   │   ├── RAM_Reserved_Graph.mat
        │   │   │   │   │   │   └── RAM_Reserved_Graph.mat.meta
        │   │   │   │   │   ├── Materials.meta
        │   │   │   │   │   ├── Prefab/
        │   │   │   │   │   │   ├── Internal/
        │   │   │   │   │   │   │   ├── ADVANCED - Module.prefab
        │   │   │   │   │   │   │   ├── ADVANCED - Module.prefab.meta
        │   │   │   │   │   │   │   ├── AUDIO - Module.prefab
        │   │   │   │   │   │   │   ├── AUDIO - Module.prefab.meta
        │   │   │   │   │   │   │   ├── FPS - Module.prefab
        │   │   │   │   │   │   │   ├── FPS - Module.prefab.meta
        │   │   │   │   │   │   │   ├── RAM - Module.prefab
        │   │   │   │   │   │   │   └── RAM - Module.prefab.meta
        │   │   │   │   │   │   ├── Internal.meta
        │   │   │   │   │   │   ├── [Graphy].prefab
        │   │   │   │   │   │   └── [Graphy].prefab.meta
        │   │   │   │   │   ├── Prefab.meta
        │   │   │   │   │   ├── README.md
        │   │   │   │   │   ├── README.md.meta
        │   │   │   │   │   ├── Readme! - Graphy - Documentation.pdf.meta
        │   │   │   │   │   ├── Runtime/
        │   │   │   │   │   │   ├── Advanced/
        │   │   │   │   │   │   │   ├── G_AdvancedData.cs
        │   │   │   │   │   │   │   └── G_AdvancedData.cs.meta
        │   │   │   │   │   │   ├── Advanced.meta
        │   │   │   │   │   │   ├── Audio/
        │   │   │   │   │   │   │   ├── G_AudioGraph.cs
        │   │   │   │   │   │   │   ├── G_AudioGraph.cs.meta
        │   │   │   │   │   │   │   ├── G_AudioManager.cs
        │   │   │   │   │   │   │   ├── G_AudioManager.cs.meta
        │   │   │   │   │   │   │   ├── G_AudioMonitor.cs
        │   │   │   │   │   │   │   ├── G_AudioMonitor.cs.meta
        │   │   │   │   │   │   │   ├── G_AudioText.cs
        │   │   │   │   │   │   │   └── G_AudioText.cs.meta
        │   │   │   │   │   │   ├── Audio.meta
        │   │   │   │   │   │   ├── Fps/
        │   │   │   │   │   │   │   ├── G_FpsGraph.cs
        │   │   │   │   │   │   │   ├── G_FpsGraph.cs.meta
        │   │   │   │   │   │   │   ├── G_FpsManager.cs
        │   │   │   │   │   │   │   ├── G_FpsManager.cs.meta
        │   │   │   │   │   │   │   ├── G_FpsMonitor.cs
        │   │   │   │   │   │   │   ├── G_FpsMonitor.cs.meta
        │   │   │   │   │   │   │   ├── G_FpsText.cs
        │   │   │   │   │   │   │   └── G_FpsText.cs.meta
        │   │   │   │   │   │   ├── Fps.meta
        │   │   │   │   │   │   ├── Graph/
        │   │   │   │   │   │   │   ├── G_Graph.cs
        │   │   │   │   │   │   │   └── G_Graph.cs.meta
        │   │   │   │   │   │   ├── Graph.meta
        │   │   │   │   │   │   ├── GraphyDebugger.cs
        │   │   │   │   │   │   ├── GraphyDebugger.cs.meta
        │   │   │   │   │   │   ├── GraphyManager.cs
        │   │   │   │   │   │   ├── GraphyManager.cs.meta
        │   │   │   │   │   │   ├── Ram/
        │   │   │   │   │   │   │   ├── G_RamGraph.cs
        │   │   │   │   │   │   │   ├── G_RamGraph.cs.meta
        │   │   │   │   │   │   │   ├── G_RamManager.cs
        │   │   │   │   │   │   │   ├── G_RamManager.cs.meta
        │   │   │   │   │   │   │   ├── G_RamMonitor.cs
        │   │   │   │   │   │   │   ├── G_RamMonitor.cs.meta
        │   │   │   │   │   │   │   ├── G_RamText.cs
        │   │   │   │   │   │   │   └── G_RamText.cs.meta
        │   │   │   │   │   │   ├── Ram.meta
        │   │   │   │   │   │   ├── Shader/
        │   │   │   │   │   │   │   ├── G_GraphShader.cs
        │   │   │   │   │   │   │   └── G_GraphShader.cs.meta
        │   │   │   │   │   │   ├── Shader.meta
        │   │   │   │   │   │   ├── Tayx.Graphy.asmdef
        │   │   │   │   │   │   ├── Tayx.Graphy.asmdef.meta
        │   │   │   │   │   │   ├── UI/
        │   │   │   │   │   │   │   ├── IModifiableState.cs
        │   │   │   │   │   │   │   ├── IModifiableState.cs.meta
        │   │   │   │   │   │   │   ├── IMovable.cs
        │   │   │   │   │   │   │   └── IMovable.cs.meta
        │   │   │   │   │   │   ├── UI.meta
        │   │   │   │   │   │   ├── Util/
        │   │   │   │   │   │   │   ├── G_ExtensionMethods.cs
        │   │   │   │   │   │   │   ├── G_ExtensionMethods.cs.meta
        │   │   │   │   │   │   │   ├── G_FloatString.cs
        │   │   │   │   │   │   │   ├── G_FloatString.cs.meta
        │   │   │   │   │   │   │   ├── G_Intstring.cs
        │   │   │   │   │   │   │   ├── G_Intstring.cs.meta
        │   │   │   │   │   │   │   ├── G_Singleton.cs
        │   │   │   │   │   │   │   └── G_Singleton.cs.meta
        │   │   │   │   │   │   └── Util.meta
        │   │   │   │   │   ├── Runtime.meta
        │   │   │   │   │   ├── Shaders/
        │   │   │   │   │   │   ├── GraphMobile.shader
        │   │   │   │   │   │   ├── GraphMobile.shader.meta
        │   │   │   │   │   │   ├── GraphStandard.shader
        │   │   │   │   │   │   └── GraphStandard.shader.meta
        │   │   │   │   │   ├── Shaders.meta
        │   │   │   │   │   ├── Textures/
        │   │   │   │   │   │   ├── 2x2_Texture.png.meta
        │   │   │   │   │   │   ├── Debugger_Logo_Dark.png.meta
        │   │   │   │   │   │   ├── Debugger_Logo_White.png.meta
        │   │   │   │   │   │   ├── Manager_Logo_Dark.png.meta
        │   │   │   │   │   │   ├── Manager_Logo_White.png.meta
        │   │   │   │   │   │   └── Rounded_Rect_10px.png.meta
        │   │   │   │   │   ├── Textures.meta
        │   │   │   │   │   ├── package.json
        │   │   │   │   │   └── package.json.meta
        │   │   │   │   ├── Graphy - Ultimate Stats Monitor.meta
        │   │   │   │   ├── LottieJsons/
        │   │   │   │   │   ├── UI/
        │   │   │   │   │   │   ├── Common/
        │   │   │   │   │   │   │   ├── loading_animation.json
        │   │   │   │   │   │   │   ├── loading_animation.json.meta
        │   │   │   │   │   │   │   ├── no_data_found_animation.json
        │   │   │   │   │   │   │   └── no_data_found_animation.json.meta
        │   │   │   │   │   │   ├── Common.meta
        │   │   │   │   │   │   ├── LottiePlayerScreen/
        │   │   │   │   │   │   │   ├── hamburger_menu.json
        │   │   │   │   │   │   │   ├── hamburger_menu.json.meta
        │   │   │   │   │   │   │   ├── next_track.json
        │   │   │   │   │   │   │   ├── next_track.json.meta
        │   │   │   │   │   │   │   ├── pause_play.json
        │   │   │   │   │   │   │   └── pause_play.json.meta
        │   │   │   │   │   │   ├── LottiePlayerScreen.meta
        │   │   │   │   │   │   ├── MainMenu/
        │   │   │   │   │   │   │   ├── 3d_cubes_icon.json
        │   │   │   │   │   │   │   ├── 3d_cubes_icon.json.meta
        │   │   │   │   │   │   │   ├── explore_icon.json
        │   │   │   │   │   │   │   ├── explore_icon.json.meta
        │   │   │   │   │   │   │   ├── home_icon.json
        │   │   │   │   │   │   │   ├── home_icon.json.meta
        │   │   │   │   │   │   │   ├── video_player_icon.json
        │   │   │   │   │   │   │   └── video_player_icon.json.meta
        │   │   │   │   │   │   └── MainMenu.meta
        │   │   │   │   │   └── UI.meta
        │   │   │   │   ├── LottieJsons.meta
        │   │   │   │   ├── Materials/
        │   │   │   │   │   ├── UIMaterial.mat
        │   │   │   │   │   └── UIMaterial.mat.meta
        │   │   │   │   ├── Materials.meta
        │   │   │   │   ├── Prefabs/
        │   │   │   │   │   ├── UI/
        │   │   │   │   │   │   ├── AnimationPreview.prefab
        │   │   │   │   │   │   ├── AnimationPreview.prefab.meta
        │   │   │   │   │   │   ├── LottieAnimationsPreview.prefab
        │   │   │   │   │   │   └── LottieAnimationsPreview.prefab.meta
        │   │   │   │   │   └── UI.meta
        │   │   │   │   ├── Prefabs.meta
        │   │   │   │   ├── README.txt
        │   │   │   │   ├── README.txt.meta
        │   │   │   │   ├── Scenes/
        │   │   │   │   │   ├── SampleScene.unity
        │   │   │   │   │   └── SampleScene.unity.meta
        │   │   │   │   ├── Scenes.meta
        │   │   │   │   ├── ScriptableObjects/
        │   │   │   │   │   ├── LottieAnimationsArray.asset
        │   │   │   │   │   └── LottieAnimationsArray.asset.meta
        │   │   │   │   ├── ScriptableObjects.meta
        │   │   │   │   ├── Scripts/
        │   │   │   │   │   ├── Editor/
        │   │   │   │   │   │   ├── LottiePlugin.Sample.SceneUI.Editor.asmdef
        │   │   │   │   │   │   ├── LottiePlugin.Sample.SceneUI.Editor.asmdef.meta
        │   │   │   │   │   │   ├── src/
        │   │   │   │   │   │   │   ├── PopulateLottieAnimations.cs
        │   │   │   │   │   │   │   ├── PopulateLottieAnimations.cs.meta
        │   │   │   │   │   │   │   ├── StreamingAssetsChecker.cs
        │   │   │   │   │   │   │   └── StreamingAssetsChecker.cs.meta
        │   │   │   │   │   │   └── src.meta
        │   │   │   │   │   ├── Editor.meta
        │   │   │   │   │   ├── Runtime/
        │   │   │   │   │   │   ├── LottiePlugin.Sample.SceneUI.Runtime.asmdef
        │   │   │   │   │   │   ├── LottiePlugin.Sample.SceneUI.Runtime.asmdef.meta
        │   │   │   │   │   │   ├── src/
        │   │   │   │   │   │   │   ├── Data/
        │   │   │   │   │   │   │   │   ├── LottieAnimations.cs
        │   │   │   │   │   │   │   │   └── LottieAnimations.cs.meta
        │   │   │   │   │   │   │   ├── Data.meta
        │   │   │   │   │   │   │   ├── State/
        │   │   │   │   │   │   │   │   ├── AppState.cs
        │   │   │   │   │   │   │   │   └── AppState.cs.meta
        │   │   │   │   │   │   │   ├── State.meta
        │   │   │   │   │   │   │   ├── Storage/
        │   │   │   │   │   │   │   │   ├── CanNotFindStickerPackException.cs
        │   │   │   │   │   │   │   │   ├── CanNotFindStickerPackException.cs.meta
        │   │   │   │   │   │   │   │   ├── TelegramStickerStorage.cs
        │   │   │   │   │   │   │   │   └── TelegramStickerStorage.cs.meta
        │   │   │   │   │   │   │   ├── Storage.meta
        │   │   │   │   │   │   │   ├── UI/
        │   │   │   │   │   │   │   │   ├── AnimationPreview.cs
        │   │   │   │   │   │   │   │   ├── AnimationPreview.cs.meta
        │   │   │   │   │   │   │   │   ├── AnimationsHomeScreen.cs
        │   │   │   │   │   │   │   │   ├── AnimationsHomeScreen.cs.meta
        │   │   │   │   │   │   │   │   ├── ExploreTelegramStickers.cs
        │   │   │   │   │   │   │   │   ├── ExploreTelegramStickers.cs.meta
        │   │   │   │   │   │   │   │   ├── LottieAnimationsPreview.cs
        │   │   │   │   │   │   │   │   ├── LottieAnimationsPreview.cs.meta
        │   │   │   │   │   │   │   │   ├── LottiePlayerScreen.cs
        │   │   │   │   │   │   │   │   ├── LottiePlayerScreen.cs.meta
        │   │   │   │   │   │   │   │   ├── MainMenu.cs
        │   │   │   │   │   │   │   │   └── MainMenu.cs.meta
        │   │   │   │   │   │   │   └── UI.meta
        │   │   │   │   │   │   └── src.meta
        │   │   │   │   │   └── Runtime.meta
        │   │   │   │   ├── Scripts.meta
        │   │   │   │   ├── Shaders/
        │   │   │   │   │   ├── UI-Default.shader
        │   │   │   │   │   ├── UI-Default.shader.meta
        │   │   │   │   │   ├── Unlit - Premultiplied Colored (TextureClip).shader
        │   │   │   │   │   ├── Unlit - Premultiplied Colored (TextureClip).shader.meta
        │   │   │   │   │   ├── Unlit - Premultiplied Colored 1.shader
        │   │   │   │   │   ├── Unlit - Premultiplied Colored 1.shader.meta
        │   │   │   │   │   ├── Unlit - Premultiplied Colored 2.shader
        │   │   │   │   │   ├── Unlit - Premultiplied Colored 2.shader.meta
        │   │   │   │   │   ├── Unlit - Premultiplied Colored 3.shader
        │   │   │   │   │   ├── Unlit - Premultiplied Colored 3.shader.meta
        │   │   │   │   │   ├── Unlit - Premultiplied Colored.shader
        │   │   │   │   │   ├── Unlit - Premultiplied Colored.shader.meta
        │   │   │   │   │   ├── Unlit - Text (TextureClip).shader
        │   │   │   │   │   ├── Unlit - Text (TextureClip).shader.meta
        │   │   │   │   │   ├── Unlit - Text 1.shader
        │   │   │   │   │   ├── Unlit - Text 1.shader.meta
        │   │   │   │   │   ├── Unlit - Text 2.shader
        │   │   │   │   │   ├── Unlit - Text 2.shader.meta
        │   │   │   │   │   ├── Unlit - Text 3.shader
        │   │   │   │   │   ├── Unlit - Text 3.shader.meta
        │   │   │   │   │   ├── Unlit - Text.shader
        │   │   │   │   │   ├── Unlit - Text.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Colored (Packed) (TextureClip).shader
        │   │   │   │   │   ├── Unlit - Transparent Colored (Packed) (TextureClip).shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Colored (TextureClip).shader
        │   │   │   │   │   ├── Unlit - Transparent Colored (TextureClip).shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Colored 1.shader
        │   │   │   │   │   ├── Unlit - Transparent Colored 1.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Colored 2.shader
        │   │   │   │   │   ├── Unlit - Transparent Colored 2.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Colored 3.shader
        │   │   │   │   │   ├── Unlit - Transparent Colored 3.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Colored.shader
        │   │   │   │   │   ├── Unlit - Transparent Colored.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Masked 1.shader
        │   │   │   │   │   ├── Unlit - Transparent Masked 1.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Masked 2.shader
        │   │   │   │   │   ├── Unlit - Transparent Masked 2.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Masked 3.shader
        │   │   │   │   │   ├── Unlit - Transparent Masked 3.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Masked.shader
        │   │   │   │   │   ├── Unlit - Transparent Masked.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Packed 1.shader
        │   │   │   │   │   ├── Unlit - Transparent Packed 1.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Packed 2.shader
        │   │   │   │   │   ├── Unlit - Transparent Packed 2.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Packed 3.shader
        │   │   │   │   │   ├── Unlit - Transparent Packed 3.shader.meta
        │   │   │   │   │   ├── Unlit - Transparent Packed.shader
        │   │   │   │   │   └── Unlit - Transparent Packed.shader.meta
        │   │   │   │   ├── Shaders.meta
        │   │   │   │   ├── StreamingAssets/
        │   │   │   │   │   ├── LottieSamples/
        │   │   │   │   │   │   ├── alright_sticker.json
        │   │   │   │   │   │   ├── alright_sticker.json.meta
        │   │   │   │   │   │   ├── black_friday_animation.json
        │   │   │   │   │   │   ├── black_friday_animation.json.meta
        │   │   │   │   │   │   ├── body_movin.json
        │   │   │   │   │   │   ├── body_movin.json.meta
        │   │   │   │   │   │   ├── butterfly_loading.json
        │   │   │   │   │   │   ├── butterfly_loading.json.meta
        │   │   │   │   │   │   ├── check_animation.json
        │   │   │   │   │   │   ├── check_animation.json.meta
        │   │   │   │   │   │   ├── concept_floral_branch_butterfly_and_tree.json
        │   │   │   │   │   │   ├── concept_floral_branch_butterfly_and_tree.json.meta
        │   │   │   │   │   │   ├── confetti.json
        │   │   │   │   │   │   ├── confetti.json.meta
        │   │   │   │   │   │   ├── favourite_app_icon.json
        │   │   │   │   │   │   ├── favourite_app_icon.json.meta
        │   │   │   │   │   │   ├── glow_loading.json
        │   │   │   │   │   │   ├── glow_loading.json.meta
        │   │   │   │   │   │   ├── hamburger_arrow_transition.json
        │   │   │   │   │   │   ├── hamburger_arrow_transition.json.meta
        │   │   │   │   │   │   ├── hubit.json
        │   │   │   │   │   │   ├── hubit.json.meta
        │   │   │   │   │   │   ├── lottiefiles_sticker_2.json
        │   │   │   │   │   │   ├── lottiefiles_sticker_2.json.meta
        │   │   │   │   │   │   ├── lottiefiles_sticker_5.json
        │   │   │   │   │   │   ├── lottiefiles_sticker_5.json.meta
        │   │   │   │   │   │   ├── marketing.json
        │   │   │   │   │   │   ├── marketing.json.meta
        │   │   │   │   │   │   ├── motorcycle.json
        │   │   │   │   │   │   ├── motorcycle.json.meta
        │   │   │   │   │   │   ├── phone.json
        │   │   │   │   │   │   ├── phone.json.meta
        │   │   │   │   │   │   ├── power_sticker.json
        │   │   │   │   │   │   ├── power_sticker.json.meta
        │   │   │   │   │   │   ├── preloader.json
        │   │   │   │   │   │   ├── preloader.json.meta
        │   │   │   │   │   │   ├── squid_game/
        │   │   │   │   │   │   │   ├── 0.json
        │   │   │   │   │   │   │   ├── 0.json.meta
        │   │   │   │   │   │   │   ├── 1.json
        │   │   │   │   │   │   │   ├── 1.json.meta
        │   │   │   │   │   │   │   ├── 10.json
        │   │   │   │   │   │   │   ├── 10.json.meta
        │   │   │   │   │   │   │   ├── 11.json
        │   │   │   │   │   │   │   ├── 11.json.meta
        │   │   │   │   │   │   │   ├── 12.json
        │   │   │   │   │   │   │   ├── 12.json.meta
        │   │   │   │   │   │   │   ├── 13.json
        │   │   │   │   │   │   │   ├── 13.json.meta
        │   │   │   │   │   │   │   ├── 14.json
        │   │   │   │   │   │   │   ├── 14.json.meta
        │   │   │   │   │   │   │   ├── 15.json
        │   │   │   │   │   │   │   ├── 15.json.meta
        │   │   │   │   │   │   │   ├── 16.json
        │   │   │   │   │   │   │   ├── 16.json.meta
        │   │   │   │   │   │   │   ├── 17.json
        │   │   │   │   │   │   │   ├── 17.json.meta
        │   │   │   │   │   │   │   ├── 18.json
        │   │   │   │   │   │   │   ├── 18.json.meta
        │   │   │   │   │   │   │   ├── 19.json
        │   │   │   │   │   │   │   ├── 19.json.meta
        │   │   │   │   │   │   │   ├── 2.json
        │   │   │   │   │   │   │   ├── 2.json.meta
        │   │   │   │   │   │   │   ├── 20.json
        │   │   │   │   │   │   │   ├── 20.json.meta
        │   │   │   │   │   │   │   ├── 21.json
        │   │   │   │   │   │   │   ├── 21.json.meta
        │   │   │   │   │   │   │   ├── 22.json
        │   │   │   │   │   │   │   ├── 22.json.meta
        │   │   │   │   │   │   │   ├── 23.json
        │   │   │   │   │   │   │   ├── 23.json.meta
        │   │   │   │   │   │   │   ├── 24.json
        │   │   │   │   │   │   │   ├── 24.json.meta
        │   │   │   │   │   │   │   ├── 3.json
        │   │   │   │   │   │   │   ├── 3.json.meta
        │   │   │   │   │   │   │   ├── 4.json
        │   │   │   │   │   │   │   ├── 4.json.meta
        │   │   │   │   │   │   │   ├── 5.json
        │   │   │   │   │   │   │   ├── 5.json.meta
        │   │   │   │   │   │   │   ├── 6.json
        │   │   │   │   │   │   │   ├── 6.json.meta
        │   │   │   │   │   │   │   ├── 7.json
        │   │   │   │   │   │   │   ├── 7.json.meta
        │   │   │   │   │   │   │   ├── 8.json
        │   │   │   │   │   │   │   ├── 8.json.meta
        │   │   │   │   │   │   │   ├── 9.json
        │   │   │   │   │   │   │   └── 9.json.meta
        │   │   │   │   │   │   ├── squid_game.meta
        │   │   │   │   │   │   ├── sticker.json
        │   │   │   │   │   │   ├── sticker.json.meta
        │   │   │   │   │   │   ├── taking_the_duggy_out.json
        │   │   │   │   │   │   └── taking_the_duggy_out.json.meta
        │   │   │   │   │   └── LottieSamples.meta
        │   │   │   │   └── StreamingAssets.meta
        │   │   │   └── SceneUI.meta
        │   │   ├── Tests/
        │   │   │   ├── Audio/
        │   │   │   │   ├── pause.mp3.meta
        │   │   │   │   ├── start.mp3.meta
        │   │   │   │   └── stop.mp3.meta
        │   │   │   ├── Audio.meta
        │   │   │   ├── Resources/
        │   │   │   │   ├── body_movin.json
        │   │   │   │   ├── body_movin.json.meta
        │   │   │   │   ├── video_player_icon.json
        │   │   │   │   └── video_player_icon.json.meta
        │   │   │   ├── Resources.meta
        │   │   │   ├── Runtime/
        │   │   │   │   ├── LottiePlugin.Tests.Runtime.asmdef
        │   │   │   │   ├── LottiePlugin.Tests.Runtime.asmdef.meta
        │   │   │   │   ├── src/
        │   │   │   │   │   ├── AnimatedImageTests.cs
        │   │   │   │   │   └── AnimatedImageTests.cs.meta
        │   │   │   │   └── src.meta
        │   │   │   └── Runtime.meta
        │   │   ├── Tests.meta
        │   │   ├── package.json
        │   │   └── package.json.meta
        │   ├── LottiePlugin.meta
        │   ├── Scenes/
        │   │   ├── Main.unity
        │   │   └── Main.unity.meta
        │   ├── Scenes.meta
        │   ├── StreamingAssets/
        │   │   ├── LottieSamples/
        │   │   │   ├── alright_sticker.json
        │   │   │   ├── alright_sticker.json.meta
        │   │   │   ├── black_friday_animation.json
        │   │   │   ├── black_friday_animation.json.meta
        │   │   │   ├── body_movin.json
        │   │   │   ├── body_movin.json.meta
        │   │   │   ├── butterfly_loading.json
        │   │   │   ├── butterfly_loading.json.meta
        │   │   │   ├── check_animation.json
        │   │   │   ├── check_animation.json.meta
        │   │   │   ├── concept_floral_branch_butterfly_and_tree.json
        │   │   │   ├── concept_floral_branch_butterfly_and_tree.json.meta
        │   │   │   ├── confetti.json
        │   │   │   ├── confetti.json.meta
        │   │   │   ├── favourite_app_icon.json
        │   │   │   ├── favourite_app_icon.json.meta
        │   │   │   ├── glow_loading.json
        │   │   │   ├── glow_loading.json.meta
        │   │   │   ├── hamburger_arrow_transition.json
        │   │   │   ├── hamburger_arrow_transition.json.meta
        │   │   │   ├── hubit.json
        │   │   │   ├── hubit.json.meta
        │   │   │   ├── lottiefiles_sticker_2.json
        │   │   │   ├── lottiefiles_sticker_2.json.meta
        │   │   │   ├── lottiefiles_sticker_5.json
        │   │   │   ├── lottiefiles_sticker_5.json.meta
        │   │   │   ├── marketing.json
        │   │   │   ├── marketing.json.meta
        │   │   │   ├── motorcycle.json
        │   │   │   ├── motorcycle.json.meta
        │   │   │   ├── phone.json
        │   │   │   ├── phone.json.meta
        │   │   │   ├── power_sticker.json
        │   │   │   ├── power_sticker.json.meta
        │   │   │   ├── preloader.json
        │   │   │   ├── preloader.json.meta
        │   │   │   ├── squid_game/
        │   │   │   │   ├── 0.json
        │   │   │   │   ├── 0.json.meta
        │   │   │   │   ├── 1.json
        │   │   │   │   ├── 1.json.meta
        │   │   │   │   ├── 10.json
        │   │   │   │   ├── 10.json.meta
        │   │   │   │   ├── 11.json
        │   │   │   │   ├── 11.json.meta
        │   │   │   │   ├── 12.json
        │   │   │   │   ├── 12.json.meta
        │   │   │   │   ├── 13.json
        │   │   │   │   ├── 13.json.meta
        │   │   │   │   ├── 14.json
        │   │   │   │   ├── 14.json.meta
        │   │   │   │   ├── 15.json
        │   │   │   │   ├── 15.json.meta
        │   │   │   │   ├── 16.json
        │   │   │   │   ├── 16.json.meta
        │   │   │   │   ├── 17.json
        │   │   │   │   ├── 17.json.meta
        │   │   │   │   ├── 18.json
        │   │   │   │   ├── 18.json.meta
        │   │   │   │   ├── 19.json
        │   │   │   │   ├── 19.json.meta
        │   │   │   │   ├── 2.json
        │   │   │   │   ├── 2.json.meta
        │   │   │   │   ├── 20.json
        │   │   │   │   ├── 20.json.meta
        │   │   │   │   ├── 21.json
        │   │   │   │   ├── 21.json.meta
        │   │   │   │   ├── 22.json
        │   │   │   │   ├── 22.json.meta
        │   │   │   │   ├── 23.json
        │   │   │   │   ├── 23.json.meta
        │   │   │   │   ├── 24.json
        │   │   │   │   ├── 24.json.meta
        │   │   │   │   ├── 3.json
        │   │   │   │   ├── 3.json.meta
        │   │   │   │   ├── 4.json
        │   │   │   │   ├── 4.json.meta
        │   │   │   │   ├── 5.json
        │   │   │   │   ├── 5.json.meta
        │   │   │   │   ├── 6.json
        │   │   │   │   ├── 6.json.meta
        │   │   │   │   ├── 7.json
        │   │   │   │   ├── 7.json.meta
        │   │   │   │   ├── 8.json
        │   │   │   │   ├── 8.json.meta
        │   │   │   │   ├── 9.json
        │   │   │   │   └── 9.json.meta
        │   │   │   ├── squid_game.meta
        │   │   │   ├── sticker.json
        │   │   │   ├── sticker.json.meta
        │   │   │   ├── taking_the_duggy_out.json
        │   │   │   └── taking_the_duggy_out.json.meta
        │   │   └── LottieSamples.meta
        │   ├── StreamingAssets.meta
        │   ├── TextMesh Pro/
        │   │   ├── Documentation/
        │   │   │   └── TextMesh Pro User Guide 2016.pdf.meta
        │   │   ├── Documentation.meta
        │   │   ├── Fonts/
        │   │   │   ├── LiberationSans - OFL.txt
        │   │   │   ├── LiberationSans - OFL.txt.meta
        │   │   │   └── LiberationSans.ttf.meta
        │   │   ├── Fonts.meta
        │   │   ├── Resources/
        │   │   │   ├── Fonts & Materials/
        │   │   │   │   ├── LiberationSans SDF - Drop Shadow.mat
        │   │   │   │   ├── LiberationSans SDF - Drop Shadow.mat.meta
        │   │   │   │   ├── LiberationSans SDF - Fallback.asset
        │   │   │   │   ├── LiberationSans SDF - Fallback.asset.meta
        │   │   │   │   ├── LiberationSans SDF - Outline.mat
        │   │   │   │   ├── LiberationSans SDF - Outline.mat.meta
        │   │   │   │   ├── LiberationSans SDF.asset
        │   │   │   │   └── LiberationSans SDF.asset.meta
        │   │   │   ├── Fonts & Materials.meta
        │   │   │   ├── LineBreaking Following Characters.txt
        │   │   │   ├── LineBreaking Following Characters.txt.meta
        │   │   │   ├── LineBreaking Leading Characters.txt
        │   │   │   ├── LineBreaking Leading Characters.txt.meta
        │   │   │   ├── Sprite Assets/
        │   │   │   │   ├── EmojiOne.asset
        │   │   │   │   └── EmojiOne.asset.meta
        │   │   │   ├── Sprite Assets.meta
        │   │   │   ├── Style Sheets/
        │   │   │   │   ├── Default Style Sheet.asset
        │   │   │   │   └── Default Style Sheet.asset.meta
        │   │   │   ├── Style Sheets.meta
        │   │   │   ├── TMP Settings.asset
        │   │   │   └── TMP Settings.asset.meta
        │   │   ├── Resources.meta
        │   │   ├── Shaders/
        │   │   │   ├── TMP_Bitmap-Custom-Atlas.shader
        │   │   │   ├── TMP_Bitmap-Custom-Atlas.shader.meta
        │   │   │   ├── TMP_Bitmap-Mobile.shader
        │   │   │   ├── TMP_Bitmap-Mobile.shader.meta
        │   │   │   ├── TMP_Bitmap.shader
        │   │   │   ├── TMP_Bitmap.shader.meta
        │   │   │   ├── TMP_SDF Overlay.shader
        │   │   │   ├── TMP_SDF Overlay.shader.meta
        │   │   │   ├── TMP_SDF SSD.shader
        │   │   │   ├── TMP_SDF SSD.shader.meta
        │   │   │   ├── TMP_SDF-Mobile Masking.shader
        │   │   │   ├── TMP_SDF-Mobile Masking.shader.meta
        │   │   │   ├── TMP_SDF-Mobile Overlay.shader
        │   │   │   ├── TMP_SDF-Mobile Overlay.shader.meta
        │   │   │   ├── TMP_SDF-Mobile SSD.shader
        │   │   │   ├── TMP_SDF-Mobile SSD.shader.meta
        │   │   │   ├── TMP_SDF-Mobile.shader
        │   │   │   ├── TMP_SDF-Mobile.shader.meta
        │   │   │   ├── TMP_SDF-Surface-Mobile.shader
        │   │   │   ├── TMP_SDF-Surface-Mobile.shader.meta
        │   │   │   ├── TMP_SDF-Surface.shader
        │   │   │   ├── TMP_SDF-Surface.shader.meta
        │   │   │   ├── TMP_SDF.shader
        │   │   │   ├── TMP_SDF.shader.meta
        │   │   │   ├── TMP_Sprite.shader
        │   │   │   ├── TMP_Sprite.shader.meta
        │   │   │   ├── TMPro.cginc
        │   │   │   ├── TMPro.cginc.meta
        │   │   │   ├── TMPro_Mobile.cginc
        │   │   │   ├── TMPro_Mobile.cginc.meta
        │   │   │   ├── TMPro_Properties.cginc
        │   │   │   ├── TMPro_Properties.cginc.meta
        │   │   │   ├── TMPro_Surface.cginc
        │   │   │   └── TMPro_Surface.cginc.meta
        │   │   ├── Shaders.meta
        │   │   ├── Sprites/
        │   │   │   ├── EmojiOne Attribution.txt
        │   │   │   ├── EmojiOne Attribution.txt.meta
        │   │   │   ├── EmojiOne.json
        │   │   │   ├── EmojiOne.json.meta
        │   │   │   └── EmojiOne.png.meta
        │   │   └── Sprites.meta
        │   └── TextMesh Pro.meta
        ├── Packages/
        │   ├── manifest.json
        │   └── packages-lock.json
        ├── ProjectSettings/
        │   ├── AudioManager.asset
        │   ├── ClusterInputManager.asset
        │   ├── DynamicsManager.asset
        │   ├── EditorBuildSettings.asset
        │   ├── EditorSettings.asset
        │   ├── GraphicsSettings.asset
        │   ├── InputManager.asset
        │   ├── MemorySettings.asset
        │   ├── NavMeshAreas.asset
        │   ├── PackageManagerSettings.asset
        │   ├── Physics2DSettings.asset
        │   ├── PresetManager.asset
        │   ├── ProjectSettings.asset
        │   ├── ProjectVersion.txt
        │   ├── QualitySettings.asset
        │   ├── TagManager.asset
        │   ├── TimeManager.asset
        │   ├── UnityConnectSettings.asset
        │   ├── VFXManager.asset
        │   ├── VersionControlSettings.asset
        │   └── XRSettings.asset
        └── UserSettings/
            ├── AndroidLogcatSettings.asset
            ├── EditorUserSettings.asset
            ├── Search.index
            └── Search.settings
Download .txt
SYMBOL INDEX (419 symbols across 59 files)

FILE: dependency/pixman/pixman-arm-intrisics.cpp
  function pixman_composite_src_n_8888_asm_neon (line 3) | void pixman_composite_src_n_8888_asm_neon(int32_t w, int32_t h,
  function pixman_composite_over_n_8888_asm_neon (line 20) | void pixman_composite_over_n_8888_asm_neon(int32_t w, int32_t h,

FILE: dependency/pixman/pixman-cpp-standard.cpp
  function pixman_composite_src_n_8888_asm_neon (line 7) | void pixman_composite_src_n_8888_asm_neon(int32_t w, int32_t h,
  function vAlpha (line 16) | inline constexpr int vAlpha(uint32_t c)
  function pixman_composite_over_n_8888_asm_neon (line 21) | void pixman_composite_over_n_8888_asm_neon(int32_t w, int32_t h,

FILE: projects/AndroidStudio/app/src/androidTest/java/com/gindemit/rlottie/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 18) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 20) | @Test

FILE: projects/AndroidStudio/app/src/main/java/com/gindemit/rlottie/MainActivity.java
  class MainActivity (line 10) | public class MainActivity extends AppCompatActivity {
    method onCreate (line 19) | @Override
    method stringFromJNI (line 35) | public native String stringFromJNI();

FILE: projects/AndroidStudio/app/src/test/java/com/gindemit/rlottie/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: src/LottiePlugin.cpp
  function lottie_animation_wrapper (line 6) | static lottie_animation_wrapper* create_animation_wrapper(std::unique_pt...
  function EXPORT_API (line 29) | EXPORT_API int32_t lottie_load_from_data(
  function EXPORT_API (line 42) | EXPORT_API int32_t lottie_load_from_file(
  function EXPORT_API (line 55) | EXPORT_API int32_t lottie_dispose_wrapper(lottie_animation_wrapper** ani...
  function EXPORT_API (line 61) | EXPORT_API int32_t lottie_render_immediately(
  function EXPORT_API (line 78) | EXPORT_API int32_t lottie_render_create_future_async(
  function EXPORT_API (line 92) | EXPORT_API int32_t lottie_render_get_future_result(
  function EXPORT_API (line 99) | EXPORT_API int32_t lottie_render_create_future_async(
  function EXPORT_API (line 112) | EXPORT_API int32_t lottie_render_get_future_result(
  function EXPORT_API (line 120) | EXPORT_API int32_t lottie_allocate_render_data(lottie_render_data** rend...
  function EXPORT_API (line 129) | EXPORT_API int32_t lottie_dispose_render_data(lottie_render_data** rende...

FILE: src/LottiePlugin.h
  type lottie_animation_wrapper (line 9) | typedef struct lottie_animation_wrapper {
  type lottie_render_data (line 19) | typedef struct lottie_render_data {

FILE: unity/RLottieUnity/Assets/LottiePlugin/Editor/src/AnimatedButtonEditor.cs
  class AnimatedButtonEditor (line 10) | [CustomEditor(typeof(AnimatedButton), true)]
    method OnEnable (line 32) | protected override void OnEnable()
    method OnDisable (line 61) | protected override void OnDisable()
    method OnInspectorGUI (line 73) | public override void OnInspectorGUI()
    method CreateAnimationIfNecessaryAndAttachToGraphic (line 150) | private void CreateAnimationIfNecessaryAndAttachToGraphic()
    method UpdateTheAnimationInfoBoxText (line 174) | private void UpdateTheAnimationInfoBoxText()
    method DrawListItems (line 196) | private void DrawListItems(Rect rect, int index, bool isActive, bool i...
    method DrawHeader (line 245) | private void DrawHeader(Rect rect)
    method AddCallback (line 252) | private void AddCallback(ReorderableList list)
    method SetStateValuesAtIndex (line 259) | private void SetStateValuesAtIndex(int index, string stateName, int fr...
    method OnSelectCallback (line 267) | private void OnSelectCallback(ReorderableList list)
    method GetStateNameProperty (line 279) | private static SerializedProperty GetStateNameProperty(SerializedPrope...
    method GetFrameNumberProperty (line 281) | private static SerializedProperty GetFrameNumberProperty(SerializedPro...

FILE: unity/RLottieUnity/Assets/LottiePlugin/Editor/src/AnimatedImageEditor.cs
  class AnimatedImageEditor (line 8) | [CustomEditor(typeof(AnimatedImage), true)]
    method OnEnable (line 28) | private void OnEnable()
    method OnInspectorGUI (line 46) | public override void OnInspectorGUI()
    method CreateAnimationIfNecessaryAndAttachToGraphic (line 107) | private void CreateAnimationIfNecessaryAndAttachToGraphic()
    method UpdateTheAnimationInfoBoxText (line 131) | private void UpdateTheAnimationInfoBoxText()

FILE: unity/RLottieUnity/Assets/LottiePlugin/Editor/src/OpenPersistentDataPathFolder.cs
  class OpenPersistentDataPathFolder (line 6) | internal static class OpenPersistentDataPathFolder
    method OpenPersistentDataFolder (line 8) | [MenuItem("Tools/Open Persistent Data Folder")]

FILE: unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/LottieAnimation.cs
  class LottieAnimation (line 11) | public sealed class LottieAnimation : IDisposable
    method LottieAnimation (line 37) | private LottieAnimation(string jsonData, string resourcesPath, uint wi...
    method LottieAnimation (line 49) | private LottieAnimation(string jsonFilePath, uint width, uint height)
    method Dispose (line 61) | public void Dispose()
    method Update (line 71) | public void Update(float animationSpeed = 1f)
    method UpdateAsync (line 75) | public void UpdateAsync(float animationSpeed = 1f)
    method TogglePlay (line 79) | public void TogglePlay()
    method Play (line 83) | public void Play()
    method Pause (line 89) | public void Pause()
    method Stop (line 94) | public void Stop()
    method DrawOneFrame (line 100) | public void DrawOneFrame(int frameNumber)
    method DrawOneFrameAsyncPrepare (line 106) | public void DrawOneFrameAsyncPrepare(int frameNumber)
    method DrawOneFrameAsyncGetResult (line 110) | public void DrawOneFrameAsyncGetResult()
    method CreateRenderDataTexture2DMarshalToNative (line 120) | private unsafe void CreateRenderDataTexture2DMarshalToNative(uint widt...
    method UpdateInternal (line 137) | private void UpdateInternal(float animationSpeed, Action<int> drawOneF...
    method LoadFromJsonFile (line 157) | public static LottieAnimation LoadFromJsonFile(string filePath, uint w...
    method LoadFromJsonData (line 162) | public static LottieAnimation LoadFromJsonData(string jsonData, string...

FILE: unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/LottieAnimationsAtlas.cs
  class LottieAnimationsAtlas (line 11) | public sealed class LottieAnimationsAtlas : IDisposable
    method LottieAnimationsAtlas (line 43) | private LottieAnimationsAtlas(string[] jsonFilePaths, uint width, uint...
    method Dispose (line 68) | public void Dispose()
    method Update (line 82) | public void Update(float animationSpeed = 1f)
    method UpdateAsync (line 86) | public void UpdateAsync(float animationSpeed = 1f)
    method TogglePlay (line 90) | public void TogglePlay()
    method Play (line 94) | public void Play()
    method Pause (line 102) | public void Pause()
    method Stop (line 106) | public void Stop()
    method DrawOneFrame (line 114) | public void DrawOneFrame(int frameNumber, int index)
    method DrawOneFrameAsyncPrepare (line 120) | public void DrawOneFrameAsyncPrepare(int frameNumber, int index)
    method DrawOneFrameAsyncGetResult (line 124) | public void DrawOneFrameAsyncGetResult()
    method CreateRenderDataAtlasTexture2DMarshalToNative (line 142) | private unsafe void CreateRenderDataAtlasTexture2DMarshalToNative(int ...
    method UpdateInternal (line 176) | private void UpdateInternal(float animationSpeed, Action<int, int> dra...
    method LoadFromJsonFiles (line 199) | public static LottieAnimationsAtlas LoadFromJsonFiles(string[] filePat...

FILE: unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/NativeBridge.cs
  type LottieAnimationWrapper (line 7) | [StructLayout(LayoutKind.Sequential)]
  type LottieRenderData (line 18) | [StructLayout(LayoutKind.Sequential)]
  class NativeBridge (line 26) | internal static class NativeBridge
    method LottieLoadFromData (line 34) | [DllImport(PLUGIN_NAME,
    method LottieLoadFromFile (line 42) | [DllImport(PLUGIN_NAME,
    method LottieDisposeWrapper (line 49) | [DllImport(PLUGIN_NAME,
    method LottieRenderImmediately (line 55) | [DllImport(PLUGIN_NAME,
    method LottieRenderCreateFutureAsync (line 64) | [DllImport(PLUGIN_NAME,
    method LottieRenderGetFutureResult (line 72) | [DllImport(PLUGIN_NAME,
    method LottieAllocateRenderData (line 79) | [DllImport(PLUGIN_NAME,
    method LottieDisposeRenderData (line 84) | [DllImport(PLUGIN_NAME,
    method LoadFromData (line 90) | internal static LottieAnimationWrapper LoadFromData(string filePath, s...
    method LoadFromFile (line 95) | internal static LottieAnimationWrapper LoadFromFile(string filePath, o...
    method Dispose (line 100) | internal static void Dispose(LottieAnimationWrapper lottieAnimationWra...

FILE: unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Support/FIleSizeFormatter.cs
  class FIleSizeFormatter (line 3) | public static class FIleSizeFormatter
    method ToPrettyFileSize (line 7) | public static string ToPrettyFileSize(long fileSize)

FILE: unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Support/FilesHelper.cs
  class FilesHelper (line 6) | public static class FilesHelper
    method CopyAnimationsJsonsFromStreamingAssetsToPersistentData (line 10) | public static void CopyAnimationsJsonsFromStreamingAssetsToPersistentD...
    method CopyFileFromStreamingAssetsToPersistentData (line 23) | public static void CopyFileFromStreamingAssetsToPersistentData(string ...
    method GetPersistentAnimationsPaths (line 29) | public static string[] GetPersistentAnimationsPaths(string[] animations)
    method GetPersistentAnimationPath (line 38) | public static string GetPersistentAnimationPath(string animation)

FILE: unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Support/StreamingAssetsHelper.cs
  class StreamingAssetsHelper (line 5) | public static class StreamingAssetsHelper
    method LoadFileFromStreamingAssets (line 7) | public static byte[] LoadFileFromStreamingAssets(string streamingAsset...

FILE: unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/UI/AnimatedButton.cs
  class AnimatedButton (line 9) | public sealed class AnimatedButton : Selectable, IPointerClickHandler, I...
    type State (line 11) | [System.Serializable]
    class ButtonClickedEvent (line 17) | [System.Serializable]
    method Awake (line 42) | protected override void Awake()
    method Start (line 48) | protected override void Start()
    method OnDestroy (line 58) | protected override void OnDestroy()
    method ResetState (line 63) | public void ResetState()
    method OnPointerClick (line 69) | public void OnPointerClick(PointerEventData eventData)
    method OnSubmit (line 75) | public void OnSubmit(BaseEventData eventData)
    method CreateIfNeededAndReturnLottieAnimation (line 79) | internal LottieAnimation CreateIfNeededAndReturnLottieAnimation()
    method SetTextureToTheTargetRawImage (line 100) | internal void SetTextureToTheTargetRawImage()
    method DisposeLottieAnimation (line 108) | internal void DisposeLottieAnimation()
    method Press (line 117) | private void Press()
    method AnimateToNextState (line 137) | private IEnumerator AnimateToNextState()

FILE: unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/UI/AnimatedImage.cs
  class AnimatedImage (line 8) | [RequireComponent(typeof(RawImage))]
    class AnimationEvent (line 12) | [System.Serializable]
    method Awake (line 42) | private void Awake()
    method Start (line 48) | private void Start()
    method OnDestroy (line 65) | private void OnDestroy()
    method Play (line 70) | public void Play()
    method Pause (line 79) | public void Pause()
    method Stop (line 83) | public void Stop()
    method LoadFromAnimationJson (line 94) | public void LoadFromAnimationJson(string json, uint width, uint height...
    method CreateIfNeededAndReturnLottieAnimation (line 121) | internal LottieAnimation CreateIfNeededAndReturnLottieAnimation()
    method DisposeLottieAnimation (line 149) | internal void DisposeLottieAnimation()
    method RenderLottieAnimationCoroutine (line 161) | private IEnumerator RenderLottieAnimationCoroutine()
    method OnAnimationStarted (line 177) | private void OnAnimationStarted(LottieAnimation animation)
    method OnAnimationPaused (line 181) | private void OnAnimationPaused(LottieAnimation animation)
    method OnAnimationStopped (line 185) | private void OnAnimationStopped(LottieAnimation animation)

FILE: unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Utility/ThrowIf.cs
  class ThrowIf (line 6) | public static class ThrowIf
    class Argument (line 8) | public static class Argument
      method IsNull (line 10) | public static void IsNull(object argument, string argumentName)
    class String (line 18) | public static class String
      method IsNullOrEmpty (line 20) | public static void IsNullOrEmpty(string str, string strName)
    class Collection (line 32) | public static class Collection
      method IsNullOrEmpty (line 34) | public static void IsNullOrEmpty(ICollection collection, string coll...
    class Field (line 46) | public static class Field
      method IsNull (line 48) | public static void IsNull(object argument, string argumentName)
      method IsNotNull (line 55) | public static void IsNotNull(object argument, string argumentName)
    class Value (line 63) | public static class Value
      method IsZero (line 65) | public static void IsZero(int value, string valueName)
      method IsZero (line 72) | public static void IsZero(uint value, string valueName)
      method IsZeroOrNegative (line 79) | public static void IsZeroOrNegative(int value, string valueName)
    class Index (line 87) | public static class Index
      method IsOutOfBounds (line 89) | public static void IsOutOfBounds(int index, string collectionName, I...

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyDebuggerEditor.cs
  class GraphyDebuggerEditor (line 22) | [CustomEditor(typeof(GraphyDebugger))]
    method OnEnable (line 48) | private void OnEnable()
    method OnInspectorGUI (line 57) | public override void OnInspectorGUI()
    method SetDefaultDebugPacketValues (line 501) | private void SetDefaultDebugPacketValues(SerializedProperty debugPacke...
    method GetComparerStringFromDebugVariable (line 526) | private string GetComparerStringFromDebugVariable(GraphyDebugger.Debug...
    method GetComparerStringFromDebugComparer (line 555) | private string GetComparerStringFromDebugComparer(GraphyDebugger.Debug...

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyEditorStyle.cs
  class GraphyEditorStyle (line 21) | internal static class GraphyEditorStyle
    method GraphyEditorStyle (line 48) | static GraphyEditorStyle()
    method SetGuiStyleFontColor (line 104) | private static void SetGuiStyleFontColor(GUIStyle guiStyle, Color color)

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyManagerEditor.cs
  class GraphyManagerEditor (line 21) | [CustomEditor(typeof(GraphyManager))]
    method OnEnable (line 142) | private void OnEnable()
    method OnInspectorGUI (line 241) | public override void OnInspectorGUI()

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyMenuItem.cs
  class GraphyMenuItem (line 19) | public class GraphyMenuItem
    method CreatePrefabVariant (line 21) | [MenuItem("Tools/Graphy/Create Prefab Variant")]
    method ImportGraphyCustomizationScene (line 53) | [MenuItem( "Tools/Graphy/Import Graphy Customization Scene" )]

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Advanced/G_AdvancedData.cs
  class G_AdvancedData (line 28) | public class G_AdvancedData : MonoBehaviour, IMovable, IModifiableState
    method OnEnable (line 79) | private void OnEnable()
    method Update (line 84) | private void Update()
    method SetPosition (line 111) | public void SetPosition(GraphyManager.ModulePosition newModulePosition)
    method SetState (line 206) | public void SetState(GraphyManager.ModuleState state, bool silentUpdat...
    method RestorePreviousState (line 227) | public void RestorePreviousState()
    method UpdateParameters (line 232) | public void UpdateParameters()
    method RefreshParameters (line 243) | public void RefreshParameters()
    method Init (line 258) | private void Init()

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioGraph.cs
  class G_AudioGraph (line 20) | public class G_AudioGraph : G_Graph
    method OnEnable (line 52) | private void OnEnable()
    method Update (line 71) | private void Update()
    method UpdateParameters (line 83) | public void UpdateParameters()
    method UpdateGraph (line 122) | protected override void UpdateGraph()
    method CreatePoints (line 214) | protected override void CreatePoints()
    method Init (line 267) | private void Init()

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioManager.cs
  class G_AudioManager (line 22) | public class G_AudioManager : MonoBehaviour, IMovable, IModifiableState
    method Awake (line 52) | private void Awake()
    method Start (line 57) | private void Start()
    method SetPosition (line 66) | public void SetPosition(GraphyManager.ModulePosition newModulePosition)
    method SetState (line 112) | public void SetState(GraphyManager.ModuleState state, bool silentUpdat...
    method RestorePreviousState (line 171) | public void RestorePreviousState()
    method UpdateParameters (line 176) | public void UpdateParameters()
    method RefreshParameters (line 190) | public void RefreshParameters()
    method Init (line 208) | private void Init()
    method SetGraphActive (line 227) | private void SetGraphActive(bool active)

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioMonitor.cs
  class G_AudioMonitor (line 24) | public class G_AudioMonitor : MonoBehaviour
    method Awake (line 68) | private void Awake()
    method Update (line 73) | private void Update()
    method OnDestroy (line 125) | private void OnDestroy()
    method UpdateParameters (line 134) | public void UpdateParameters()
    method lin2dB (line 157) | public float lin2dB(float linear)
    method dBNormalized (line 167) | public float dBNormalized(float db)
    method FindAudioListener (line 179) | private AudioListener FindAudioListener()
    method OnSceneLoaded (line 191) | private void OnSceneLoaded(Scene scene, LoadSceneMode loadSceneMode)
    method Init (line 199) | private void Init()

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioText.cs
  class G_AudioText (line 20) | public class G_AudioText : MonoBehaviour
    method Awake (line 42) | private void Awake()
    method Update (line 47) | private void Update()
    method UpdateParameters (line 68) | public void UpdateParameters()
    method Init (line 77) | private void Init()

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsGraph.cs
  class G_FpsGraph (line 20) | public class G_FpsGraph : G_Graph
    method Update (line 52) | private void Update()
    method UpdateParameters (line 61) | public void UpdateParameters()
    method UpdateGraph (line 93) | protected override void UpdateGraph()
    method CreatePoints (line 153) | protected override void CreatePoints()
    method Init (line 179) | private void Init()

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsManager.cs
  class G_FpsManager (line 22) | public class G_FpsManager : MonoBehaviour, IMovable, IModifiableState
    method Awake (line 53) | private void Awake()
    method Start (line 58) | private void Start()
    method SetPosition (line 67) | public void SetPosition(GraphyManager.ModulePosition newModulePosition)
    method SetState (line 111) | public void SetState(GraphyManager.ModuleState state, bool silentUpdat...
    method RestorePreviousState (line 185) | public void RestorePreviousState()
    method UpdateParameters (line 190) | public void UpdateParameters()
    method RefreshParameters (line 204) | public void RefreshParameters()
    method Init (line 222) | private void Init()
    method SetGraphActive (line 241) | private void SetGraphActive(bool active)

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsMonitor.cs
  class G_FpsMonitor (line 21) | public class G_FpsMonitor : MonoBehaviour
    method Awake (line 48) | private void Awake()
    method Update (line 53) | private void Update()
    method UpdateParameters (line 125) | public void UpdateParameters()
    method Init (line 135) | private void Init()

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsText.cs
  class G_FpsText (line 20) | public class G_FpsText : MonoBehaviour
    method Awake (line 55) | private void Awake()
    method Update (line 60) | private void Update()
    method UpdateParameters (line 103) | public void UpdateParameters()
    method SetFpsRelatedTextColor (line 124) | private void SetFpsRelatedTextColor(Text text, float fps)
    method Init (line 140) | private void Init()

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Graph/G_Graph.cs
  class G_Graph (line 18) | public abstract class G_Graph : MonoBehaviour
    method UpdateGraph (line 25) | protected abstract void UpdateGraph();
    method CreatePoints (line 30) | protected abstract void CreatePoints();

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/GraphyDebugger.cs
  class GraphyDebugger (line 32) | public class GraphyDebugger : G_Singleton<GraphyDebugger>
    method GraphyDebugger (line 41) | protected GraphyDebugger () { }
    type DebugVariable (line 45) | public enum DebugVariable
    type DebugComparer (line 57) | public enum DebugComparer
    type ConditionEvaluation (line 66) | public enum ConditionEvaluation
    type MessageType (line 73) | public enum MessageType
    type DebugCondition (line 84) | [System.Serializable]
    class DebugPacket (line 99) | [System.Serializable]
      method Update (line 138) | public void Update()
      method Executed (line 154) | public void Executed()
    method Start (line 179) | private void Start()
    method Update (line 186) | private void Update()
    method AddNewDebugPacket (line 198) | public void AddNewDebugPacket(DebugPacket newDebugPacket)
    method AddNewDebugPacket (line 206) | public void AddNewDebugPacket
    method AddNewDebugPacket (line 231) | public void AddNewDebugPacket
    method AddNewDebugPacket (line 256) | public void AddNewDebugPacket
    method AddNewDebugPacket (line 281) | public void AddNewDebugPacket
    method GetFirstDebugPacketWithId (line 308) | public DebugPacket GetFirstDebugPacketWithId(int packetId)
    method GetAllDebugPacketsWithId (line 318) | public List<DebugPacket> GetAllDebugPacketsWithId(int packetId)
    method RemoveFirstDebugPacketWithId (line 328) | public void RemoveFirstDebugPacketWithId(int packetId)
    method RemoveAllDebugPacketsWithId (line 341) | public void RemoveAllDebugPacketsWithId(int packetId)
    method AddCallbackToFirstDebugPacketWithId (line 354) | public void AddCallbackToFirstDebugPacketWithId(System.Action callback...
    method AddCallbackToAllDebugPacketWithId (line 367) | public void AddCallbackToAllDebugPacketWithId(System.Action callback, ...
    method CheckDebugPackets (line 388) | private void CheckDebugPackets()
    method CheckIfConditionIsMet (line 460) | private bool CheckIfConditionIsMet(DebugCondition debugCondition)
    method GetRequestedValueFromDebugVariable (line 485) | private float GetRequestedValueFromDebugVariable(DebugVariable debugVa...
    method ExecuteOperationsInDebugPacket (line 518) | private void ExecuteOperationsInDebugPacket(DebugPacket debugPacket)

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/GraphyManager.cs
  class GraphyManager (line 32) | public class GraphyManager : G_Singleton<GraphyManager>
    method GraphyManager (line 34) | protected GraphyManager () { }
    type Mode (line 39) | public enum Mode
    type ModuleType (line 45) | public enum ModuleType
    type ModuleState (line 53) | public enum ModuleState
    type ModulePosition (line 62) | public enum ModulePosition
    type LookForAudioListener (line 71) | public enum LookForAudioListener
    type ModulePreset (line 78) | public enum ModulePreset
    method Start (line 354) | private void Start()
    method OnDestroy (line 359) | private void OnDestroy()
    method Update (line 365) | private void Update()
    method OnApplicationFocus (line 373) | private void OnApplicationFocus(bool isFocused)
    method SetModulePosition (line 387) | public void SetModulePosition(ModuleType moduleType, ModulePosition mo...
    method SetModuleMode (line 407) | public void SetModuleMode(ModuleType moduleType, ModuleState moduleState)
    method ToggleModes (line 429) | public void ToggleModes()
    method SetPreset (line 443) | public void SetPreset(ModulePreset modulePreset)
    method ToggleActive (line 539) | public void ToggleActive()
    method Enable (line 551) | public void Enable()
    method Disable (line 571) | public void Disable()
    method Init (line 588) | private void Init()
    method CheckForHotkeyPresses (line 625) | private void CheckForHotkeyPresses()
    method CheckFor1KeyPress (line 773) | private bool CheckFor1KeyPress(Key key)
    method CheckFor2KeyPress (line 785) | private bool CheckFor2KeyPress(Key key1, Key key2)
    method CheckFor3KeyPress (line 798) | private bool CheckFor3KeyPress(Key key1, Key key2, Key key3)
    method CheckFor1KeyPress (line 812) | private bool CheckFor1KeyPress(KeyCode key)
    method CheckFor2KeyPress (line 817) | private bool CheckFor2KeyPress(KeyCode key1, KeyCode key2)
    method CheckFor3KeyPress (line 823) | private bool CheckFor3KeyPress(KeyCode key1, KeyCode key2, KeyCode key3)
    method UpdateAllParameters (line 830) | private void UpdateAllParameters()
    method RefreshAllParameters (line 838) | private void RefreshAllParameters()

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Ram/G_RamGraph.cs
  class G_RamGraph (line 24) | public class G_RamGraph : G_Graph
    method Update (line 61) | private void Update()
    method UpdateParameters (line 70) | public void UpdateParameters()
    method UpdateGraph (line 125) | protected override void UpdateGraph()
    method CreatePoints (line 175) | protected override void CreatePoints()
    method Init (line 250) | private void Init()

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Ram/G_RamManager.cs
  class G_RamManager (line 22) | public class G_RamManager : MonoBehaviour, IMovable, IModifiableState
    method Awake (line 59) | private void Awake()
    method Start (line 64) | private void Start()
    method SetPosition (line 73) | public void SetPosition(GraphyManager.ModulePosition newModulePosition)
    method SetState (line 117) | public void SetState(GraphyManager.ModuleState state, bool silentUpdat...
    method RestorePreviousState (line 176) | public void RestorePreviousState()
    method UpdateParameters (line 181) | public void UpdateParameters()
    method RefreshParameters (line 194) | public void RefreshParameters()
    method Init (line 211) | private void Init()
    method SetGraphActive (line 229) | private void SetGraphActive(bool active)

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Ram/G_RamMonitor.cs
  class G_RamMonitor (line 22) | public class G_RamMonitor : MonoBehaviour
    method Update (line 34) | private void Update()

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Ram/G_RamText.cs
  class G_RamText (line 20) | public class G_RamText : MonoBehaviour
    method Awake (line 44) | private void Awake()
    method Update (line 49) | private void Update()
    method UpdateParameters (line 68) | public void UpdateParameters()
    method Init (line 81) | private void Init()

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Shader/G_GraphShader.cs
  class G_GraphShader (line 23) | public class G_GraphShader
    method InitializeShader (line 74) | public void InitializeShader()
    method UpdateArray (line 91) | public void UpdateArray()
    method UpdateAverage (line 99) | public void UpdateAverage()
    method UpdateThresholds (line 107) | public void UpdateThresholds()
    method UpdateColors (line 116) | public void UpdateColors()
    method UpdatePoints (line 126) | public void UpdatePoints()

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/UI/IModifiableState.cs
  type IModifiableState (line 16) | public interface IModifiableState
    method SetState (line 24) | void SetState(GraphyManager.ModuleState newState, bool silentUpdate);

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/UI/IMovable.cs
  type IMovable (line 16) | public interface IMovable
    method SetPosition (line 24) | void SetPosition(GraphyManager.ModulePosition newModulePosition);

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Util/G_ExtensionMethods.cs
  class G_ExtensionMethods (line 20) | public static class G_ExtensionMethods
    method SetAllActive (line 33) | public static List<GameObject> SetAllActive(this List<GameObject> game...
    method SetOneActive (line 43) | public static List<Image> SetOneActive(this List<Image> images, int ac...
    method SetAllActive (line 53) | public static List<Image> SetAllActive(this List<Image> images, bool a...

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Util/G_FloatString.cs
  class G_FloatString (line 18) | public static class G_FloatString
    method Init (line 69) | public static void Init( float minNegativeValue, float maxPositiveValue )
    method Dispose (line 93) | public static void Dispose()
    method ToStringNonAlloc (line 108) | public static string ToStringNonAlloc(this float value)
    method ToStringNonAlloc (line 135) | public static string ToStringNonAlloc(this float value, string format)
    method ToInt (line 161) | public static int ToInt(this float f)
    method ToFloat (line 175) | public static float ToFloat(this int i)
    method ToIndex (line 184) | private static int ToIndex(this float f)
    method FromIndex (line 189) | private static float FromIndex(this int i)

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Util/G_Intstring.cs
  class G_IntString (line 18) | public static class G_IntString
    method Init (line 59) | public static void Init( int minNegativeValue, int maxPositiveValue )
    method Dispose (line 84) | public static void Dispose()
    method ToStringNonAlloc (line 99) | public static string ToStringNonAlloc(this int value)

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Util/G_Singleton.cs
  class G_Singleton (line 24) | public class G_Singleton<T> : MonoBehaviour where T : MonoBehaviour
    method Awake (line 62) | void Awake()
    method OnDestroy (line 74) | void OnDestroy()

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Editor/src/PopulateLottieAnimations.cs
  class PopulateLottieAnimationsWindow (line 9) | public class PopulateLottieAnimationsWindow : EditorWindow
    method ShowWindow (line 16) | [MenuItem("Tools/Populate Lottie Animations")]
    method OnEnable (line 22) | private void OnEnable()
    method OnGUI (line 31) | private void OnGUI()
    method PopulateLottieAnimations (line 75) | private void PopulateLottieAnimations()

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Editor/src/StreamingAssetsChecker.cs
  class StreamingAssetsChecker (line 8) | internal static class StreamingAssetsChecker
    method CheckIfStreaminAssetsContainLottieFiles (line 15) | [InitializeOnLoadMethod]
    method CopyFilesRecursively (line 61) | private static void CopyFilesRecursively(string sourcePath, string des...

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Runtime/src/Data/LottieAnimations.cs
  class LottieAnimations (line 5) | [CreateAssetMenu(fileName ="LottieAnimationsArray", menuName = "Data/Lot...
    method SetAnimationsEditorCall (line 12) | public void SetAnimationsEditorCall(string[] animations)

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Runtime/src/State/AppState.cs
  class AppState (line 6) | internal class AppState : MonoBehaviour
    method Start (line 11) | private void Start()
    method OnDestroy (line 19) | private void OnDestroy()

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Runtime/src/Storage/CanNotFindStickerPackException.cs
  class CanNotFindStickerPackException (line 3) | internal class CanNotFindStickerPackException : System.Exception

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Runtime/src/Storage/TelegramStickerStorage.cs
  class TelegramStickerStorage (line 10) | internal sealed class TelegramStickerStorage : System.IDisposable
    method TelegramStickerStorage (line 23) | internal TelegramStickerStorage(string botKey)
    method Dispose (line 29) | public void Dispose()
    method DownloadTelegramStickersPackAsync (line 39) | public async Task<string[]> DownloadTelegramStickersPackAsync(string p...
    method DownloadTelegramStickersPackIfNecessaryAsync (line 76) | public Task<string[]> DownloadTelegramStickersPackIfNecessaryAsync(str...
    method UnpackLocalTgsFilesToJsonFilesAsync (line 98) | public async Task<string[]> UnpackLocalTgsFilesToJsonFilesAsync(string...
    method UnpackLocalTgsFilesToJsonFilesIfNecessaryAsync (line 129) | public Task<string[]> UnpackLocalTgsFilesToJsonFilesIfNecessaryAsync(s...

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Runtime/src/UI/AnimationPreview.cs
  class AnimationPreview (line 6) | internal sealed class AnimationPreview : MonoBehaviour, System.IDisposable
    method InitFromFile (line 17) | internal void InitFromFile(string jsonFilePath, uint width, uint height)
    method InitFromData (line 23) | internal void InitFromData(uint width, uint height)
    method Dispose (line 34) | public void Dispose()
    method DoUpdate (line 40) | internal void DoUpdate()
    method DoUpdateAsync (line 48) | internal void DoUpdateAsync()
    method DoDrawOneFrameAsyncGetResult (line 56) | internal void DoDrawOneFrameAsyncGetResult()
    method DisableAnimation (line 65) | internal void DisableAnimation()
    method EnableAnimation (line 70) | internal void EnableAnimation()

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Runtime/src/UI/AnimationsHomeScreen.cs
  class AnimationsHomeScreen (line 5) | internal sealed class AnimationsHomeScreen : MonoBehaviour, System.IDisp...
    method Init (line 12) | internal void Init(string[] animationPaths)
    method Dispose (line 18) | public void Dispose()
    method OnTextureSizeDropdownValueChanged (line 24) | private void OnTextureSizeDropdownValueChanged(int index)

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Runtime/src/UI/ExploreTelegramStickers.cs
  class ExploreTelegramStickers (line 6) | internal sealed class ExploreTelegramStickers : MonoBehaviour, System.ID...
    method Init (line 20) | internal void Init()
    method Dispose (line 34) | public void Dispose()
    method Update (line 43) | private void Update()
    method OnTokenInputFieldValueChanged (line 55) | private void OnTokenInputFieldValueChanged(string value)
    method OnStickerPackNameInputFieldSubmit (line 60) | private void OnStickerPackNameInputFieldSubmit(string value)
    method OnFindButtonClick (line 64) | private void OnFindButtonClick()
    method CreateStorageIfTokenIsNotEmpty (line 68) | private void CreateStorageIfTokenIsNotEmpty()
    method DisposeStorageIfNecessary (line 78) | private void DisposeStorageIfNecessary()
    method LoadTelegramStickersIfNecessary (line 86) | private async void LoadTelegramStickersIfNecessary()

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Runtime/src/UI/LottieAnimationsPreview.cs
  class LottieAnimationsPreview (line 8) | internal sealed class LottieAnimationsPreview : MonoBehaviour, System.ID...
    method Init (line 24) | internal void Init(string[] animationPaths, uint textureSize)
    method Dispose (line 56) | public void Dispose()
    method RestartCoroutine (line 71) | private void RestartCoroutine()
    method OnEnable (line 79) | private void OnEnable()
    method OnScrollRectValueChanged (line 84) | private void OnScrollRectValueChanged(Vector2 scrollPosition)
    method RenderLottieAnimationCoroutine (line 104) | private IEnumerator RenderLottieAnimationCoroutine()

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Runtime/src/UI/LottiePlayerScreen.cs
  class LottiePlayerScreen (line 8) | public class LottiePlayerScreen : MonoBehaviour, System.IDisposable
    method Init (line 23) | internal void Init(string[] animationPaths, string[] animations)
    method Dispose (line 46) | public void Dispose()
    method Update (line 63) | private void Update()
    method OnAnimationDropdownValueChanged (line 75) | private void OnAnimationDropdownValueChanged(int newValue)
    method OnPlayPositionSliderValueChanged (line 93) | private void OnPlayPositionSliderValueChanged(float newValue)
    method OnPlayPauseButtonClick (line 101) | private void OnPlayPauseButtonClick(int currentStateIndex, LottiePlugi...
    method OnNextAnimationClick (line 105) | private void OnNextAnimationClick(int currentStateIndex, LottiePlugin....

FILE: unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Scripts/Runtime/src/UI/MainMenu.cs
  class MainMenu (line 6) | internal sealed class MainMenu : MonoBehaviour, System.IDisposable
    method Init (line 20) | internal void Init(string[] animationPaths, string[] animations)
    method Dispose (line 34) | public void Dispose()
    method UpdateTheButtonsPositions (line 45) | private void UpdateTheButtonsPositions()
    method UpdateActiveButtonPosition (line 55) | private void UpdateActiveButtonPosition(Transform transform)
    method OnHomeButtonClick (line 61) | private void OnHomeButtonClick(int stateIndex, AnimatedButton.State st...
    method OnPlayerButtonClick (line 68) | private void OnPlayerButtonClick(int stateIndex, AnimatedButton.State ...
    method OnExploreButtonClick (line 75) | private void OnExploreButtonClick(int stateIndex, AnimatedButton.State...
    method On3dObjectsButtonClick (line 82) | private void On3dObjectsButtonClick(int stateIndex, AnimatedButton.Sta...

FILE: unity/RLottieUnity/Assets/LottiePlugin/Tests/Runtime/src/AnimatedImageTests.cs
  class AnimatedImageTests (line 9) | public class AnimatedImageTests
    method SetUp (line 14) | [SetUp]
    method TearDown (line 24) | [TearDown]
    method CheckAwakeFunctionality (line 30) | [UnityTest]
    method CheckStartFunctionalityWithNoJsonAnimation (line 37) | [UnityTest]
    method CheckStartFunctionalityWithJsonAnimation (line 45) | [UnityTest]
    method CheckPlayFunctionality (line 55) | [UnityTest]
    method CheckStopFunctionality (line 64) | [UnityTest]
    method CheckTextureDimensions (line 75) | [UnityTest]
    method CheckDisposeFunctionality (line 84) | [UnityTest]
Copy disabled (too large) Download .json
Condensed preview — 697 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (26,929K chars).
[
  {
    "path": ".editorconfig",
    "chars": 9135,
    "preview": "# https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference?view=vs-2017\n\n# top-most "
  },
  {
    "path": ".gitattributes",
    "chars": 600,
    "preview": "# Sources\r\n*.c     text diff=c\r\n*.cc    text diff=cpp\r\n*.cxx   text diff=cpp\r\n*.cpp   text diff=cpp\r\n*.c++   text diff=c"
  },
  {
    "path": ".github/workflows/activation.yaml",
    "chars": 602,
    "preview": "name: Acquire activation file\non:\n  workflow_dispatch: {}\njobs:\n  activation:\n    name: Request manual activation file 🔑"
  },
  {
    "path": ".github/workflows/build_native_libraries.yaml",
    "chars": 17457,
    "preview": "name: Build and Test\n\non:\n  push:\n    branches:\n      - dev\n      - codex/remove-texture.apply-and-move-updates-to-nativ"
  },
  {
    "path": ".gitignore",
    "chars": 49,
    "preview": ".vs\n.vscode\nprojects/CMake/build*\nout/*\n.DS_Store"
  },
  {
    "path": ".gitmodules",
    "chars": 264,
    "preview": "[submodule \"dependency/rlottie\"]\n\tpath = dependency/rlottie\n\turl = git@github.com:gindemit/rlottie.git\n\tbranch = unity-r"
  },
  {
    "path": "AGENTS.md",
    "chars": 2730,
    "preview": "# Unity RLottie Plugin\n\nThis repository hosts a Unity plugin that brings the [rlottie](https://github.com/Samsung/rlotti"
  },
  {
    "path": "LICENSE",
    "chars": 1076,
    "preview": "MIT License\n\nCopyright (c) 2023 Gindemit Konstantin\n\nPermission is hereby granted, free of charge, to any person obtaini"
  },
  {
    "path": "README.md",
    "chars": 6042,
    "preview": "# Unity Lottie Animation Plugin\n![GitHub release](https://img.shields.io/github/release/gindemit/unity-rlottie.svg)\n![Un"
  },
  {
    "path": "dependency/pixman/pixman-arm-intrisics.cpp",
    "chars": 1815,
    "preview": "#include <arm_neon.h>\n\nextern \"C\" void pixman_composite_src_n_8888_asm_neon(int32_t w, int32_t h,\n                      "
  },
  {
    "path": "dependency/pixman/pixman-arm-neon-asm.S",
    "chars": 19929,
    "preview": "/*\n * Copyright © 2009 Nokia Corporation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n "
  },
  {
    "path": "dependency/pixman/pixman-arm-neon-asm.h",
    "chars": 37636,
    "preview": "/*\n * Copyright © 2009 Nokia Corporation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n "
  },
  {
    "path": "dependency/pixman/pixman-arma64-neon-asm.S",
    "chars": 16531,
    "preview": "/*\n * Copyright © 2009 Nokia Corporation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n "
  },
  {
    "path": "dependency/pixman/pixman-arma64-neon-asm.h",
    "chars": 40685,
    "preview": "/*\n * Copyright © 2009 Nokia Corporation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n "
  },
  {
    "path": "dependency/pixman/pixman-cpp-standard.cpp",
    "chars": 1066,
    "preview": "#include <memory>\n\n#define BYTE_MUL(c, a)                                  \\\n    ((((((c) >> 8) & 0x00ff00ff) * (a)) & 0"
  },
  {
    "path": "projects/AndroidStudio/.gitignore",
    "chars": 225,
    "preview": "*.iml\n.gradle\n/local.properties\n/.idea/caches\n/.idea/libraries\n/.idea/modules.xml\n/.idea/workspace.xml\n/.idea/navEditor."
  },
  {
    "path": "projects/AndroidStudio/.idea/.gitignore",
    "chars": 50,
    "preview": "# Default ignored files\r\n/shelf/\r\n/workspace.xml\r\n"
  },
  {
    "path": "projects/AndroidStudio/.idea/.name",
    "chars": 12,
    "preview": "UnityRLottie"
  },
  {
    "path": "projects/AndroidStudio/.idea/compiler.xml",
    "chars": 174,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<project version=\"4\">\r\n  <component name=\"CompilerConfiguration\">\r\n    <bytecode"
  },
  {
    "path": "projects/AndroidStudio/.idea/gradle.xml",
    "chars": 813,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<project version=\"4\">\r\n  <component name=\"GradleMigrationSettings\" migrationVers"
  },
  {
    "path": "projects/AndroidStudio/.idea/misc.xml",
    "chars": 364,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<project version=\"4\">\r\n  <component name=\"ProjectRootManager\" version=\"2\" langua"
  },
  {
    "path": "projects/AndroidStudio/.idea/vcs.xml",
    "chars": 191,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<project version=\"4\">\r\n  <component name=\"VcsDirectoryMappings\">\r\n    <mapping d"
  },
  {
    "path": "projects/AndroidStudio/app/.gitignore",
    "chars": 13,
    "preview": "/build\r\n/.cxx"
  },
  {
    "path": "projects/AndroidStudio/app/build.gradle",
    "chars": 1676,
    "preview": "plugins {\n    id 'com.android.application'\n}\n\nandroid {\n    namespace 'com.gindemit.rlottie'\n    compileSdk 33\n    ndkVe"
  },
  {
    "path": "projects/AndroidStudio/app/proguard-rules.pro",
    "chars": 750,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "projects/AndroidStudio/app/src/androidTest/java/com/gindemit/rlottie/ExampleInstrumentedTest.java",
    "chars": 754,
    "preview": "package com.gindemit.rlottie;\n\nimport android.content.Context;\n\nimport androidx.test.platform.app.InstrumentationRegistr"
  },
  {
    "path": "projects/AndroidStudio/app/src/main/AndroidManifest.xml",
    "chars": 756,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\r\n    <appl"
  },
  {
    "path": "projects/AndroidStudio/app/src/main/java/com/gindemit/rlottie/MainActivity.java",
    "chars": 969,
    "preview": "package com.gindemit.rlottie;\n\nimport androidx.appcompat.app.AppCompatActivity;\n\nimport android.os.Bundle;\nimport androi"
  },
  {
    "path": "projects/AndroidStudio/app/src/main/res/drawable/ic_launcher_background.xml",
    "chars": 5606,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "projects/AndroidStudio/app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "chars": 1702,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    "
  },
  {
    "path": "projects/AndroidStudio/app/src/main/res/layout/activity_main.xml",
    "chars": 818,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas."
  },
  {
    "path": "projects/AndroidStudio/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "chars": 272,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <b"
  },
  {
    "path": "projects/AndroidStudio/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "chars": 272,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <b"
  },
  {
    "path": "projects/AndroidStudio/app/src/main/res/values/colors.xml",
    "chars": 378,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"purple_200\">#FFBB86FC</color>\n    <color name=\"purpl"
  },
  {
    "path": "projects/AndroidStudio/app/src/main/res/values/strings.xml",
    "chars": 74,
    "preview": "<resources>\n    <string name=\"app_name\">UnityRLottie</string>\n</resources>"
  },
  {
    "path": "projects/AndroidStudio/app/src/main/res/values/themes.xml",
    "chars": 834,
    "preview": "<resources xmlns:tools=\"http://schemas.android.com/tools\">\n    <!-- Base application theme. -->\n    <style name=\"Theme.U"
  },
  {
    "path": "projects/AndroidStudio/app/src/main/res/values-night/themes.xml",
    "chars": 834,
    "preview": "<resources xmlns:tools=\"http://schemas.android.com/tools\">\n    <!-- Base application theme. -->\n    <style name=\"Theme.U"
  },
  {
    "path": "projects/AndroidStudio/app/src/test/java/com/gindemit/rlottie/ExampleUnitTest.java",
    "chars": 381,
    "preview": "package com.gindemit.rlottie;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test"
  },
  {
    "path": "projects/AndroidStudio/build.gradle",
    "chars": 458,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nbuildscript {\n    re"
  },
  {
    "path": "projects/AndroidStudio/gradle/wrapper/gradle-wrapper.properties",
    "chars": 238,
    "preview": "#Sat Nov 13 22:19:53 CET 2021\r\ndistributionBase=GRADLE_USER_HOME\r\ndistributionUrl=https\\://services.gradle.org/distribut"
  },
  {
    "path": "projects/AndroidStudio/gradle.properties",
    "chars": 1093,
    "preview": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will ov"
  },
  {
    "path": "projects/AndroidStudio/gradlew",
    "chars": 5766,
    "preview": "#!/usr/bin/env sh\n\n#\n# Copyright 2015 the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "projects/AndroidStudio/gradlew.bat",
    "chars": 2763,
    "preview": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (th"
  },
  {
    "path": "projects/AndroidStudio/settings.gradle",
    "chars": 287,
    "preview": "dependencyResolutionManagement {\n    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n    repositories {\n   "
  },
  {
    "path": "projects/CMake/.gitignore",
    "chars": 184,
    "preview": "CMakeLists.txt.user\r\nCMakeCache.txt\r\nCMakeFiles\r\nCMakeScripts\r\nTesting\r\nMakefile\r\ncmake_install.cmake\r\ninstall_manifest."
  },
  {
    "path": "projects/CMake/CMakeLists.txt",
    "chars": 7998,
    "preview": "# CMakeList.txt : CMake project for LottiePlugin, include source and define\r\ncmake_minimum_required (VERSION 3.6)\r\n\r\n#se"
  },
  {
    "path": "projects/CMake/CMakeSettings.json",
    "chars": 1493,
    "preview": "{\r\n  \"configurations\": [\r\n    {\r\n      \"name\": \"x64-Debug\",\r\n      \"generator\": \"Ninja\",\r\n      \"configurationType\": \"D"
  },
  {
    "path": "src/ExportApi.h",
    "chars": 312,
    "preview": "#ifndef _EXPORT_API_H_\n#define _EXPORT_API_H_\n\n#if defined(__EMSCRIPTEN__)\n  #include <emscripten/emscripten.h>\n  #defin"
  },
  {
    "path": "src/LottiePlugin.cpp",
    "chars": 4869,
    "preview": "#include \"LottiePlugin.h\"\n#include \"vdebug.h\"\n\nextern \"C\" {\n\n    static lottie_animation_wrapper* create_animation_wrapp"
  },
  {
    "path": "src/LottiePlugin.h",
    "chars": 1819,
    "preview": "#ifndef _VORBIS_PLUGIN_H_\n#define _VORBIS_PLUGIN_H_\n\n#include \"ExportApi.h\"\n#include <stdio.h>\n#include <stdlib.h>\n#incl"
  },
  {
    "path": "unity/RLottieUnity/.editorconfig",
    "chars": 257,
    "preview": "# https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference?view=vs-2017\n\n# top-most "
  },
  {
    "path": "unity/RLottieUnity/.gitignore",
    "chars": 1023,
    "preview": "# This .gitignore file should be placed at the root of your Unity project directory\r\n#\r\n# Get latest from https://github"
  },
  {
    "path": "unity/RLottieUnity/.vsconfig",
    "chars": 99,
    "preview": "{\n  \"version\": \"1.0\",\n  \"components\": [ \n    \"Microsoft.VisualStudio.Workload.ManagedGame\"\n  ]\n} \n"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Editor/LottiePlugin.Editor.asmdef",
    "chars": 402,
    "preview": "{\n    \"name\": \"LottiePlugin.Editor\",\n    \"references\": [\n        \"GUID:2511835434a4c014d9d18a4681bf1136\"\n    ],\n    \"inc"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Editor/LottiePlugin.Editor.asmdef.meta",
    "chars": 166,
    "preview": "fileFormatVersion: 2\nguid: fbc69261922547442af6ce2b4f7f8318\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Editor/src/AnimatedButtonEditor.cs",
    "chars": 12514,
    "preview": "#if UNITY_EDITOR\nusing System.Text;\nusing UnityEditor;\nusing UnityEditor.UI;\nusing UnityEditorInternal;\nusing UnityEngin"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Editor/src/AnimatedButtonEditor.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 4748ea48fc23cd04f84ebb4333de8cd5\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Editor/src/AnimatedImageEditor.cs",
    "chars": 6246,
    "preview": "#if UNITY_EDITOR\nusing System.Text;\nusing UnityEditor;\nusing UnityEngine;\n\nnamespace LottiePlugin.UI.Editor\n{\n    [Custo"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Editor/src/AnimatedImageEditor.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 849d0cdde8e851240ae6d1fb559f256a\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Editor/src/OpenPersistentDataPathFolder.cs",
    "chars": 352,
    "preview": "using UnityEditor;\r\nusing UnityEngine;\r\n\r\nnamespace MyEditor.Menu\r\n{\r\n    internal static class OpenPersistentDataPathFo"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Editor/src/OpenPersistentDataPathFolder.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: c7e8f23675e57ea45ba5ec2bcb0ba68d\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Editor/src.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: d5d1324eb0130f84a986bcd8f3169be0\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Editor.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: 17417d3e71704134986dd3a95c59bd56\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/arm64-v8a/libLottiePlugin.so.meta",
    "chars": 1769,
    "preview": "fileFormatVersion: 2\nguid: 9979f9cdf97890a4294636e42f8d6b09\nPluginImporter:\n  externalObjects: {}\n  serializedVersion: 2"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/arm64-v8a.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: 801a6ec6f5f938949a8d09beef48a4a6\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/armeabi-v7a/libLottiePlugin.so.meta",
    "chars": 1772,
    "preview": "fileFormatVersion: 2\nguid: 2c80d7a027bdec245b63d96df51fca6f\nPluginImporter:\n  externalObjects: {}\n  serializedVersion: 2"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/armeabi-v7a.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: fd6f97734e4c98a4ead99d4c9d8c94d6\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/x86/libLottiePlugin.so.meta",
    "chars": 1770,
    "preview": "fileFormatVersion: 2\nguid: f3abf920cc86fd14b8bce9ef9cfd0a1e\nPluginImporter:\n  externalObjects: {}\n  serializedVersion: 2"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/x86.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: fc810c8bf266cb34eb889bdd809983b9\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/x86_64/libLottiePlugin.so.meta",
    "chars": 1772,
    "preview": "fileFormatVersion: 2\nguid: b46637c2d6cfbf34caaec0ac6fe28060\nPluginImporter:\n  externalObjects: {}\n  serializedVersion: 2"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android/x86_64.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: e32f62b9c1154cc4eba1944fe7cfcab1\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Android.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: 24158343e8bbd8e458b94aecb46e58bb\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Linux/x86_64/libLottiePlugin.so.meta",
    "chars": 1317,
    "preview": "fileFormatVersion: 2\nguid: b7374bb31a258ebe49f95ff1092573b7\nPluginImporter:\n  externalObjects: {}\n  serializedVersion: 2"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Linux/x86_64.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: 7146e101b78799b4284df5c9d17af42a\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Linux.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: 7393f7fda2beb6241b6174ece6283a9e\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/OSX/libLottiePlugin.dylib.meta",
    "chars": 1524,
    "preview": "fileFormatVersion: 2\nguid: 7e05edcb1cc5a4944adb53efc7b936ea\nPluginImporter:\n  externalObjects: {}\n  serializedVersion: 2"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/OSX.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: ac961d6817f1b49f1b1a512bf728e930\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/WebGL/LottiePlugin.bc.meta",
    "chars": 1601,
    "preview": "fileFormatVersion: 2\nguid: 802189a482d5445e38e17bd66bff4025\nPluginImporter:\n  externalObjects: {}\n  serializedVersion: 2"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/WebGL/libLottiePlugin.a.meta",
    "chars": 1773,
    "preview": "fileFormatVersion: 2\nguid: 27f7c518adc62ff4ca72e224a4174916\nPluginImporter:\n  externalObjects: {}\n  serializedVersion: 2"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/WebGL/librlottie.a.meta",
    "chars": 1773,
    "preview": "fileFormatVersion: 2\nguid: 947404206898326488621deb8a96fa4b\nPluginImporter:\n  externalObjects: {}\n  serializedVersion: 2"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/WebGL.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: c415353a7bdb74ee281fa32aae79b464\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Windows/x86/LottiePlugin.dll.meta",
    "chars": 1770,
    "preview": "fileFormatVersion: 2\nguid: 4a32b4e01daae5b41818751d844d8234\nPluginImporter:\n  externalObjects: {}\n  serializedVersion: 2"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Windows/x86.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: b487f6482c7c4e34fbff765a11b1cd00\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Windows/x86_64/LottiePlugin.dll.meta",
    "chars": 1773,
    "preview": "fileFormatVersion: 2\nguid: c82ab44078100784c96c6a72bc0685ba\nPluginImporter:\n  externalObjects: {}\n  serializedVersion: 2"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Windows/x86_64.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: 2a46775488083fc4d913f12fcba9f0c1\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/Windows.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: 811705017c1ec9e4a88d14d0d8336147\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/iOS/libLottiePlugin.a.meta",
    "chars": 1522,
    "preview": "fileFormatVersion: 2\nguid: 9de81b1084cc14811b0a512e6c3aa72f\nPluginImporter:\n  externalObjects: {}\n  serializedVersion: 2"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/iOS/librlottie.a.meta",
    "chars": 1522,
    "preview": "fileFormatVersion: 2\nguid: b1aa33924a83c484083a3eb8fd7ca7bd\nPluginImporter:\n  externalObjects: {}\n  serializedVersion: 2"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/iOS/x86_64/libLottiePlugin.a.meta",
    "chars": 1692,
    "preview": "fileFormatVersion: 2\nguid: 776e704a5a10eaa4fad8bc0f1f5ff958\nPluginImporter:\n  externalObjects: {}\n  serializedVersion: 2"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/iOS/x86_64/librlottie.a.meta",
    "chars": 1692,
    "preview": "fileFormatVersion: 2\nguid: 73eef34f40a57d94084e509395e2e853\nPluginImporter:\n  externalObjects: {}\n  serializedVersion: 2"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/iOS/x86_64.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: 3318df43de3eda14cae18710be5be1e6\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins/iOS.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: f383d3ea0acac42dcb91af51564d8340\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Plugins.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: bf81dc9040a9db846b53e8d34f1e15a7\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/AssemblyAttributes.cs",
    "chars": 155,
    "preview": "using System.Runtime.CompilerServices;\n\n[assembly: InternalsVisibleTo(\"LottiePlugin.Editor\")]\n[assembly: InternalsVisibl"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/AssemblyAttributes.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 9aa4083744b9fe34a9d1dfd1d5c8bc90\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/LottiePlugin.Runtime.asmdef",
    "chars": 327,
    "preview": "{\n    \"name\": \"LottiePlugin.Runtime\",\n    \"references\": [],\n    \"includePlatforms\": [],\n    \"excludePlatforms\": [],\n    "
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/LottiePlugin.Runtime.asmdef.meta",
    "chars": 166,
    "preview": "fileFormatVersion: 2\nguid: 2511835434a4c014d9d18a4681bf1136\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/LottieAnimation.cs",
    "chars": 6760,
    "preview": "using LottiePlugin.Utility;\nusing System;\nusing System.IO;\nusing System.Runtime.InteropServices;\nusing Unity.Collections"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/LottieAnimation.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 837b9dc5354525641903bac7adb98b6a\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/LottieAnimationsAtlas.cs",
    "chars": 9525,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServi"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/LottieAnimationsAtlas.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 271cc01adb53c7945bfd4ded2088874e\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/NativeBridge.cs",
    "chars": 4056,
    "preview": "using System;\nusing System.Runtime.InteropServices;\nusing UnityEngine;\n\nnamespace LottiePlugin\n{\n    [StructLayout(Layou"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/NativeBridge.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: cafc31676b56ff0479ed5f2929c80f50\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Support/FIleSizeFormatter.cs",
    "chars": 1800,
    "preview": "namespace LottiePlugin.Support\r\n{\r\n    public static class FIleSizeFormatter\r\n    {\r\n        private static readonly str"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Support/FIleSizeFormatter.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 5b60aac282992a04faf2c428d9461e9f\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Support/FilesHelper.cs",
    "chars": 1738,
    "preview": "using System.IO;\nusing UnityEngine;\n\nnamespace LottiePlugin.Support\n{\n    public static class FilesHelper\n    {\n        "
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Support/FilesHelper.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 5142b9d6649d413429bc44b000c65542\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Support/StreamingAssetsHelper.cs",
    "chars": 979,
    "preview": "using System.IO;\n\nnamespace LottiePlugin.Support\n{\n    public static class StreamingAssetsHelper\n    {\n        public st"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Support/StreamingAssetsHelper.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 15f6afe52c432724aaa79f9b850c4d62\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Support.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: 6ab7aed18ac8fef40af90d11627b213c\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/UI/AnimatedButton.cs",
    "chars": 5172,
    "preview": "using System.Collections;\nusing UnityEngine;\nusing UnityEngine.EventSystems;\nusing UnityEngine.Serialization;\nusing Unit"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/UI/AnimatedButton.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 3021768183fd1164198729d595c17231\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/UI/AnimatedImage.cs",
    "chars": 6585,
    "preview": "using System.Collections;\nusing UnityEngine;\nusing UnityEngine.Events;\nusing UnityEngine.UI;\n\nnamespace LottiePlugin.UI\n"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/UI/AnimatedImage.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: dd340d501d30f364781da00b0938e032\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/UI.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: a8c6c0d2ec2d29543bf1ed3638ed4390\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Utility/ThrowIf.cs",
    "chars": 3099,
    "preview": "using System;\nusing System.Collections;\n\nnamespace LottiePlugin.Utility\n{\n    public static class ThrowIf\n    {\n        "
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Utility/ThrowIf.cs.meta",
    "chars": 243,
    "preview": "fileFormatVersion: 2\nguid: 64e429e2f957f704b88a11edde317669\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n "
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src/Utility.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: 1547b3a830b337141a4e7326f228cae9\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime/src.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: f0f30590af313224495bc547b6c74ef2\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Runtime.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: f6510d9a8a0ff6c4ea6f124d613c350c\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/ExternalDlls/Newtonsoft.Json.dll.meta",
    "chars": 1542,
    "preview": "fileFormatVersion: 2\nguid: 97604fef140520c4bbbf28c4ab295281\nPluginImporter:\n  externalObjects: {}\n  serializedVersion: 2"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/ExternalDlls/System.Buffers.dll.meta",
    "chars": 1397,
    "preview": "fileFormatVersion: 2\nguid: 44eab852d4878a64f851dc501431d94b\nPluginImporter:\n  externalObjects: {}\n  serializedVersion: 2"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/ExternalDlls/System.Memory.dll.meta",
    "chars": 1397,
    "preview": "fileFormatVersion: 2\nguid: 392ba60219e281e45a32762ec090e222\nPluginImporter:\n  externalObjects: {}\n  serializedVersion: 2"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/ExternalDlls/System.Threading.Tasks.Extensions.dll.meta",
    "chars": 1397,
    "preview": "fileFormatVersion: 2\nguid: 276ed90f3c1d6e64991704c19b801824\nPluginImporter:\n  externalObjects: {}\n  serializedVersion: 2"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/ExternalDlls/Telegram.Bot.dll.meta",
    "chars": 1397,
    "preview": "fileFormatVersion: 2\nguid: d7aef7f374e3e944786e7a15fde417d9\nPluginImporter:\n  externalObjects: {}\n  serializedVersion: 2"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/ExternalDlls.meta",
    "chars": 172,
    "preview": "fileFormatVersion: 2\nguid: c72ccb32fe8c9294fbef7e5399eeb188\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  us"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Changelog.txt",
    "chars": 6060,
    "preview": "-----------------------------\r\nv2.1.3\r\n\r\n- Added null check for Keyboard.current.\r\n\r\n-----------------------------\r\nv2.1"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Changelog.txt.meta",
    "chars": 232,
    "preview": "fileFormatVersion: 2\r\nguid: 425066d07b7c1204887be96c53348ac6\r\nlabels:\r\n- counter\r\n- fps\r\n- graphy\r\n- tayx\r\ntimeCreated: "
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyDebuggerEditor.cs",
    "chars": 22191,
    "preview": "/* ---------------------------------------\r\n * Author:          Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contri"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyDebuggerEditor.cs.meta",
    "chars": 276,
    "preview": "fileFormatVersion: 2\r\nguid: 4a96825e094d61441b5247d0c32652b3\r\ntimeCreated: 1514907656\r\nlicenseType: Store\r\nMonoImporter:"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyEditorStyle.cs",
    "chars": 4116,
    "preview": "/* ---------------------------------------\r\n * Author:          Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contri"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyEditorStyle.cs.meta",
    "chars": 254,
    "preview": "fileFormatVersion: 2\r\nguid: 1bb06e7c222a60f47a476e2648224330\r\nMonoImporter:\r\n  externalObjects: {}\r\n  serializedVersion:"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyManagerEditor.cs",
    "chars": 28932,
    "preview": "/* ---------------------------------------\r\n * Author:          Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contri"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyManagerEditor.cs.meta",
    "chars": 254,
    "preview": "fileFormatVersion: 2\r\nguid: f01a5c28e5127404da343db2a7409c10\r\nMonoImporter:\r\n  externalObjects: {}\r\n  serializedVersion:"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyMenuItem.cs",
    "chars": 2611,
    "preview": "/* ---------------------------------------\r\n * Author:          Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contri"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/GraphyMenuItem.cs.meta",
    "chars": 254,
    "preview": "fileFormatVersion: 2\r\nguid: 68962e071a0ce0549a853f10c6af3f54\r\nMonoImporter:\r\n  externalObjects: {}\r\n  serializedVersion:"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/Tayx.Graphy.Editor.asmdef",
    "chars": 564,
    "preview": "{\r\n    \"name\": \"Tayx.Graphy.Editor\",\r\n    \"references\": [\r\n        \"GUID:18e5109d897e1b244ab2dfeaf5482c7b\"\r\n    ],\r\n    "
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor/Tayx.Graphy.Editor.asmdef.meta",
    "chars": 173,
    "preview": "fileFormatVersion: 2\r\nguid: 9c59a049deefdf64bbbaa730a340bb3f\r\nAssemblyDefinitionImporter:\r\n  externalObjects: {}\r\n  user"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Editor.meta",
    "chars": 180,
    "preview": "fileFormatVersion: 2\r\nguid: 74026f7916b08a343916493b0a1752cc\r\nfolderAsset: yes\r\nDefaultImporter:\r\n  externalObjects: {}\r"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold/ERIC-TIRADO-NORTHWEST-LICENSE.txt",
    "chars": 734,
    "preview": "Eric Tirado - NORTHWEST - BOLD, ROUGH - BETA\r\n\r\nVersion 0.6 2016\r\n______________________________________________________"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold/ERIC-TIRADO-NORTHWEST-LICENSE.txt.meta",
    "chars": 204,
    "preview": "fileFormatVersion: 2\r\nguid: 67bbd8c5103323b4688fcfa3abe68927\r\nlabels:\r\n- font\r\ntimeCreated: 1516718196\r\nlicenseType: Sto"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold/NORTHWEST-B.otf.meta",
    "chars": 471,
    "preview": "fileFormatVersion: 2\r\nguid: d523cde1d178d7c4ca6bb724b9d5213e\r\nlabels:\r\n- font\r\ntimeCreated: 1516718196\r\nlicenseType: Sto"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold.meta",
    "chars": 202,
    "preview": "fileFormatVersion: 2\r\nguid: 2b891f35198da7642a30fd430ae0d619\r\nfolderAsset: yes\r\ntimeCreated: 1516718193\r\nlicenseType: St"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Font/Roboto/LICENSE.txt",
    "chars": 11560,
    "preview": "\r\n                                 Apache License\r\n                           Version 2.0, January 2004\r\n               "
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Font/Roboto/LICENSE.txt.meta",
    "chars": 204,
    "preview": "fileFormatVersion: 2\r\nguid: eb908df110bf2314d94d245f8a338830\r\nlabels:\r\n- font\r\ntimeCreated: 1515073036\r\nlicenseType: Sto"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Font/Roboto/Roboto-Bold.ttf.meta",
    "chars": 538,
    "preview": "fileFormatVersion: 2\r\nguid: 9568ece128856a54cbc1060379ab498d\r\nlabels:\r\n- font\r\ntimeCreated: 1515090903\r\nlicenseType: Sto"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Font/Roboto/Roboto-Regular.ttf.meta",
    "chars": 538,
    "preview": "fileFormatVersion: 2\r\nguid: 76ed11d84beb10846a746b4259e26d39\r\nlabels:\r\n- font\r\ntimeCreated: 1515073036\r\nlicenseType: Sto"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Font/Roboto.meta",
    "chars": 202,
    "preview": "fileFormatVersion: 2\r\nguid: 37f53a7f00580aa4fa7797d9308063e7\r\nfolderAsset: yes\r\ntimeCreated: 1515073036\r\nlicenseType: St"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Font.meta",
    "chars": 202,
    "preview": "fileFormatVersion: 2\r\nguid: 3ac48df14c942a247a9e31f953e82768\r\nfolderAsset: yes\r\ntimeCreated: 1511635919\r\nlicenseType: St"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/GUI/GraphyGUISkin.guiskin",
    "chars": 37909,
    "preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!114 &11400000\r\nMonoBehaviour:\r\n  m_ObjectHideFlags: 0\r\n  m_Correspondi"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/GUI/GraphyGUISkin.guiskin.meta",
    "chars": 205,
    "preview": "fileFormatVersion: 2\r\nguid: 663039f397abaa648854c3b8ef8f4256\r\nlabels:\r\n- gui\r\ntimeCreated: 1513980352\r\nlicenseType: Stor"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/GUI.meta",
    "chars": 202,
    "preview": "fileFormatVersion: 2\r\nguid: 88ea372125bb21f49adbb31579e66715\r\nfolderAsset: yes\r\ntimeCreated: 1513980359\r\nlicenseType: St"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/LICENSE",
    "chars": 1089,
    "preview": "MIT License\r\n\r\nCopyright (c) 2018 Martín Pane\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/LICENSE.meta",
    "chars": 162,
    "preview": "fileFormatVersion: 2\r\nguid: 7dcb986197a7fca43a1547994c1e7ad8\r\nDefaultImporter:\r\n  externalObjects: {}\r\n  userData: \r\n  a"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/Audio_Spectrum_Graph.mat",
    "chars": 2523,
    "preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!21 &2100000\r\nMaterial:\r\n  serializedVersion: 6\r\n  m_ObjectHideFlags: 0"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/Audio_Spectrum_Graph.mat.meta",
    "chars": 266,
    "preview": "fileFormatVersion: 2\r\nguid: 61a418be8e5d13c448865432314f8277\r\nlabels:\r\n- audio\r\n- graph\r\n- material\r\n- shader\r\n- spectro"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/Audio_Spectrum_Highest_Values_Graph.mat",
    "chars": 2536,
    "preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!21 &2100000\r\nMaterial:\r\n  serializedVersion: 6\r\n  m_ObjectHideFlags: 0"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/Audio_Spectrum_Highest_Values_Graph.mat.meta",
    "chars": 266,
    "preview": "fileFormatVersion: 2\r\nguid: a65c67e8efa392e4faaf526ab060ac88\r\nlabels:\r\n- audio\r\n- graph\r\n- material\r\n- shader\r\n- spectro"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/FPS_Graph.mat",
    "chars": 2593,
    "preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!21 &2100000\r\nMaterial:\r\n  serializedVersion: 6\r\n  m_ObjectHideFlags: 0"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/FPS_Graph.mat.meta",
    "chars": 267,
    "preview": "fileFormatVersion: 2\r\nguid: 8a88e148dbc2d0f45a027f72e59aee4d\r\nlabels:\r\n- counter\r\n- fps\r\n- graph\r\n- material\r\n- monitor\r"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/RAM_Allocated_Graph.mat",
    "chars": 2603,
    "preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!21 &2100000\r\nMaterial:\r\n  serializedVersion: 6\r\n  m_ObjectHideFlags: 0"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/RAM_Allocated_Graph.mat.meta",
    "chars": 268,
    "preview": "fileFormatVersion: 2\r\nguid: 6b025b045db969e4988a6267cc04938d\r\nlabels:\r\n- counter\r\n- graph\r\n- material\r\n- memory\r\n- monit"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/RAM_Mono_Graph.mat",
    "chars": 2568,
    "preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!21 &2100000\r\nMaterial:\r\n  serializedVersion: 6\r\n  m_ObjectHideFlags: 0"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/RAM_Mono_Graph.mat.meta",
    "chars": 268,
    "preview": "fileFormatVersion: 2\r\nguid: cb5c252f19f1cd2448f88d7f9dd989e8\r\nlabels:\r\n- counter\r\n- graph\r\n- material\r\n- memory\r\n- monit"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/RAM_Reserved_Graph.mat",
    "chars": 2599,
    "preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!21 &2100000\r\nMaterial:\r\n  serializedVersion: 6\r\n  m_ObjectHideFlags: 0"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials/RAM_Reserved_Graph.mat.meta",
    "chars": 268,
    "preview": "fileFormatVersion: 2\r\nguid: 5ec99183bcca10249ac54cd6dcee6372\r\nlabels:\r\n- counter\r\n- graph\r\n- material\r\n- memory\r\n- monit"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Materials.meta",
    "chars": 202,
    "preview": "fileFormatVersion: 2\r\nguid: c859b3e9d83661640842bbb8989b021a\r\nfolderAsset: yes\r\ntimeCreated: 1511697723\r\nlicenseType: St"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab/Internal/ADVANCED - Module.prefab",
    "chars": 27684,
    "preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!1 &3842867399166853360\r\nGameObject:\r\n  m_ObjectHideFlags: 0\r\n  m_Corre"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab/Internal/ADVANCED - Module.prefab.meta",
    "chars": 161,
    "preview": "fileFormatVersion: 2\r\nguid: 8e60b58e9eec36e46ba32caf55a802f4\r\nPrefabImporter:\r\n  externalObjects: {}\r\n  userData: \r\n  as"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab/Internal/AUDIO - Module.prefab",
    "chars": 20670,
    "preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!1 &8023522192042546097\r\nGameObject:\r\n  m_ObjectHideFlags: 0\r\n  m_Corre"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab/Internal/AUDIO - Module.prefab.meta",
    "chars": 161,
    "preview": "fileFormatVersion: 2\r\nguid: 78081648e28527242bb334a6bdf7bfce\r\nPrefabImporter:\r\n  externalObjects: {}\r\n  userData: \r\n  as"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab/Internal/FPS - Module.prefab",
    "chars": 44163,
    "preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!1 &6364973415932893355\r\nGameObject:\r\n  m_ObjectHideFlags: 0\r\n  m_Corre"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab/Internal/FPS - Module.prefab.meta",
    "chars": 161,
    "preview": "fileFormatVersion: 2\r\nguid: fed2d45066a6d2a4191aa0c744a03147\r\nPrefabImporter:\r\n  externalObjects: {}\r\n  userData: \r\n  as"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab/Internal/RAM - Module.prefab",
    "chars": 43141,
    "preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!1 &824167088398547643\r\nGameObject:\r\n  m_ObjectHideFlags: 0\r\n  m_Corres"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab/Internal/RAM - Module.prefab.meta",
    "chars": 161,
    "preview": "fileFormatVersion: 2\r\nguid: 6387d68cbe02d2d4fb8912f794606585\r\nPrefabImporter:\r\n  externalObjects: {}\r\n  userData: \r\n  as"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab/Internal.meta",
    "chars": 180,
    "preview": "fileFormatVersion: 2\r\nguid: 1551dbe188c02e544b8dd95d263ae1a3\r\nfolderAsset: yes\r\nDefaultImporter:\r\n  externalObjects: {}\r"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab/[Graphy].prefab",
    "chars": 24169,
    "preview": "%YAML 1.1\r\n%TAG !u! tag:unity3d.com,2011:\r\n--- !u!1 &177638\r\nGameObject:\r\n  m_ObjectHideFlags: 0\r\n  m_CorrespondingSourc"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab/[Graphy].prefab.meta",
    "chars": 326,
    "preview": "fileFormatVersion: 2\r\nguid: 0abab5bb77339e4428787a870eb31bd3\r\nlabels:\r\n- audio\r\n- counter\r\n- debugger\r\n- fps\r\n- graph\r\n-"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Prefab.meta",
    "chars": 202,
    "preview": "fileFormatVersion: 2\r\nguid: 3be1e89ca880cc644a2aa20d1854250c\r\nfolderAsset: yes\r\ntimeCreated: 1511555560\r\nlicenseType: St"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/README.md",
    "chars": 5739,
    "preview": "# Graphy - Ultimate FPS Counter - Stats Monitor & Debugger (Unity)\r\n\r\n[![openupm](https://img.shields.io/npm/v/com.tayx."
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/README.md.meta",
    "chars": 165,
    "preview": "fileFormatVersion: 2\r\nguid: fd1e6a9192c40084998c62404bb41ba2\r\nTextScriptImporter:\r\n  externalObjects: {}\r\n  userData: \r\n"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Readme! - Graphy - Documentation.pdf.meta",
    "chars": 238,
    "preview": "fileFormatVersion: 2\r\nguid: d78a1478d4edf8a4f894e39e18c9e58d\r\nlabels:\r\n- Counter\r\n- Fps\r\n- Graph\r\n- Graphy\r\n- Tayx\r\ntime"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Advanced/G_AdvancedData.cs",
    "chars": 14043,
    "preview": "/* ---------------------------------------\r\n * Author:          Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contri"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Advanced/G_AdvancedData.cs.meta",
    "chars": 276,
    "preview": "fileFormatVersion: 2\r\nguid: 5c1019d31db77fd468164577146737ad\r\ntimeCreated: 1512484835\r\nlicenseType: Store\r\nMonoImporter:"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Advanced.meta",
    "chars": 202,
    "preview": "fileFormatVersion: 2\r\nguid: 1ac38d39b5dd9f442a088b7284b58236\r\nfolderAsset: yes\r\ntimeCreated: 1513377123\r\nlicenseType: St"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioGraph.cs",
    "chars": 10929,
    "preview": "/* ---------------------------------------\r\n * Author:          Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contri"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioGraph.cs.meta",
    "chars": 276,
    "preview": "fileFormatVersion: 2\r\nguid: f2d6ca19dafe21b4b983441274e7f12a\r\ntimeCreated: 1513169449\r\nlicenseType: Store\r\nMonoImporter:"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioManager.cs",
    "chars": 8060,
    "preview": "/* ---------------------------------------\r\n * Author:          Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contri"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioManager.cs.meta",
    "chars": 276,
    "preview": "fileFormatVersion: 2\r\nguid: 8c0448d8db852b54480670d291c04f1a\r\ntimeCreated: 1514998347\r\nlicenseType: Store\r\nMonoImporter:"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioMonitor.cs",
    "chars": 7137,
    "preview": "/* ---------------------------------------\r\n * Author:          Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contri"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioMonitor.cs.meta",
    "chars": 276,
    "preview": "fileFormatVersion: 2\r\nguid: 2216f4eff6a7a8a43b38b180fdd2fd9e\r\ntimeCreated: 1513377074\r\nlicenseType: Store\r\nMonoImporter:"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioText.cs",
    "chars": 2446,
    "preview": "/* ---------------------------------------\r\n * Author:          Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contri"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioText.cs.meta",
    "chars": 276,
    "preview": "fileFormatVersion: 2\r\nguid: 766a588f9a6cb55499c66ea772072e11\r\ntimeCreated: 1513377063\r\nlicenseType: Store\r\nMonoImporter:"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Audio.meta",
    "chars": 202,
    "preview": "fileFormatVersion: 2\r\nguid: 2523395741efc1c48822a27d9fcb57d2\r\nfolderAsset: yes\r\ntimeCreated: 1513377094\r\nlicenseType: St"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsGraph.cs",
    "chars": 6392,
    "preview": "/* ---------------------------------------\r\n * Author:          Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contri"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsGraph.cs.meta",
    "chars": 276,
    "preview": "fileFormatVersion: 2\r\nguid: 2e119c7747ac400478c7cfcaea03214e\r\ntimeCreated: 1511794194\r\nlicenseType: Store\r\nMonoImporter:"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsManager.cs",
    "chars": 8549,
    "preview": "/* ---------------------------------------\r\n * Author:          Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contri"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsManager.cs.meta",
    "chars": 276,
    "preview": "fileFormatVersion: 2\r\nguid: 221dc0b3655ddb749ace6bad55f0159f\r\ntimeCreated: 1514998359\r\nlicenseType: Store\r\nMonoImporter:"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsMonitor.cs",
    "chars": 4965,
    "preview": "/* ---------------------------------------\r\n * Author:          Martin Pane (martintayx@gmail.com) (@tayx94)\r\n * Contrib"
  },
  {
    "path": "unity/RLottieUnity/Assets/LottiePlugin/Samples~/SceneUI/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsMonitor.cs.meta",
    "chars": 276,
    "preview": "fileFormatVersion: 2\r\nguid: b205584e495e4634aa3a332a78102a19\r\ntimeCreated: 1513376950\r\nlicenseType: Store\r\nMonoImporter:"
  }
]

// ... and 497 more files (download for full content)

About this extraction

This page contains the full source code of the gindemit/unity-rlottie GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 697 files (36.2 MB), approximately 6.0M tokens, and a symbol index with 419 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!