feat(YouTube): add support version v18.38.44, v18.39.41

This commit is contained in:
inotia00 2023-10-19 10:43:05 +09:00
parent d303dd4ab0
commit 88dedec168
110 changed files with 463 additions and 196 deletions

View File

@ -32,7 +32,9 @@ Example:
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
} }
], ],

View File

@ -41,7 +41,9 @@ import org.w3c.dom.Element
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -26,7 +26,9 @@ import app.revanced.util.integrations.Constants.ADS_PATH
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -36,7 +36,9 @@ import app.revanced.util.resources.ResourceUtils.copyXmlNode
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -30,7 +30,9 @@ import app.revanced.util.integrations.Constants.PATCHES_PATH
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -30,7 +30,9 @@ import app.revanced.util.integrations.Constants.PATCHES_PATH
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -41,7 +41,9 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -41,7 +41,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -45,7 +45,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -40,7 +40,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -36,7 +36,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -35,7 +35,9 @@ import app.revanced.util.integrations.Constants.FULLSCREEN
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -47,7 +47,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -35,7 +35,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
], ],

View File

@ -32,7 +32,9 @@ import app.revanced.util.integrations.Constants.PATCHES_PATH
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -37,7 +37,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -41,7 +41,9 @@ import app.revanced.util.integrations.Constants.GENERAL
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -31,7 +31,9 @@ import app.revanced.util.integrations.Constants.GENERAL
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -39,7 +39,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -35,7 +35,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -35,7 +35,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -30,7 +30,9 @@ import app.revanced.util.integrations.Constants.PATCHES_PATH
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -35,7 +35,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -38,7 +38,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -37,7 +37,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -35,7 +35,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -31,7 +31,9 @@ import app.revanced.util.integrations.Constants.PATCHES_PATH
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -33,7 +33,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -35,7 +35,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -19,7 +19,9 @@ import app.revanced.util.bytecode.getStringIndex
import app.revanced.util.integrations.Constants.GENERAL import app.revanced.util.integrations.Constants.GENERAL
import app.revanced.util.integrations.Constants.PATCHES_PATH import app.revanced.util.integrations.Constants.PATCHES_PATH
import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
@Patch( @Patch(
name = "Hide mix playlists", name = "Hide mix playlists",
@ -43,7 +45,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]
@ -108,6 +112,7 @@ object MixPlaylistsPatch : BytecodePatch(
val insertIndex = methodInstructions.indexOfFirst { instruction -> val insertIndex = methodInstructions.indexOfFirst { instruction ->
instruction.opcode == Opcode.INVOKE_INTERFACE instruction.opcode == Opcode.INVOKE_INTERFACE
&& (instruction as? ReferenceInstruction)?.reference.toString().contains("[B")
} }
val freeIndex = it.scanResult.patternScanResult!!.startIndex - 1 val freeIndex = it.scanResult.patternScanResult!!.startIndex - 1

View File

@ -31,7 +31,9 @@ import app.revanced.util.integrations.Constants.GENERAL
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -40,7 +40,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -43,7 +43,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -33,7 +33,9 @@ import app.revanced.util.integrations.Constants.GENERAL
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -40,7 +40,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -37,7 +37,9 @@ import app.revanced.util.integrations.Constants.GENERAL
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -27,7 +27,9 @@ import app.revanced.util.resources.ResourceHelper.updatePatchStatusIcon
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
], ],

View File

@ -27,7 +27,9 @@ import app.revanced.util.resources.ResourceHelper.updatePatchStatusIcon
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -27,7 +27,9 @@ import app.revanced.util.resources.ResourceHelper.updatePatchStatusIcon
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
], ],

View File

@ -31,7 +31,9 @@ import app.revanced.util.resources.ResourceHelper.updatePatchStatusLabel
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -25,7 +25,9 @@ import app.revanced.patches.youtube.utils.settings.SettingsPatch
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
], ],

View File

@ -30,7 +30,9 @@ import app.revanced.util.resources.ResourceUtils.copyResources
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -27,7 +27,9 @@ import org.w3c.dom.Element
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
], ],

View File

@ -29,7 +29,9 @@ import kotlin.io.path.exists
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
], ],

View File

@ -34,7 +34,9 @@ import app.revanced.util.resources.ResourceUtils.copyXmlNode
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
], ],

View File

@ -33,7 +33,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -27,7 +27,9 @@ import kotlin.io.path.exists
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
], ],

View File

@ -33,7 +33,9 @@ import org.w3c.dom.Element
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -32,7 +32,9 @@ import app.revanced.patches.youtube.utils.settings.SettingsPatch
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -35,7 +35,9 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -26,7 +26,9 @@ import app.revanced.util.integrations.Constants.MISC_PATH
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -44,7 +44,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -25,7 +25,9 @@ import app.revanced.patches.youtube.utils.settings.SettingsPatch
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
], ],

View File

@ -34,7 +34,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -32,7 +32,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -38,7 +38,9 @@ import com.android.tools.smali.dexlib2.Opcode
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -42,7 +42,9 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -32,7 +32,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -30,7 +30,9 @@ import app.revanced.util.integrations.Constants.MISC_PATH
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -42,7 +42,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -28,7 +28,9 @@ import app.revanced.util.resources.ResourceUtils.copyXmlNode
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -26,7 +26,9 @@ import app.revanced.util.resources.ResourceHelper.addTranslations
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -33,7 +33,9 @@ import app.revanced.util.integrations.Constants.NAVIGATION
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -32,7 +32,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -13,7 +13,9 @@ import app.revanced.patches.youtube.navigation.navigationbuttons.fingerprints.Pi
import app.revanced.patches.youtube.navigation.navigationbuttons.fingerprints.PivotBarShortsButtonViewFingerprint import app.revanced.patches.youtube.navigation.navigationbuttons.fingerprints.PivotBarShortsButtonViewFingerprint
import app.revanced.patches.youtube.utils.fingerprints.PivotBarCreateButtonViewFingerprint import app.revanced.patches.youtube.utils.fingerprints.PivotBarCreateButtonViewFingerprint
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ImageOnlyTab
import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch
import app.revanced.util.bytecode.getWideLiteralIndex
import app.revanced.util.integrations.Constants.NAVIGATION import app.revanced.util.integrations.Constants.NAVIGATION
import app.revanced.util.pivotbar.InjectionUtils.REGISTER_TEMPLATE_REPLACEMENT import app.revanced.util.pivotbar.InjectionUtils.REGISTER_TEMPLATE_REPLACEMENT
import app.revanced.util.pivotbar.InjectionUtils.injectHook import app.revanced.util.pivotbar.InjectionUtils.injectHook
@ -42,7 +44,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]
@ -94,12 +98,12 @@ object NavigationButtonsPatch : BytecodePatch(
*/ */
parentResult.mutableMethod.apply { parentResult.mutableMethod.apply {
val insertIndex = implementation!!.instructions.let { val insertIndex = implementation!!.instructions.let {
val scanStart = parentResult.scanResult.patternScanResult!!.endIndex val scanStart = getWideLiteralIndex(ImageOnlyTab)
scanStart + it.subList(scanStart, it.size - 1).indexOfFirst { instruction -> scanStart + it.subList(scanStart, it.size - 1).indexOfFirst { instruction ->
instruction.opcode == Opcode.INVOKE_STATIC instruction.opcode == Opcode.INVOKE_VIRTUAL
}
} }
} + 2
injectHook(CREATE_BUTTON_HOOK, insertIndex) injectHook(CREATE_BUTTON_HOOK, insertIndex)
} }

View File

@ -33,7 +33,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -49,7 +49,9 @@ import org.w3c.dom.Element
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -40,7 +40,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -36,7 +36,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -29,7 +29,9 @@ import app.revanced.util.integrations.Constants.PLAYER
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -30,7 +30,9 @@ import app.revanced.patches.youtube.utils.settings.SettingsPatch
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -37,7 +37,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -50,7 +50,9 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -38,7 +38,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -36,7 +36,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -35,7 +35,9 @@ import app.revanced.util.integrations.Constants.PLAYER
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -33,7 +33,9 @@ import app.revanced.util.integrations.Constants.INTEGRATIONS_PATH
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -3,5 +3,8 @@ package app.revanced.patches.youtube.player.playerbuttonbg.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
object PlayerPatchFingerprint : MethodFingerprint( object PlayerPatchFingerprint : MethodFingerprint(
customFingerprint = { methodDef, _ -> methodDef.definingClass == "Lapp/revanced/integrations/patches/layout/PlayerPatch;" && methodDef.name == "hidePlayerButton" } customFingerprint = { methodDef, _ ->
methodDef.definingClass == "Lapp/revanced/integrations/patches/layout/PlayerPatch;"
&& methodDef.name == "hidePlayerButton"
}
) )

View File

@ -39,7 +39,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -29,7 +29,9 @@ import app.revanced.patches.youtube.utils.settings.SettingsPatch
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -35,7 +35,9 @@ import app.revanced.util.integrations.Constants.PLAYER
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -9,6 +9,7 @@ import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.youtube.player.speedoverlay.fingerprints.SpeedOverlayConfigFingerprint import app.revanced.patches.youtube.player.speedoverlay.fingerprints.SpeedOverlayConfigFingerprint
import app.revanced.patches.youtube.player.speedoverlay.fingerprints.SpeedOverlayHookAlternativeFingerprint
import app.revanced.patches.youtube.player.speedoverlay.fingerprints.SpeedOverlayHookFingerprint import app.revanced.patches.youtube.player.speedoverlay.fingerprints.SpeedOverlayHookFingerprint
import app.revanced.patches.youtube.player.speedoverlay.fingerprints.YouTubeTextViewFingerprint import app.revanced.patches.youtube.player.speedoverlay.fingerprints.YouTubeTextViewFingerprint
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch
@ -42,7 +43,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]
@ -51,6 +54,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
object SpeedOverlayPatch : BytecodePatch( object SpeedOverlayPatch : BytecodePatch(
setOf( setOf(
SpeedOverlayConfigFingerprint, SpeedOverlayConfigFingerprint,
SpeedOverlayHookAlternativeFingerprint,
SpeedOverlayHookFingerprint, SpeedOverlayHookFingerprint,
YouTubeTextViewFingerprint YouTubeTextViewFingerprint
) )
@ -71,7 +75,12 @@ object SpeedOverlayPatch : BytecodePatch(
} }
} ?: throw SpeedOverlayConfigFingerprint.exception } ?: throw SpeedOverlayConfigFingerprint.exception
SpeedOverlayHookFingerprint.result?.let { val speedOverlayHookResult =
SpeedOverlayHookFingerprint.result
?: SpeedOverlayHookAlternativeFingerprint.result
?: throw SpeedOverlayHookFingerprint.exception
speedOverlayHookResult.let {
it.mutableMethod.apply { it.mutableMethod.apply {
val insertIndex = implementation!!.instructions.indexOfFirst { instruction -> val insertIndex = implementation!!.instructions.indexOfFirst { instruction ->
instruction.opcode == Opcode.CMPL_FLOAT instruction.opcode == Opcode.CMPL_FLOAT
@ -85,7 +94,7 @@ object SpeedOverlayPatch : BytecodePatch(
""" """
) )
} }
} ?: throw SpeedOverlayHookFingerprint.exception }
YouTubeTextViewFingerprint.result?.let { YouTubeTextViewFingerprint.result?.let {
it.mutableMethod.apply { it.mutableMethod.apply {

View File

@ -0,0 +1,57 @@
package app.revanced.patches.youtube.player.speedoverlay.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import com.android.tools.smali.dexlib2.Opcode
object SpeedOverlayHookAlternativeFingerprint : MethodFingerprint(
returnType = "V",
opcodes = listOf(
Opcode.IGET_OBJECT,
Opcode.CHECK_CAST,
Opcode.INVOKE_VIRTUAL,
Opcode.IGET_OBJECT,
Opcode.CHECK_CAST,
Opcode.IGET_OBJECT,
Opcode.IGET_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.IGET_OBJECT,
Opcode.CHECK_CAST,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT,
Opcode.IF_EQZ,
Opcode.IGET_OBJECT,
Opcode.CHECK_CAST,
Opcode.IGET_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.IGET_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT,
Opcode.IF_EQZ,
Opcode.GOTO,
Opcode.IGET_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.IGET_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_OBJECT,
Opcode.CHECK_CAST,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT,
Opcode.IGET,
Opcode.CMPL_FLOAT,
Opcode.IF_GEZ,
Opcode.IGET_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.IGET_OBJECT,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.RETURN_VOID
),
customFingerprint = { methodDef, _ -> methodDef.name == "run" }
)

View File

@ -39,7 +39,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -41,7 +41,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -39,7 +39,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -43,7 +43,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -48,7 +48,9 @@ import org.w3c.dom.Element
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -37,7 +37,9 @@ import app.revanced.util.integrations.Constants.SEEKBAR
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -33,7 +33,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -31,7 +31,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -37,7 +37,9 @@ import app.revanced.util.integrations.Constants.SEEKBAR
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -32,7 +32,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -66,7 +66,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -8,15 +8,18 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve
import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.youtube.shorts.shortscomponent.fingerprints.BottomNavigationBarAlternativeFingerprint
import app.revanced.patches.youtube.shorts.shortscomponent.fingerprints.BottomNavigationBarFingerprint import app.revanced.patches.youtube.shorts.shortscomponent.fingerprints.BottomNavigationBarFingerprint
import app.revanced.patches.youtube.shorts.shortscomponent.fingerprints.RenderBottomNavigationBarFingerprint import app.revanced.patches.youtube.shorts.shortscomponent.fingerprints.RenderBottomNavigationBarFingerprint
import app.revanced.patches.youtube.shorts.shortscomponent.fingerprints.SetPivotBarFingerprint import app.revanced.patches.youtube.shorts.shortscomponent.fingerprints.SetPivotBarFingerprint
import app.revanced.patches.youtube.utils.fingerprints.PivotBarCreateButtonViewFingerprint import app.revanced.patches.youtube.utils.fingerprints.PivotBarCreateButtonViewFingerprint
import app.revanced.util.integrations.Constants.SHORTS import app.revanced.util.integrations.Constants.SHORTS
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
object ShortsNavigationBarPatch : BytecodePatch( object ShortsNavigationBarPatch : BytecodePatch(
setOf( setOf(
BottomNavigationBarAlternativeFingerprint,
BottomNavigationBarFingerprint, BottomNavigationBarFingerprint,
PivotBarCreateButtonViewFingerprint, PivotBarCreateButtonViewFingerprint,
RenderBottomNavigationBarFingerprint RenderBottomNavigationBarFingerprint
@ -56,6 +59,23 @@ object ShortsNavigationBarPatch : BytecodePatch(
val insertIndex = it.scanResult.patternScanResult!!.endIndex val insertIndex = it.scanResult.patternScanResult!!.endIndex
val insertRegister = getInstruction<OneRegisterInstruction>(insertIndex).registerA val insertRegister = getInstruction<OneRegisterInstruction>(insertIndex).registerA
addInstructions(
insertIndex, """
invoke-static {v$insertRegister}, $SHORTS->hideShortsPlayerNavigationBar(Landroid/view/View;)Landroid/view/View;
move-result-object v$insertRegister
"""
)
}
} ?: BottomNavigationBarAlternativeFingerprint.result?.let {
it.mutableMethod.apply {
val targetIndex = it.scanResult.patternScanResult!!.endIndex + 3
val insertIndex =
if (getInstruction(targetIndex).opcode == Opcode.IF_EQZ)
targetIndex
else
targetIndex + 1
val insertRegister = getInstruction<OneRegisterInstruction>(insertIndex).registerA
addInstructions( addInstructions(
insertIndex, """ insertIndex, """
invoke-static {v$insertRegister}, $SHORTS->hideShortsPlayerNavigationBar(Landroid/view/View;)Landroid/view/View; invoke-static {v$insertRegister}, $SHORTS->hideShortsPlayerNavigationBar(Landroid/view/View;)Landroid/view/View;

View File

@ -0,0 +1,19 @@
package app.revanced.patches.youtube.shorts.shortscomponent.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
object BottomNavigationBarAlternativeFingerprint : MethodFingerprint(
returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = listOf("Landroid/view/View;", "Landroid/os/Bundle;"),
opcodes = listOf(
Opcode.IGET_OBJECT,
Opcode.IGET_OBJECT,
Opcode.IGET_OBJECT,
Opcode.INVOKE_VIRTUAL
),
strings = listOf("r_pfvc", "ReelWatchPaneFragmentViewModelKey")
)

View File

@ -33,7 +33,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -45,7 +45,9 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
"18.34.38", "18.34.38",
"18.35.36", "18.35.36",
"18.36.39", "18.36.39",
"18.37.36" "18.37.36",
"18.38.44",
"18.39.41"
] ]
) )
] ]

View File

@ -5,44 +5,28 @@ import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode
object NewFlyoutPanelOnClickListenerFingerprint : MethodFingerprint( object NewVideoQualityChangedFingerprint : MethodFingerprint(
returnType = "L", returnType = "L",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = listOf("L"), parameters = listOf("L"),
opcodes = listOf( opcodes = listOf(
Opcode.IGET, // Video resolution (human readable).
Opcode.IGET_OBJECT,
Opcode.IGET_BOOLEAN,
Opcode.IGET_OBJECT,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_DIRECT,
Opcode.IGET_OBJECT,
Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.GOTO,
Opcode.CONST_4,
Opcode.IF_NE,
Opcode.IGET_OBJECT,
Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT,
Opcode.IGET, Opcode.IGET,
Opcode.AND_INT_LIT8,
Opcode.IF_EQZ,
Opcode.IGET_OBJECT,
Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_OBJECT,
Opcode.IF_NEZ,
Opcode.NEW_INSTANCE,
Opcode.INVOKE_DIRECT,
Opcode.IGET_OBJECT,
Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT,
Opcode.NEW_INSTANCE,
Opcode.CONST_16,
Opcode.INVOKE_DIRECT,
Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT,
Opcode.IGET_OBJECT,
Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.NEW_INSTANCE
) )
) )

View File

@ -5,14 +5,9 @@ import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ImageOnlyTab import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ImageOnlyTab
import app.revanced.util.bytecode.isWideLiteralExists import app.revanced.util.bytecode.isWideLiteralExists
import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
object PivotBarCreateButtonViewFingerprint : MethodFingerprint( object PivotBarCreateButtonViewFingerprint : MethodFingerprint(
returnType = "V", returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
opcodes = listOf(
Opcode.MOVE_OBJECT,
Opcode.INVOKE_DIRECT_RANGE, // unique instruction anchor
),
customFingerprint = { methodDef, _ -> methodDef.isWideLiteralExists(ImageOnlyTab) } customFingerprint = { methodDef, _ -> methodDef.isWideLiteralExists(ImageOnlyTab) }
) )

Some files were not shown because too many files have changed in this diff Show More