Skip to content

feat: GUI Overhaul#98

Open
prateek-who wants to merge 56 commits intoMorpheApp:devfrom
prateek-who:gui-overhaul
Open

feat: GUI Overhaul#98
prateek-who wants to merge 56 commits intoMorpheApp:devfrom
prateek-who:gui-overhaul

Conversation

@prateek-who
Copy link
Copy Markdown
Contributor

No description provided.

prateek-who and others added 30 commits February 11, 2026 09:04
Fixed a bunch of issues with the simplified version. It should behave better now.
Fixed minor UI bugs and URL pointing issues
Builds an apkmirror link to link the app . Might want to change the implementation later
Fixed "Download original APK" button UI for reddit.
Added more extensive timestamp for when patches are published.
Added Patch notes section in the patches screen.
Fixed minor UI problems
Added a device indicator on the top which allows to see if a device is connected or not.
Other minor UI and logic fixes.
No more hardcoded disabled patches, directly read from the patches files
Made a bunch of UI improvements for the patch screen.
Simplified mode loading now shows a circular icon instead of making up progress numbers.
User can remove libs if they do not need it
We can now generate a single cross platform jar file.
Fixed an issue where cache wasn't clearing on windows
No more code duplication. The patching logic is present in a central engine that both the cli and the gui can call to make it run however they want.
Minor fixes for various stuff
Better patching logging Simplified version.
Added --force for unsupported versions.
Added a button for --continue-on-error to allow gui users to continue patching even when if a patch throws an error.
added fixes from other branches and new mini theme
Added a better offline mode experience for the user.
Minor UI improvemments to the patches and patchselection screens.
Added some updates from other branch (but not all, might lack some functionality that are present in other branches)
Copy link
Copy Markdown
Contributor

@LisoUseInAIKyrios LisoUseInAIKyrios left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks awesome. We can merge this soon.

Comment on lines +67 to +71
/**
* Check if this is a patch file (.mpp or .jar)
*/
fun isPatchFile(): Boolean = isMpp() || isJar()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When would a jar file be used?

Patches are always mpp files.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is residue from testing. Will remove this.

Comment on lines 22 to 25
/**
* Derive display name from package name.
*/
fun getDisplayName(packageName: String): String {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new Patcher 1.3.3 Compatibility object has an app name field and that could be used.

If there isn't an app name in the compatibility tag then this fallback logic here can be used instead.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new compatibility has experimental versions too. Eventually CLI could add a switch in the settings like Manager to use experimental if available.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, this was added because third party patches had apps whose names were hard to get, so I just added this as a fallback. Will make this fallback logic instead.

Yea, the experimental feature from the manager needs to be added.

Comment on lines +39 to +45
/**
* Subtle falling sakura petals overlay.
* Draws 12–18 petals drifting down with gentle rotation and horizontal sway.
* Designed to be layered behind interactive content (no pointer input).
*/
@Composable
fun SakuraPetals(
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Love the look of this.

I would suggest adjusting the foreground text color to be pure black/white or use some other color that contrasts better against the sakura background color.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is what I am working on now. All the themes other than light and dark seems to have some sort of contrast issues. Will fix them soon.

@@ -0,0 +1 @@
{"nm": "cat", "ddd": 0, "h": 1080, "w": 1080, "meta": {"g": "@lottiefiles/toolkit-js 0.25.4"}, "layers": [{"ty": 4, "nm": "Layer 7 Outlines", "sr": 1, "st": 0, "op": 300.00001221925, "ip": 0, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": {"a": {"a": 0, "k": [5.25, 5.25, 0], "ix": 1}, "s": {"a": 0, "k": [150, 150, 100], "ix": 6}, "sk": {"a": 0, "k": 0}, "p": {"a": 1, "k": [{"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [531, 418.5, 0], "t": 25, "ti": [0, -1.125, 0], "to": [0, 1.125, 0]}, {"o": {"x": 0.333, "y": 0.333}, "i": {"x": 0.667, "y": 0.667}, "s": [531, 425.25, 0], "t": 30, "ti": [0, 0, 0], "to": [0, 0, 0]}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [531, 425.25, 0], "t": 59, "ti": [-1.375, 1.25, 0], "to": [1.375, -1.25, 0]}, {"o": {"x": 0.333, "y": 0.333}, "i": {"x": 0.667, "y": 0.667}, "s": [539.25, 417.75, 0], "t": 64, "ti": [0, 0, 0], "to": [0, 0, 0]}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [539.25, 417.75, 0], "t": 105, "ti": [1.5, 0, 0], "to": [-1.5, 0, 0]}, {"o": {"x": 0.333, "y": 0.333}, "i": {"x": 0.667, "y": 0.667}, "s": [530.25, 417.75, 0], "t": 110, "ti": [0, 0, 0], "to": [0, 0, 0]}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [530.25, 417.75, 0], "t": 129, "ti": [0, -1.25, 0], "to": [0, 1.25, 0]}, {"o": {"x": 0.333, "y": 0.333}, "i": {"x": 0.667, "y": 0.667}, "s": [530.25, 425.25, 0], "t": 135, "ti": [0, 0, 0], "to": [0, 0, 0]}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [530.25, 425.25, 0], "t": 159, "ti": [-0.125, 1.125, 0], "to": [0.125, -1.125, 0]}, {"s": [531, 418.5, 0], "t": 165.000006720588}], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 10}, "sa": {"a": 0, "k": 0}, "o": {"a": 0, "k": 100, "ix": 11}}, "ef": [], "shapes": [{"ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Group 1", "ix": 1, "cix": 2, "np": 2, "it": [{"ty": "sh", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Group", "nm": "Path 1", "ix": 1, "d": 1, "ks": {"a": 0, "k": {"c": true, "i": [[0, -2.761], [2.761, 0], [0, 2.761], [-2.761, 0]], "o": [[0, 2.761], [-2.761, 0], [0, -2.761], [2.761, 0]], "v": [[5, 0], [0, 5], [-5, 0], [0, -5]]}, "ix": 2}}, {"ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": {"a": 0, "k": [1, 1, 1], "ix": 4}, "r": 1, "o": {"a": 0, "k": 100, "ix": 5}}, {"ty": "tr", "a": {"a": 0, "k": [0, 0], "ix": 1}, "s": {"a": 0, "k": [100, 100], "ix": 3}, "sk": {"a": 0, "k": 0, "ix": 4}, "p": {"a": 0, "k": [5.25, 5.25], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 6}, "sa": {"a": 0, "k": 0, "ix": 5}, "o": {"a": 0, "k": 100, "ix": 7}}]}], "ind": 1}, {"ty": 4, "nm": "eye 1 Outlines", "sr": 1, "st": 0, "op": 300.00001221925, "ip": 0, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": {"a": {"a": 0, "k": [5.25, 5.25, 0], "ix": 1}, "s": {"a": 0, "k": [150, 150, 100], "ix": 6}, "sk": {"a": 0, "k": 0}, "p": {"a": 1, "k": [{"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [501, 429, 0], "t": 25, "ti": [0.062, -1.312, 0], "to": [-0.062, 1.312, 0]}, {"o": {"x": 0.333, "y": 0.333}, "i": {"x": 0.667, "y": 0.667}, "s": [500.625, 436.875, 0], "t": 30, "ti": [0, 0, 0], "to": [0, 0, 0]}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [500.625, 436.875, 0], "t": 59, "ti": [-1.25, 1.375, 0], "to": [1.25, -1.375, 0]}, {"o": {"x": 0.333, "y": 0.333}, "i": {"x": 0.667, "y": 0.667}, "s": [508.125, 428.625, 0], "t": 64, "ti": [0, 0, 0], "to": [0, 0, 0]}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [508.125, 428.625, 0], "t": 105, "ti": [1.25, 0, 0], "to": [-1.25, 0, 0]}, {"o": {"x": 0.333, "y": 0.333}, "i": {"x": 0.667, "y": 0.667}, "s": [500.625, 428.625, 0], "t": 110, "ti": [0, 0, 0], "to": [0, 0, 0]}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [500.625, 428.625, 0], "t": 129, "ti": [0, -1.25, 0], "to": [0, 1.25, 0]}, {"o": {"x": 0.333, "y": 0.333}, "i": {"x": 0.667, "y": 0.667}, "s": [500.625, 436.125, 0], "t": 135, "ti": [0, 0, 0], "to": [0, 0, 0]}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [500.625, 436.125, 0], "t": 159, "ti": [-0.062, 1.188, 0], "to": [0.062, -1.188, 0]}, {"s": [501, 429, 0], "t": 165.000006720588}], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 10}, "sa": {"a": 0, "k": 0}, "o": {"a": 0, "k": 100, "ix": 11}}, "ef": [], "shapes": [{"ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Group 1", "ix": 1, "cix": 2, "np": 2, "it": [{"ty": "sh", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Group", "nm": "Path 1", "ix": 1, "d": 1, "ks": {"a": 0, "k": {"c": true, "i": [[0, -2.761], [2.761, 0], [0, 2.761], [-2.761, 0]], "o": [[0, 2.761], [-2.761, 0], [0, -2.761], [2.761, 0]], "v": [[5, 0], [0, 5], [-5, 0], [0, -5]]}, "ix": 2}}, {"ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": {"a": 0, "k": [1, 1, 1], "ix": 4}, "r": 1, "o": {"a": 0, "k": 100, "ix": 5}}, {"ty": "tr", "a": {"a": 0, "k": [0, 0], "ix": 1}, "s": {"a": 0, "k": [100, 100], "ix": 3}, "sk": {"a": 0, "k": 0, "ix": 4}, "p": {"a": 0, "k": [5.25, 5.25], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 6}, "sa": {"a": 0, "k": 0, "ix": 5}, "o": {"a": 0, "k": 100, "ix": 7}}]}], "ind": 2}, {"ty": 4, "nm": "Layer 8 Outlines", "sr": 1, "st": 0, "op": 300.00001221925, "ip": 0, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": {"a": {"a": 0, "k": [34.25, 68.25, 0], "ix": 1}, "s": {"a": 0, "k": [150, 150, 100], "ix": 6}, "sk": {"a": 0, "k": 0}, "p": {"a": 0, "k": [532.5, 486, 0], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 10}, "sa": {"a": 0, "k": 0}, "o": {"a": 0, "k": 100, "ix": 11}}, "ef": [], "shapes": [{"ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Group 1", "ix": 1, "cix": 2, "np": 2, "it": [{"ty": "sh", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Group", "nm": "Path 1", "ix": 1, "d": 1, "ks": {"a": 0, "k": {"c": true, "i": [[0, -18.778], [18.777, 0], [0, 18.778], [-18.778, 0]], "o": [[0, 18.778], [-18.778, 0], [0, -18.778], [18.777, 0]], "v": [[34, 0], [0, 34], [-34, 0], [0, -34]]}, "ix": 2}}, {"ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": {"a": 0, "k": [0, 0, 0], "ix": 4}, "r": 1, "o": {"a": 0, "k": 100, "ix": 5}}, {"ty": "tr", "a": {"a": 0, "k": [0, 0], "ix": 1}, "s": {"a": 0, "k": [100, 100], "ix": 3}, "sk": {"a": 0, "k": 0, "ix": 4}, "p": {"a": 0, "k": [34.25, 34.25], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 6}, "sa": {"a": 0, "k": 0, "ix": 5}, "o": {"a": 0, "k": 100, "ix": 7}}]}], "ind": 3}, {"ty": 4, "nm": "ear2 Outlines", "sr": 1, "st": 0, "op": 300.00001221925, "ip": 0, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": {"a": {"a": 0, "k": [7.25, 28.369, 0], "ix": 1}, "s": {"a": 0, "k": [150, 150, 100], "ix": 6}, "sk": {"a": 0, "k": 0}, "p": {"a": 1, "k": [{"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [537, 400.678, 0], "t": 25, "ti": [1.625, -0.375, 0], "to": [-1.625, 0.375, 0]}, {"o": {"x": 0.333, "y": 0.333}, "i": {"x": 0.667, "y": 0.667}, "s": [527.25, 402.928, 0], "t": 30, "ti": [0, 0, 0], "to": [0, 0, 0]}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [527.25, 402.928, 0], "t": 59, "ti": [-1.531, 0.469, 0], "to": [1.531, -0.469, 0]}, {"o": {"x": 0.333, "y": 0.333}, "i": {"x": 0.667, "y": 0.667}, "s": [536.437, 400.116, 0], "t": 64, "ti": [0, 0, 0], "to": [0, 0, 0]}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [536.437, 400.116, 0], "t": 129, "ti": [1, 0, 0], "to": [-1, 0, 0]}, {"o": {"x": 0.333, "y": 0.333}, "i": {"x": 0.667, "y": 0.667}, "s": [530.437, 400.116, 0], "t": 135, "ti": [0, 0, 0], "to": [0, 0, 0]}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [530.437, 400.116, 0], "t": 159, "ti": [-1.094, -0.094, 0], "to": [1.094, 0.094, 0]}, {"s": [537, 400.678, 0], "t": 165.000006720588}], "ix": 2}, "r": {"a": 1, "k": [{"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [0], "t": 25}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-9], "t": 30}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-9], "t": 59}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-7], "t": 64}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-7], "t": 72}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-3], "t": 74}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-12], "t": 75}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [5], "t": 77}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-12], "t": 81}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-5], "t": 82}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-18], "t": 85}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [5], "t": 88}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-8], "t": 91}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-8], "t": 105}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [1], "t": 110}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [1], "t": 129}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-19], "t": 135}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-19], "t": 159}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [0], "t": 165}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-7], "t": 177}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-3], "t": 179}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-12], "t": 180}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [5], "t": 182}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-12], "t": 186}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-5], "t": 187}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-18], "t": 190}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [5], "t": 193}, {"s": [0], "t": 196.000007983244}], "ix": 10}, "sa": {"a": 0, "k": 0}, "o": {"a": 0, "k": 100, "ix": 11}}, "ef": [], "shapes": [{"ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Group 1", "ix": 1, "cix": 2, "np": 2, "it": [{"ty": "sh", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Group", "nm": "Path 1", "ix": 1, "d": 1, "ks": {"a": 0, "k": {"c": false, "i": [[0, 0], [0, 0], [0, 0]], "o": [[0, 0], [0, 0], [0, 0]], "v": [[-6.508, 14.059], [-7, -14.059], [7, 4.941]]}, "ix": 2}}, {"ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": {"a": 0, "k": [0, 0, 0], "ix": 4}, "r": 1, "o": {"a": 0, "k": 100, "ix": 5}}, {"ty": "tr", "a": {"a": 0, "k": [0, 0], "ix": 1}, "s": {"a": 0, "k": [100, 100], "ix": 3}, "sk": {"a": 0, "k": 0, "ix": 4}, "p": {"a": 0, "k": [7.25, 14.31], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 6}, "sa": {"a": 0, "k": 0, "ix": 5}, "o": {"a": 0, "k": 100, "ix": 7}}]}], "ind": 4}, {"ty": 4, "nm": "ear 1 Outlines", "sr": 1, "st": 0, "op": 300.00001221925, "ip": 0, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": {"a": {"a": 0, "k": [7.25, 28.369, 0], "ix": 1}, "s": {"a": 0, "k": [150, 150, 100], "ix": 6}, "sk": {"a": 0, "k": 0}, "p": {"a": 1, "k": [{"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [498, 409.678, 0], "t": 25, "ti": [0.562, -2.188, 0], "to": [-0.562, 2.188, 0]}, {"o": {"x": 0.333, "y": 0.333}, "i": {"x": 0.667, "y": 0.667}, "s": [494.625, 422.803, 0], "t": 30, "ti": [0, 0, 0], "to": [0, 0, 0]}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [494.625, 422.803, 0], "t": 59, "ti": [-0.594, 1.156, 0], "to": [0.594, -1.156, 0]}, {"o": {"x": 0.333, "y": 0.333}, "i": {"x": 0.667, "y": 0.667}, "s": [498.187, 415.866, 0], "t": 64, "ti": [0, 0, 0], "to": [0, 0, 0]}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [498.187, 415.866, 0], "t": 129, "ti": [0.281, -0.594, 0], "to": [-0.281, 0.594, 0]}, {"o": {"x": 0.333, "y": 0.333}, "i": {"x": 0.667, "y": 0.667}, "s": [496.5, 419.428, 0], "t": 135, "ti": [0, 0, 0], "to": [0, 0, 0]}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [496.5, 419.428, 0], "t": 159, "ti": [-0.25, 1.625, 0], "to": [0.25, -1.625, 0]}, {"s": [498, 409.678, 0], "t": 165.000006720588}], "ix": 2}, "r": {"a": 1, "k": [{"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [0], "t": 25}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-12], "t": 30}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-12], "t": 59}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-5], "t": 64}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-5], "t": 105}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [2], "t": 110}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [2], "t": 129}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-20], "t": 135}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [-20], "t": 159}, {"s": [0], "t": 165.000006720588}], "ix": 10}, "sa": {"a": 0, "k": 0}, "o": {"a": 0, "k": 100, "ix": 11}}, "ef": [], "shapes": [{"ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Group 1", "ix": 1, "cix": 2, "np": 2, "it": [{"ty": "sh", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Group", "nm": "Path 1", "ix": 1, "d": 1, "ks": {"a": 0, "k": {"c": false, "i": [[0, 0], [0, 0], [0, 0]], "o": [[0, 0], [0, 0], [0, 0]], "v": [[-6.508, 14.059], [-7, -14.059], [7, 4.941]]}, "ix": 2}}, {"ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": {"a": 0, "k": [0, 0, 0], "ix": 4}, "r": 1, "o": {"a": 0, "k": 100, "ix": 5}}, {"ty": "tr", "a": {"a": 0, "k": [0, 0], "ix": 1}, "s": {"a": 0, "k": [100, 100], "ix": 3}, "sk": {"a": 0, "k": 0, "ix": 4}, "p": {"a": 0, "k": [7.25, 14.31], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 6}, "sa": {"a": 0, "k": 0, "ix": 5}, "o": {"a": 0, "k": 100, "ix": 7}}]}], "ind": 5}, {"ty": 4, "nm": "foot Outlines", "sr": 1, "st": 0, "op": 300.00001221925, "ip": 0, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": {"a": {"a": 0, "k": [77, 40, 0], "ix": 1}, "s": {"a": 0, "k": [150, 150, 100], "ix": 6}, "sk": {"a": 0, "k": 0}, "p": {"a": 0, "k": [540, 492, 0], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 10}, "sa": {"a": 0, "k": 0}, "o": {"a": 0, "k": 100, "ix": 11}}, "ef": [], "shapes": [{"ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Group 1", "ix": 1, "cix": 2, "np": 2, "it": [{"ty": "sh", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Group", "nm": "Path 1", "ix": 1, "d": 1, "ks": {"a": 1, "k": [{"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [9.792, -1.935], [1.377, -4.256], [0.347, -4.168]], "o": [[0, 0], [-4.388, 0.866], [-0.777, 2.406], [0, 0]], "v": [[18.5, -10], [-7.311, -8.065], [-16.666, 0.223], [-18.5, 10]]}], "t": 30}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [9.792, -1.935], [10.583, -4.223], [2.167, -4.5]], "o": [[0, 0], [-4.388, 0.866], [-2.348, 0.937], [0, 0]], "v": [[18.5, -10], [-8.061, -13.815], [-28.166, -11.277], [-40.583, -1.083]]}], "t": 33}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [9.911, 1.186], [8.892, -7.125], [0.25, -3.917]], "o": [[0, 0], [-2.939, -0.352], [-7.834, 6.277], [0, 0]], "v": [[18.5, -10], [-8.061, -15.648], [-28.833, -12.61], [-35.25, -0.083]]}], "t": 36}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [9.911, 1.186], [1.666, -1.89], [0.25, -3.917]], "o": [[0, 0], [-2.939, -0.352], [-3.491, 3.96], [0, 0]], "v": [[18.5, -10], [-8.061, -15.648], [-22.499, -10.777], [-28.25, 1.417]]}], "t": 39}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [9.792, -1.935], [1.377, -4.256], [0.347, -4.168]], "o": [[0, 0], [-4.388, 0.866], [-0.777, 2.406], [0, 0]], "v": [[18.5, -10], [-7.311, -8.065], [-16.666, 0.223], [-18.5, 10]]}], "t": 42}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [9.792, -1.935], [1.377, -4.256], [0.347, -4.168]], "o": [[0, 0], [-4.388, 0.866], [-0.777, 2.406], [0, 0]], "v": [[18.5, -10], [-7.311, -8.065], [-16.666, 0.223], [-18.5, 10]]}], "t": 135}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [9.792, -1.935], [10.583, -4.223], [2.167, -4.5]], "o": [[0, 0], [-4.388, 0.866], [-2.348, 0.937], [0, 0]], "v": [[18.5, -10], [-8.061, -13.815], [-28.166, -11.277], [-40.583, -1.083]]}], "t": 138}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [9.911, 1.186], [8.892, -7.125], [0.25, -3.917]], "o": [[0, 0], [-2.939, -0.352], [-7.834, 6.277], [0, 0]], "v": [[18.5, -10], [-8.061, -15.648], [-28.833, -12.61], [-35.25, -0.083]]}], "t": 141}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [9.911, 1.186], [1.666, -1.89], [0.25, -3.917]], "o": [[0, 0], [-2.939, -0.352], [-3.491, 3.96], [0, 0]], "v": [[18.5, -10], [-8.061, -15.648], [-22.499, -10.777], [-28.25, 1.417]]}], "t": 144}, {"s": [{"c": false, "i": [[0, 0], [9.792, -1.935], [1.377, -4.256], [0.347, -4.168]], "o": [[0, 0], [-4.388, 0.866], [-0.777, 2.406], [0, 0]], "v": [[18.5, -10], [-7.311, -8.065], [-16.666, 0.223], [-18.5, 10]]}], "t": 147.000005987433}], "ix": 2}}, {"ty": "st", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Stroke", "nm": "Stroke 1", "lc": 2, "lj": 1, "ml": 10, "o": {"a": 0, "k": 100, "ix": 4}, "w": {"a": 0, "k": 16, "ix": 5}, "c": {"a": 0, "k": [0, 0, 0], "ix": 3}}, {"ty": "tr", "a": {"a": 0, "k": [0, 0], "ix": 1}, "s": {"a": 0, "k": [100, 100], "ix": 3}, "sk": {"a": 0, "k": 0, "ix": 4}, "p": {"a": 0, "k": [58.5, 50], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 6}, "sa": {"a": 0, "k": 0, "ix": 5}, "o": {"a": 0, "k": 100, "ix": 7}}]}], "ind": 6}, {"ty": 4, "nm": "tail Outlines", "sr": 1, "st": 0, "op": 300.00001221925, "ip": 0, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": {"a": {"a": 0, "k": [104.011, 30, 0], "ix": 1}, "s": {"a": 0, "k": [150, 150, 100], "ix": 6}, "sk": {"a": 0, "k": 0}, "p": {"a": 0, "k": [714.017, 497.25, 0], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 10}, "sa": {"a": 0, "k": 0}, "o": {"a": 0, "k": 100, "ix": 11}}, "ef": [], "shapes": [{"ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Group 1", "ix": 1, "cix": 2, "np": 2, "it": [{"ty": "sh", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Group", "nm": "Path 1", "ix": 1, "d": 1, "ks": {"a": 1, "k": [{"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [36.624, -19.156], [-16, 13]], "o": [[0, 0], [-7.025, 3.675], [0, 0]], "v": [[36.172, -45.78], [1.204, 42.105], [-21.828, 11.22]]}], "t": 0}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [-5.407, -37.51], [7.125, 38.75]], "o": [[0, 0], [4.093, 27.74], [0, 0]], "v": [[36.172, -45.78], [35.079, 37.98], [-16.703, 49.72]]}], "t": 9}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [-5.032, -32.385], [-9, -2.5]], "o": [[0, 0], [5.137, 33.062], [0, 0]], "v": [[36.172, -45.78], [22.704, 53.605], [64.672, 94.22]]}], "t": 12}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [-16.771, -28.108], [29.5, 20]], "o": [[0, 0], [17.968, 30.115], [0, 0]], "v": [[36.172, -45.78], [34.204, 34.605], [72.672, 14.22]]}], "t": 25}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [30.638, -59.753], [-18, 0.5]], "o": [[0, 0], [-9.032, 17.615], [0, 0]], "v": [[36.172, -45.78], [25.204, 41.105], [45.672, 78.22]]}], "t": 37}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [29.718, -25.385], [-14.083, -12]], "o": [[0, 0], [-12.782, 14.115], [0, 0]], "v": [[36.172, -45.78], [22.704, 37.355], [-3.495, 67.22]]}], "t": 39}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [27.118, -32.385], [-1.592, 32.8]], "o": [[0, 0], [-12.24, 16.493], [0, 0]], "v": [[36.172, -45.78], [18.554, 35.105], [-27.611, 23.795]]}], "t": 41}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [28.793, -31.635], [-37.858, 26.212]], "o": [[0, 0], [-14.207, 23.365], [0, 0]], "v": [[36.172, -45.78], [11.879, 34.105], [-19.97, 12.758]]}], "t": 45}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [36.624, -19.156], [-16, 13]], "o": [[0, 0], [-7.025, 3.675], [0, 0]], "v": [[36.172, -45.78], [1.204, 42.105], [-21.828, 11.22]]}], "t": 49}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [-5.407, -37.51], [7.125, 38.75]], "o": [[0, 0], [4.093, 27.74], [0, 0]], "v": [[36.172, -45.78], [35.079, 37.98], [-16.703, 49.72]]}], "t": 58}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [-5.032, -32.385], [-9, -2.5]], "o": [[0, 0], [5.137, 33.062], [0, 0]], "v": [[36.172, -45.78], [22.704, 53.605], [64.672, 94.22]]}], "t": 61}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [-16.771, -28.108], [29.5, 20]], "o": [[0, 0], [17.968, 30.115], [0, 0]], "v": [[36.172, -45.78], [34.204, 34.605], [72.672, 14.22]]}], "t": 74}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [30.638, -59.753], [-18, 0.5]], "o": [[0, 0], [-9.032, 17.615], [0, 0]], "v": [[36.172, -45.78], [25.204, 41.105], [45.672, 78.22]]}], "t": 86}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [29.718, -25.385], [-14.083, -12]], "o": [[0, 0], [-12.782, 14.115], [0, 0]], "v": [[36.172, -45.78], [22.704, 37.355], [-3.495, 67.22]]}], "t": 88}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [27.118, -32.385], [-1.592, 32.8]], "o": [[0, 0], [-12.24, 16.493], [0, 0]], "v": [[36.172, -45.78], [18.554, 35.105], [-27.611, 23.795]]}], "t": 90}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [28.793, -31.635], [-37.858, 26.212]], "o": [[0, 0], [-14.207, 23.365], [0, 0]], "v": [[36.172, -45.78], [11.879, 34.105], [-19.97, 12.758]]}], "t": 94}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [36.624, -19.156], [-16, 13]], "o": [[0, 0], [-7.025, 3.675], [0, 0]], "v": [[36.172, -45.78], [1.204, 42.105], [-21.828, 11.22]]}], "t": 98}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [-5.407, -37.51], [7.125, 38.75]], "o": [[0, 0], [4.093, 27.74], [0, 0]], "v": [[36.172, -45.78], [35.079, 37.98], [-16.703, 49.72]]}], "t": 107}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [-5.032, -32.385], [-9, -2.5]], "o": [[0, 0], [5.137, 33.062], [0, 0]], "v": [[36.172, -45.78], [22.704, 53.605], [64.672, 94.22]]}], "t": 110}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [-16.771, -28.108], [29.5, 20]], "o": [[0, 0], [17.968, 30.115], [0, 0]], "v": [[36.172, -45.78], [34.204, 34.605], [72.672, 14.22]]}], "t": 123}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [30.638, -59.753], [-18, 0.5]], "o": [[0, 0], [-9.032, 17.615], [0, 0]], "v": [[36.172, -45.78], [25.204, 41.105], [45.672, 78.22]]}], "t": 135}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [29.718, -25.385], [-14.083, -12]], "o": [[0, 0], [-12.782, 14.115], [0, 0]], "v": [[36.172, -45.78], [22.704, 37.355], [-3.495, 67.22]]}], "t": 137}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [27.118, -32.385], [-1.592, 32.8]], "o": [[0, 0], [-12.24, 16.493], [0, 0]], "v": [[36.172, -45.78], [18.554, 35.105], [-27.611, 23.795]]}], "t": 139}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [28.793, -31.635], [-37.858, 26.212]], "o": [[0, 0], [-14.207, 23.365], [0, 0]], "v": [[36.172, -45.78], [11.879, 34.105], [-19.97, 12.758]]}], "t": 143}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [36.624, -19.156], [-16, 13]], "o": [[0, 0], [-7.025, 3.675], [0, 0]], "v": [[36.172, -45.78], [1.204, 42.105], [-21.828, 11.22]]}], "t": 147}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [-5.407, -37.51], [7.125, 38.75]], "o": [[0, 0], [4.093, 27.74], [0, 0]], "v": [[36.172, -45.78], [35.079, 37.98], [-16.703, 49.72]]}], "t": 156}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [-5.032, -32.385], [-9, -2.5]], "o": [[0, 0], [5.137, 33.062], [0, 0]], "v": [[36.172, -45.78], [22.704, 53.605], [64.672, 94.22]]}], "t": 159}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [-16.771, -28.108], [29.5, 20]], "o": [[0, 0], [17.968, 30.115], [0, 0]], "v": [[36.172, -45.78], [34.204, 34.605], [72.672, 14.22]]}], "t": 172}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [30.638, -59.753], [-18, 0.5]], "o": [[0, 0], [-9.032, 17.615], [0, 0]], "v": [[36.172, -45.78], [25.204, 41.105], [45.672, 78.22]]}], "t": 184}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [29.718, -25.385], [-14.083, -12]], "o": [[0, 0], [-12.782, 14.115], [0, 0]], "v": [[36.172, -45.78], [22.704, 37.355], [-3.495, 67.22]]}], "t": 186}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [27.118, -32.385], [-1.592, 32.8]], "o": [[0, 0], [-12.24, 16.493], [0, 0]], "v": [[36.172, -45.78], [18.554, 35.105], [-27.611, 23.795]]}], "t": 188}, {"o": {"x": 0.333, "y": 0}, "i": {"x": 0.667, "y": 1}, "s": [{"c": false, "i": [[0, 0], [28.793, -31.635], [-37.858, 26.212]], "o": [[0, 0], [-14.207, 23.365], [0, 0]], "v": [[36.172, -45.78], [11.879, 34.105], [-19.97, 12.758]]}], "t": 192}, {"s": [{"c": false, "i": [[0, 0], [36.624, -19.156], [-16, 13]], "o": [[0, 0], [-7.025, 3.675], [0, 0]], "v": [[36.172, -45.78], [1.204, 42.105], [-21.828, 11.22]]}], "t": 196.000007983244}], "ix": 2}}, {"ty": "st", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Stroke", "nm": "Stroke 1", "lc": 2, "lj": 1, "ml": 10, "o": {"a": 0, "k": 100, "ix": 4}, "w": {"a": 0, "k": 12, "ix": 5}, "c": {"a": 0, "k": [0, 0, 0], "ix": 3}}, {"ty": "tr", "a": {"a": 0, "k": [0, 0], "ix": 1}, "s": {"a": 0, "k": [100, 100], "ix": 3}, "sk": {"a": 0, "k": 0, "ix": 4}, "p": {"a": 0, "k": [67.828, 75.78], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 6}, "sa": {"a": 0, "k": 0, "ix": 5}, "o": {"a": 0, "k": 100, "ix": 7}}]}], "ind": 7}, {"ty": 4, "nm": "Layer 1 Outlines", "sr": 1, "st": 0, "op": 300.00001221925, "ip": 0, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": {"a": {"a": 0, "k": [275, 33, 0], "ix": 1}, "s": {"a": 0, "k": [150, 150, 100], "ix": 6}, "sk": {"a": 0, "k": 0}, "p": {"a": 0, "k": [583.5, 564, 0], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 10}, "sa": {"a": 0, "k": 0}, "o": {"a": 0, "k": 100, "ix": 11}}, "ef": [], "shapes": [{"ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Group 1", "ix": 1, "cix": 2, "np": 2, "it": [{"ty": "sh", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Group", "nm": "Path 1", "ix": 1, "d": 1, "ks": {"a": 0, "k": {"c": false, "i": [[0, 0], [0, 0]], "o": [[0, 0], [0, 0]], "v": [[-200, 33], [1280, 33]]}, "ix": 2}}, {"ty": "st", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Stroke", "nm": "Stroke 1", "lc": 2, "lj": 1, "ml": 10, "o": {"a": 0, "k": 100, "ix": 4}, "w": {"a": 0, "k": 24, "ix": 5}, "c": {"a": 0, "k": [0.149, 0.2039, 0.1569], "ix": 3}}, {"ty": "tr", "a": {"a": 0, "k": [0, 0], "ix": 1}, "s": {"a": 0, "k": [100, 100], "ix": 3}, "sk": {"a": 0, "k": 0, "ix": 4}, "p": {"a": 0, "k": [0, 0], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 6}, "sa": {"a": 0, "k": 0, "ix": 5}, "o": {"a": 0, "k": 100, "ix": 7}}]}], "ind": 8}, {"ty": 4, "nm": "Layer 9 Outlines", "sr": 1, "st": 0, "op": 300.00001221925, "ip": 0, "hd": false, "ddd": 0, "bm": 0, "hasMask": false, "ao": 0, "ks": {"a": {"a": 0, "k": [70.25, 68.25, 0], "ix": 1}, "s": {"a": 0, "k": [85, 85, 100], "ix": 6}, "sk": {"a": 0, "k": 0}, "p": {"a": 0, "k": [618, 518, 0], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 10}, "sa": {"a": 0, "k": 0}, "o": {"a": 0, "k": 100, "ix": 11}}, "ef": [], "shapes": [{"ty": "gr", "bm": 0, "hd": false, "mn": "ADBE Vector Group", "nm": "Group 1", "ix": 1, "cix": 2, "np": 2, "it": [{"ty": "sh", "bm": 0, "hd": false, "mn": "ADBE Vector Shape - Group", "nm": "Path 1", "ix": 1, "d": 1, "ks": {"a": 0, "k": {"c": true, "i": [[0, -39.212], [39.212, 0], [0, 39.212], [-39.212, 0]], "o": [[0, 39.212], [-39.212, 0], [0, -39.212], [39.212, 0]], "v": [[70, -3], [-1, 68], [-70, 5], [7, -68]]}, "ix": 2}}, {"ty": "fl", "bm": 0, "hd": false, "mn": "ADBE Vector Graphic - Fill", "nm": "Fill 1", "c": {"a": 0, "k": [0, 0, 0], "ix": 4}, "r": 1, "o": {"a": 0, "k": 100, "ix": 5}}, {"ty": "tr", "a": {"a": 0, "k": [0, 0], "ix": 1}, "s": {"a": 0, "k": [100, 100], "ix": 3}, "sk": {"a": 0, "k": 0, "ix": 4}, "p": {"a": 0, "k": [70.25, 68.25], "ix": 2}, "r": {"a": 0, "k": 0, "ix": 6}, "sa": {"a": 0, "k": 0, "ix": 5}, "o": {"a": 0, "k": 100, "ix": 7}}]}], "ind": 9}], "v": "5.7.13", "fr": 29.9700012207031, "op": 197.000008023974, "ip": 0, "assets": []} No newline at end of file
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where does this drawable appear in the app?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nowhere right now. This is supposed to be a cute little black cat playing by itself in the corner in the matcha theme. This particular cat seemed like it had good animation but I just couldn't edit it in the right way, so removed it for now. But the cat idea seems like a really nice touch to the theme. Do you have any idea how I could achieve this?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file appears to be a Lottie animation, which will require pulling in some kind of Lottie dependency. If a Lottie dependency exists that isn't very large then we can pull it in (even if it's for only fun reasons like this). But if the dependency isn't convenient or is large we can come up with other fun visual like the simple code for the Sakura pedals.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is true. There could be other ideas that we could come up with too. Will think about this once again.

@prateek-who
Copy link
Copy Markdown
Contributor Author

prateek-who commented Apr 2, 2026

  • Title bar issue on mac (positioning issue) and windows (doesn't even exist. The minimize, close, etc buttons need to be integrated into the window).
  • Colors palette contrast issues on various themes.
  • Animation fix for matcha theme. (Remove that lottie file if not used perhaps.)
  • Result screen centering issue.
  • Read App name from patch file.
  • Change the look of the Supported apps. Currently we are not showing experimental version

These are issues I need to fix (from the top of my head). Let's delay the merge until this gets ready.

@prateek-who
Copy link
Copy Markdown
Contributor Author

prateek-who commented Apr 3, 2026

Could you check if the morphe window looks decent on windows now?

@LisoUseInAIKyrios
Copy link
Copy Markdown
Contributor

I don't use Windows but maybe someone else can check:

https://github.com/MorpheApp/morphe-cli/suites/63221859474/artifacts/6259679436

@prateek-who
Copy link
Copy Markdown
Contributor Author

Oh wait, are you on Linux? How does it look on that?

@LisoUseInAIKyrios
Copy link
Copy Markdown
Contributor

I'm on Mac. It looks good for me.

@prateek-who
Copy link
Copy Markdown
Contributor Author

oh lmao, I am on mac too. It looks decent on mac, but the second I switch to my windows laptop, the colors look a bit washed. I don't if it's a colors issue or my screen issue.

@prateek-who
Copy link
Copy Markdown
Contributor Author

prateek-who commented Apr 4, 2026

Screenshot 2026-04-04 at 1 55 01 PM

Does this look too washed out? The contrast is much better, but I kinda feel it lacks emotion. Feels like strawberry syrup. But what do you think?

@LisoUseInAIKyrios
Copy link
Copy Markdown
Contributor

LisoUseInAIKyrios commented Apr 4, 2026

what if the grey text is black, and the red is white or black?

Revamped supported apps cards to show experimental versions.
Revamped App info card to now handle experimental version, stable version and a bunch of edge cases.
Patching result screen is now properly centered.
Unable to strip archs bug fixed.
Minor UI fixes. (Still a lot of work to do here)
@prateek-who
Copy link
Copy Markdown
Contributor Author

See how the Supported apps section looks now. What are your opinions on it? Please tell me your ideas to improve it, if you have any.

@LisoUseInAIKyrios
Copy link
Copy Markdown
Contributor

LisoUseInAIKyrios commented Apr 6, 2026

I think it looks great. I like the fixed width font that gives off a console vibe.

Picking an experimental version shows a "this may not work" warning but it can instead show a 🧪 experimental warning message (can use same message shown in Manager).

Details Experimental

@LisoUseInAIKyrios
Copy link
Copy Markdown
Contributor

The console output of the GUI is so much easier to read when the patch is displayed last:

Patch applied: Hide video action buttons
Patch applied: Loop video
Patch applied: Miniplayer
Patch applied: Navigation bar
Patch applied: Open Shorts in regular player
Patch applied: Open links externally
Patch applied: Open videos fullscreen
Patch applied: Playback speed
Patch applied: Remove background playback restrictions
Patch applied: Remove viewer discretion dialog
Patch applied: Restore old search filters
Patch applied: Return YouTube Dislike
Patch applied: Sanitize sharing links
Patch applied: Seekbar
Patch applied: Shorts autoplay
Patch applied: SponsorBlock
Patch applied: Spoof app version
Patch applied: Spoof device dimensions
Patch applied: Spoof video streams
Patch applied: Swipe controls
Patch applied: Theme
Patch applied: Video ads
Patch applied: Video quality

Compared to CLI:

INFO: "Check watch history domain name resolution" succeeded 
INFO: "Copy video URL" succeeded 
INFO: "Custom branding" succeeded 
INFO: "Custom player overlay opacity" succeeded 
INFO: "Disable DRC audio" succeeded 
INFO: "Disable QUIC protocol" succeeded 
INFO: "Disable Shorts resuming on startup" succeeded 
INFO: "Disable double tap actions" succeeded 
INFO: "Disable haptic feedback" succeeded 
INFO: "Disable layout updates" succeeded 
INFO: "Disable player popup panels" succeeded 
INFO: "Disable rolling number animations" succeeded 
INFO: "Disable sign in to TV popup" succeeded 
INFO: "Disable video codecs" succeeded 

I think the CLI console could be changed to use the same 'patch last' format of:

INFO: Success: Check watch history domain name resolution
INFO: Success: Copy video URL
INFO: Success: Custom branding
INFO: Success: Custom player overlay opacity
INFO: Success: Disable DRC audio
INFO: Success: Disable QUIC protocol
INFO: Success: Disable Shorts resuming on startup
INFO: Success: Disable double tap actions
INFO: Success: Disable haptic feedback
INFO: Success: Disable layout updates
INFO: Success: Disable player popup panels
INFO: Success: Disable rolling number animations
INFO: Success: Disable sign in to TV popup
INFO: Success: Disable video codecs

@eksan127
Copy link
Copy Markdown

eksan127 commented Apr 7, 2026

I don't use Windows but maybe someone else can check:

https://github.com/MorpheApp/morphe-cli/suites/63221859474/artifacts/6259679436

image wow that cool, animation background

@eksan127
Copy link
Copy Markdown

eksan127 commented Apr 7, 2026

I don't use Windows but maybe someone else can check:

https://github.com/MorpheApp/morphe-cli/suites/63221859474/artifacts/6259679436

image if i uncheck in strip native libraries still got this error

i was report this on the Reddit a day ago use this version
https://github.com/MorpheApp/morphe-cli/actions/runs/23846854173/artifacts/6219563344

patch version: 1.23.0-dev.8
YouTube version: 21.14.482

@prateek-who
Copy link
Copy Markdown
Contributor Author

@eksan127 Sorry that was the old build. Try this:
https://github.com/MorpheApp/morphe-cli/suites/63516598277/artifacts/6293794474

@prateek-who
Copy link
Copy Markdown
Contributor Author

Picking an experimental version shows a "this may not work" warning but it can instead show a 🧪 experimental warning message (can use same message shown in Manager).

Yea, will change this.

I think the CLI console could be changed to use the same 'patch last' format

Roger that

@eksan127
Copy link
Copy Markdown

eksan127 commented Apr 7, 2026

@eksan127 Sorry that was the old build. Try this: https://github.com/MorpheApp/morphe-cli/suites/63516598277/artifacts/6293794474

@prateek-who patching work but output file still have all architecture
image_2026-04-07_17-04-47

@prateek-who
Copy link
Copy Markdown
Contributor Author

Will look into this

@prateek-who
Copy link
Copy Markdown
Contributor Author

@wchill Had a small confusion.

When a user passes --striplibs, we pass it using keepArchitectures right. The patcher does its job, and when it gets to the lib stripping part, it does it correctly on its temp directory. It properly deletes the unwanted arch dirs from disk, and even logs "Stripped N lib files". This is good.

But here's the issue now. The way the engine rebuilds the output APK is by copying the original input APK and then applying PatcherResult.applyTo() to splice in the changes. applyTo() only knows what to delete from the rebuilt zip via ResourceCoder.getDeletedFiles(). And in ArsclibResourceCoder that method is currently a hard-coded no-op:

    /**
     * No-op, not currently supported by ArsclibResourceCoder.
     */
    override fun getDeletedFiles(): Set<String> = emptySet()

The deletion set handed to applyTo() is always empty. And that means no libs get stripped. Unless I am reading this wrong (which also could be true), this is the issue right now. Could you check if this is true? Or if there is some issue on my end in this PR? (Because I messed up earlier and had to solve a lot of conflicts, so there could be chances that maybe something changed during my merge fest.)

@wchill
Copy link
Copy Markdown
Contributor

wchill commented Apr 7, 2026

It's a no-op because we already delete the files on disk. So there's no need to delete them in the later step.

At least, that's how it's supposed to work.

@prateek-who
Copy link
Copy Markdown
Contributor Author

prateek-who commented Apr 7, 2026

Is the manager using the keepArchitecture form the patcher? If yes, then how is it doing that properly?

I tested --striplibs on v1.6.4-dev.2 and v1.6.4-dev.1, and striplibs seems broken on all of them. It seems to be broken ever since dev.1. The stable v1.6.3 strips libs perfectly. Here's how to test it:

  1. Run the patching with the above mentioned cli versions. Add --striplibs and whatever cpu arch at the end. I tested with arm64-v8a
  2. Check the resultant apk's size. Could also run this command: unzip -l patched_app.apk | grep '^.*lib/' | awk '{print$4}' | cut -d/ -f1-2 | sort -u

This should show the archs present. Could you check once too. I could've made a mistake, but it seems broken.

@wchill
Copy link
Copy Markdown
Contributor

wchill commented Apr 7, 2026

This is where the stripping happens: https://github.com/MorpheApp/morphe-patcher/blob/dev/src/main/kotlin/app/morphe/patcher/resource/coder/ArsclibResourceCoder.kt#L220

I don't have time to investigate this for the next few days, but you could set a breakpoint there and see what is happening on the file system to debug.

@prateek-who
Copy link
Copy Markdown
Contributor Author

Did the line 220 check via the filesystem instead of a debugger.
Checking: patched-temporary-files/patcher/apk/root/lib/
gave me:arm64-v8a

stripNativeLibraries() is working correctly. The libs are being stripped. The bug is most likely with the applyTo() method. Ran it with AI and this is what it says:
"So stripNativeLibraries() at L220 works perfectly — armeabi-v7a, x86, x86_64 are gone from the scratch dir. The bug is downstream: applyTo() builds the output APK as originalApk.copyTo(rebuilt); applyTo(rebuilt) and only removes entries reported by getDeletedFiles(), which is currently = emptySet() in ArsclibResourceCoder.kt:356. So the original APK's lib entries get carried straight through into the output, and the on-disk strip is invisible to applyTo()."

@wchill
Copy link
Copy Markdown
Contributor

wchill commented Apr 7, 2026

Honestly we shouldn't be copying the original APK anyway for arsclib because all of the resources are already being repacked.

Feel free to send a PR to fix this. Easy fix is you can populate the set returned by getDeletedFiles() by modifying detectFileChanges to also record deleted files, harder fix is to redo the APK repacking.

@prateek-who
Copy link
Copy Markdown
Contributor Author

Sure thing, will submit a PR using your easy approach. I asked claude what the harder fix would be and I've been trying to make sense of its explanation for 30 mins now. From what I understand, we would have to rework how the patcher assembles the final APK. Currently it's built by copying the original and applying a diff, and the harder fix seems moves to packing it from scratch out of the working dir. It makes some sense on the surface but I don't seem to understand how it is going to work. Seems like the right long term direction, but maybe we do that in the future.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants