From 7cff0719ffe550e1e4b1551ff69f680e0550fcec Mon Sep 17 00:00:00 2001 From: victorh028 Date: Sun, 13 Apr 2025 13:47:31 -0400 Subject: [PATCH 01/29] =?UTF-8?q?=F0=9F=91=A3:=20=20Crear=20deb=20para=20d?= =?UTF-8?q?ebian?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/gradle_build.yml | 48 ++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/.github/workflows/gradle_build.yml b/.github/workflows/gradle_build.yml index 1a220dc4..ed36e17c 100644 --- a/.github/workflows/gradle_build.yml +++ b/.github/workflows/gradle_build.yml @@ -1,29 +1,71 @@ -name: Build Jar +name: Build Jar and DEB on: push: branches: [ "master" ] pull_request: branches: [ "master" ] + workflow_dispatch: # ---> Para ejecutar desde la interfaz permissions: contents: read jobs: build: - runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - name: Set up JDK 8 uses: actions/setup-java@v4 with: java-version: '8' distribution: 'temurin' + - uses: gradle/actions/setup-gradle@v4 + - name: Build with Gradle - run: ./gradlew fatJar + run: ./gradlew fatJar --no-daemon # --> Evitar algunos errores CI + + - name: Install dependencies for DEB packaging + run: | + sudo apt-get update + sudo apt-get install -y dh-make debhelper devscripts + + - name: Create DEB package structure + run: | + mkdir -p deb-package/usr/share/apkeditor + mkdir -p deb-package/usr/bin + mkdir -p deb-package/DEBIAN + chmod 755 deb-package + + # Copy the built jar + cp build/libs/*.jar deb-package/usr/share/apkeditor/apkeditor.jar + + # Create launcher script + echo '#!/bin/sh' > deb-package/usr/bin/apkeditor + echo 'java -jar /usr/share/apkeditor/apkeditor.jar "$@"' >> deb-package/usr/bin/apkeditor + chmod +x deb-package/usr/bin/apkeditor + + # Create control file + cat > deb-package/DEBIAN/control < + Description: APK Editor tool + A tool for editing APK files. + EOL + + - name: Build DEB package + run: | + dpkg-deb --build deb-package + mkdir -p artifacts + mv deb-package.deb artifacts/apkeditor_1.0-${{ github.run_number }}_all.deb + - uses: actions/upload-artifact@v4 with: name: APKEditor From a6cbcb7a715707275ada5b8ba95b9ec55c6deace Mon Sep 17 00:00:00 2001 From: victorh028 Date: Sun, 13 Apr 2025 13:57:56 -0400 Subject: [PATCH 02/29] =?UTF-8?q?=F0=9F=91=A3:=20=20Crear=20deb=20para=20d?= =?UTF-8?q?ebian?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/gradle_build.yml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/workflows/gradle_build.yml b/.github/workflows/gradle_build.yml index ed36e17c..8604a833 100644 --- a/.github/workflows/gradle_build.yml +++ b/.github/workflows/gradle_build.yml @@ -64,9 +64,13 @@ jobs: run: | dpkg-deb --build deb-package mkdir -p artifacts - mv deb-package.deb artifacts/apkeditor_1.0-${{ github.run_number }}_all.deb - - - uses: actions/upload-artifact@v4 + mv deb-package.deb artifacts/apkeditor_1.0-${{ github.run_number }}_all.deb + + - name: Upload artifacts + uses: actions/upload-artifact@v4 with: - name: APKEditor - path: build/libs + name: Build-Outputs-${{ github.run_id }} + path: | + build/libs/*.jar + artifacts/*.deb + From d0c9b0460c39e93de78be687d3f326378bc0887f Mon Sep 17 00:00:00 2001 From: victorh028 Date: Sun, 13 Apr 2025 14:09:29 -0400 Subject: [PATCH 03/29] =?UTF-8?q?=F0=9F=91=A3:=20=20Crear=20deb=20para=20d?= =?UTF-8?q?ebian?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/gradle_build.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/gradle_build.yml b/.github/workflows/gradle_build.yml index 8604a833..3901472f 100644 --- a/.github/workflows/gradle_build.yml +++ b/.github/workflows/gradle_build.yml @@ -71,6 +71,11 @@ jobs: with: name: Build-Outputs-${{ github.run_id }} path: | - build/libs/*.jar - artifacts/*.deb - + build/libs + artifacts + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: APKEditor + path: build/libs From 26fd974c979612eb43d30107ebb56508b15e61dd Mon Sep 17 00:00:00 2001 From: victorh028 Date: Sun, 13 Apr 2025 14:18:24 -0400 Subject: [PATCH 04/29] =?UTF-8?q?=F0=9F=91=A31.0:=20=20Crear=20deb=20para?= =?UTF-8?q?=20debian?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/gradle_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gradle_build.yml b/.github/workflows/gradle_build.yml index 3901472f..03c95764 100644 --- a/.github/workflows/gradle_build.yml +++ b/.github/workflows/gradle_build.yml @@ -78,4 +78,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: APKEditor - path: build/libs + path: artifacts From 65820d32a71b0f108de3c8845003bb522016a2b3 Mon Sep 17 00:00:00 2001 From: victorh028 Date: Sun, 13 Apr 2025 14:28:39 -0400 Subject: [PATCH 05/29] =?UTF-8?q?=F0=9F=91=A31.0:=20=20Crear=20deb=20para?= =?UTF-8?q?=20debian?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/gradle_build.yml | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/.github/workflows/gradle_build.yml b/.github/workflows/gradle_build.yml index 03c95764..d33c63a2 100644 --- a/.github/workflows/gradle_build.yml +++ b/.github/workflows/gradle_build.yml @@ -64,18 +64,23 @@ jobs: run: | dpkg-deb --build deb-package mkdir -p artifacts - mv deb-package.deb artifacts/apkeditor_1.0-${{ github.run_number }}_all.deb + mv deb-package.deb artifacts/apkeditor_1.4-${{ github.run_number }}_all.deb - name: Upload artifacts uses: actions/upload-artifact@v4 with: - name: Build-Outputs-${{ github.run_id }} - path: | - build/libs - artifacts + name: DEBIAN-DEB-APKEDITOR + path: artifacts + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: TERMUX-DEB-APKEDITOR - name: Upload artifacts uses: actions/upload-artifact@v4 with: - name: APKEditor - path: artifacts + name: APKEDITOR.jar + path: build/libs + + From 332f5ac88ba114a189915d890df6154cbf4e7d76 Mon Sep 17 00:00:00 2001 From: victorh028 Date: Sun, 13 Apr 2025 15:18:10 -0400 Subject: [PATCH 06/29] =?UTF-8?q?=F0=9F=91=A31.0:=20=20Crear=20deb=20para?= =?UTF-8?q?=20debian?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/gradle_build.yml | 78 +++++++++++++++++++++++------- 1 file changed, 60 insertions(+), 18 deletions(-) diff --git a/.github/workflows/gradle_build.yml b/.github/workflows/gradle_build.yml index d33c63a2..d6222498 100644 --- a/.github/workflows/gradle_build.yml +++ b/.github/workflows/gradle_build.yml @@ -33,51 +33,93 @@ jobs: sudo apt-get update sudo apt-get install -y dh-make debhelper devscripts - - name: Create DEB package structure + - name: Create DEB package structure DEBIAN run: | - mkdir -p deb-package/usr/share/apkeditor - mkdir -p deb-package/usr/bin - mkdir -p deb-package/DEBIAN - chmod 755 deb-package - + ################ DEBIAN ##################### + mkdir -p deb-package-debian/usr/share/apkeditor + mkdir -p deb-package-debian/usr/bin + mkdir -p deb-package-debian/DEBIAN + chmod 755 deb-package-debian + # Copy the built jar - cp build/libs/*.jar deb-package/usr/share/apkeditor/apkeditor.jar + cp build/libs/*.jar deb-package-debian/usr/share/apkeditor/apkeditor.jar # Create launcher script - echo '#!/bin/sh' > deb-package/usr/bin/apkeditor - echo 'java -jar /usr/share/apkeditor/apkeditor.jar "$@"' >> deb-package/usr/bin/apkeditor - chmod +x deb-package/usr/bin/apkeditor + echo '#!/bin/sh' > deb-package-debian/usr/bin/apkeditor + echo 'java -jar /usr/share/apkeditor/apkeditor.jar "$@"' >> deb-package-debian/usr/bin/apkeditor + chmod +x deb-package-debian/usr/bin/apkeditor # Create control file - cat > deb-package/DEBIAN/control < deb-package-debian/DEBIAN/control < + Maintainer: VictorH028 Description: APK Editor tool A tool for editing APK files. EOL + + - name: Create DEB package structure TERMUX + run: | + ############## TERMUX ############### + mkdir -p deb-package-termux/data/data/com.termux/files/usr/share/apkeditor + mkdir -p deb-package-termux/data/data/com.termux/files/usr/bin + mkdir -p deb-package-termux/DEBIAN + chmod 755 deb-package-termux + + # Copy the built jar + cp build/libs/*.jar deb-package-termux/data/com.termux/files/usr/share/apkeditor/apkeditor.jar + + # Create launcher script + # + cat > deb-package-termux/data/data/com.termux/files/usr/bin/apkeditor < deb-package-termux/DEBIAN/control < + Description: APK Editor tool + A tool for editing APK files. + EOL + + - name: Build DEB package run: | - dpkg-deb --build deb-package + #### debian #### + dpkg-deb --build deb-package-debian mkdir -p artifacts - mv deb-package.deb artifacts/apkeditor_1.4-${{ github.run_number }}_all.deb - - - name: Upload artifacts + mv deb-package-debian.deb artifacts/apkeditor_1.4-${{ github.run_number }}_all.deb + #### termux #### + dpkg-deb --build deb-package-termux + mkdir -p artifacts1 + mv deb-package-termux.deb artifacts1/apkeditor_1.4-${{ github.run_number }}_all.deb + + + - name: Upload DEBIAN-DEB-APKEDITOR uses: actions/upload-artifact@v4 with: name: DEBIAN-DEB-APKEDITOR path: artifacts - - name: Upload artifacts + - name: Upload TERMUX-DEB-APKEDITOR uses: actions/upload-artifact@v4 with: name: TERMUX-DEB-APKEDITOR + path: artifacts1 - - name: Upload artifacts + - name: Upload APKEDITOR.jar uses: actions/upload-artifact@v4 with: name: APKEDITOR.jar From e420ee459efc491c9b5f28ee276bb6713ad3bf08 Mon Sep 17 00:00:00 2001 From: victorh028 Date: Sun, 13 Apr 2025 15:24:33 -0400 Subject: [PATCH 07/29] =?UTF-8?q?=F0=9F=91=A31.0:=20=20Crear=20deb=20para?= =?UTF-8?q?=20debian?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/gradle_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gradle_build.yml b/.github/workflows/gradle_build.yml index d6222498..c77ee3d5 100644 --- a/.github/workflows/gradle_build.yml +++ b/.github/workflows/gradle_build.yml @@ -70,7 +70,7 @@ jobs: chmod 755 deb-package-termux # Copy the built jar - cp build/libs/*.jar deb-package-termux/data/com.termux/files/usr/share/apkeditor/apkeditor.jar + cp build/libs/*.jar deb-package-termux/data/data/com.termux/files/usr/share/apkeditor/apkeditor.jar # Create launcher script # From 4cb96e59fde8354da07f6c3a8a8ee37ae4d7f1dd Mon Sep 17 00:00:00 2001 From: victorh028 Date: Sun, 13 Apr 2025 15:49:14 -0400 Subject: [PATCH 08/29] =?UTF-8?q?=F0=9F=91=A31.0:=20=20Crear=20deb=20para?= =?UTF-8?q?=20debian=20y=20termux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/gradle_build.yml | 53 ++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/.github/workflows/gradle_build.yml b/.github/workflows/gradle_build.yml index c77ee3d5..4f58139b 100644 --- a/.github/workflows/gradle_build.yml +++ b/.github/workflows/gradle_build.yml @@ -76,7 +76,56 @@ jobs: # cat > deb-package-termux/data/data/com.termux/files/usr/bin/apkeditor < \(.*\)$") + if expr "x${newProg}" : 'x/' >/dev/null; then + prog="${newProg}" + else + progdir=$(dirname "${prog}") + prog="${progdir}/${newProg}" + fi + done + oldwd=$(pwd) + progdir=$(dirname "${prog}") + cd "${progdir}" + progdir=$(pwd) + prog="${progdir}"/$(basename "${prog}") + cd "${oldwd}" + + jarfile=apkeditor.jar + libdir="$PREFIX/share/apkeditor" + if [ ! -r "$libdir/$jarfile" ]; then + echo $(basename "$prog")": can't find $jarfile" + exit 1 + fi + + javaOpts="-Xmx512M -Dfile.encoding=utf-8" + + while expr "x$1" : 'x-J' >/dev/null; do + opt=$(expr "$1" : '-J\(.*\)') + javaOpts="${javaOpts} -${opt}" + shift + done + + if [ "$OSTYPE" = "cygwin" ]; then + jarpath=$(cygpath -w "$libdir/$jarfile") + else + jarpath="$libdir/$jarfile" + fi + + PATH=$PATH:$(pwd) + export PATH + + if [ -f "$1" ]; then + input_file="$1" + output_file="${input_file%.*}.apk" + exec java $javaOpts -jar "$jarpath" m -i "$input_file" -o "$output_file" + else + exec java $javaOpts -jar "$jarpath" "$@" + fi EOL @@ -122,7 +171,7 @@ jobs: - name: Upload APKEDITOR.jar uses: actions/upload-artifact@v4 with: - name: APKEDITOR.jar + name: APKEDITOR path: build/libs From a65ad122f904bd6850c2ffd062de860e0d873297 Mon Sep 17 00:00:00 2001 From: victorh028 Date: Sun, 13 Apr 2025 16:14:28 -0400 Subject: [PATCH 09/29] =?UTF-8?q?=F0=9F=91=A31.0:=20=20Crear=20deb=20para?= =?UTF-8?q?=20debian=20y=20termux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/gradle_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gradle_build.yml b/.github/workflows/gradle_build.yml index 4f58139b..bea8532f 100644 --- a/.github/workflows/gradle_build.yml +++ b/.github/workflows/gradle_build.yml @@ -79,7 +79,7 @@ jobs: prog="$0" while [ -h "${prog}" ]; do - newProg=$(/data/data/com.termux/files/usr/bin/ls -ld "${prog}" + newProg=$(/data/data/com.termux/files/usr/bin/ls -ld "${prog}") newProg=$(expr "${newProg}" : ".* -> \(.*\)$") if expr "x${newProg}" : 'x/' >/dev/null; then prog="${newProg}" From 8f182131ece3e4df2aeb345bff52d80ab88d44fb Mon Sep 17 00:00:00 2001 From: victorh028 Date: Sun, 13 Apr 2025 22:25:47 -0400 Subject: [PATCH 10/29] =?UTF-8?q?=F0=9F=91=A3:=20A=C3=B1adi=20plugin=20y?= =?UTF-8?q?=20actualize=20algunas=20tareas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index 9ab1b6e6..113262a2 100755 --- a/build.gradle +++ b/build.gradle @@ -1,9 +1,11 @@ - +apply plugin: 'application' apply plugin: 'java' group 'com.reandroid.apkeditor' version '1.4.2' +mainClassName = 'com.reandroid.apkeditor.Main' + java { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 @@ -16,19 +18,20 @@ if (JavaVersion.current().isJava8Compatible()) { } } } + repositories { mavenCentral() } dependencies { //implementation("io.github.reandroid:ARSCLib:+") - compile(files("$rootProject.projectDir/libs/ARSCLib.jar")) + implementation(files("$rootProject.projectDir/libs/ARSCLib.jar")) // built from: https://github.com/REAndroid/smali-lib - compile(files("$rootProject.projectDir/libs/smali.jar")) + implementation(files("$rootProject.projectDir/libs/smali.jar")) // built from: https://github.com/REAndroid/JCommand - compile(files("$rootProject.projectDir/libs/JCommand.jar")) + implementation(files("$rootProject.projectDir/libs/JCommand.jar")) } processResources { @@ -40,19 +43,23 @@ processResources { javadoc { exclude('com/reandroid/test/**') } + jar { exclude('com/reandroid/test/**') duplicatesStrategy = DuplicatesStrategy.FAIL + manifest { + attributes 'Main-Class': mainClassName + } } task fatJar(type: Jar) { duplicatesStrategy = DuplicatesStrategy.EXCLUDE manifest { attributes( - 'Main-Class': 'com.reandroid.apkeditor.Main' + 'Main-Class': mainClassName ) } - from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } + from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } with jar } From 202d716bc20383b5172b2f427d63df536088dc84 Mon Sep 17 00:00:00 2001 From: victorh028 Date: Tue, 15 Apr 2025 01:39:48 -0400 Subject: [PATCH 11/29] =?UTF-8?q?=F0=9F=91=A3:=20Comparaciones=20inecesari?= =?UTF-8?q?as=20con=20`logger`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apkeditor/common/AndroidManifestHelper.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/reandroid/apkeditor/common/AndroidManifestHelper.java b/src/main/java/com/reandroid/apkeditor/common/AndroidManifestHelper.java index d8124fea..6e528b2c 100644 --- a/src/main/java/com/reandroid/apkeditor/common/AndroidManifestHelper.java +++ b/src/main/java/com/reandroid/apkeditor/common/AndroidManifestHelper.java @@ -71,8 +71,9 @@ public static void removeAttributeFromManifestByName(AndroidManifestBlock androi } return; } + // Antes hera un valor entero boolean removed = manifestElement.removeAttributesWithName(resourceName); - if (removed && logger != null) { + if (removed ) { logger.logMessage("Removed-attribute : " + resourceName); } } @@ -86,7 +87,7 @@ public static void removeAttributeFromManifestById(AndroidManifestBlock androidM return; } boolean removed = manifestElement.removeAttributesWithId(resourceId); - if (removed && logger != null) { + if (removed ) { logger.logMessage("Removed-attribute : " + HexUtil.toHex8("@0x", resourceId)); } } @@ -108,7 +109,7 @@ public static void removeAttributeFromManifestAndApplication(AndroidManifestBloc ResXmlElement applicationElement = manifestElement.getElement( AndroidManifest.TAG_application); - if(removed && logger != null) { + if(removed ) { logger.logMessage("Attributes on removed: " + HexUtil.toHex8("0x", resourceId) + " (" + nameForLogging + ")"); } @@ -116,7 +117,7 @@ public static void removeAttributeFromManifestAndApplication(AndroidManifestBloc return; } removed = applicationElement.removeAttributesWithId(resourceId); - if(removed && logger != null) { + if(removed ) { logger.logMessage("Attributes on removed: " + HexUtil.toHex8("0x", resourceId) + " (" + nameForLogging + ")"); } From 535bf90f2bf670ccaed7043fb57a5bff21ae4e3e Mon Sep 17 00:00:00 2001 From: victorh028 Date: Tue, 22 Apr 2025 17:09:08 -0400 Subject: [PATCH 12/29] =?UTF-8?q?=F0=9F=91=A3:=20Better=20logic=20for=20th?= =?UTF-8?q?e=20deb?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/gradle_build.yml | 60 +++++++----------------------- 1 file changed, 13 insertions(+), 47 deletions(-) diff --git a/.github/workflows/gradle_build.yml b/.github/workflows/gradle_build.yml index bea8532f..3f2df859 100644 --- a/.github/workflows/gradle_build.yml +++ b/.github/workflows/gradle_build.yml @@ -50,7 +50,7 @@ jobs: chmod +x deb-package-debian/usr/bin/apkeditor # Create control file - cat > deb-package-debian/DEBIAN/control < deb-package-debian/DEBIAN/control <<`EOL` Package: apkeditor Version: 1.4-${{ github.run_number }} Section: utils @@ -74,58 +74,24 @@ jobs: # Create launcher script # - cat > deb-package-termux/data/data/com.termux/files/usr/bin/apkeditor < deb-package-termux/data/data/com.termux/files/usr/bin/apkeditor <<`EOL` #!/data/data/com.termux/files/usr/bin/bash - prog="$0" - while [ -h "${prog}" ]; do - newProg=$(/data/data/com.termux/files/usr/bin/ls -ld "${prog}") - newProg=$(expr "${newProg}" : ".* -> \(.*\)$") - if expr "x${newProg}" : 'x/' >/dev/null; then - prog="${newProg}" - else - progdir=$(dirname "${prog}") - prog="${progdir}/${newProg}" - fi - done - oldwd=$(pwd) - progdir=$(dirname "${prog}") - cd "${progdir}" - progdir=$(pwd) - prog="${progdir}"/$(basename "${prog}") - cd "${oldwd}" - - jarfile=apkeditor.jar - libdir="$PREFIX/share/apkeditor" - if [ ! -r "$libdir/$jarfile" ]; then - echo $(basename "$prog")": can't find $jarfile" - exit 1 + JAR_PATH="/data/data/com.termux/files/usr/share/apkeditor/apkeditor.jar + if [ ! -f "$JAR_PATH" ]; then + echo "Error: I can't find apkeditor.jar en $JAR_PATH" >&2 + exit 1 fi - javaOpts="-Xmx512M -Dfile.encoding=utf-8" + JAVA_OPTS="-Xmx512M -Dfile.encoding=utf-8" - while expr "x$1" : 'x-J' >/dev/null; do - opt=$(expr "$1" : '-J\(.*\)') - javaOpts="${javaOpts} -${opt}" - shift - done + # Procesar argumentos -J (si los hay) + while [[ "$1" == -J* ]]; do + JAVA_OPTS="$JAVA_OPTS -${1#-J}" + shift + don - if [ "$OSTYPE" = "cygwin" ]; then - jarpath=$(cygpath -w "$libdir/$jarfile") - else - jarpath="$libdir/$jarfile" - fi - - PATH=$PATH:$(pwd) - export PATH - - if [ -f "$1" ]; then - input_file="$1" - output_file="${input_file%.*}.apk" - exec java $javaOpts -jar "$jarpath" m -i "$input_file" -o "$output_file" - else - exec java $javaOpts -jar "$jarpath" "$@" - fi + exec java $JAVA_OPTS -jar "$JAR_PATH" "$@" EOL From 594f861fdefb5684f26688a8d41f7c4639fede86 Mon Sep 17 00:00:00 2001 From: victorh028 Date: Tue, 22 Apr 2025 17:21:10 -0400 Subject: [PATCH 13/29] =?UTF-8?q?=F0=9F=91=A3:=20Better=20logic=20for=20th?= =?UTF-8?q?e=20deb?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/gradle_build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/gradle_build.yml b/.github/workflows/gradle_build.yml index 3f2df859..59c4b1d6 100644 --- a/.github/workflows/gradle_build.yml +++ b/.github/workflows/gradle_build.yml @@ -50,7 +50,7 @@ jobs: chmod +x deb-package-debian/usr/bin/apkeditor # Create control file - cat > deb-package-debian/DEBIAN/control <<`EOL` + cat > deb-package-debian/DEBIAN/control < deb-package-termux/data/data/com.termux/files/usr/bin/apkeditor <<`EOL` + cat > deb-package-termux/data/data/com.termux/files/usr/bin/apkeditor < Date: Tue, 22 Apr 2025 18:00:41 -0400 Subject: [PATCH 15/29] =?UTF-8?q?=F0=9F=91=A3:=20Better=20logic=20for=20th?= =?UTF-8?q?e=20deb?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/gradle_build.yml | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/.github/workflows/gradle_build.yml b/.github/workflows/gradle_build.yml index 08495aac..1655bf0e 100644 --- a/.github/workflows/gradle_build.yml +++ b/.github/workflows/gradle_build.yml @@ -77,21 +77,15 @@ jobs: cat > deb-package-termux/data/data/com.termux/files/usr/bin/apkeditor << 'EOF' #!/data/data/com.termux/files/usr/bin/bash - JAR_PATH="/data/data/com.termux/files/usr/share/apkeditor/apkeditor.jar + JAR_PATH="/data/data/com.termux/files/usr/share/apkeditor/apkeditor.jar" if [ ! -f "$JAR_PATH" ]; then echo "Error: I can't find apkeditor.jar en $JAR_PATH" >&2 exit 1 fi - JAVA_OPTS="-Xmx512M -Dfile.encoding=utf-8" + JAVA_OPTS="-Xmx512M " - # Procesar argumentos -J (si los hay) - while [[ "$1" == -J* ]]; do - JAVA_OPTS="$JAVA_OPTS -${1#-J}" - shift - don - - exec java $JAVA_OPTS -jar "$JAR_PATH" "$@" + exec java -jar $JAVA_OPTS "$JAR_PATH" "$@" EOF From 915c4b75430ff1621d8c6a57b41e91f9b8137187 Mon Sep 17 00:00:00 2001 From: victorh028 Date: Thu, 24 Sep 2026 10:29:00 +0500 Subject: [PATCH 16/29] build: actualizar Gradle a sintaxis moderna y Java 21 --- build.gradle | 48 ++++++++++++++++++++++-------------------------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/build.gradle b/build.gradle index 38f88973..f8869156 100755 --- a/build.gradle +++ b/build.gradle @@ -1,22 +1,19 @@ -apply plugin: 'application' -apply plugin: 'java' - -group 'com.reandroid.apkeditor' -version '1.4.9' +plugins { + id 'application' + id 'java' +} -mainClassName = 'com.reandroid.apkeditor.Main' +group = 'com.reandroid.apkeditor' +version = '1.4.9' -java { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 +application { + mainClass = 'com.reandroid.apkeditor.Main' } -if (JavaVersion.current().isJava8Compatible()) { - allprojects { - tasks.compileJava { - //options.addStringOption('-Xlint:unchecked', '-quiet') - } - } +java { + // Definir la compatibilidad con Java 21 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } repositories { @@ -24,19 +21,14 @@ repositories { } dependencies { - //implementation("io.github.reandroid:ARSCLib:+") implementation(files("$rootProject.projectDir/libs/ARSCLib.jar")) - - // built from: https://github.com/REAndroid/smali-lib implementation(files("$rootProject.projectDir/libs/smali.jar")) - - // built from: https://github.com/REAndroid/JCommand implementation(files("$rootProject.projectDir/libs/JCommand.jar")) } processResources { filesMatching('apkeditor.properties') { - expand('version': version) + expand('version': project.version) } } @@ -48,18 +40,22 @@ jar { exclude('com/reandroid/test/**') duplicatesStrategy = DuplicatesStrategy.FAIL manifest { - attributes 'Main-Class': mainClassName + attributes 'Main-Class': application.mainClass.get() } } +// Configuración de FatJar compatible con Gradle 8.x task fatJar(type: Jar) { duplicatesStrategy = DuplicatesStrategy.EXCLUDE + archiveClassifier = 'all' + manifest { - attributes( - 'Main-Class': mainClassName - ) + attributes 'Main-Class': application.mainClass.get() + } + + from { + configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } - from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } with jar } From 86e96876fd0b06d1cec2c4967fc6f66eb3659ddd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9D=95=AF=F0=9D=96=8A=F0=9D=96=92=F0=9D=96=94?= =?UTF-8?q?=F0=9D=96=93=20=F0=9D=95=B3=F0=9D=96=9A=F0=9D=96=93=F0=9D=96=99?= =?UTF-8?q?=F0=9D=96=8A=F0=9D=96=97?= <117833298+VictorH028@users.noreply.github.com> Date: Thu, 24 Sep 2026 10:37:35 +0500 Subject: [PATCH 17/29] Update JDK version from 8 to 21 in workflow --- .github/workflows/gradle_build_beta.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/gradle_build_beta.yml b/.github/workflows/gradle_build_beta.yml index d8fecad6..89aa0a43 100644 --- a/.github/workflows/gradle_build_beta.yml +++ b/.github/workflows/gradle_build_beta.yml @@ -16,10 +16,10 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set up JDK 8 + - name: Set up JDK 21 uses: actions/setup-java@v4 with: - java-version: '8' + java-version: '21' distribution: 'temurin' - uses: gradle/actions/setup-gradle@v4 - name: Build with Gradle From 80908debff11bdb028bc0215a9902cbf8646bd2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9D=95=AF=F0=9D=96=8A=F0=9D=96=92=F0=9D=96=94?= =?UTF-8?q?=F0=9D=96=93=20=F0=9D=95=B3=F0=9D=96=9A=F0=9D=96=93=F0=9D=96=99?= =?UTF-8?q?=F0=9D=96=8A=F0=9D=96=97?= <117833298+VictorH028@users.noreply.github.com> Date: Thu, 24 Sep 2026 10:38:32 +0500 Subject: [PATCH 18/29] Update JDK version from 8 to 21 in workflow --- .github/workflows/gradle_build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/gradle_build.yml b/.github/workflows/gradle_build.yml index 1655bf0e..8067a157 100644 --- a/.github/workflows/gradle_build.yml +++ b/.github/workflows/gradle_build.yml @@ -17,10 +17,10 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set up JDK 8 + - name: Set up JDK 21 uses: actions/setup-java@v4 with: - java-version: '8' + java-version: '21' distribution: 'temurin' - uses: gradle/actions/setup-gradle@v4 From 65ec8389e1d1c361919b416b07053557eef01e37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9D=95=AF=F0=9D=96=8A=F0=9D=96=92=F0=9D=96=94?= =?UTF-8?q?=F0=9D=96=93=20=F0=9D=95=B3=F0=9D=96=9A=F0=9D=96=93=F0=9D=96=99?= =?UTF-8?q?=F0=9D=96=8A=F0=9D=96=97?= <117833298+VictorH028@users.noreply.github.com> Date: Thu, 24 Sep 2026 10:41:20 +0500 Subject: [PATCH 19/29] Update Gradle wrapper to version 8.5 --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8a91a6b6..f5da588c 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https://services.gradle.org/distributions/gradle-6.5.1-all.zip +distributionUrl=https://services.gradle.org/distributions/gradle-8.5-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 0364b081fa9a598bb1899822eaa4d87740d2f07d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9D=95=AF=F0=9D=96=8A=F0=9D=96=92=F0=9D=96=94?= =?UTF-8?q?=F0=9D=96=93=20=F0=9D=95=B3=F0=9D=96=9A=F0=9D=96=93=F0=9D=96=99?= =?UTF-8?q?=F0=9D=96=8A=F0=9D=96=97?= <117833298+VictorH028@users.noreply.github.com> Date: Thu, 24 Sep 2026 10:47:10 +0500 Subject: [PATCH 20/29] Change Gradle build command from betaJar to fatJar --- .github/workflows/gradle_build_beta.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gradle_build_beta.yml b/.github/workflows/gradle_build_beta.yml index 89aa0a43..6b21e9fb 100644 --- a/.github/workflows/gradle_build_beta.yml +++ b/.github/workflows/gradle_build_beta.yml @@ -23,7 +23,7 @@ jobs: distribution: 'temurin' - uses: gradle/actions/setup-gradle@v4 - name: Build with Gradle - run: ./gradlew betaJar + run: ./gradlew fatJar - uses: actions/upload-artifact@v4 with: name: APKEditor From cbe55b99c3b3e6c37cf462ccac592b4442c45856 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9D=95=AF=F0=9D=96=8A=F0=9D=96=92=F0=9D=96=94?= =?UTF-8?q?=F0=9D=96=93=20=F0=9D=95=B3=F0=9D=96=9A=F0=9D=96=93=F0=9D=96=99?= =?UTF-8?q?=F0=9D=96=8A=F0=9D=96=97?= <117833298+VictorH028@users.noreply.github.com> Date: Thu, 24 Sep 2026 10:41:20 +0500 Subject: [PATCH 21/29] Update Gradle wrapper to version 8.5 From 1b7aee39259d5db9eb37dae1ab7b0d86d183fd6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9D=95=AF=F0=9D=96=8A=F0=9D=96=92=F0=9D=96=94?= =?UTF-8?q?=F0=9D=96=93=20=F0=9D=95=B3=F0=9D=96=9A=F0=9D=96=93=F0=9D=96=99?= =?UTF-8?q?=F0=9D=96=8A=F0=9D=96=97?= <117833298+VictorH028@users.noreply.github.com> Date: Thu, 24 Sep 2026 10:41:20 +0500 Subject: [PATCH 22/29] next: commit --- .github/workflows/gradle_build.yml | 4 +- .github/workflows/gradle_build_beta.yml | 4 +- build.gradle | 61 ------------------------ gradle/wrapper/gradle-wrapper.properties | 2 +- 4 files changed, 5 insertions(+), 66 deletions(-) delete mode 100755 build.gradle diff --git a/.github/workflows/gradle_build.yml b/.github/workflows/gradle_build.yml index 8067a157..1655bf0e 100644 --- a/.github/workflows/gradle_build.yml +++ b/.github/workflows/gradle_build.yml @@ -17,10 +17,10 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set up JDK 21 + - name: Set up JDK 8 uses: actions/setup-java@v4 with: - java-version: '21' + java-version: '8' distribution: 'temurin' - uses: gradle/actions/setup-gradle@v4 diff --git a/.github/workflows/gradle_build_beta.yml b/.github/workflows/gradle_build_beta.yml index 6b21e9fb..ad509639 100644 --- a/.github/workflows/gradle_build_beta.yml +++ b/.github/workflows/gradle_build_beta.yml @@ -16,10 +16,10 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set up JDK 21 + - name: Set up JDK 8 uses: actions/setup-java@v4 with: - java-version: '21' + java-version: '8' distribution: 'temurin' - uses: gradle/actions/setup-gradle@v4 - name: Build with Gradle diff --git a/build.gradle b/build.gradle deleted file mode 100755 index f8869156..00000000 --- a/build.gradle +++ /dev/null @@ -1,61 +0,0 @@ -plugins { - id 'application' - id 'java' -} - -group = 'com.reandroid.apkeditor' -version = '1.4.9' - -application { - mainClass = 'com.reandroid.apkeditor.Main' -} - -java { - // Definir la compatibilidad con Java 21 - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 -} - -repositories { - mavenCentral() -} - -dependencies { - implementation(files("$rootProject.projectDir/libs/ARSCLib.jar")) - implementation(files("$rootProject.projectDir/libs/smali.jar")) - implementation(files("$rootProject.projectDir/libs/JCommand.jar")) -} - -processResources { - filesMatching('apkeditor.properties') { - expand('version': project.version) - } -} - -javadoc { - exclude('com/reandroid/test/**') -} - -jar { - exclude('com/reandroid/test/**') - duplicatesStrategy = DuplicatesStrategy.FAIL - manifest { - attributes 'Main-Class': application.mainClass.get() - } -} - -// Configuración de FatJar compatible con Gradle 8.x -task fatJar(type: Jar) { - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - archiveClassifier = 'all' - - manifest { - attributes 'Main-Class': application.mainClass.get() - } - - from { - configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } - } - with jar -} - diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f5da588c..8a91a6b6 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https://services.gradle.org/distributions/gradle-8.5-all.zip +distributionUrl=https://services.gradle.org/distributions/gradle-6.5.1-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 37993b00795e138e7a1586cdf7d427863ee9f0fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9D=95=AF=F0=9D=96=8A=F0=9D=96=92=F0=9D=96=94?= =?UTF-8?q?=F0=9D=96=93=20=F0=9D=95=B3=F0=9D=96=9A=F0=9D=96=93=F0=9D=96=99?= =?UTF-8?q?=F0=9D=96=8A=F0=9D=96=97?= <117833298+VictorH028@users.noreply.github.com> Date: Thu, 24 Sep 2026 10:38:32 +0500 Subject: [PATCH 23/29] Update JDK version from 8 to 21 in workflow --- .github/workflows/gradle_build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/gradle_build.yml b/.github/workflows/gradle_build.yml index 1655bf0e..8067a157 100644 --- a/.github/workflows/gradle_build.yml +++ b/.github/workflows/gradle_build.yml @@ -17,10 +17,10 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set up JDK 8 + - name: Set up JDK 21 uses: actions/setup-java@v4 with: - java-version: '8' + java-version: '21' distribution: 'temurin' - uses: gradle/actions/setup-gradle@v4 From 60edace7d747aacbbee982aba14e726712177c66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9D=95=AF=F0=9D=96=8A=F0=9D=96=92=F0=9D=96=94?= =?UTF-8?q?=F0=9D=96=93=20=F0=9D=95=B3=F0=9D=96=9A=F0=9D=96=93=F0=9D=96=99?= =?UTF-8?q?=F0=9D=96=8A=F0=9D=96=97?= <117833298+VictorH028@users.noreply.github.com> Date: Thu, 24 Sep 2026 10:37:35 +0500 Subject: [PATCH 24/29] Update JDK version from 8 to 21 in workflow --- .github/workflows/gradle_build_beta.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/gradle_build_beta.yml b/.github/workflows/gradle_build_beta.yml index ad509639..6b21e9fb 100644 --- a/.github/workflows/gradle_build_beta.yml +++ b/.github/workflows/gradle_build_beta.yml @@ -16,10 +16,10 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set up JDK 8 + - name: Set up JDK 21 uses: actions/setup-java@v4 with: - java-version: '8' + java-version: '21' distribution: 'temurin' - uses: gradle/actions/setup-gradle@v4 - name: Build with Gradle From 39420b27e2762c8791c5d505280768e17aa2c0a0 Mon Sep 17 00:00:00 2001 From: victorh028 Date: Thu, 24 Sep 2026 10:29:00 +0500 Subject: [PATCH 25/29] build: update Gradle to modern syntax and Java 21 --- build.gradle | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100755 build.gradle diff --git a/build.gradle b/build.gradle new file mode 100755 index 00000000..f8869156 --- /dev/null +++ b/build.gradle @@ -0,0 +1,61 @@ +plugins { + id 'application' + id 'java' +} + +group = 'com.reandroid.apkeditor' +version = '1.4.9' + +application { + mainClass = 'com.reandroid.apkeditor.Main' +} + +java { + // Definir la compatibilidad con Java 21 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 +} + +repositories { + mavenCentral() +} + +dependencies { + implementation(files("$rootProject.projectDir/libs/ARSCLib.jar")) + implementation(files("$rootProject.projectDir/libs/smali.jar")) + implementation(files("$rootProject.projectDir/libs/JCommand.jar")) +} + +processResources { + filesMatching('apkeditor.properties') { + expand('version': project.version) + } +} + +javadoc { + exclude('com/reandroid/test/**') +} + +jar { + exclude('com/reandroid/test/**') + duplicatesStrategy = DuplicatesStrategy.FAIL + manifest { + attributes 'Main-Class': application.mainClass.get() + } +} + +// Configuración de FatJar compatible con Gradle 8.x +task fatJar(type: Jar) { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + archiveClassifier = 'all' + + manifest { + attributes 'Main-Class': application.mainClass.get() + } + + from { + configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } + } + with jar +} + From 5ada7bd3588735de19916e68f03b823790e3eacc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9D=95=AF=F0=9D=96=8A=F0=9D=96=92=F0=9D=96=94?= =?UTF-8?q?=F0=9D=96=93=20=F0=9D=95=B3=F0=9D=96=9A=F0=9D=96=93=F0=9D=96=99?= =?UTF-8?q?=F0=9D=96=8A=F0=9D=96=97?= <117833298+VictorH028@users.noreply.github.com> Date: Thu, 24 Sep 2026 10:41:20 +0500 Subject: [PATCH 26/29] Update Gradle wrapper to version 8.5 --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8a91a6b6..f5da588c 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https://services.gradle.org/distributions/gradle-6.5.1-all.zip +distributionUrl=https://services.gradle.org/distributions/gradle-8.5-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From d1e2f80317a4f9c5f4ebe2a6258e97305f3b607b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9D=95=AF=F0=9D=96=8A=F0=9D=96=92=F0=9D=96=94?= =?UTF-8?q?=F0=9D=96=93=20=F0=9D=95=B3=F0=9D=96=9A=F0=9D=96=93=F0=9D=96=99?= =?UTF-8?q?=F0=9D=96=8A=F0=9D=96=97?= <117833298+VictorH028@users.noreply.github.com> Date: Thu, 24 Sep 2026 10:37:35 +0500 Subject: [PATCH 27/29] Add.. --- LICENSE | 0 README.md | 0 build.gradle | 0 gradle/wrapper/gradle-wrapper.jar | Bin gradle/wrapper/gradle-wrapper.properties | 0 gradlew | 0 gradlew.bat | 0 settings.gradle | 0 src/main/resources/apkeditor.properties | 0 src/main/resources/strings/strings-ar.properties | 0 src/main/resources/strings/strings-fr.properties | 0 11 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 LICENSE mode change 100755 => 100644 README.md mode change 100755 => 100644 build.gradle mode change 100755 => 100644 gradle/wrapper/gradle-wrapper.jar mode change 100755 => 100644 gradle/wrapper/gradle-wrapper.properties mode change 100755 => 100644 gradlew mode change 100755 => 100644 gradlew.bat mode change 100755 => 100644 settings.gradle mode change 100755 => 100644 src/main/resources/apkeditor.properties mode change 100755 => 100644 src/main/resources/strings/strings-ar.properties mode change 100755 => 100644 src/main/resources/strings/strings-fr.properties diff --git a/LICENSE b/LICENSE old mode 100755 new mode 100644 diff --git a/README.md b/README.md old mode 100755 new mode 100644 diff --git a/build.gradle b/build.gradle old mode 100755 new mode 100644 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar old mode 100755 new mode 100644 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties old mode 100755 new mode 100644 diff --git a/gradlew b/gradlew old mode 100755 new mode 100644 diff --git a/gradlew.bat b/gradlew.bat old mode 100755 new mode 100644 diff --git a/settings.gradle b/settings.gradle old mode 100755 new mode 100644 diff --git a/src/main/resources/apkeditor.properties b/src/main/resources/apkeditor.properties old mode 100755 new mode 100644 diff --git a/src/main/resources/strings/strings-ar.properties b/src/main/resources/strings/strings-ar.properties old mode 100755 new mode 100644 diff --git a/src/main/resources/strings/strings-fr.properties b/src/main/resources/strings/strings-fr.properties old mode 100755 new mode 100644 From a654c95f2b681538205f59241458edc6ec42abe8 Mon Sep 17 00:00:00 2001 From: victorh028 Date: Sun, 4 Oct 2026 14:57:29 +0500 Subject: [PATCH 28/29] UI --- APKEditor-futuristic-base.zip | Bin 0 -> 135691 bytes apkeditor-futuristic-base/ARCHITECTURE.md | 41 +++++ .../PROJECT_INVENTORY.json | 6 + .../README_GUI_ARCHITECTURE.md | 102 +++++++++++++ .../reandroid/apkeditor/CommandExecutor.java | 6 +- .../apkeditor/core/ExecutionContext.java | 42 +++++ .../core/LegacyOptionsOperation.java | 50 ++++++ .../reandroid/apkeditor/core/Operation.java | 11 ++ .../apkeditor/core/OperationListener.java | 10 ++ .../apkeditor/core/OperationRegistry.java | 21 +++ .../apkeditor/core/OperationResult.java | 29 ++++ .../apkeditor/gui/GUIApplication.java | 14 ++ .../reandroid/apkeditor/gui/MainWindow.java | 144 ++++++++++++++++++ .../gui/components/FileSelector.java | 54 +++++++ .../apkeditor/gui/components/LogConsole.java | 37 +++++ .../apkeditor/gui/components/NeonButton.java | 25 +++ .../gui/components/ProgressPanel.java | 32 ++++ .../apkeditor/gui/model/AppState.java | 22 +++ .../apkeditor/gui/navigation/Navigator.java | 18 +++ .../apkeditor/gui/navigation/Route.java | 13 ++ .../reandroid/apkeditor/gui/theme/Colors.java | 21 +++ .../reandroid/apkeditor/gui/theme/Fonts.java | 13 ++ .../reandroid/apkeditor/gui/theme/Theme.java | 43 ++++++ .../apkeditor/gui/view/DashboardView.java | 60 ++++++++ .../apkeditor/gui/view/LogsView.java | 30 ++++ .../apkeditor/gui/view/OperationView.java | 123 +++++++++++++++ .../operations/OperationCatalog.java | 28 ++++ .../reandroid/commons/utils/ElapsedTime.java | 2 +- src/main/resources/apkeditor.properties | 4 - src/main/resources/color_names.txt | 2 +- src/main/resources/protect_dic_dir_name.txt | 2 +- src/main/resources/protect_dic_file_name.txt | 2 +- .../resources/strings/strings-ar.properties | 125 --------------- .../resources/strings/strings-fr.properties | 137 ----------------- src/main/resources/strings/strings.properties | 141 ----------------- 35 files changed, 998 insertions(+), 412 deletions(-) create mode 100644 APKEditor-futuristic-base.zip create mode 100644 apkeditor-futuristic-base/ARCHITECTURE.md create mode 100644 apkeditor-futuristic-base/PROJECT_INVENTORY.json create mode 100644 apkeditor-futuristic-base/README_GUI_ARCHITECTURE.md create mode 100644 src/main/java/com/reandroid/apkeditor/core/ExecutionContext.java create mode 100644 src/main/java/com/reandroid/apkeditor/core/LegacyOptionsOperation.java create mode 100644 src/main/java/com/reandroid/apkeditor/core/Operation.java create mode 100644 src/main/java/com/reandroid/apkeditor/core/OperationListener.java create mode 100644 src/main/java/com/reandroid/apkeditor/core/OperationRegistry.java create mode 100644 src/main/java/com/reandroid/apkeditor/core/OperationResult.java create mode 100644 src/main/java/com/reandroid/apkeditor/gui/GUIApplication.java create mode 100644 src/main/java/com/reandroid/apkeditor/gui/MainWindow.java create mode 100644 src/main/java/com/reandroid/apkeditor/gui/components/FileSelector.java create mode 100644 src/main/java/com/reandroid/apkeditor/gui/components/LogConsole.java create mode 100644 src/main/java/com/reandroid/apkeditor/gui/components/NeonButton.java create mode 100644 src/main/java/com/reandroid/apkeditor/gui/components/ProgressPanel.java create mode 100644 src/main/java/com/reandroid/apkeditor/gui/model/AppState.java create mode 100644 src/main/java/com/reandroid/apkeditor/gui/navigation/Navigator.java create mode 100644 src/main/java/com/reandroid/apkeditor/gui/navigation/Route.java create mode 100644 src/main/java/com/reandroid/apkeditor/gui/theme/Colors.java create mode 100644 src/main/java/com/reandroid/apkeditor/gui/theme/Fonts.java create mode 100644 src/main/java/com/reandroid/apkeditor/gui/theme/Theme.java create mode 100644 src/main/java/com/reandroid/apkeditor/gui/view/DashboardView.java create mode 100644 src/main/java/com/reandroid/apkeditor/gui/view/LogsView.java create mode 100644 src/main/java/com/reandroid/apkeditor/gui/view/OperationView.java create mode 100644 src/main/java/com/reandroid/apkeditor/operations/OperationCatalog.java delete mode 100644 src/main/resources/apkeditor.properties delete mode 100644 src/main/resources/strings/strings-ar.properties delete mode 100644 src/main/resources/strings/strings-fr.properties delete mode 100644 src/main/resources/strings/strings.properties diff --git a/APKEditor-futuristic-base.zip b/APKEditor-futuristic-base.zip new file mode 100644 index 0000000000000000000000000000000000000000..46b4a5a77cb054bb20f4d21fec313a10ed09f23b GIT binary patch literal 135691 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

%tyMw zpoL+%A*YXCcU`zAcz3L}#;lsa4;QR128_iHi}u}Hf7!9gmyCGDjaWiKN79yl_H=${ z>^J2XB-uzJ(~B!*7=0Yprcre)EjG5v2Sr6@n*oU`GZd89YY&ADTwv?TZD z-^NMa@rSTLnQY=ds9ZM$-9na+3J%gDuAE0D7>sNqz~!3%Jd&k@su#%LC#s8=6}?ig z6Zm*D`tNot8v}7`jq=G5RY%-@GHE~A6h^D)cME>8r2du1u4LJdm@+h>Ml1ahC!$_V zw4lc9lsrN` z1zsXp8pnV$s)i3a65JU%CDzP(p-FQ$;mU%oAMpIC`rRUz!VFvEAUSyIq$NW}_Ru}c zmNt>?EE%oxt5kUKXfg2lrP@x$uMh^^jxwbVDOgf^SkV#QAU4fPPm})_lBMhxs~mXi zxnlLDpE|F3mFkMoRt!L;&>muf2jwO=h@;ieVIO6)TM1n0nmwd1p7dBYEI^_Ppn8W; zU`^X#(6!+enl7l29|b25dx-;J_q@+zLO4q2?DykzNmWjA2Xf@Tnw$L}ti4l|Xzh|L zTCP>LZQHhO+qP}nwr#JnZDW;fYn}SLPoL3y-}|^<=G%PxMr340X2fi$p0M#dBS&6N z?yTo$vQJw8JPU>BE1$t}z3m-NoELQfGU?OFmm@z$FVfL~9OK<0jrizw+rMxAc%--w zOhNzvG!Oy+DEtRDe{4(~%}nTI{`vlQAZCxI%|Bw7+u1po=40Ml6zvY{OAh zX~Shg_Msp~&l@5`{0((vF>>ezvCK zyz~|AV`C4mUWfz&yE0GUbTDyT3h~K13DV|@nLUb8nR8ElIT(n)rf}I9XC9Y0( z*yAYqk>{+P`X^kj923nAt@-z_qoHrMB|TA3SOTYH#TtQrXrrKUcZkrQ-;?VoM`9|2 zC>3k<#Jcn(kR87A$w2U`cUrC=@JnO&p`@Tfsd%@4+7yu4JeaZ)J4C>0qphwJ4Ig7uA z?98V`w(L_K?Oi!oFwg|sIl_)(%rYg;!?bvwV!d+p;OwHTW2W}0#M9zQ5n^<8tMN?| zT?7e`boBd-3>T<3$q_-GsknSBh!yL`>w0iWZAbfMMPV=rFaP$}@$B={e2_s@RiP?KtnU}Bu)vZU!?3;}>_O~}1(=mi zrHui@?Hx^S3f{IQ-xp2>=Iec|iHdvkaZZ8I1w~FDzhCs7nDGhH0wlP+3$hbLr9t`BNPlgpB<7%^#MqYp{lEt%;7Wd`FkK& zyO@Blkyg5cnF0=`R^Wo!$`0oB8 zVUaK0vD=z#2ic0=5KtM1!icfM4{E;)xY;N!415N=f2LV7kjz#=@X94s`@ z(VzP{^+ws?bIFVv2XPD+R%^|lL?Ny8Ig$+(fT-}C-l@_yZ8tBOBG@@BCtOQWWhtC4 z_Ows1&xIA9Ufc{oYQnf=eW9{N?5N~+S*In#O^|7{84Oq&Maf@LS?c}#Q?>+FRjM1$ z8aWuso$k&6o5bY-gFUhR7cFl?E#D^n)n|0~hbx}KDqfY<)O$D3AT+@JxZt>w`gB0heZO_#@gb=+)m5AwE*IZso&KIafa>@zrb!AQujNZr%& zxl)fFe)KVpNILobb2o{N8qr#txd{hhlg`} z7fJxde;&>LXh=l}{Z*jiGxopwu!5g(-x2QjhodYN)`P%Z_ifjJ+pzBexh@q_%d;b2 zl&AZD?X3t1zH}g&e#chH>`zrgbPg^c$=*efnx1KivdxvkXyyR<#*);F9HYu$q6T7)G-?WAm0%whG%y-hC+fD*kORr_qUa>;NQqd@d9N#hfJQ*mB zH+6gmI7ooMf$w6fjnI22wn>f3k5Fe1p~=;xk8|R zQ8Cy4O-Z*bW5!l1IEPzUg&}r1N}pS;$D-at3dY85k*y%JT~2r~s_cSK+SfqfbU1$O zws8$Ka#_l&ami(CaGRN5VFg*3kYvjcL>#Ws)FCh`(MuBG!zfAagv*%1G2jz+xK=XY zb5P@9%o?4?K=v2HBcukYv8sv^`cW@ygXvqXcUR-9_hM>GH&Imf_nT{|l4>5`pMo?7+PvIfh?aV>Y5(EWAz zc>Y*W9>^3I7PQ(bFx->e_k0qsF3nGb1KZrTkW6$<)RWOK2=&b^C>Zl^ei&k}YY2}Y*stTE887%u-0RUjOM%IlqfqNJ)`GmeEJoD&r~l1^V}P4+y$BHtxF1r;{~B{%zu4uY^m zR?ESl@wWM`AWy)iT@=ZkHs3?E8;-eYqKA~h!asRKvYC*rRUlsc%Ab2^0o)IEw^{p~ z!ZB`py3YpMd3O`zxA5kF91s64J|Fq8FMBBsQZL3{E*LMUR75}JrOX*L2-fxw%#S5@ z?c(4&80|D^YM66&^Z|a!O?)N_%+usbje`wnLYj3Mm~aA(mM(qH7!Kd6!C`%N^o4E% zabkTo{+tlPEV{!HY2?alS6$WNPZ*l?UR|)qQI(H@>eh`BQr~^M^&Mw@pAR!J$9Cv* zd4{%?>E!8{qvUl7!IcQ|b0{gaU=fcCn5|I7$nF_4PfAqgX=-sEkkez-s{sh_O4VCe!0Y8tz7)x=u* zNsn#Ywi(Z{U7);9UpMdh3LitZIBd+n0q3D79IF{LpogNi^yc_;eQE=tmAId6BS5L2 zAsC5a(PD?frfuvq=V;O@U2q`L!5T?NwdhcXA_y_Kt4q7Vya%%dNM>3TbAMZ2Ov%=T}y zbaO+2peh`y&48SAM*=0ayovjT2eCY*6ACMpPR8bBJ6p?-!ZgXZLkp8PlMMzxQzAKC@I+Br@E@97PPC&HT&ZWQswA z%X77UNx`5{1K5PrjoyHZUg9^A{0NY)pd2|H7`s8>*TYVnuWB*16B>G zQZK3miYOns3VhH!Og$FGskO-*Y_-lhf=60GbF4Ty=`erWWOGJK+tZsBDfYruWt%iN z2fm-EjN|4ms1G?eo0K3fIZUXu-6~FGm!fE1Vn5-i)g{YNd&}n={8iirGy?BdpC87f z_|%MxsT3esj2yYIfoZ!{)AFens7of>1zTxA3sJT)u}(l^Q{=!ZL$*E5vOm!W={eXs zkF1^U^Z9F@t|{SMLYccS1qR=4QyV_cM2e#0EpT&)PR^Wyh`LM+@{IHj_71bH2_8nM zph{})bFi@^>%(4KAtGJ=c-`E5L42vW)MfJbw?JSG5C)`jGG7%m!WNark~Hnu)hyJN zu9V{|?`uO>-`42B4dmIiZm6lFFCy2oE?2E9{rJi40Eey88)P7q2cCek#|~H5I4uhM zj-}YbR|k?B$p25?3@y{~eeRDTuiB3htNwqWv$V4}as00U3n#k&XTvIF;A~)RXZGLD z?8ySM7xeIOZ#?xSLTZTY zj*IHCDCexN1+7@jqxGxwr55}!wT`*od*x+$T-Vi%6fRbD^-3(L~330>~iyt@M)xD%pIRVx@=*Npg|9Jm3 z99lrTt;CP%dxjvwp)pf(->$4JL8>y+WV26Zp|{W?gqUlc)Q^PWvVZj6%99Ce^*yx} z3TGnljWuCS_;tk05j1Y1)jzz?=>y@IUSZAoRWm86NJDDV{lfix;2Y?RB|C5T&{6i6 zrj88#F#tL4NR4JpKv<4`T?g$>9l8V{?BxUmuH(fpzV%mar{>1XHwYoG-Ex~{74N^* zj(%`ihy9=00R;7*v52sDv~&Im`1^^cur+mY`k%>zs*ck?h2uo+^41vBlG6j)rc7J1 z?B^UNV*IMvZs5l{g{UGCx+LfGrHipOA)wi#(-#0MXPd|Cc@SFHWe=rKy)x%`eL|4_ zy8kF^QfjPS2PKL=;iCV`m{^g*?I%-YQTt7{cf@g?8JyEAV`nd(%*i})=sHid*<##0cc#qQ8B%nq-XG3P-%H>` zQ)F;I$}2|v%&oHs3ku!nwZi&jFG*2@fi&)dC1KTiXo4iHr9eiY5YOots%nD3T0Hy{ zE87ejKhE(W3iL42@Ff)4_(41Jcc9Hb9oC3hK51euvZBixqv^X*YBdH80UZR z=+Ey|OGRR54V)YIv7m_xAh9L|$^3+T4=f3*ceWXypd0JC*_eqvWFg|g{`1MYRT8t2Y((%Q*xymN-#Co(bX!b1IHNNb}c%@ z)G_bUOSv2e9@)38W?R;tcm2Uom!^?$nKfZG)4<{n-now3O>^=Zy_|rqQuoSasoRro z_T6-gGZ%E}P=ROVcXyL+=)aVK*n9A@R4`B8h`&`1O_b;7Di6^V&rovN>d+!SR!WhR zcTje|VOlbWqQMu^B9fVdvbx9*UbXI~CjqCx_U$e_8)$~bxA@@f$5H{Yy@?IXMafRI zYho8)(icoE6}Y;!mo1!6)fHbTf`vny3t7E6I{?}MtKs%0y*kC!`RyE)S9$2*170}x zpu3&;bTp0ed4D~*mDxZVayCDhYV!Dn9TxP=9IEPTYASLWl&ax_BV$0G7BEVBxO^i} z2e$*;(dkHh#$w``+g|3ZjUwuS`)QY5`eOi^TQ|Sx0PN-DrFiH`+TJ0m{E#!ysX?=y zmlv8rsRyD=F3AC|M7>ORENzWEcFmw+bA((G}?1Kz)`|CfDcfm8fMAxiv!it&G- z;QSA$2%ESII64}5$QyWA+Zh=D3&zx_82n@Z{dKM9z*H|_i^$;`U{Ic>ADLq?qSzIl zWGbM5-0Ym%F;*<9=(@%7*GDX(m4w8#%K!*5;kfJIpvz79Lj_nD@X@4Gl{**f_MPT5 z*R>1YiD|afmmKZtVv=82@;3^BD-}^d28`XuRE)%K^JdlZgc*mKUS)d@vikOK%x5~Wq)DXxt3q3mz#oFz%UF9l zwa8MRY#w4QX^hkgRN+4iX)!G>{jWd4m~YRrJonl(Nx=ePMm_AEYq{ zLqeC$v`3H*O)|je0>JH4!pR~cV_C&?t8_2KbY5dXTpv%f2IN{@_O}Q$He}D znr1lO(urJubH^$&(GGW{A;^#nYVtE=A>IQ59GM}ECp&?{3l>y z?;nc#CO11{!e+@Pehi)!HgQH}9Fivf1s>g=Fd>)1jGn1mB=A|x$f6${$BVXs2Z=*I zyaH^henan^9m+TWoDWJv_6>kXQK6t={^keuNt4+T?JE7(SnAj;l^wO9+<2 zbvH?H%VhlLU=zX81@QYeiJ!mfA@gH@2klVxtqX`DhGOU3$16``m0mu z?t96q?kv2b0+G686RcA!W;bp|r#OC*gh&f3JkJ5X1K6#!40@FMnmkfy1|p_139U8dlnMtkVM6uq2%t@{zWYu^_RHVt{W8f6A3 ziknmpSeQwR;@^cbAt} zaO#S8^SwY)boQYlx_KYr4fR?Iw~!fKfRt!S|K-!#@BlI7&rBEt}xNoi7Y@uGp zC-4KHgJMSUHHhNIcno5ATm4Z`AY3778hZ$2Zj|hCcmgs`k$lJzI{x3v_?A`}Z%myD z3#+wf|3!l~w6cC<#oTkhX!NhEapFcStVX9st$U+P^^)u?*T^a6GvwdBME}qrFQ8P! zns}RtYJCoJ80r;q)++2PZKp{SZjd5ZRx?Z->7kfq@2vGyYZkGIo-_Ud28b^UfT(;p zKG`40v0 zWm@3E@tjr3qSV;Y|ru~btnO4fRsl(3NClezv71xK-*E`#F| zcvPh1mA(*4@2e;6(UMHO^x;qeDGPUhYr{s+l*rJzcTzc~n6!;Jj9Wg1$%+aW&lhzp(Et?nqySglV;mBH1Lk z^6o(ni*{AX`I+uz3aqb~GqmwO(*N(Og;>t=o(JJJbSl6Wde;w=V`y<8JKo@;&QW}x6w zNG9cLd4ua_Ob)B1#EP_o3pv$>5&S_!$TPFgWq zEzftdJi8yv{GK$&HAs_e!B*jwcw2||lp1rnPZ?$D&Pty+$buM?4&RiZsPQGTELj{R zxqdYzobk))*S0FLdxbM-TBW4(6<_mw(IZnq?2xfo!@q@VEXwoJGWouFUsBMco9y`a zG}kZkN?iY+&Kd~eKQn#%|02kL%eOgdT5%if$i63P+4snrmX#it+Re_in$1e(p=YYg zmUz;Jfo{^-EjZ|%`@J^}N$juzt{dV-5|>VIGgnO*J=gtK{#F?`$Z~36g%^O?JzQKt z$yq85_zl`|xVEDjg~W35D-pX7=_Z*Z^2QKK`l`?)95Hu#Elk0D84KE`_M$ri#-Q)Z zs($v@*8lWTok7x=18dLgF_Sr=f&<>)%RYea6hH@Oq=ql06i#+?(9Leq25fd1LT#N0-GVZE{TE?s@*aByL$#rO(cwyGN=|hKwEP z0E3x1IIo$M7ytvuEVa*rE9Djw~1Q&*~aN(z?dZZWWYx^azoQf-{ zd#H}$E<9E6Qa)Zbp~r>qfj4{Za8k*kBj^Y`ho5Xr$5|u5{^a@uOY;%75p)TE zy&=sGPHl=YD3w=hY<{rKl8+rfZITpEy~dE&n^?KclcZCLPq1vylK`nu!r){!5-e+i z2x*;|zI^q~MRH-Za8airT09>)goaL7Y7yQHV!`E@e@~l!!PJuOpgjAW4&}lsumQSn zvE1DBj1QU%!VvRv>)yt9J)*!xV-J}m9iiy{xkVPl#%znLBPfvAXMv5riYqRowT|MH zW~xzF?pmqT&xwjBt%fAcU*R4yUxi3D)U94sz7n+hus@~>g?dmSI}=_Jk`t%_hA_lJ zs#8E0+H0*e(P4yMzVDAv4E}vbtME(ASUt*BYgL{qE2q>}IY9(gc2|5+riddL4{Q#d z_<4nmb@@snFT9|_<0yDY@O&jXO-WgUhfgsL)bRVl&R!l45q(6HOWr!7Rka|>Q>reW zKQH!5S<)?in`q6FLOMbw|7H?6TM?3b&F97&{Gtw;-)3jkNg~8lpi9~8uZRy^Cy*{p zfjzun&#vj%)r4V;B}!wVXQW#ot;EXtit(G{8BW4fMf1lI8fn|L4O{>7es7ee9S-+Z zt1!JN%4IiE;|*eYk)8v9B8Vcr6H>DKq=CC*s9v(Elx&{AF94OH7UA1ZbuexHq!dcvq?YS z>7X2LKfBv{OFufB!4w^1S$88_=TcW;%UH7lCpO`bUM^a3F}n*dvE4V{u&K}E(Vud< z*NP0{;s9~eiF~<*18rUQpvz*kyQL7j$1#B$V;c^GL`z+ts6-i!<7@R-nLtz%PT`~M zSHfgDlXA@`>|}+n79)m5;}JYG7;m!Ajo-hvxQ1@FE&@OR00KX4uJ(Vn#Z_{4w6HZ3 zwKMyl#hss=_Sg-2_?{Cg(QJK@B$Ux@DJA{oa_WR%m#%UtNOFN9^*WpD{*_-Zu|nng zo0U%_4PVF8Ub9HsAojrYD(~jPEiUxgvHFf&8T=$$t>c4&S4GR*saxdz5S#sIh5Qx? zLPQ*x_FBQ}O@X{$)9AT#>IKBo16t^wefhnZ(brtDMV9)rvG^%LBZLXRpi0USZsqe` z@rmV~bf8F~f>RHjV>~nKi9F6El&{hMV5pdHq@;=KUsrF|)i}M=MsBpiXq0g%mqwl= zt%yb$bLyEsz!i7ZZH!^ofClYi8H_pkf|N?A_B$eKHK8U0s$vv#m33dP{30`E0jrW+ zWemyAZ$9|yaom`Sw0l*mnbI&p3aJ#lY|OuI1773d7K z=*%X$Al6y92HZb_@|H+#V!$^M^|{TDapPwUnMLwI(+zbeDNrVpP&FcuRETHMV5t@? zU!ua4h~+O@hq}O9N#y5)laK1LpK=lFeY=k-^f%n`!1bJ&!{?etEa?@Z&1NiMoiO-w z9pwK=aj*l(fjiK%uO7z4&0V-jDLY3V=)x&=!ztG;b_TS4_((0k6upJWTEuPglwVmX z)n9P9{iZygC~7->3F`|IkQe#;QD@#>_+^f6)7;N-7pFUCg10m|8UdS5BKQ%u6BWvP z_&sts-zqv-n6nt{kJ0DTrc(FX)NHe#$#hC31!87$$79lH*l)Qjtj~a6Rg@wDrqE|iDXQNTWf5JFyr)-=^xI9P!3r|4^y$;@x%S<@kube2 z0LB9lRlH)6V?zy8fU~u;wIeukO{yCdw*`+Hmmku+Pp=34KK$9j3w?K>R*RI38f8yqK08cD7c1@ zQy4FYgeu|tM(k*V@drbM{5^#^q0f4FQwPgxd0W4J^GZdYA80W|u!>CTxY zXZCbe4SmM9zwOL=3%oc(0moZq!-b!@Ba3Wg_%=113>i^Fkr9$8_cmM;$znz^SowE8 z>JkF^l9p|DedsSvKK_xmEk-SF%cmnq7*6J6v$U{7XqLtWDdsP;=#CUlWlhcKOP?~K z&*D}aeRk#9IK~;K?%r69{I`i+VQz>MayIB_oF(m1Ps@&@3<$B0@W))urD$ATsD=5^ zUVV1zo28hERb()Q5%YH=Mmgd6j|5~0jGZ$>g(0wW@Ln#Q6Zw)is3ziHXw*TA8+mDm z2noJ`{jKJ)(Gz`*x>bs|McDKZ)s=QUm0;hD9A}tIQa-1xidzB=c3(%&mhJ-pxcqz9 z*_UbguobnPlIevxRRe4SbW_Ap7llj{+{X!8MxJ<&-bX^~M|n<;MaK-RUcLmN;&Fl2 zbC)zpXGCW*&rqEvOf#bf=$*cn$~JTx8_R9r_@PgNbLPD!L}N&Ss|B?!sHEmAMLnqQ zT?_q+J2x}uAs9HnaE0f4cFCF!2L@2DL`Rg@%j{js1dm)PoNzjjANLvnSkAhtni0rN z*_allpD44<#e03{2K&mmp$;VEL%NBEAE>Qn-UaWK9Itha`J^tC)V{d=cZL2qvgk>V zq*=C8$(estM2nax{+OnLIYPu2XnA9tgtLw6%k7M1&Qo* z742lm&Z)x=)Bi`%(`UW`@!*0RVh3)AO_SCeB5!lixq%I)4$$-wt|;cuEyA~XTs&9A z#0L4ofE${q8tJQZ?%u+ZciG6-UkX==<*f15Qgx_T4Lx5<7GSr%miI^e300quU)usN zF*>e8IOEEKxSW6gO~)!wx#o}j0kwpmV?~|+AgGC2SewWi*qHnqrv2zy?8rZQ*4Dk^ zVk2Qz8;p#ZM&b;kO@5FBlMiw$eI~jD)i{AP*-AUQ#CO0T?;D<%Tqk1g_qiZA z0Hq4pOfoH~erJF*w6wH%`>yE~;>51`dsjk38jt7(k5@Ka1_O2IjPM^%GZT6R=7B6f z#$Y^YELu?QM5tfd{JVVTa3dZuK~wr-aQMX`Q}omWFxKu9{ybvRKY|v#c1d<*ct7su zcz`!XBHG(o)L2Uix*UVhpE?;H#B!Ps*VPqG7Z%K`7caqw+=!)davH1D7J%^_>rb>Gg4}=dVX-t_?M{dWv=D%#L$-d z^lFC9oa%FU(<*R0J7qo}gaPXFpF9b6sIc0xLF=cReP2+xq$5X0y=hw^b!vmo^xY}d zreSP9pMddCGVh#eyU@OPrXhn_$u5X`nd?_$2U*=Q^`ej%YE8yS5${1FY#CwZFFi%L8?~vlz-2-@-KK{h%@h5MLC+ zQQ?P7zp9O6VNfDKwXw)wb?2h)EAKY}`up@qg;avh=i%S4Al2gSH2peaBr#v@VFIr< zYkXlVlkY3}#Ro10k4hoHh*Owp8SLB-Q!98ufZ^U1qhDTtbjm%Z&Ifr39?FGw%;fVZ zQ^s-5qg$cghp}gRgW=gEQB>9;+nnF7FzY+c1?023jqt`;(RE8YD>xYhaNu6l_iQ4; zB^`P#|0E#80pSI&2kF6JcGTA!xl$PkKa*fzOP5cDGA<@i1wgrZ$oKfTp?m|1T)D<3 zc4&kwM*XR~X-9uetYQ8QF_G*>?wVTaQY(jS$9i(@@uaGu*O`5S`ME>z$FiZjha==q zt##0*YzZ@EBxkn)#{xuf+Kl9SW<`rDuO1{C{r0}Y*uL6)tTEBXo(_x;71W9;3lU?uH#sf&fY;GjPrz?FR9ismQ$7_2!ml!ABi+ zIt_7MB_wwTmFT%*&tTA4Pgr^+n_f$iv`!A;p$k!tauZ3Y!`}e~4mr2TOv*vV32axZ z^|i@s?>}RKP(-hzA>dL|xoBB?U#C7c#(8*7SC(!oGN4?xnHan-D7PZ;&AWCB_S6Sl zmFwv0k#saQg9wA{-obpMW&rmU(ygo>S^c1uobJGlsJd}H=llF|8Zt9u5HoW;y#kP; z9D?G1YZ4mxVYYh|xc98|=E(dIND{v#E>ec0;!~ew3$T+c)ypC*5*HinDu%^wcs>;o z?iaky{ymUUC$EoB>BsTf;K%X$KM8^|2DTQaCQi=(0)jPa|DCt{Be>Di^IPbwGjtkA zWg5mFw2C5e)hGSd$AZ)>w4r6JNKn?c8}r*$C^VK-y);heT|<7`y1Rbex?A#{_eTTp zL9ip%qGoabB06>L)KRDJkv8?kSG^j~9~Gid4_`y}9S52~fg$)qkdmK_;M9INJmhk3J1K1|1VKh8Yaf7>~T#OmA98vKURLnLngm7f~!KGnSlc zoqDRc=7=@#hUOnYgq_(#0bM4;ej^jMnEG?E;{IUZ{WHh)N|La1X2O;>;12k9cV_6u zh!uN%hV?9}yLDjiGzT0`|HJ#}MI8ffPRevwY=GHKQ9^=rOvofL%&hN(ns4Qu5Dyv> z(q5KWBnGe4VK{+ZEeH&Qhi^z#8X;Te`pJmZf`xv}RRkWln3im;J#e}^A8$eMr4A_r z?6YB>?<06lDPP$KmkQDQ@NxX|b4RooGqXTD?jLD1UN5(O@x-X-v;pfJfTi!3)`yg4d`UvjmndYhkfrSxT%&LV84+$bU{-KDfhTsD|hJfd&x@dWS5R|taErr z?mVhWJdu>+gj^@;L#aA%fCl3i;YGzM9AMb6LT6rWA@LL92jsDu+mI_Y>3Fx#Zm_qd+rm^%C{SJI)OMv8t=&2H*|x3uO>#G6h$PKr zGY#p68jqE}+}whSTg)e!Jn%_JEr66)Ho2Wi1g;u zvxG)fEyL=j+-KSQyID(Pi_U?6uIs8so0c)iHdwiEt@^7DHkv3tIG2TO-&&Gz!0uxu zO6sO{9tDKgGMD@3uom?^LTGIBA2#Zp(k^fFy$^WkYM!@JX~;9(|4uF+we_FwZ*BwJRS74Euy32$cy=ja-iF`7>MWg z5q#Z%^;x4qN@Mr*dD1-A2R9ee)Wn=BN5Mv?rwS!=j7lEd$x!DCX`2ne2aIr?Zp`Vh zF1BG1RX~||oRtv#CwQi!m^+_>EN8ZD!ba)Dp=5;H3Pt84-jR>QU_}u9o}JiDFwF-- z`S6NFVN?|>-tjQ|mzmND1QQFY=`){^ghkEJI2lW|7rM)qfF#bU{dwBV{9|G%;vYE*aa_C?`+PwLR`>>10PIgT2(awY&Rsu9^kw2Qnd zQ=jzh7`m>nF#{_s zF4_#DhqRuI$B(twAkfHhWq}v%tT?Qu|1^TrE`UdxxPs9!qf=x5n;z@;FNM zOU>t%Q8%QD3h$7?yIsfE%YXFl>&yKPenz#vJ8ayM0S0g2C@|Mnzxx%oHzeu|1^+4f zeox8N8&p{7-Pcf=*)C))zkZ&CBEi=vzv<%C-_{0TRvFcM#=DQN|61yP_5T>MCu z^E$FfR)=@KUd(3aot;_MG(JtU@Y;?cQ5Gu|<4V3=;YXrvcF@7cGTY?BIiiT&8Iis_ z3w=bYq;{jq!MbB*H%ckIX-~vzzNRTgh}inEj?}bX2T5V#&Y9mmpmD5xB5b2@^Nv(S z&roPV>zHcUtDrkBWY)Da_m1nHG`e%nkiy_qe%#*e@G~$2MUtp(z3iX-jxu}WtmAvj zWva-KSK#tbEpeByt%8U+? zWw~{$JGt>TJXxv_dWsV7u5?4qdP605wgXXe@v`j<}Z&6 zc)?sMdXuvA7%%V3N**=oHI+;^VyNlM=)V5^6rxF&4LSx2 zD!+Rj_+D^Fk`BBk1PzF(eK&3Sz;C{{^T2{{T|bnCq8jqMoSsb4v&vbZ41RvJEV6U5 z>(O14VbA+&K;NB4|BBwL;NkNKqGf~RE@Lf8>#MtX`5SfimF}{|{vpnX5$H>~I`|E+ z(?exxR9-mISAG50Jal5qhl|PLtUg^|W@onNWQXrxF{XH|450Z3W9)xUCw@}Q0SxS| zOpGmlhL|*_F3v8F7EaCy6GEaIi$?E2uGE4v&|s8m6`jKrMhM<)&3aH4R7+uC`z2?@-}2m*0j38?eU* z1<}oj3BYPt*COEy`XC+A@LcE5Zix%NTX=IacD`Se8=y( zHNF|WGzT8+dGTb^lJ0;^ozSOC+meoqSxc62pv!jmR>vP(;lx)I@V&>ICj){Z&8S3E z!k~tj5E?3lGoXbKqT(BqBxaC;g|FnLBq14>v<$REU?ixufE621QaA6nMJ!Fq1;Vy= z*hwj=7sskb3JI<05mhZxEle1i*>YedlsA4uU{_qF?!@ZRPg(dp;C_!sKH9){af*CK z-LNA?%9tKB!cpM8ryo&KvIbL-f#Xr7On6u-h=OT4`f?MRk_5a#d|x?hUzliKw!1tu zddMrt_B8Q)_f!z5loN@}kpioHJ%=Noj~*%~=6}zHUEjn#tUGdRegiJ|0bB_-!d|1a2b#*GInTGYqkg`p~_U82RfnGO^nG{E_ zLHRCR)mCb6>XMBhBR)+T1+WNmd-1ncv`6j+*L0gYc@KnPE+*dZeBiNZ_Y{<2m%+i{ zip3%F@?SkPgs_;eZhHL378_ja2f4~5aL%uDm*8lUIu4;!MT(q{xE(s+JaHW@9kB~Q z$|bx#T-nD1Hxp3nh*0i(ibLj?;^XPp1Um2QMOAg$U^I_3Ip4JlA94LUo=W#`MyDlR z(!AxsdOP4NE@WO($8{BuYyxqyztd?0TjCzEuX)wb(y%1-qg`evphxeQ@4i39jK7y! z)+tkBZi93T`n0;vXuniR4lSJx3JKTZP%N!;ry4TX#`pjNYXd{`~|<6 zd#00K?x^$ih5AiZ_c=Qka-)~DmdzSA^KWwB;`k-yKT96KKT96}$ptOXojBl>IrZjf#8H&-kS>FM$dDykHzTt`|SIGBYM)R8PVo78EKa*EE1M9HE%A z5m$nt20WDGAd(O_2*TAU-ICp__MWK;FCi`GmnRu6Ylj6bq}rW65xsbHreCvW1#IvI z7pw)_Dp=k#bY#t)8TEPWS?ZEySAit{VlzS{(!2IAKGhOWJ!K%nf=3*aR7|!o@ZJ?K z)o45qKy287m#E1Jr=VG9T#UIyi8TZ}2bjW>=);;eV0_t|o%d$E(V)sBRl6}=RlBut z_Tb3Wl^JnL*BMy1_T=rzoGN{NL=|0}z4c|}xd9wrB0$(KT^RC@WlU1V?7*I(uwh4l zI!Tta7&AmQbRMT9qJpGy5HkrB5Rg2|q-Yw1)M*w2X4hhpY1Y|HHBU2??d8NJcrkc zM%L6&)5hsXA+;cFq@7%y#VCZ*O>}N5`ve%FbJcBOx^=_$YnPZXwkX+}*rQ-Xhn;OND$h`6+g>z#w7_<|Y);IE16bNAkzE=6X5wW{=&C zO?BJ=LpLOGl==1qjw?YsQMQQsC?3S@DWH%57JaoRKXT4uy0LaIU29Ka3wPpnK`9Yu zcx?j?m#FF7uZfVzoZ&q_s#W09kqhOUPusR-0pjHhY093Dd%cqA-*39qh*vy>HYWGe z5VKy#?oxx$X_yEcrdr@7v33I<=R0e^uhCSdlR5l&%5!HOMi@riM%`vJ?5~JPwdc#; z=_en5BaOZ}wi9@RB+-`FGc%4!iX`N0vtq$du)^iiEhZCDhy^l)@>x%l}3 z(uyk|J4S+f&s>Vg9bV6kaJom7zu+0;Vq0nj?5xbJG2lrL^$P1f7qR+Lm~+mRFQ{Tl z4zm7j;BkZvge6ZHuW$HjSs%1fWe8ikSpH4NJy=C>(5+LZc@4Yu#iFzZ6&XQUPNP-S zQfo{U6n}aP_PNoV+*`KS%i3hpn_y@p^~5N}thJ~(Tlc6*tRe*%iL%_d@z}lH0L)bj zLRCrkU>vKAE0?h?#6z_kfR3ad@uFmQICf4d#pEQq%K5!r_om$TU2M(6ppo z=x6BY@%ByQW&*@&J@@!14XNCu)_{Fyh>m(?A5u)P;GM#n62Pvp@H8#OxqD zKwX#P9350F?2MsE8-8(Mk5J-4ru0V?Ks_R5uyz2(TE$u6;CfOwD4`T-`Ec(#;p6F_ z1cM>D=Z~7IZ+g|H18uZyQrD(i2dw&rBcAiLh?Mnw6ZSP=&iE$nt5!{xV3-;(%I8!| zak>GPPS{4sN@S+g3RV$7f^{)1e)Xd1G$gVZB0W2kY0=EcF!yr+-)3HHeNHfR159Qo z?T03#&vv&*mJLm+MfJdwy~WEdy~BweJ22Ijx=kn$K){o z1E|=07@A>Ng__2)d?lZmruq|>GB-A%Q+P?ka3XTaZ)V2GsFDr)OxkP?5GYUGGtMq^ zcR^8#2#M1JA6a53o-M@3k^6Y{e!(NwJT}DSPOaT5X4K3Tm9vrhl=_{d4%LC?^XCCC z6I&aU4Lhh{)!GTkV@i*qS1ciYBzRMTm<)3%W^hTK#N?9y*G0-@$pa=VkT6BjH)Y|i z6hoOqtB#rcFy=D0pBty^H>D)-Z@yGqe%$g_IWu8@OA`*3T)kf|16K2N1?|e_Jt?fd zKKY?5+@foT&?ABgs3?0XawZQkr$Ljyy-JF0p79}CD_vEF&9Eri9DT73lb8*uraw0; z2BBy4(g#AZZCJ)?I!`V-H+Xe~0!w-AV{SF!r*G~($6&)dfIF1efUykDPOv~~57fJB zREw^>{K}Ng3BIE8d|i_@yYYpN){?AseibEtXAD({4Z3EU8c(?FDBi>`xG0BMv4NqP zdt_jbMzi|}FS&+h&?+7*eRdrDE7-RWW+7l1ploZY_w{INaqfI~0_#HmWCXZ3 z?%wok<1cZsC^^>IQ&@|A&en5t$)00Q##pk5JDE}?LrNM9%mwSCPQlP8&-2mJ1xzDT zsy7_(TrXiIy$nro?2c2{HnvIQF%--JzdFsUY=czMM9cbh4{mpADU07<-H$n2$Pezj z9X}!Y*{PDGz2sga%6u6aCZ-ubg!;df#=9w$+~)b8J;@q!uHl4jD@P^-?Rv0XIMf?k z3e_z>KHzl<8?;nRoV0qXqY*&Xd0RCsC_H=TOv84dXXHhDZ83nu}iL* zt&294EO0(PbHraW9>2KXltsTFyW#KN(aYVoK~T#6)V#aqQ|x6GjpD07ZcAk;g$^;9 zTxpWJ@tK_DqbR#+UXGcLRJT;g4*8EoFYLB5mO$GOv1D1^n3yINo}~jzUypUFP|aaE zk}WG|S`FeY9Noi5pbp?D1KEwNL{|JtB)Xz$c!l_5!mcP0<~$f=6sWR+Z9;=+_rnnT z_s8;LtXZGGj!0Ya|?%Y7h|B_aAr;Rjp0Ar@2oy^&bC;T zIp;vxD}rq9fe>>?A4q70kl1glQXLrbR%H2<#KgwWl zM9gyO&FSjd@mP4cdSAd1?8Y=fn}>3pMZr`^GGim-1{bzkW*sMi-1=gLGO2V8 zI|OJbUgXm?nJO)Tc06p#8K+#94L$!pm@4P1rAaJ}l($ytlM37Y& zu|n;mn}?9XJRD zJP~r9yd|eWF3hI(<`Np%?Wd@w*6IZ6GK7*Bn~)WhR0479!%3=FDpa$A20u4GOFK}+(5zLcg7o{(tb}AzvvsB(($=fb>yBG%k1zNKfEwc#IUXOj zeXS=wJ1z|V=_!X^M}TzCyD_yOiHCTD$Qup3yg3X3Isqm99K=yH=u?Gj>;YcNsbYUW z59k<}b5)J4owB{PF&xE~e>|9DjPM|fFtDsVdN-{I35*J z2V?XhCIMrn$n(!mSG5&uX4F`4RiXVjwMKiZrCsz4~^$tJ6662BK7 z{s9HsG>Vj$%Z9LSn6+;M_p+=S0o5E*$KOB#HpK#2zpDVI_Cb{SRRs$!@B8s3hjE3On31uZ_vVG z>v#^Dd<$tW6H2b%2X0!;_PddEkKJoc4hH&HyX+F#SSB4MkHZKH7w1Mfo4!f2B-NTk{UaW*eKa9T@wog5~p_Gr8+fOQPLpKq{50g6Lu(D&)vcx_?6+%kf zwUUe7@0RCuLUF}cQ@)*_H(7V_g^;Qh3NlyMX!aqiNO0_9ZQ8Cmd&j57PtEX1IXX|) zdm`288Gh7f>&%6Yj0~e#T{o}MC^CkW_?XcmV|FKB?5{Z59srz=lI?}so9e+2s$0!= zefjozF|^br6jVjMIR4bM_LQ3GVtOSVZ}57W@rbfx?cj=O=Zpv+V5M z-OgTQe~iol=DdXPbmS9q_q$$O{S*rGv9st4LzH5+)q2@||BupJYJzGh_n*?+E8PE1 z%fP>Wh~myR)OR$Dw%rk*fHUP;+j07v^F~-`;^mS7C7M_ zZE=`L&BqgOKW%YuV2SflW|Qzp6Fz?R>eT#;JiLU*>G41((4Yo=fL?^+l=cjaVeurSGVqvI9>hvX(jlRM zP=p2DGpnkDBNyGeQw4+VI(MEuZ4@usFomOP(;UZkvKF3y`UP?WZ$q}p_KX~)314^) z5QTZYh?zn5a5#bEcsfZ1gwF{L`H=xXdSl!7zYB#9^=Vg`4He_2j1ccN2r17`Vu64t zf%nCH78}cqnQaoNyf`ymi&N){y5QULZpO{L7#qgie#!;5Wyhbd->%PXow-8G+=lV~ z3i#s2?72b!pZ6nd1tX3E#5xA2bWnsUjZ(@^2Q62y8^h%}ffqiaL+a2sLg1+%3&|53 zFGP;94>GiqD+RfGkAR{+=nyemRCYXGliG4n|eEBp7X&}Pay5w@H8=HEZCVOf%Y zv>|HM!_I>kr^@O{{uK`aU?xx;E25|VH9Xk`#|`jz43X3V;~tz+9|J)N+%!~<2Pl{D zGwI;T*ZMDO_g{9*UhJra+r2X6~@Cwh6%-}8aSNQ>mAzt%_jV}YM0%<;<0%#WNZu0le5DQ;0SA+c0Nx1Q4b5TuH1G0p@+It=^3rkW!$5y*R3-0TRp2<1 zL+7q>NTooAEeob*t0yY)F|DIX!_^gl;4mZz_a3@a;x~mudOdt!x!c#0$f11#+H~pJprEm$0%_MW=Yvnbnj`d4}K|?W`P?A*7~SVKEh{9&wuZHiKsh z&t=!9MI;ZvB59Wj3~8zBHssMyI(ALpqMR`TzD@@w@Y1kP7gkG@GEMPtxz2&XHuRDx z2_i~I8(S`~qqx5|#{tilafDMCuP!>i0B2t#o$6D61fSPaY}Bbb3EF zt`)7sz^j?|!U5JPOoL8Ty^+)dxqSRg(>jkOylGSh=Lem#`+d z9I4Kgo|9DUCla}i7nb5^8G`(S06es>YS&MPpAN{!QDGsZyn-ch7c#a#NZ$H(?xG?^|Nw_g0RJ%Er=Qj(tDj|)g$k+;Z9124+10_&sBDxFm8(2 zHFZAmOZfW+A8=tY7s58s#X^owL8&L@mj103copQjB9$)8vv=-@=kXL%1=8rMmdPt_N2{NN8bi9YY%RYXZ zz%WQmLO7q(I!KFd>t;(dD4didNfW!sqqLSF^Q3HEg>)rFPYvm@tW?hoVCjcupA#=) zvXh3v6A-{^lkNUovilM4=IwrLaiGbC=M3r`=Sr>U`;UR5@w&n&C&poe$esvndjNIpy$O971}-AZ*+ zTK!|E81Ed=7SWN(uL-=u^$Qb9w<&zVE{qO8Mxu~3q7~nE>cP`dEmPveSeA>HatFHH zE9W&ZMPt#v)nUKvHmt2fyRF%evg~}gQDZt*o{m-pJ*7#Fo4ySpby3)tQ^AU+qpxag z*7{Q4Jo_nd=1J6Z9Y2U<#PRtJ^EXPMN@N0+jqN!14V9CCa9lCgpl8G{KA0hXQK}aI zu;Uw8ZlN7~I_i!v|1MKbtIN6+T3GUEEEZh!eho)EDnNJKP3sc&DdqkqIV&lKUDh}w zz7Q8~)<=jH@*E?s#YgFMEZNKtO|T{Wmf z+!p?s7n+D~BQaNF*GLD}6E)xnD^k0$3fH2Ql;=CVI2j`)Yhf!tV=Sf4uS(WN#@ESc zCC6Sx%40Uf^^8fst0Esaw(RIzJJF+pjGk&TD%(ZIM2@rh$ThWjo~^3~{k_Q*>Oy=- zDxF+MN4+CO?B;DGwC2NkKA!73KjU*(z22a!>priZ*+2bGF6||HJdL;f!Xtx|x`*KF z2$g{gAA5Ozqhq5}bT1d#xwBqnf8RfjRL-82u=U)Cub~^gc^KlFuq8gg;l7p@{xhi{ zA8sdb;n6DXlN`bdj{ zk1CXAvnPrrXPrVMAcSOsr~{zXNPO=7;g3WSUs#eds|=z6i1O*W4O;%(0oeuIo;WOa z_oUz7dAI+85J6M0g*l2DX3Vio@e@lvfHbgt=8j35r}9%EmGRp;)7xlO4wf19BPDWn9jhHt7P;p8l4>A%|UH?JF$q7jHQc@V9mKkhO@K(#z-PDXZ z-vQM>EcdrS5WtW*FhU4fm`?PDZtJW2)pkd-ZXLM7sx4Z-+rQ)aOtBq$g<8uiRQ~~| zH@H%UNk5G_YA_el2q#b4_HHbZ(;eQB8{A_}d=WU}J!jNRx|moBqv&BQnNLKXKH1S4 zvO+%p0&L8E7MkgKHJJv>oTs0eM-88vL@t`8JNTQgAsD;D-cHWw^TB{oAV4w0iWm~F zcYBK21i}+niQ6YdBBMc#p4(tBpT%0Hv1J9iE9M4_71(38sc@Rn@iXQ#!wmlIIe>Cz zxzSeI*%R>tokwwykC61357cK2Xx*ww7yEdh%f44pY> z7Qt29>>A572zZf5r)Vg|Iid;22Fi-R=u9$#4atQy`hd;xdJK;CBEBBO@|r$v3j%A> zC1chTmo$+PxfwinPus)62B)Eao;C4|C@nDstPI3HA$#J9N*3g$n5`#`d0^ESUg>Rw z#XW(=9F;!k83?2*lzfhW{_+^4&h0}#u^_w_VYfUIJ-i|Uem|y-Shj-?#!yM#%BgXm zVD^VEB;g;|mW2D-ljxD9j{}7tEUlvljGmdn3H^%+lh32)kmFD9P=83y0@7dF+I19U zW-~%f1DxtwGArJiYEQ!)VtNco+&(Ns`fzBC{3- zc`C6UBa{9-9vaNe2t&LAy#DaTezxsp z^3$fVkJ~SABBwcQ1-*NRL(8kH%}@QCQ?F6Jo?ZG zoV&Q+N)n#8kWKIpiitPy45o9X=;qx7@krt%{(&rhQqVR&5CWJg;UA!^3{ZlAM6-x} zM&Wg&Y(fRpP*j0lHG$FET7BQwk?_?P}5T9Z8=G;rC;Df z3&y-3{OweATp9mB(TLG9JLvKP&OxY-r-85@Xvt%_S106Zoao!N)C-RC&|8|cX%|5w zLmIWHpSsHZa3mb;u;T5t1=sR~=x+zr{P3o|Xvcl(-+VmV{Js2GAIYNhnZqt%LYF2~ z>LE&zJG;RA9&o=QNY!|LNHh=oMy0sGffU*QAkoYqzT#IaLrxfDM5aJQWJWvT5e;7g zwh)WP7s!SSN>^I%eV2<*yv%C6U-0)Akn~z4pPc^QQ<9)n3M?t zq_mRJgi*>^xIKj%=(2Yk_?d|~PKsy6hg@mft`Dj_SQQS=T=-AVv9eK4B6|zG)A{X7 zlcPzCiA*JeJ<(64E#n}NW;5rhESE!|nHcAf>^s@e(`?V6zttUeHbW`$J!_igPyT&e z+@wiTa_F|~1K;U0Ewb`!PoMn`H9R)wLGSC6t;p0AUYCC2XBIeX3_QzGLT%Z^GPe&( zGbY>b2QX}2DOEFZp&A6CSv^mmv`O8v!g>jnDLllsRI)^=<5J~z{1P4X3#9F?L#8Ky z$8}2yX#T|Rwr&U}T*z^{-$q>WVo6r_Ff&1DJv}X<>wXMfv_-x2AGT4#uk$K7rbAo( z1cY9u16+5Z$NOTsw-b%Ap6jaOkm<#ytDz1}g=il&8QlJ99P%Kk^eIny-{3!$SOi*^ zfAps>B7B!BLgKWt?a)E)no^ooiA@a<&9d@{h8(DTtQkH!q!@yfTWFqN`O|e@UlS9M z)N12GE~pThipn%hyA`d1v&7$?*>@tJ$G5w%$&8UQ^kA0RzX70&-oqs{p`^B)qI%(r zd^_0ezq9&>OQSI;XCPOsCtDMIH$}UL?GewIqZWenDV1Gjz3dUjQcNtHVfBZs%*sXC z?Vz;W_5S2ulSL~gkP9GElHW!tiN(ZhBY$$|b0neLJYq+#-~>*;s{;!aB8RD}zN3DP zi}}aGb-}lHZ!lO_fX)1!%7>LWOYkOZVel`4bZy+l4Uh%;x%_I75IGGI@>wL>K*?>G zi@?klUx4Kn+gJf3cV^qfY44}ABe-9dSjec4Ho?s6T%Yu*GftNr6V~7>Sxzq3T+V;) zD*Cw22`oRmO6!k8`roiU{r~3C|JU}Eqp}sdM33Nes|MpCsgO0ut5_pUAtKBlwdv?p zxow=t!tPq1quadcXZD+T$9V&Ykgmq;A8=_0M$gTlG5{qNJeD~->fj|_ZJw^q!0fFo zOKg%#3>q`!49gLvLC-g@+Kro|4uQEgpYH`n zOhsVehjb7!iJxE(jEN56E?(c*495Ij-Cmm6CZ0J zjm4fwcmHvHxP;X!ojNt)jXS4WuRiF^;D=jxG?FcAr_cBo?Dp{e3hw@K4pu`Cs zK8EKRErMK$ab=o`tv5&1&ec84Gq;`wV}2wnTBYPK)cG%4mw zg)BdIJS?-~gq1GgoxcGTZIVeeMvz~aub#y67G8)QNA0)H)aM8c5?U%&k)X(E~=HpJ-%_87#ukk1{ zg&ky03pB<{4Q>$k{pQ&$I}_`?uLH2wkKF75Hy=HXn~P9FgcvrXjRUMM2u&gxSmtwW zJik63mJ{k}?A0G(;6ot5(4W`xV}PG|l#+H@8s7i5ARJ9;F#2L_8byRA8V8;jH+K$B zVN&QTfoGF!Q<9jUKjm^%PjHd>K87_%0K-E!|EBZcu|EokJAM3yKekO|xdHcq|MTj^ zjJne@-$S+2tr_7A&mwov02kkGx9Z^9Urea9eoGxHs%3E@Ulu>#kGcGYd7u^9Fohzo#oX=E0uRo2NJhLMeQg`Q;@9J zj75IHU}d>G&%XbWf{ty4ICi8Fa?#K zJcr`61(23dWcV?)3#c@vHZO*&y*n=cQ4f1uR@n6V?3vqIUqCO@-j6eEO?F2tQ3N3$}tx+niSL zn!9kj|KR?f6?-e%>8Jz{xu8eP2@_oN7tTmciA9F}lWZGr9~7JnQ!%7{s_(KL6)rXa zom;-IjuNaaow1CYD$alhd$*BHQFv&^RWedh399@@fylr}MnHm5eLYx=)07h7ZJGq` z+X4k@oB_eI&a60{Zid%#qzC(wsK8~~>_ONNdF59bIrA&GYe zdMk*uTg5d?FW*wNMH~WqD?gnodz+f&7Pf4 zM7W<+M;WOd_?4V|#Vye4*h&~g^c%x)*1W8t?V14nDnMPBm{GF`xg!yI>-nQqFaZv^dp5C`-vkfdkzgEEiD@{J;@)*7^G}sGqRMT|!XoGs zs89Cc%9@O$SYu*?eujM?TXWLwMP1XtrsJ#xMj8E;*23qM&AYM&BPXD2o?P4@8I83& zGS$GOB>X#eP|DpkKs zN3{w&8c!eFng?+lV9wPz>hauyQr2~(xZe!CQ9oHO#LgBGW>zra(H0J8_Q9bK1}^f= zNIE<@&msdnUZxi^@?BqR3qXEYjNOUvaW0;cJGIeMN1UaeKB6W@q z>eRnzRt-oR>-add5@_wLSZwJwaMGL&}6PB}{PT8inen`FPm`)d9s3{1&k+k^5Lb@0Dk(ZE857&1=z_cVS=LeEw$RwQt1I~XgmO|=uBmBiE*T;gek7yy=6T8IgFM-=|)+7Dk z$fTwy+0y_QsW)?p#`PoeAjga$LguVpq5W|*;b6McXcK+zX8;zsv8Z3sPsPeQr`{S) z`yzEWQ8wohJ!yi{=-7c|d1bI!^6g3DYfeV81h8`depF zx3z^yqhIGKTKFJSX2dEHf|JTs%myNNMt8(!x#DNasSN4Bay$h^lhO_zVv%>lxa=3L zsPK1-Fl*OfJ*B^PL4+YR-mZT=L62{(9G_fsDNW|#IXml zqvZq}YYthw^*dgyPgwp+T^1ua@{-vJ2I+j3X=$Q9_14cTmHCD3~CvB64bs`LQH_Do8uaB0yR($y!&4557 zeeM$H+WjPM36f*~s4sWGldRtyFTY)&fG8ZLDYWWd+?m3YG%`LVPyxN}JNljj1F~V* z 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 literal 0 HcmV?d00001 diff --git a/apkeditor-futuristic-base/ARCHITECTURE.md b/apkeditor-futuristic-base/ARCHITECTURE.md new file mode 100644 index 00000000..0b614cd3 --- /dev/null +++ b/apkeditor-futuristic-base/ARCHITECTURE.md @@ -0,0 +1,41 @@ +# Arquitectura + +## Capas + +### Core +Contratos pequeños y agnósticos de interfaz. + +### Operations +Un único punto para registrar las operaciones disponibles. + +### GUI +Swing puro. Ninguna clase GUI importa `Builder`, `Decompiler`, etc. directamente. + +### Legacy engine +El código original permanece en sus paquetes para minimizar el riesgo de romper imports. + +## Flujo de una operación + +```text +GUI + ↓ +OperationView + ↓ +LegacyOptionsOperation + ↓ +Options.validate() + ↓ +Options.runCommand() + ↓ +Builder / Decompiler / Merger / ... + ↓ +CommandExecutor + ↓ +ExecutionContext + ↓ +OperationListener + ↓ +LogConsole / ProgressPanel +``` + +Esto permite que la misma operación pueda ser llamada desde CLI, GUI o una futura API. diff --git a/apkeditor-futuristic-base/PROJECT_INVENTORY.json b/apkeditor-futuristic-base/PROJECT_INVENTORY.json new file mode 100644 index 00000000..b43b1095 --- /dev/null +++ b/apkeditor-futuristic-base/PROJECT_INVENTORY.json @@ -0,0 +1,6 @@ +{ + "original_files": 64, + "java_files": 61, + "resource_files": 3, + "new_files": 22 +} \ No newline at end of file diff --git a/apkeditor-futuristic-base/README_GUI_ARCHITECTURE.md b/apkeditor-futuristic-base/README_GUI_ARCHITECTURE.md new file mode 100644 index 00000000..528e4c42 --- /dev/null +++ b/apkeditor-futuristic-base/README_GUI_ARCHITECTURE.md @@ -0,0 +1,102 @@ +# APKEditor — base GUI futurista + +Esta versión parte directamente del código reunido en `todo_el_codigo_limpio.txt`. + +## Qué se conserva + +Se restauran los 64 archivos fuente y recursos que estaban en el documento original, manteniendo sus paquetes: +- `com.reandroid.apkeditor` +- `compile` +- `decompile` +- `merge` +- `refactor` +- `protect` +- `info` +- `smali` +- `common` +- `utils` +- `com.reandroid.commons` + +No se reemplazó el motor existente por una implementación ficticia. + +## Nueva arquitectura + +```text + ┌─────────────────────┐ + │ GUI Swing │ + │ gui/view/components │ + └──────────┬──────────┘ + │ + ┌──────────▼──────────┐ + │ Operation │ + │ core/operations │ + └──────────┬──────────┘ + │ + ┌──────────▼──────────┐ + │ LegacyOptionsAdapter│ + └──────────┬──────────┘ + │ + ┌──────────▼──────────┐ + │ Motor APKEditor │ + │ Builder/Decompiler │ + │ Merger/Refactor... │ + └─────────────────────┘ +``` + +La GUI no debe contener lógica de APK. El motor tampoco debe conocer Swing. + +## Entrada GUI + +```bash +java -cp "..." com.reandroid.apkeditor.gui.GUIApplication +``` + +El classpath/dependencias deben ser los mismos que ya utiliza el proyecto original. + +## Estructura nueva + +```text +src/main/java/com/reandroid/apkeditor/ +├── core/ +│ ├── ExecutionContext.java +│ ├── LegacyOptionsOperation.java +│ ├── Operation.java +│ ├── OperationListener.java +│ ├── OperationRegistry.java +│ └── OperationResult.java +├── operations/ +│ └── OperationCatalog.java +├── gui/ +│ ├── GUIApplication.java +│ ├── MainWindow.java +│ ├── components/ +│ ├── model/ +│ ├── navigation/ +│ ├── theme/ +│ └── view/ +└── ... motor existente ... +``` + +## Regla de mantenimiento + +- `core`: contratos y ejecución. +- `operations`: conecta casos de uso con el motor existente. +- `gui`: presentación. +- `CommandExecutor`: sigue siendo parte del motor; solamente publica eventos mediante `ExecutionContext`. +- `cli`: permanece independiente. +- No meter lógica de APK en una vista Swing. +- No meter componentes Swing en `Builder`, `Decompiler`, `Merger`, etc. + +## Siguiente refactor recomendado + +1. Extraer modelos de configuración GUI de `Options`. +2. Crear adaptadores específicos `DecodeOperation`, `BuildOperation`, `MergeOperation`, etc. +3. Separar validación de entrada/salida del parser CLI. +4. Crear un `ProjectSession` para archivos temporales y proyectos abiertos. +5. Añadir tareas cancelables y progreso real. +6. Añadir tests de `core` sin iniciar Swing. +7. Cuando la arquitectura esté estable, retirar duplicaciones del motor una por una. + +## Nota + +El ZIP es una base estructural. La integración completa depende de las dependencias externas que no estaban incluidas dentro de `todo_el_codigo_limpio.txt` (por ejemplo ARSCLib, dexlib, jcommander interno del proyecto y demás librerías). diff --git a/src/main/java/com/reandroid/apkeditor/CommandExecutor.java b/src/main/java/com/reandroid/apkeditor/CommandExecutor.java index 8b730372..2eed677a 100644 --- a/src/main/java/com/reandroid/apkeditor/CommandExecutor.java +++ b/src/main/java/com/reandroid/apkeditor/CommandExecutor.java @@ -15,6 +15,8 @@ */ package com.reandroid.apkeditor; +import com.reandroid.apkeditor.core.ExecutionContext; + import com.reandroid.apk.APKLogger; import com.reandroid.archive.ZipEntryMap; import com.reandroid.apk.ApkModule; @@ -97,6 +99,7 @@ public void logMessage(String msg) { if(!mEnableLog){ return; } + ExecutionContext.message(mLogTag + msg); Logger.i(mLogTag + msg); } @Override @@ -104,6 +107,7 @@ public void logError(String msg, Throwable tr) { if(!mEnableLog){ return; } + ExecutionContext.error(mLogTag + msg, tr); Logger.e(mLogTag + msg, tr); } @Override @@ -111,6 +115,7 @@ public void logVerbose(String msg) { if(!mEnableLog){ return; } + ExecutionContext.message(mLogTag + msg); Logger.sameLine(mLogTag + msg); } @Override @@ -146,4 +151,3 @@ protected static void removeSignature(ApkModule module){ archive.remove("stamp-cert-sha256"); } } - diff --git a/src/main/java/com/reandroid/apkeditor/core/ExecutionContext.java b/src/main/java/com/reandroid/apkeditor/core/ExecutionContext.java new file mode 100644 index 00000000..e5b7b4b7 --- /dev/null +++ b/src/main/java/com/reandroid/apkeditor/core/ExecutionContext.java @@ -0,0 +1,42 @@ +package com.reandroid.apkeditor.core; + +/** + * Contexto por hilo para conectar los loggers existentes con la GUI. + * No contiene estado de proyecto ni estado visual. + */ +public final class ExecutionContext { + private static final ThreadLocal CURRENT = new ThreadLocal<>(); + + private ExecutionContext() {} + + public static void setListener(OperationListener listener) { + if (listener == null) { + CURRENT.remove(); + } else { + CURRENT.set(listener); + } + } + + public static OperationListener getListener() { + return CURRENT.get(); + } + + public static void clear() { + CURRENT.remove(); + } + + public static void message(String message) { + OperationListener listener = CURRENT.get(); + if (listener != null) listener.onMessage(message); + } + + public static void warning(String message) { + OperationListener listener = CURRENT.get(); + if (listener != null) listener.onWarning(message); + } + + public static void error(String message, Throwable error) { + OperationListener listener = CURRENT.get(); + if (listener != null) listener.onError(message, error); + } +} diff --git a/src/main/java/com/reandroid/apkeditor/core/LegacyOptionsOperation.java b/src/main/java/com/reandroid/apkeditor/core/LegacyOptionsOperation.java new file mode 100644 index 00000000..01ee752e --- /dev/null +++ b/src/main/java/com/reandroid/apkeditor/core/LegacyOptionsOperation.java @@ -0,0 +1,50 @@ +package com.reandroid.apkeditor.core; + +import com.reandroid.apkeditor.Options; + +/** + * Adaptador que permite ejecutar el motor existente sin acoplarlo a Swing. + */ +public class LegacyOptionsOperation implements Operation { + private final String id; + private final String name; + private final Options options; + + public LegacyOptionsOperation(String id, String name, Options options) { + this.id = id; + this.name = name; + this.options = options; + } + + @Override + public String getId() { return id; } + + @Override + public String getName() { return name; } + + public Options getOptions() { return options; } + + @Override + public OperationResult execute(OperationListener listener) throws Exception { + long start = System.currentTimeMillis(); + if (listener != null) listener.onStarted(id, name); + + ExecutionContext.setListener(listener); + try { + options.validate(); + options.runCommand(); + OperationResult result = OperationResult.success( + id, System.currentTimeMillis() - start); + if (listener != null) listener.onCompleted(result); + return result; + } catch (Exception ex) { + if (listener != null) listener.onError(ex.getMessage(), ex); + OperationResult result = OperationResult.failure( + id, System.currentTimeMillis() - start, ex); + if (listener != null) listener.onCompleted(result); + throw ex; + } finally { + ExecutionContext.clear(); + } + } +} diff --git a/src/main/java/com/reandroid/apkeditor/core/Operation.java b/src/main/java/com/reandroid/apkeditor/core/Operation.java new file mode 100644 index 00000000..055ecff3 --- /dev/null +++ b/src/main/java/com/reandroid/apkeditor/core/Operation.java @@ -0,0 +1,11 @@ +package com.reandroid.apkeditor.core; + +/** + * Unidad de trabajo independiente de la interfaz. + * CLI y GUI pueden ejecutar las mismas operaciones. + */ +public interface Operation { + String getId(); + String getName(); + OperationResult execute(OperationListener listener) throws Exception; +} diff --git a/src/main/java/com/reandroid/apkeditor/core/OperationListener.java b/src/main/java/com/reandroid/apkeditor/core/OperationListener.java new file mode 100644 index 00000000..f8035584 --- /dev/null +++ b/src/main/java/com/reandroid/apkeditor/core/OperationListener.java @@ -0,0 +1,10 @@ +package com.reandroid.apkeditor.core; + +public interface OperationListener { + default void onStarted(String operationId, String operationName) {} + default void onProgress(int percent) {} + default void onMessage(String message) {} + default void onWarning(String message) {} + default void onError(String message, Throwable error) {} + default void onCompleted(OperationResult result) {} +} diff --git a/src/main/java/com/reandroid/apkeditor/core/OperationRegistry.java b/src/main/java/com/reandroid/apkeditor/core/OperationRegistry.java new file mode 100644 index 00000000..2a4b5c10 --- /dev/null +++ b/src/main/java/com/reandroid/apkeditor/core/OperationRegistry.java @@ -0,0 +1,21 @@ +package com.reandroid.apkeditor.core; + +import java.util.*; + +public final class OperationRegistry { + private final Map operations = new LinkedHashMap<>(); + + public OperationRegistry register(Operation operation) { + Objects.requireNonNull(operation, "operation"); + operations.put(operation.getId(), operation); + return this; + } + + public Operation get(String id) { + return operations.get(id); + } + + public Collection all() { + return Collections.unmodifiableCollection(operations.values()); + } +} diff --git a/src/main/java/com/reandroid/apkeditor/core/OperationResult.java b/src/main/java/com/reandroid/apkeditor/core/OperationResult.java new file mode 100644 index 00000000..f5dd2600 --- /dev/null +++ b/src/main/java/com/reandroid/apkeditor/core/OperationResult.java @@ -0,0 +1,29 @@ +package com.reandroid.apkeditor.core; + +public final class OperationResult { + private final boolean success; + private final String operationId; + private final long durationMillis; + private final Throwable error; + + private OperationResult(boolean success, String operationId, + long durationMillis, Throwable error) { + this.success = success; + this.operationId = operationId; + this.durationMillis = durationMillis; + this.error = error; + } + + public static OperationResult success(String operationId, long durationMillis) { + return new OperationResult(true, operationId, durationMillis, null); + } + + public static OperationResult failure(String operationId, long durationMillis, Throwable error) { + return new OperationResult(false, operationId, durationMillis, error); + } + + public boolean isSuccess() { return success; } + public String getOperationId() { return operationId; } + public long getDurationMillis() { return durationMillis; } + public Throwable getError() { return error; } +} diff --git a/src/main/java/com/reandroid/apkeditor/gui/GUIApplication.java b/src/main/java/com/reandroid/apkeditor/gui/GUIApplication.java new file mode 100644 index 00000000..afd5cb95 --- /dev/null +++ b/src/main/java/com/reandroid/apkeditor/gui/GUIApplication.java @@ -0,0 +1,14 @@ +package com.reandroid.apkeditor.gui; + +import javax.swing.SwingUtilities; + +public final class GUIApplication { + private GUIApplication() {} + + public static void main(String[] args) { + SwingUtilities.invokeLater(() -> { + MainWindow window = new MainWindow(); + window.setVisible(true); + }); + } +} diff --git a/src/main/java/com/reandroid/apkeditor/gui/MainWindow.java b/src/main/java/com/reandroid/apkeditor/gui/MainWindow.java new file mode 100644 index 00000000..0521cf1d --- /dev/null +++ b/src/main/java/com/reandroid/apkeditor/gui/MainWindow.java @@ -0,0 +1,144 @@ +package com.reandroid.apkeditor.gui; + +import com.reandroid.apkeditor.core.OperationRegistry; +import com.reandroid.apkeditor.gui.components.*; +import com.reandroid.apkeditor.gui.navigation.*; +import com.reandroid.apkeditor.gui.theme.*; +import com.reandroid.apkeditor.gui.view.*; +import com.reandroid.apkeditor.operations.OperationCatalog; + +import javax.swing.*; +import java.awt.*; +import java.util.LinkedHashMap; +import java.util.Map; + +public final class MainWindow extends JFrame { + private final OperationRegistry registry; + private final CardLayout cards = new CardLayout(); + private final JPanel content = Theme.panel(cards); + private final Navigator navigator = new Navigator(content, cards); + private final LogConsole logs = new LogConsole(); + private final ProgressPanel progress = new ProgressPanel(); + private final JLabel status = new JLabel("● READY"); + + public MainWindow() { + super("APKEditor · Futuristic"); + Theme.install(); + registry = OperationCatalog.create(); + + setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + setMinimumSize(new Dimension(1100, 720)); + setSize(1280, 800); + setLocationRelativeTo(null); + + JPanel root = Theme.panel(new BorderLayout()); + root.add(createTopBar(), BorderLayout.NORTH); + root.add(createCenter(), BorderLayout.CENTER); + root.add(createStatusBar(), BorderLayout.SOUTH); + setContentPane(root); + } + + private JComponent createTopBar() { + JPanel bar = Theme.panel(new BorderLayout()); + bar.setBorder(BorderFactory.createCompoundBorder( + BorderFactory.createMatteBorder(0, 0, 1, 0, Colors.BORDER), + Theme.empty(14))); + + JLabel brand = new JLabel("◈ APKEDITOR"); + brand.setFont(Fonts.SECTION); + brand.setForeground(Colors.PRIMARY); + + JLabel engine = new JLabel("CORE ENGINE"); + engine.setFont(Fonts.SMALL); + engine.setForeground(Colors.TEXT_MUTED); + + bar.add(brand, BorderLayout.WEST); + bar.add(engine, BorderLayout.EAST); + return bar; + } + + private JComponent createCenter() { + JPanel center = Theme.panel(new BorderLayout()); + center.add(createSidebar(), BorderLayout.WEST); + buildViews(); + center.add(content, BorderLayout.CENTER); + return center; + } + + private JComponent createSidebar() { + JPanel side = Theme.panel(new GridLayout(0, 1, 0, 6)); + side.setPreferredSize(new Dimension(190, 0)); + side.setBorder(BorderFactory.createCompoundBorder( + BorderFactory.createMatteBorder(0, 0, 0, 1, Colors.BORDER), + Theme.empty(14))); + + addNav(side, "DASHBOARD", Route.DASHBOARD); + addNav(side, "DECODE", Route.DECODE); + addNav(side, "BUILD", Route.BUILD); + addNav(side, "MERGE", Route.MERGE); + addNav(side, "REFACTOR", Route.REFACTOR); + addNav(side, "PROTECT", Route.PROTECT); + addNav(side, "INFO", Route.INFO); + addNav(side, "LOGS", Route.LOGS); + addNav(side, "SETTINGS", Route.SETTINGS); + return side; + } + + private void addNav(JPanel parent, String text, Route route) { + NeonButton button = new NeonButton(text); + button.setHorizontalAlignment(SwingConstants.LEFT); + button.addActionListener(e -> navigator.show(route)); + parent.add(button); + } + + private void buildViews() { + content.add(new DashboardView(id -> { + try { + navigator.show(Route.valueOf(id.toUpperCase())); + } catch (IllegalArgumentException ignored) {} + }), Route.DASHBOARD.name()); + + Map routes = new LinkedHashMap<>(); + routes.put("decode", Route.DECODE); + routes.put("build", Route.BUILD); + routes.put("merge", Route.MERGE); + routes.put("refactor", Route.REFACTOR); + routes.put("protect", Route.PROTECT); + routes.put("info", Route.INFO); + + for (var entry : routes.entrySet()) { + var operation = registry.get(entry.getKey()); + content.add(new OperationView( + entry.getKey(), operation, logs, progress, + busy -> status.setText(busy ? "● RUNNING" : "● READY")), + entry.getValue().name()); + } + + content.add(new LogsView(logs), Route.LOGS.name()); + + JPanel settings = Theme.panel(new BorderLayout()); + settings.setBorder(Theme.empty(24)); + JLabel title = new JLabel("SETTINGS"); + title.setFont(Fonts.TITLE); + title.setForeground(Colors.TEXT); + JLabel info = new JLabel("Theme, paths and engine preferences can be moved here later.
" + + "The important rule is: settings must not leak into operation code."); + info.setForeground(Colors.TEXT_MUTED); + settings.add(title, BorderLayout.NORTH); + settings.add(info, BorderLayout.CENTER); + content.add(settings, Route.SETTINGS.name()); + + navigator.show(Route.DASHBOARD); + } + + private JComponent createStatusBar() { + JPanel bottom = Theme.panel(new BorderLayout(10, 0)); + bottom.setBorder(BorderFactory.createCompoundBorder( + BorderFactory.createMatteBorder(1, 0, 0, 0, Colors.BORDER), + Theme.empty(8))); + status.setForeground(Colors.SUCCESS); + bottom.add(status, BorderLayout.WEST); + bottom.add(progress, BorderLayout.CENTER); + return bottom; + } +} diff --git a/src/main/java/com/reandroid/apkeditor/gui/components/FileSelector.java b/src/main/java/com/reandroid/apkeditor/gui/components/FileSelector.java new file mode 100644 index 00000000..c473da4f --- /dev/null +++ b/src/main/java/com/reandroid/apkeditor/gui/components/FileSelector.java @@ -0,0 +1,54 @@ +package com.reandroid.apkeditor.gui.components; + +import com.reandroid.apkeditor.gui.theme.Colors; +import com.reandroid.apkeditor.gui.theme.Fonts; + +import javax.swing.*; +import java.awt.*; +import java.io.File; + +public final class FileSelector extends JPanel { + private final JTextField field = new JTextField(); + + public FileSelector(String label, boolean directory) { + setLayout(new BorderLayout(8, 4)); + setBackground(Colors.BACKGROUND); + + JLabel title = new JLabel(label); + title.setFont(Fonts.SMALL); + title.setForeground(Colors.TEXT_MUTED); + + NeonButton browse = new NeonButton("BROWSE"); + browse.addActionListener(e -> choose(directory)); + + field.setFont(Fonts.BODY); + field.setBorder(BorderFactory.createLineBorder(Colors.BORDER)); + + JPanel center = new JPanel(new BorderLayout(6, 0)); + center.setOpaque(false); + center.add(field, BorderLayout.CENTER); + center.add(browse, BorderLayout.EAST); + + add(title, BorderLayout.NORTH); + add(center, BorderLayout.CENTER); + } + + private void choose(boolean directory) { + JFileChooser chooser = new JFileChooser(); + chooser.setFileSelectionMode(directory + ? JFileChooser.DIRECTORIES_ONLY + : JFileChooser.FILES_ONLY); + if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { + field.setText(chooser.getSelectedFile().getAbsolutePath()); + } + } + + public File getFile() { + String value = field.getText().trim(); + return value.isEmpty() ? null : new File(value); + } + + public void setFile(File file) { + field.setText(file == null ? "" : file.getAbsolutePath()); + } +} diff --git a/src/main/java/com/reandroid/apkeditor/gui/components/LogConsole.java b/src/main/java/com/reandroid/apkeditor/gui/components/LogConsole.java new file mode 100644 index 00000000..8ce9ba8c --- /dev/null +++ b/src/main/java/com/reandroid/apkeditor/gui/components/LogConsole.java @@ -0,0 +1,37 @@ +package com.reandroid.apkeditor.gui.components; + +import com.reandroid.apkeditor.gui.theme.Colors; +import com.reandroid.apkeditor.gui.theme.Fonts; + +import javax.swing.*; +import java.awt.*; + +public final class LogConsole extends JPanel { + private final JTextArea area = new JTextArea(); + + public LogConsole() { + setLayout(new BorderLayout()); + setBackground(Colors.SURFACE); + setBorder(BorderFactory.createLineBorder(Colors.BORDER)); + + area.setEditable(false); + area.setFont(Fonts.MONO); + area.setBackground(Colors.SURFACE); + area.setForeground(Colors.TEXT); + area.setLineWrap(true); + area.setWrapStyleWord(true); + + add(new JScrollPane(area), BorderLayout.CENTER); + } + + public void append(String message) { + SwingUtilities.invokeLater(() -> { + area.append(message + System.lineSeparator()); + area.setCaretPosition(area.getDocument().getLength()); + }); + } + + public void clear() { + area.setText(""); + } +} diff --git a/src/main/java/com/reandroid/apkeditor/gui/components/NeonButton.java b/src/main/java/com/reandroid/apkeditor/gui/components/NeonButton.java new file mode 100644 index 00000000..6c5ac7e1 --- /dev/null +++ b/src/main/java/com/reandroid/apkeditor/gui/components/NeonButton.java @@ -0,0 +1,25 @@ +package com.reandroid.apkeditor.gui.components; + +import com.reandroid.apkeditor.gui.theme.Colors; +import com.reandroid.apkeditor.gui.theme.Fonts; + +import javax.swing.*; +import java.awt.*; + +public class NeonButton extends JButton { + public NeonButton(String text) { + super(text); + setFont(Fonts.BODY); + setForeground(Colors.TEXT); + setBackground(Colors.SURFACE_2); + setFocusPainted(false); + setBorder(BorderFactory.createLineBorder(Colors.BORDER)); + setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + setMargin(new Insets(10, 14, 10, 14)); + } + + public void setAccent(boolean accent) { + setForeground(accent ? Colors.BACKGROUND : Colors.TEXT); + setBackground(accent ? Colors.PRIMARY : Colors.SURFACE_2); + } +} diff --git a/src/main/java/com/reandroid/apkeditor/gui/components/ProgressPanel.java b/src/main/java/com/reandroid/apkeditor/gui/components/ProgressPanel.java new file mode 100644 index 00000000..e633846d --- /dev/null +++ b/src/main/java/com/reandroid/apkeditor/gui/components/ProgressPanel.java @@ -0,0 +1,32 @@ +package com.reandroid.apkeditor.gui.components; + +import com.reandroid.apkeditor.gui.theme.Colors; + +import javax.swing.*; +import java.awt.*; + +public final class ProgressPanel extends JPanel { + private final JLabel status = new JLabel("READY"); + private final JProgressBar progress = new JProgressBar(); + + public ProgressPanel() { + setLayout(new BorderLayout(10, 0)); + setBackground(Colors.SURFACE); + setBorder(BorderFactory.createEmptyBorder(8, 10, 8, 10)); + status.setForeground(Colors.TEXT); + progress.setIndeterminate(false); + add(status, BorderLayout.WEST); + add(progress, BorderLayout.CENTER); + } + + public void start(String text) { + status.setText(text); + progress.setIndeterminate(true); + } + + public void complete(boolean ok) { + progress.setIndeterminate(false); + progress.setValue(100); + status.setText(ok ? "DONE" : "FAILED"); + } +} diff --git a/src/main/java/com/reandroid/apkeditor/gui/model/AppState.java b/src/main/java/com/reandroid/apkeditor/gui/model/AppState.java new file mode 100644 index 00000000..0216391e --- /dev/null +++ b/src/main/java/com/reandroid/apkeditor/gui/model/AppState.java @@ -0,0 +1,22 @@ +package com.reandroid.apkeditor.gui.model; + +import java.io.File; + +public final class AppState { + private File currentInput; + private File currentOutput; + private String activeRoute = "dashboard"; + private boolean busy; + + public File getCurrentInput() { return currentInput; } + public void setCurrentInput(File currentInput) { this.currentInput = currentInput; } + + public File getCurrentOutput() { return currentOutput; } + public void setCurrentOutput(File currentOutput) { this.currentOutput = currentOutput; } + + public String getActiveRoute() { return activeRoute; } + public void setActiveRoute(String activeRoute) { this.activeRoute = activeRoute; } + + public boolean isBusy() { return busy; } + public void setBusy(boolean busy) { this.busy = busy; } +} diff --git a/src/main/java/com/reandroid/apkeditor/gui/navigation/Navigator.java b/src/main/java/com/reandroid/apkeditor/gui/navigation/Navigator.java new file mode 100644 index 00000000..60052506 --- /dev/null +++ b/src/main/java/com/reandroid/apkeditor/gui/navigation/Navigator.java @@ -0,0 +1,18 @@ +package com.reandroid.apkeditor.gui.navigation; + +import java.awt.CardLayout; +import java.awt.Container; + +public final class Navigator { + private final Container container; + private final CardLayout layout; + + public Navigator(Container container, CardLayout layout) { + this.container = container; + this.layout = layout; + } + + public void show(Route route) { + layout.show(container, route.name()); + } +} diff --git a/src/main/java/com/reandroid/apkeditor/gui/navigation/Route.java b/src/main/java/com/reandroid/apkeditor/gui/navigation/Route.java new file mode 100644 index 00000000..26192063 --- /dev/null +++ b/src/main/java/com/reandroid/apkeditor/gui/navigation/Route.java @@ -0,0 +1,13 @@ +package com.reandroid.apkeditor.gui.navigation; + +public enum Route { + DASHBOARD, + DECODE, + BUILD, + MERGE, + REFACTOR, + PROTECT, + INFO, + LOGS, + SETTINGS +} diff --git a/src/main/java/com/reandroid/apkeditor/gui/theme/Colors.java b/src/main/java/com/reandroid/apkeditor/gui/theme/Colors.java new file mode 100644 index 00000000..f28fb036 --- /dev/null +++ b/src/main/java/com/reandroid/apkeditor/gui/theme/Colors.java @@ -0,0 +1,21 @@ +package com.reandroid.apkeditor.gui.theme; + +import java.awt.Color; + +public final class Colors { + private Colors() {} + + public static final Color BACKGROUND = new Color(8, 11, 18); + public static final Color SURFACE = new Color(15, 20, 30); + public static final Color SURFACE_2 = new Color(21, 28, 41); + public static final Color BORDER = new Color(39, 54, 74); + + public static final Color PRIMARY = new Color(40, 210, 255); + public static final Color SECONDARY = new Color(139, 92, 246); + public static final Color SUCCESS = new Color(52, 211, 153); + public static final Color WARNING = new Color(251, 191, 36); + public static final Color ERROR = new Color(248, 113, 113); + + public static final Color TEXT = new Color(231, 238, 248); + public static final Color TEXT_MUTED = new Color(139, 153, 174); +} diff --git a/src/main/java/com/reandroid/apkeditor/gui/theme/Fonts.java b/src/main/java/com/reandroid/apkeditor/gui/theme/Fonts.java new file mode 100644 index 00000000..709ae8c1 --- /dev/null +++ b/src/main/java/com/reandroid/apkeditor/gui/theme/Fonts.java @@ -0,0 +1,13 @@ +package com.reandroid.apkeditor.gui.theme; + +import java.awt.Font; + +public final class Fonts { + private Fonts() {} + + public static final Font TITLE = new Font("SansSerif", Font.BOLD, 24); + public static final Font SECTION = new Font("SansSerif", Font.BOLD, 15); + public static final Font BODY = new Font("SansSerif", Font.PLAIN, 13); + public static final Font SMALL = new Font("SansSerif", Font.PLAIN, 11); + public static final Font MONO = new Font("Monospaced", Font.PLAIN, 12); +} diff --git a/src/main/java/com/reandroid/apkeditor/gui/theme/Theme.java b/src/main/java/com/reandroid/apkeditor/gui/theme/Theme.java new file mode 100644 index 00000000..adb17d2a --- /dev/null +++ b/src/main/java/com/reandroid/apkeditor/gui/theme/Theme.java @@ -0,0 +1,43 @@ +package com.reandroid.apkeditor.gui.theme; + +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.border.EmptyBorder; +import java.awt.*; + +public final class Theme { + private Theme() { + } + + public static void install() { + UIManager.put("Panel.background", Colors.BACKGROUND); + UIManager.put("Label.foreground", Colors.TEXT); + UIManager.put("TextField.background", Colors.SURFACE_2); + UIManager.put("TextField.foreground", Colors.TEXT); + UIManager.put("TextField.caretForeground", Colors.PRIMARY); + UIManager.put("TextArea.background", Colors.SURFACE); + UIManager.put("TextArea.foreground", Colors.TEXT); + UIManager.put("Button.background", Colors.SURFACE_2); + UIManager.put("Button.foreground", Colors.TEXT); + UIManager.put("Button.font", Fonts.BODY); + UIManager.put("ScrollPane.border", BorderFactory.createEmptyBorder()); + } + + public static JPanel panel(LayoutManager layout) { + JPanel panel = new JPanel(layout); + panel.setBackground(Colors.BACKGROUND); + return panel; + } + + public static Border empty(int size) { + return new EmptyBorder(size, size, size, size); + } + + public static void card(JComponent component) { + component.setOpaque(true); + component.setBackground(Colors.SURFACE); + component.setBorder(BorderFactory.createCompoundBorder( + BorderFactory.createLineBorder(Colors.BORDER), + new EmptyBorder(16, 16, 16, 16))); + } +} diff --git a/src/main/java/com/reandroid/apkeditor/gui/view/DashboardView.java b/src/main/java/com/reandroid/apkeditor/gui/view/DashboardView.java new file mode 100644 index 00000000..6479ff6f --- /dev/null +++ b/src/main/java/com/reandroid/apkeditor/gui/view/DashboardView.java @@ -0,0 +1,60 @@ +package com.reandroid.apkeditor.gui.view; + +import com.reandroid.apkeditor.gui.components.NeonButton; +import com.reandroid.apkeditor.gui.theme.*; + +import javax.swing.*; +import java.awt.*; +import java.util.function.Consumer; + +public final class DashboardView extends JPanel { + public DashboardView(Consumer navigate) { + setLayout(new BorderLayout(0, 20)); + setBackground(Colors.BACKGROUND); + setBorder(Theme.empty(24)); + + JLabel title = new JLabel("APK EDITOR"); + title.setFont(Fonts.TITLE); + title.setForeground(Colors.TEXT); + + JLabel subtitle = new JLabel("Modern control center · core engine ready"); + subtitle.setFont(Fonts.BODY); + subtitle.setForeground(Colors.TEXT_MUTED); + + JPanel heading = Theme.panel(new BorderLayout()); + heading.add(title, BorderLayout.NORTH); + heading.add(subtitle, BorderLayout.SOUTH); + add(heading, BorderLayout.NORTH); + + JPanel grid = Theme.panel(new GridLayout(2, 3, 12, 12)); + addCard(grid, "DECODE", "APK → project", "decode", navigate); + addCard(grid, "BUILD", "project → APK", "build", navigate); + addCard(grid, "MERGE", "merge modules", "merge", navigate); + addCard(grid, "REFACTOR", "rename resources", "refactor", navigate); + addCard(grid, "PROTECT", "protect output", "protect", navigate); + addCard(grid, "INFO", "inspect APK", "info", navigate); + add(grid, BorderLayout.CENTER); + } + + private void addCard(JPanel parent, String title, String desc, + String route, Consumer navigate) { + JPanel card = Theme.panel(new BorderLayout(8, 8)); + Theme.card(card); + + JLabel t = new JLabel(title); + t.setFont(Fonts.SECTION); + t.setForeground(Colors.PRIMARY); + + JLabel d = new JLabel("" + desc + ""); + d.setForeground(Colors.TEXT_MUTED); + + NeonButton open = new NeonButton("OPEN"); + open.setAccent(true); + open.addActionListener(e -> navigate.accept(route)); + + card.add(t, BorderLayout.NORTH); + card.add(d, BorderLayout.CENTER); + card.add(open, BorderLayout.SOUTH); + parent.add(card); + } +} diff --git a/src/main/java/com/reandroid/apkeditor/gui/view/LogsView.java b/src/main/java/com/reandroid/apkeditor/gui/view/LogsView.java new file mode 100644 index 00000000..0a0bc761 --- /dev/null +++ b/src/main/java/com/reandroid/apkeditor/gui/view/LogsView.java @@ -0,0 +1,30 @@ +package com.reandroid.apkeditor.gui.view; + +import com.reandroid.apkeditor.gui.components.LogConsole; +import com.reandroid.apkeditor.gui.components.NeonButton; +import com.reandroid.apkeditor.gui.theme.*; + +import javax.swing.*; +import java.awt.*; + +public final class LogsView extends JPanel { + public LogsView(LogConsole console) { + setLayout(new BorderLayout(0, 10)); + setBackground(Colors.BACKGROUND); + setBorder(Theme.empty(24)); + + JPanel header = Theme.panel(new BorderLayout()); + JLabel title = new JLabel("OPERATION LOG"); + title.setFont(Fonts.TITLE); + title.setForeground(Colors.TEXT); + + NeonButton clear = new NeonButton("CLEAR"); + clear.addActionListener(e -> console.clear()); + + header.add(title, BorderLayout.WEST); + header.add(clear, BorderLayout.EAST); + + add(header, BorderLayout.NORTH); + add(console, BorderLayout.CENTER); + } +} diff --git a/src/main/java/com/reandroid/apkeditor/gui/view/OperationView.java b/src/main/java/com/reandroid/apkeditor/gui/view/OperationView.java new file mode 100644 index 00000000..2505aeca --- /dev/null +++ b/src/main/java/com/reandroid/apkeditor/gui/view/OperationView.java @@ -0,0 +1,123 @@ +package com.reandroid.apkeditor.gui.view; + +import com.reandroid.apkeditor.core.*; +import com.reandroid.apkeditor.gui.components.*; +import com.reandroid.apkeditor.gui.theme.*; + +import javax.swing.*; +import java.awt.*; +import java.io.File; +import java.util.function.Consumer; + +public final class OperationView extends JPanel { + private final String operationId; + private final Operation operation; + private final FileSelector input = new FileSelector("INPUT", false); + private final FileSelector output = new FileSelector("OUTPUT", true); + private final LogConsole logs; + private final ProgressPanel progress; + private final JButton runButton = new NeonButton("RUN OPERATION"); + private final Consumer busyState; + + public OperationView(String operationId, Operation operation, + LogConsole logs, ProgressPanel progress, + Consumer busyState) { + this.operationId = operationId; + this.operation = operation; + this.logs = logs; + this.progress = progress; + this.busyState = busyState; + + setLayout(new BorderLayout(0, 16)); + setBackground(Colors.BACKGROUND); + setBorder(Theme.empty(24)); + + JLabel title = new JLabel(operation.getName().toUpperCase()); + title.setFont(Fonts.TITLE); + title.setForeground(Colors.TEXT); + add(title, BorderLayout.NORTH); + + JPanel form = Theme.panel(new GridBagLayout()); + Theme.card(form); + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 0; c.gridy = 0; c.weightx = 1; c.fill = GridBagConstraints.HORIZONTAL; + c.insets = new Insets(8, 8, 8, 8); + form.add(input, c); + + c.gridy++; + form.add(output, c); + + c.gridy++; + c.anchor = GridBagConstraints.WEST; + runButton.setFont(Fonts.SECTION); + ((NeonButton) runButton).setAccent(true); + runButton.addActionListener(e -> run()); + form.add(runButton, c); + + add(form, BorderLayout.CENTER); + } + + private void run() { + if (!(operation instanceof LegacyOptionsOperation legacy)) { + logs.append("[ERROR] Unsupported operation adapter: " + operationId); + return; + } + + File in = input.getFile(); + File out = output.getFile(); + + if (in == null) { + logs.append("[WARN] Select an input first."); + return; + } + + try { + var options = legacy.getOptions(); + options.inputFile = in; + if (out != null && operationId.equals("decode")) { + options.outputFile = out; + } else if (out != null) { + options.outputFile = out; + } + + busyState.accept(true); + runButton.setEnabled(false); + logs.append("[START] " + operation.getName()); + progress.start(operation.getName()); + + Thread worker = new Thread(() -> { + try { + operation.execute(new OperationListener() { + public void onMessage(String message) { + logs.append("[INFO] " + message); + } + public void onWarning(String message) { + logs.append("[WARN] " + message); + } + public void onError(String message, Throwable error) { + logs.append("[ERROR] " + (message == null ? error : message)); + } + public void onCompleted(OperationResult result) { + SwingUtilities.invokeLater(() -> { + progress.complete(result.isSuccess()); + runButton.setEnabled(true); + busyState.accept(false); + logs.append(result.isSuccess() + ? "[DONE] " + operation.getName() + : "[FAILED] " + operation.getName()); + }); + } + }); + } catch (Exception ignored) { + // onCompleted/onError already report the failure. + } + }, "apkeditor-" + operationId); + worker.setDaemon(true); + worker.start(); + } catch (Exception ex) { + logs.append("[ERROR] " + ex.getMessage()); + runButton.setEnabled(true); + busyState.accept(false); + } + } +} diff --git a/src/main/java/com/reandroid/apkeditor/operations/OperationCatalog.java b/src/main/java/com/reandroid/apkeditor/operations/OperationCatalog.java new file mode 100644 index 00000000..317eb82c --- /dev/null +++ b/src/main/java/com/reandroid/apkeditor/operations/OperationCatalog.java @@ -0,0 +1,28 @@ +package com.reandroid.apkeditor.operations; + +import com.reandroid.apkeditor.core.OperationRegistry; +import com.reandroid.apkeditor.core.LegacyOptionsOperation; +import com.reandroid.apkeditor.compile.BuildOptions; +import com.reandroid.apkeditor.decompile.DecompileOptions; +import com.reandroid.apkeditor.info.InfoOptions; +import com.reandroid.apkeditor.merge.MergerOptions; +import com.reandroid.apkeditor.protect.ProtectorOptions; +import com.reandroid.apkeditor.refactor.RefactorOptions; + +/** + * Punto único para registrar las operaciones que ya existen en el motor. + * Aquí no se dibuja ninguna ventana. + */ +public final class OperationCatalog { + private OperationCatalog() {} + + public static OperationRegistry create() { + return new OperationRegistry() + .register(new LegacyOptionsOperation("decode", "Decode APK", new DecompileOptions())) + .register(new LegacyOptionsOperation("build", "Build APK", new BuildOptions())) + .register(new LegacyOptionsOperation("merge", "Merge APK", new MergerOptions())) + .register(new LegacyOptionsOperation("refactor", "Refactor", new RefactorOptions())) + .register(new LegacyOptionsOperation("protect", "Protect", new ProtectorOptions())) + .register(new LegacyOptionsOperation("info", "APK Info", new InfoOptions())); + } +} diff --git a/src/main/java/com/reandroid/commons/utils/ElapsedTime.java b/src/main/java/com/reandroid/commons/utils/ElapsedTime.java index 7f6b6997..75443bf2 100644 --- a/src/main/java/com/reandroid/commons/utils/ElapsedTime.java +++ b/src/main/java/com/reandroid/commons/utils/ElapsedTime.java @@ -85,4 +85,4 @@ private String msToDisplayTime(long l, boolean includeMs, boolean ignoreZero){ } return String.format(Locale.ENGLISH,"%02d:%02d:%02d", hr, min, sec); } -} \ No newline at end of file +} diff --git a/src/main/resources/apkeditor.properties b/src/main/resources/apkeditor.properties deleted file mode 100644 index ea8267a9..00000000 --- a/src/main/resources/apkeditor.properties +++ /dev/null @@ -1,4 +0,0 @@ -app.name=APKEditor -app.version=${version} -app.repo=https://github.com/REAndroid/APKEditor -app.description=Android binary resource files editor diff --git a/src/main/resources/color_names.txt b/src/main/resources/color_names.txt index 6d62e023..6d8716e3 100644 --- a/src/main/resources/color_names.txt +++ b/src/main/resources/color_names.txt @@ -1563,4 +1563,4 @@ #FFE4D69B,Zombie #FFA59B91,Zorba #FF044022,Zuccini -#FFEDF6FF,Zumthor \ No newline at end of file +#FFEDF6FF,Zumthor diff --git a/src/main/resources/protect_dic_dir_name.txt b/src/main/resources/protect_dic_dir_name.txt index 6606bb20..e3c6972b 100644 --- a/src/main/resources/protect_dic_dir_name.txt +++ b/src/main/resources/protect_dic_dir_name.txt @@ -24,4 +24,4 @@ res/values/integers.xml res/values/plurals.xml res/values/public.xml res/values/strings.xml -res/values/styles.xml" \ No newline at end of file +res/values/styles.xml" diff --git a/src/main/resources/protect_dic_file_name.txt b/src/main/resources/protect_dic_file_name.txt index 415e0c73..bd99cf95 100644 --- a/src/main/resources/protect_dic_file_name.txt +++ b/src/main/resources/protect_dic_file_name.txt @@ -10,4 +10,4 @@ classes.dex AndroidManifest.xml AndroidManifest -resources.arsc \ No newline at end of file +resources.arsc diff --git a/src/main/resources/strings/strings-ar.properties b/src/main/resources/strings/strings-ar.properties deleted file mode 100644 index 9c477cc5..00000000 --- a/src/main/resources/strings/strings-ar.properties +++ /dev/null @@ -1,125 +0,0 @@ -################################################################################################ -# Localized strings used by APKEditor -# File naming: -# strings-[language]-[country(optional)].properties -# default: -# strings.properties -# e.g. : strings-en-US.properties, strings-en.properties -# -# Content: The content is as per specification of java.util.Properties -# Encoding: utf-8 only. If utf-8 can not handle, use escaped hex encoding. -# format: -# name={VALUE} -# name: A unique string of characters starting with a-z , digits 0-9 and underscore '_' -# {VALUE}: the value -# -# -# Comment: New line starting with '#' character -# -# NOTES: -# 1 - Optionally, keep the list alphabetically sorted by name. -# 2 - If the name and {VALUE} is the same as default, the entry can be ignored -# -################################################################################################ -# Authors: github.com/REAndroid, -################################################################################################ - -app_version=استعراض معلومات الاصدار و الخروج -app_help=استعراض المساعدة والخروج -build_description=يبني الملف الثنائي لأندرويد من json/xml/raw. -build_example_1=[أساسي]\n java -jar APKEditor.jar b -i مسار/دليل_الإدخال -build_example_2=[تحديد الإخراج]\n java -jar APKEditor.jar b -i مسار/دليل_الإدخال -o مسار/الإخراج.apk -build_example_3=[استعادة التوقيعات]\n java -jar APKEditor.jar b -t sig -i مسار/الإدخال.apk -sig مسار/دليل_التوقيعات -build_example_4=[تحديد الإطار]\n java -jar APKEditor.jar b -i مسار/دليل_الإدخال -framework framework-res.apk -framework platforms/android-32/android.jar -build_no_cache=تجاهل ملفات .dex المخزنة مؤقتًا وإعادة بناء ملفات smali. -build_types=أنواع البناء، افتراضيًا يتم تحديد أنواع البناء عن طريق المسح السريع لملفات دليل الإدخال. القيم هي: -clean_meta=ينظف دليل META-INF مع كتلة التوقيع. -decode_description=يفك تشفير الموارد الثنائية لأندرويد إلى json/xml/raw قابلة للقراءة. -decode_example_1=[أساسي]\njava -jar APKEditor.jar d -i مسار/الإدخال.apk -decode_example_2=[تحديد الإخراج]\njava -jar APKEditor.jar d -i مسار/الإدخال.apk -o مسار/الإخراج.apk -decode_example_3=[تحديد نوع فك التشفير]\njava -jar APKEditor.jar d -t xml -i مسار/الإدخال.apk -decode_example_4=[تحديد ملف(ات) الإطار]\njava -jar APKEditor.jar d -i مسار/الإدخال.apk -framework framework-res.apk -framework platforms/android-32/android.jar -decode_example_5=[فك تشفير كتلة توقيع apk]\njava -jar APKEditor.jar d -t sig -i مسار/الإدخال.apk -sig مسار/دليل_التوقيعات -decode_types=أنواع فك التشفير: -decode_usage=d [الخيارات، الأعلام] -dump_dex_markers=يفرغ علامات dex (ينطبق فقط عند وضع smali). -duplicate_option_exception=خيار مكرر '%s' -empty_command_args_exception=أمر فارغ، قم بالتشغيل مع -h للحصول على المساعدة -empty_command_option_exception=خيارات فارغة، قم بالتشغيل مع `<الأمر>` -h للحصول على المساعدة -force_delete=فرض حذف مسار الإخراج. -framework_version_number=رقم إصدار الإطار المفضل -help_description=يعرض هذه المساعدة ويخرج. -help_main_footer=للحصول على مساعدة حول كل أمر قم بالتشغيل مع: -info_activities=يطبع اسم الفئة الرئيسية للنشاط. إذا كان في الوضع المفصل، يطبع جميع الأنشطة المعلنة بما في ذلك ``. -info_app_class_name=اسم فئة التطبيق. -info_app_icon=مسار/قيمة أيقونة التطبيق. إذا كان في الوضع المفصل، يطبع جميع التكوينات. -info_app_icon_round=مسار/قيمة أيقونة التطبيق الدائرية. إذا كان في الوضع المفصل، يطبع جميع التكوينات. -info_app_name=اسم التطبيق. إذا كان في الوضع المفصل، يطبع جميع التكوينات. -info_app_version_code=رمز إصدار التطبيق. -info_app_version_name=اسم إصدار التطبيق. -info_description=يطبع معلومات عن apk. -info_dex=يطبع معلومات dex. -info_example_1=[أساسي]\n java -jar APKEditor.jar info -i ملف.apk -info_example_2=[تحديد الإخراج والنوع]\n java -jar APKEditor.jar info -i مسار/الإدخال.apk -t json -v -o ملف_المعلومات.json -info_example_3=[طباعة نوع محدد فقط]\n java -jar APKEditor.jar info -i مسار/الإدخال.apk -resources -filter-type drawable -info_filter_type=يطبع فقط أسماء نوع المورد المحدد\n *ينطبق هذا فقط عند استخدام العلم '-resources'.\n *يمكن أن يكون متعددًا. -info_invalid_output_extension=امتداد ملف غير صالح! المتوقع '%s'، '%s' -info_configurations=طباعة التكوينات في APK. -info_languages=طباعة اللغات في APK. -info_locales=طباعة الإعدادات المحلية في APK. -info_list_files=قائمة الملفات داخل apk. -info_list_xml_files=قائمة ملفات xml المجمعة داخل apk. -info_min_sdk_version=الحد الأدنى لإصدار SDK. -info_package_name=اسم الحزمة (معرف التطبيق) من الملف التعريفي وإذا كان في الوضع المفصل، يطبع حزم جدول الموارد. -info_permissions=الأذونات. -info_print_types=أنواع/تنسيقات الطباعة: -info_res=يطبع إدخالات الموارد المحددة بواسطة أي من:\n 1) معرف المورد السداسي العشري أو العشري.\n 2) الاسم الكامل للمورد مثل @string/app_name.\n *يمكن أن يكون متعددًا. -info_resources=يطبع جميع الموارد -info_signatures=يطبع معلومات التوقيع. -info_signatures_base64=يطبع معلومات التوقيع مع شهادات base64. -info_strings=طباعة محتويات مجموعة السلاسل في جدول الموارد في APK. -info_target_sdk_version=إصدار SDK المستهدف. -info_verbose_mode=الوضع المفصل. -info_xml_tree=يطبع ملفات xml المجمعة في الأصول المعطاة.\n *يمكن أن يكون متعددًا -info_xml_strings=طباعة سلاسل ملفات xml المجمعة المعطاة.\n *يمكن أن يكون متعددًا -input_path=مسار الإدخال. -invalid_sig_parameter_combination=مجموعة معلمات غير صالحة!\nتم توفير دليل التوقيعات ولكن يفتقد: -t sig -invalid_type_format=سلسلة `<%s>` غير صالحة '%s' -keep_original_res=يحتفظ بمسارات ملفات res/* الأصلية:\n *ينطبق فقط عند فك التشفير إلى xml\n *سيتم وضع جميع ملفات res/* في الدليل ``\n *سيتم ربط المسارات النسبية بـ values/*xml -merge_description=يدمج ملفات apk المقسمة من الدليل أو ملفات apk المضغوطة مثل XAPK، APKM، APKS ... -merge_example_1=[أساسي]\n java -jar APKEditor.jar m -i مسار/الإدخال -o مسار/الإخراج.apk -missing_input_file=ملف الإدخال مفقود. -missing_sig_directory=دليل التوقيعات مفقود. -missing_value_exception=قيمة مفقودة لـ '%s' -no_dex_debug=يسقط جميع معلومات التصحيح من smali/dex. -no_such_directory=لا يوجد مثل هذا الدليل: '%s' -no_such_file=لا يوجد مثل هذا الملف: '%s'. -no_such_file_or_directory=لا يوجد مثل هذا الملف أو الدليل: '%s' -output_path=مسار الإخراج. اختياري، إذا لم يتم توفيره فسيتم إنشاء ملف جديد في نفس الدليل كإدخال -path_already_exists=المسار موجود بالفعل: '%s' -path_is_directory_expect_file=المسار هو دليل يتوقع ملفًا: '%s' -path_is_file_expect_directory=المسار هو ملف يتوقع دليلًا: '%s' -path_of_framework=مسار ملف الإطار (يمكن أن يكون متعددًا). -protect_description=يحمي/يشوه ملفات موارد apk. باستخدام تقنيات تشويه فريدة. -protect_example_1=[أساسي]\n java -jar APKEditor.jar p -i مسار/الإدخال.apk -o مسار/الإخراج.apk -protect_keep_type=الاحتفاظ بأسماء نوع مورد محددة (مثل drawable)، افتراضيًا يحتفظ فقط بنوع المورد ``.\n *يمكن أن يكون متعددًا -protect_skip_manifest=عدم حماية الملف التعريفي. -raw_dex=نسخ ملفات dex الخام / تخطي smali. -res_dir_name=يعين اسم الدليل الجذر لملفات الموارد. على سبيل المثال، للتشويه لنقل الملفات من 'res/*' إلى 'r/*' أو العكس. -refactor_description=يعيد هيكلة أسماء الموارد المشوهة -refactor_example_1=[أساسي]\n java -jar APKEditor.jar x -i مسار/الإدخال.apk -o مسار/الإخراج.apk -refactor_fix_types=يصحح أسماء نوع المورد بناءً على الاستخدامات والقيم -refactor_public_xml=مسار ملف xml لمعرفات الموارد (public.xml)\nيحمل الأسماء ويطبقها على الموارد من ملف 'public.xml' -signatures_path=مسار دليل التوقيعات. -split_json=يقسم resources.arsc إلى أجزاء متعددة وفقًا لإدخالات النوع (استخدم هذا للملفات الكبيرة) -title_commands=الأوامر: -title_app_description=محرر ملفات الموارد الثنائية لأندرويد -title_example=أمثلة: -title_flags=الأعلام: -title_options=الخيارات: -title_other_options=خيارات أخرى: -title_usage=الاستخدام: -unknown_command_exception=أمر غير معروف: '%s' -unknown_option_exception=خيار غير معروف: '%s' -validate_modules=يتحقق من نفس رقم الإصدار لـ base.apk مع ملفات apk المقسمة. -validate_resources_dir=التحقق من صحة اسم دليل الموارد\n(على سبيل المثال، إذا كان مسار ملف مورد drawable هو 'res/abc.png' فسيتم نقله إلى 'res/drawable/abc.png)' diff --git a/src/main/resources/strings/strings-fr.properties b/src/main/resources/strings/strings-fr.properties deleted file mode 100644 index 4c562976..00000000 --- a/src/main/resources/strings/strings-fr.properties +++ /dev/null @@ -1,137 +0,0 @@ -################################################################################################ -# Localized strings used by APKEditor -# File naming: -# strings-[language]-[country(optional)].properties -# default: -# strings.properties -# e.g. : strings-en-US.properties, strings-en.properties -# -# Content: The content is as per specification of java.util.Properties -# Encoding: utf-8 only. If utf-8 can not handle, use escaped hex encoding. -# format: -# name={VALUE} -# name: A unique string of characters starting with a-z , digits 0-9 and underscore '_' -# {VALUE}: the value -# -# -# Comment: New line starting with '#' character -# -# NOTES: -# 1 - Optionally, keep the list alphabetically sorted by name. -# 2 - If the name and {VALUE} is the same as default, the entry can be ignored -# -################################################################################################ -# Authors: github.com/REAndroid, -################################################################################################ - -app_version=Affiche les informations de versions. -app_help=Affiche cette aide et quitte. -build_description=Construit un fichier binaire Android à partir de fichiers json/xml/raw. -build_example_1=[Rudimentaire]\n java -jar APKEditor.jar b -i chemin/répertoire_d_entrée -build_example_2=[Spécifier la sortie]\n java -jar APKEditor.jar b -i chemin/répertoire_d_entrée -o chemin/sortie.apk -build_example_3=[Restaurer les signatures]\n java -jar APKEditor.jar b -t sig -i chemin/entrée.apk -sig chemin/répertoire_de_signatures -build_example_4=[Spécifier le framework]\n java -jar APKEditor.jar b -i chemin/répertoire_d_entrée -framework framework-res.apk -framework plates-formes/android-32/android.jar -build_no_cache=Ignore les fichiers .dex préconstruits en cache et reconstruit les fichiers smali. -build_types=Types de construction, par défaut les types de construction sont déterminés par un balayage rapide des fichiers du répertoire d'entrée. Valeurs: -clean_meta=Nettoie le répertoire META-INF ainsi que le bloc de signature. -# translation-required -# comment_level=[Baksmali] Définit le niveau de commentaire.\n 1) off : Aucun commentaire ne sera imprimé.\n 2) basic : Imprime les commentaires de base et les identifiants de ressources.\n 3) detail : Imprime les relations entre classes et méthodes.\n 4) full : Imprime tous les commentaires.\n **Par défaut = detail -decode_description=Décode les fichiers binaires de ressources Android aux formats json/xml/raw lisibles. -decode_example_1=[Basic]\njava -jar APKEditor.jar d -i chemin/entrée.apk -decode_example_2=[Spécifier la sortie]\njava -jar APKEditor.jar d -i chemin/entrée.apk -o chemin/sortie.apk -decode_example_3=[Spécifier le type de décodage]\njava -jar APKEditor.jar d -t xml -i chemin/entrée.apk -decode_example_4=[Spécifier les fichiers de framework]\njava -jar APKEditor.jar d -i chemin/entrée.apk -framework framework-res.apk -framework plates-formes/android-32/android.jar -decode_example_5=[Décoder le bloc de signatures d'un fichier APK]\njava -jar APKEditor.jar d -t sig -i chemin/entrée.apk -sig chemin/répertoire_de_signatures -decode_load_dex=Nombre de fichiers dex à charger à la fois.\nSi le nombre de fichiers dex de l'APK est supérieur à cette valeur, le décodeur charge un dex à la fois.\n *S'applique uniquement lorsque -dex-lib est défini sur interne.\n *Par défaut = 3\n *Voir ci-dessous. -decode_note_1=[internal] Générateur Dex\:\n* Prise en charge complète des fichiers dex jusqu'à 042.\n* Compression de fichier dex maximale.\n* Construction avec un ordre de sections dex similaire à celui de r8/dx.\n* Édition pratique des marqueurs dex, voir le fichier smali/classes/dex-file.json \n* Commentaires smali utiles supplémentaires : par exemple, hiérarchie classe/méthode.\n* Prise en charge des espaces dans le SimpleName de la classe, comme introduit dans dex 040+ -decode_note_2=[-load-dex] Pour afficher correctement la hiérarchie des classes/méthodes, il est nécessaire de charger tous les fichiers DEX simultanément. Cela peut entraîner une consommation de mémoire importante et une erreur « OutOfMemoryError ». Il est donc nécessaire de limiter le nombre de fichiers DEX à charger simultanément. Ce problème peut être contourner avec l'argument mémoire -Xmx, par exemple : java -Xmx8g -jar APKEditor.jar ... -decode_types=Types de décodage\: -decode_usage=d [Options, commutateurs] -dump_dex_markers=Extrait les marqueurs des fichiers DEX (s'applique uniquement en mode smali). -duplicate_option_exception=Option en double '%s'. -dex_lib=Bibliothèque Dex à utiliser\:\n 1) internal : utiliser la bibliothèque interne, prend en charge les versions dex jusqu'à 042.\n 2) jf : utiliser la bibliothèque de JesusFreke/smali, prend en charge les versions dex 035 et inférieures.\n *Par défaut = jf\n **AVERTISSEMENT : la valeur par défaut sera remplacée par « internal » dans les versions à venir.\n *Voir ci-dessous. -empty_command_args_exception=Commande imcomplète, utiliser l'option « -h » pour obtenir de l'aide. -empty_command_option_exception=Options manquantes, ajouter l'option « -h » pour obtenir de l'aide. -extract_native_libs=Définit l'attribut extractNativeLibs du manifeste et applique la compression des fichiers de bibliothèque (*.so).\n *Par défaut = manifest\n 1) manifest : lire et appliquer à partir du manifeste.\n 2) none : supprimer l'attribut du manifeste et stocker les bibliothèques compressées.\n 3) true : définir l'attribut du manifeste sur « true » et stocker les bibliothèques compressées.\n 4) false : définir l'attribut du manifeste sur « false » et stocker les bibliothèques non compressées avec un alignement 4096. -force_delete=Entraîne la suppression du chemin de sortie. -framework_version_number=Numéro de version de framework privilégié. -help_description=Affiche cette aide et quitte. -help_main_footer=Pour obtenir de l'aide sur chaque commande, exécutez\: -info_activities=Affiche le nom de la classe d'activité principale. En mode verbeux, affiche toutes les activités déclarées, y compris les « ». -info_app_class_name=Nom de la classe fille d' « Application ». -info_app_icon=Chemin/valeur de l'icône de l'application. En mode verbeux, affiche toutes les configurations. -info_app_icon_round=Chemin/valeur de l'icône ronde de l'application. En mode verbeux, affiche toutes les configurations. -info_app_name=Nom de l'application. En mode verbeux, affiche toutes les configurations. -info_app_version_code=Affiche la valeur de versionCode. -info_app_version_name=Affiche la valeur de versionName. -info_description=Affiche les informations du fichier APK. -info_dex=Affiche les informations des fichiers DEX. -info_example_1=[Rudimentaire]\n java -jar APKEditor.jar info -i fichier.apk\n -info_example_2=[Spécifier la sortie et le type]\n java -jar APKEditor.jar info -i chemin/entrée.apk -t json -v -o fichier_info.json\n -info_example_3=[Affiche uniquement le type spécifié]\n java -jar APKEditor.jar info -i chemin/entrée.apk -resources -filter-type drawable -info_filter_type=Affiche uniquement les types de ressources spécifiés\n *Cela s'applique uniquement lorsque le commutateur '-resources' est utilisé.\n *Peut être multiple. -info_invalid_output_extension=Extension de fichier invalide ! Attendu '%s', '%s' -info_configurations=Affiche les configurations de l'APK. -info_languages=Affiche les langues prises en charge dans l'APK. -info_locales=Affiche les paramètres régionaux pris en charge dans l'APK. -info_list_files=Liste les fichiers présents dans l'APK. -info_list_xml_files=Liste les fichiers XML compilés présents dans l'APK. -info_min_sdk_version=Version minimale du SDK. -info_package_name=Nom du paquet (identifiant de l'application) à partir du manifeste et, si le mode verbeux est activé, affiche les paquets de la table de ressources. -info_permissions=Autorisations. -info_print_types=Types/formats d'affichage\: -info_res=Affiche les entrées de ressources spécifiées par\:\n 1) ID de ressource hexadécimal ou décimal.\n 2) Nom de ressource complet e.g @string/app_name.\n *Peut être multiple. -info_resources=Affiche toutes les ressources. -info_signatures=Affihe les informations de signature. -info_signatures_base64=Affiche les informations de signature avec certificats base64. -info_strings=Affiche le contenu du « string pool » de la table de ressources de l'APK. -info_target_sdk_version=Version cible du SDK. -info_verbose_mode=Mode Verbeux. -info_xml_tree=Affiche les fichiers XML compilés des ressources données.\n *Peut être multiple -info_xml_strings=Affiche les chaînes des ressources XML compilées données.\n *Peut être multiple -input_path=Chemin d'entrée. -invalid_sig_parameter_combination=Combinaison de paramètres non valide !\nRépertoire de signatures fourni mais « -t sig » est manquant. -invalid_type_format=Chaîne <%s> '%s' non valide. -keep_original_res=Conserve les chemins d'accès aux fichiers res/*\:\n *S'applique uniquement lors du décodage en xml\n *Tous les fichiers « res/* » sont placés dans le répertoire « »\n *Les chemins relatifs seront liés aux fichiers « values/*xml ». -merge_description=Fusionne les fichiers APK fractionnés à partir d'un répertoire ou de fichiers APK archivés comme XAPK, APKM, APKS... -merge_example_1=[Rudimentaire]\n java -jar APKEditor.jar m -i chemin/entrée -o chemin/sortie.apk -missing_input_file=Fichier d'entrée manquant. -missing_sig_directory=Répertoire de signatures manquant. -missing_value_exception=Valeur manquante pour '%s'. -no_dex_debug=Supprime toutes les informations de débogage des fichiers smali/dex. -no_such_directory=Répertoire inexistant\: '%s'. -no_such_file=Fichier inexistant: '%s'. -no_such_file_or_directory=Fichier ou répertoire inexistant: '%s'. -output_path=Chemin de sortie. Facultatif, si non fourni, un nouveau fichier sera généré dans le même répertoire que celui d'entrée. -path_already_exists=Ce chemin existe déjà: '%s'. -path_is_directory_expect_file=Chemin d'un répertoire au lieu d'un fichier: '%s'. -path_is_file_expect_directory=Chemin d'un fichier au lieu d'un répertoire: '%s'. -path_of_framework=Chemin du fichier de framework (peut être multiple). -protect_confuse_zip=Obscurcie la structure du zip. Lorsque cette option est activée :\n * Les applications peuvent planter en cas d'accès direct aux fichiers APK, par exemple Class.getResourceAsStream().\n * Certains scanners APK peuvent signaler un « ZIP mal formé ». -protect_description=Protège/Masque les fichiers de ressources, en utilisant des techniques d'odfuscation uniques. -protect_dic_dir_name=Chemin vers un fichier texte contenant une liste de noms de répertoires séparés par une nouvelle ligne. -protect_dic_file_name=Chemin vers un fichier texte contenant une liste de noms de fichiers séparés par une nouvelle ligne. -protect_example_1=[Rudimentaire]\n java -jar APKEditor.jar p -i chemin/entrée.apk -o chemin/sortie.apk -protect_keep_type=Conserve les noms de type de ressource spécifiques (par exemple, drawable). Par défaut, conserve uniquement le type de ressource .\n *Peut être multiple -protect_skip_manifest=Préserve le manifeste. -raw_dex=Copie les fichiers DEX bruts / ignore smali. -res_dir_name=Définit le nom du répertoire des fichiers de ressources.\nPar exemple, pour l'obfuscation, assure le déplacement des fichiers de « res/* » vers « r/* » ou vice versa. -refactor_description=Refactorise les noms de ressources obscurcis. -refactor_example_1=[Rudimentaire]\n java -jar APKEditor.jar x -i chemin/entrée.apk -o chemin/sortie.apk -refactor_fix_types=Corrige les noms des types de ressources en fonction de leurs utilisations et de leur valeurs. -refactor_public_xml=Chemin du fichier des IDs de ressources « public.xml ».\nLes noms seront appliqués aux ressources. -signatures_path=Chemin du répertoire de signatures. -smali_registers=[Baksmali] Utilise la directive « .registers » au lieu de la directive par défaut « .locals ». -split_json=Divise « resources.arsc » en plusieurs parties selon le type d'entrée (utiliser cette option pour les fichiers volumineux). -title_commands=Commandes\: -title_app_description=Éditeur de fichiers binaires de ressources Android -title_example=Exemples\: -title_flags=Commutateurs\: -title_options=Options\: -title_other_options=Autres options\: -title_notes=Notes\: -title_usage=Utilisation\: -unknown_command_exception=Commande inconnue\: '%s' -unknown_option_exception=Option inconnue\: '%s' -validate_modules=Exige la même valeur « versionCode » pour le fichier base.apk et les fichiers APK fractionnés. -validate_resources_dir=Valide le nom du répertoire de ressources \n(par exemple, si le chemin d'un fichier de ressources drawable est « res/abc.png », il sera déplacé vers « res/drawable/abc.png »). diff --git a/src/main/resources/strings/strings.properties b/src/main/resources/strings/strings.properties deleted file mode 100644 index 0fffe57e..00000000 --- a/src/main/resources/strings/strings.properties +++ /dev/null @@ -1,141 +0,0 @@ -################################################################################################ -# Localized strings used by APKEditor -# File naming: -# strings-[language]-[country(optional)].properties -# default: -# strings.properties -# e.g. : strings-en-US.properties, strings-en.properties -# -# Content: The content is as per specification of java.util.Properties -# Encoding: utf-8 only. If utf-8 can not handle, use escaped hex encoding. -# format: -# name={VALUE} -# name: A unique string of characters starting with a-z , digits 0-9 and underscore '_' -# {VALUE}: the value -# -# -# Comment: New line starting with '#' character -# -# NOTES: -# 1 - Optionally, keep the list alphabetically sorted by name. -# 2 - If the name and {VALUE} is the same as default, the entry can be ignored -# -################################################################################################ -# Authors: github.com/REAndroid, -################################################################################################ - -app_version=Displays version information and exit -app_help=Displays this help and exit -build_description=Builds android binary from json/xml/raw. -build_example_1=[Basic]\n java -jar APKEditor.jar b -i path/input_directory -build_example_2=[Specify output]\n java -jar APKEditor.jar b -i path/input_directory -o path/output.apk -build_example_3=[Restore signatures]\n java -jar APKEditor.jar b -t sig -i path/input.apk -sig path/signatures_dir -build_example_4=[Specify framework]\n java -jar APKEditor.jar b -i path/input_directory -framework framework-res.apk -framework platforms/android-32/android.jar -build_no_cache=Ignore built cached .dex files and re-build smali files. -build_types=Build types, By default build types determined by quick scanning of input directory files. Values are\: -clean_meta=Cleans META-INF directory along with signature block. -comment_level=[Baksmali] Sets the comment level.\n 1) off : No comment will be printed.\n 2) basic : Prints basic and resource id comments.\n 3) detail : Including , Prints class & method relation comments.\n 4) detail2 : Including , Prints encoded hex strings with literal as comment.\n 5) full : Prints all comments.\n **Default = detail -decode_description=Decodes android resources binary to readable json/xml/raw. -decode_dex_profile=Decodes dex profile binary files under assets/dexopt to readable json files. -decode_example_1=[Basic]\njava -jar APKEditor.jar d -i path/input.apk -decode_example_2=[Specify output]\njava -jar APKEditor.jar d -i path/input.apk -o path/output.apk -decode_example_3=[Specify decode type]\njava -jar APKEditor.jar d -t xml -i path/input.apk -decode_example_4=[Specify framework file(s)]\njava -jar APKEditor.jar d -i path/input.apk -framework framework-res.apk -framework platforms/android-32/android.jar -decode_example_5=[Decode apk signature block]\njava -jar APKEditor.jar d -t sig -i path/input.apk -sig path/signatures_dir -decode_no_cache=Do not create dex .cache files. -decode_load_dex=Number of dex files to load at a time.\nIf the apk dex files count greater than this value, then the decoder loads one dex at a time.\n *Applies only when -dex-lib set to internal.\n *Default = 3\n *See below. -decode_note_1=[internal] Dex builder\:\n* Fully supports dex files up to 042.\n* Highest dex file compression.\n* Builds with similar dex-section order as r8/dx.\n* Convenient dex markers editing, see file smali/classes/dex-file.json \n* Additional helpful smali comments: e.g class/method hierarchy.\n* Supports whitespaces on class simple name as introduced on dex 040+ -decode_note_2=[-load-dex] To print correct class/method hierarchy, it is necessary to load all dex files at once. This may result high memory consumption and could fail with "OutOfMemoryError" thus you are required to limit the number of dex files to load at a time. You can overcome this problem with -Xmx memory arg e.g java -Xmx8g -jar APKEditor.jar ... -decode_types=Decode types\: -decode_usage=d [Options, flags] -dump_dex_markers=Dumps dex markers (applies only when smali mode). -duplicate_option_exception=Duplicate option '%s' -dex_lib=Dex library to use\:\n 1) internal : Use internal library, supports dex versions up to 042.\n 2) jf : Use library by JesusFreke/smali, supports dex versions 035 and below.\n *Default = internal\n *See below. -dex_protect_level=Dex protection level (0-5).\n 0 - Off\n 1 - Basic\n 2 - Normal (Not implemented yet)\n 3 - High (Not implemented yet)\n 4 - Max (Not implemented yet)\n * Default 0 -empty_command_args_exception=Empty command, run with -h to get help -empty_command_option_exception=Empty options, run with -h to get help -encode_dex_profile=Encodes decoded dex profile json files to binary assets/dexopt files. -extract_native_libs=Sets extractNativeLibs attribute on manifest and applies compression of library files (*.so).\n *Default = manifest\n 1) manifest: read and apply from manifest.\n 2) none: remove attribute from manifest and store libraries compressed.\n 3) true: set manifest attribute 'true' and store libraries compressed.\n 4) false: set manifest attribute 'false' and store libraries un-compressed with 4096 alignment. -force_delete=Force delete output path. -framework_version_number=Preferred framework version number -help_description=Displays this help and exit. -help_main_footer=To get help about each command run with\: -info_activities=Prints main activity class name. If verbose mode, prints all declared activities including . -info_app_class_name=Application class name. -info_app_icon=App icon path/value. If verbose mode, prints all configurations. -info_app_icon_round=App round icon path/value. If verbose mode, prints all configurations. -info_app_name=App name. If verbose mode, prints all configurations. -info_app_version_code=App version code. -info_app_version_name=App version name. -info_description=Prints information of apk. -info_dex=Prints dex information. -info_example_1=[Basic]\n java -jar APKEditor.jar info -i file.apk -info_example_2=[Specify output and type]\n java -jar APKEditor.jar info -i path/input.apk -t json -v -o info_file.json -info_example_3=[Print only specific type]\n java -jar APKEditor.jar info -i path/input.apk -resources -filter-type drawable -info_filter_type=Prints only the specified resource type names\n *This applies only when flag '-resources' used.\n *Can be multiple. -info_invalid_output_extension=Invalid file extension! Expected '%s', '%s' -info_configurations=Print the configurations in the APK. -info_languages=Print the languages in the APK. -info_locales=Print the locales in the APK. -info_list_files=List files inside apk. -info_list_xml_files=List compiled xml files inside apk. -info_min_sdk_version=Minimum SDK version. -info_package_name=Package name(application id) from manifest and if verbose mode, prints resource table packages. -info_permissions=Permissions. -info_print_types=Print types/formats\: -info_res=Prints resource entries specified by either of\:\n 1) Hex or decimal resource id.\n 2) Full resource name e.g @string/app_name.\n *Can be multiple. -info_resources=Prints all resources -info_signatures=Prints signature information. -info_signatures_base64=Prints signature information with base64 certificates. -info_strings=Print the contents of the resource table string pool in the APK. -info_target_sdk_version=Target SDK version. -info_verbose_mode=Verbose mode. -info_xml_tree=Prints the compiled xmls in the given assets.\n *Can be multiple -info_xml_strings=Print the strings of the given compiled xml assets.\n *Can be multiple -input_path=Input path. -invalid_sig_parameter_combination=Invalid parameter combination!\nSignatures directory provided but missing: -t sig -invalid_type_format=Invalid <%s> string '%s' -keep_original_res=Keeps original res/* file paths\:\n *Applies only when decoding to xml\n *All res/* files will be placed on dir \n *The relative paths will be linked to values/*xml -merge_description=Merges split apk files from directory or compressed apk files like XAPK, APKM, APKS ... -merge_example_1=[Basic]\n java -jar APKEditor.jar m -i path/input -o path/output.apk -missing_input_file=Missing input file. -missing_sig_directory=Missing signatures directory. -missing_value_exception=Missing value for '%s' -no_dex_debug=Drops all debug info from smali/dex. -no_such_directory=No such directory: '%s' -no_such_file=No such file: '%s'. -no_such_file_or_directory=No such file or directory: '%s' -output_path=Output path. Optional, if not provided then a new file will be generated on same directory as input -path_already_exists=Path already exists: '%s' -path_is_directory_expect_file=Path is a directory expecting file: '%s' -path_is_file_expect_directory=Path is a file expecting directory: '%s' -path_of_framework=Path of framework file (can be multiple). -protect_confuse_zip=Confuse zip structure. When this turned on:\n * Apps might crash if accessing apk files directly e.g Class.getResourceAsStream().\n * Some apk scanners might flag it as "Malformed zip" -protect_description=Protects/Obfuscates apk resource files. Using unique obfuscation techniques. -protect_dic_dir_name=Path to a text file containing a list of directory names separated by new line. -protect_dic_file_name=Path to a text file containing a list of file names separated by new line. -protect_example_1=[Basic]\n java -jar APKEditor.jar p -i path/input.apk -o path/output.apk -protect_keep_type=Keep specific resource type names (e.g drawable), By default keeps only resource type.\n *Can be multiple -protect_skip_manifest=Do not protect manifest. -raw_dex=Copy raw dex files / skip smali. -res_dir_name=Sets resource files root dir name. e.g. for obfuscation to move files from 'res/*' to 'r/*' or vice versa. -refactor_description=Refactors obfuscated resource names -refactor_example_1=[Basic]\n java -jar APKEditor.jar x -i path/input.apk -o path/output.apk -refactor_fix_types=Corrects resource type names based on usages and values -refactor_public_xml=Path of resource ids xml file (public.xml)\nLoads names and applies to resources from 'public.xml' file -remove_annotation=[Baksmali] Type name of annotation to remove from dex\n e.g: -remove-annotation Lkotlin/Metadata;\n *Can be multiple. -signatures_path=Signatures directory path. -smali_registers=[Baksmali] Use ".registers" directive instead of the default ".locals". -split_json=Splits resources.arsc into multiple parts as per type entries (use this for large files) -title_commands=Commands\: -title_app_description=Android binary resource files editor -title_example=Examples\: -title_flags=Flags\: -title_options=Options\: -title_other_options=Other options\: -title_notes=Notes\: -title_usage=Usage\: -unknown_command_exception=Unknown command\: '%s' -unknown_option_exception=Unknown option\: '%s' -validate_modules=Validates for same versionNumber of base.apk with split apk files. -validate_resources_dir=Validate resources dir name\n(eg. if a drawable resource file path is 'res/abc.png' then it will be moved to 'res/drawable/abc.png)' From 66272864e2f49d766530c63407bead519d683d80 Mon Sep 17 00:00:00 2001 From: victorh028 Date: Sun, 4 Oct 2026 17:01:24 +0500 Subject: [PATCH 29/29] UI --- APKEditor-futuristic-base.zip | Bin 135691 -> 0 bytes apkeditor-futuristic-base/ARCHITECTURE.md | 41 ----- .../PROJECT_INVENTORY.json | 6 - .../README_GUI_ARCHITECTURE.md | 102 ------------- src/main/resources/apkeditor.properties | 4 + .../resources/strings/strings-ar.properties | 125 ++++++++++++++++ .../resources/strings/strings-fr.properties | 137 +++++++++++++++++ src/main/resources/strings/strings.properties | 141 ++++++++++++++++++ 8 files changed, 407 insertions(+), 149 deletions(-) delete mode 100644 APKEditor-futuristic-base.zip delete mode 100644 apkeditor-futuristic-base/ARCHITECTURE.md delete mode 100644 apkeditor-futuristic-base/PROJECT_INVENTORY.json delete mode 100644 apkeditor-futuristic-base/README_GUI_ARCHITECTURE.md create mode 100644 src/main/resources/apkeditor.properties create mode 100755 src/main/resources/strings/strings-ar.properties create mode 100755 src/main/resources/strings/strings-fr.properties create mode 100644 src/main/resources/strings/strings.properties diff --git a/APKEditor-futuristic-base.zip b/APKEditor-futuristic-base.zip deleted file mode 100644 index 46b4a5a77cb054bb20f4d21fec313a10ed09f23b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135691 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

%tyMw zpoL+%A*YXCcU`zAcz3L}#;lsa4;QR128_iHi}u}Hf7!9gmyCGDjaWiKN79yl_H=${ z>^J2XB-uzJ(~B!*7=0Yprcre)EjG5v2Sr6@n*oU`GZd89YY&ADTwv?TZD z-^NMa@rSTLnQY=ds9ZM$-9na+3J%gDuAE0D7>sNqz~!3%Jd&k@su#%LC#s8=6}?ig z6Zm*D`tNot8v}7`jq=G5RY%-@GHE~A6h^D)cME>8r2du1u4LJdm@+h>Ml1ahC!$_V zw4lc9lsrN` z1zsXp8pnV$s)i3a65JU%CDzP(p-FQ$;mU%oAMpIC`rRUz!VFvEAUSyIq$NW}_Ru}c zmNt>?EE%oxt5kUKXfg2lrP@x$uMh^^jxwbVDOgf^SkV#QAU4fPPm})_lBMhxs~mXi zxnlLDpE|F3mFkMoRt!L;&>muf2jwO=h@;ieVIO6)TM1n0nmwd1p7dBYEI^_Ppn8W; zU`^X#(6!+enl7l29|b25dx-;J_q@+zLO4q2?DykzNmWjA2Xf@Tnw$L}ti4l|Xzh|L zTCP>LZQHhO+qP}nwr#JnZDW;fYn}SLPoL3y-}|^<=G%PxMr340X2fi$p0M#dBS&6N z?yTo$vQJw8JPU>BE1$t}z3m-NoELQfGU?OFmm@z$FVfL~9OK<0jrizw+rMxAc%--w zOhNzvG!Oy+DEtRDe{4(~%}nTI{`vlQAZCxI%|Bw7+u1po=40Ml6zvY{OAh zX~Shg_Msp~&l@5`{0((vF>>ezvCK zyz~|AV`C4mUWfz&yE0GUbTDyT3h~K13DV|@nLUb8nR8ElIT(n)rf}I9XC9Y0( z*yAYqk>{+P`X^kj923nAt@-z_qoHrMB|TA3SOTYH#TtQrXrrKUcZkrQ-;?VoM`9|2 zC>3k<#Jcn(kR87A$w2U`cUrC=@JnO&p`@Tfsd%@4+7yu4JeaZ)J4C>0qphwJ4Ig7uA z?98V`w(L_K?Oi!oFwg|sIl_)(%rYg;!?bvwV!d+p;OwHTW2W}0#M9zQ5n^<8tMN?| zT?7e`boBd-3>T<3$q_-GsknSBh!yL`>w0iWZAbfMMPV=rFaP$}@$B={e2_s@RiP?KtnU}Bu)vZU!?3;}>_O~}1(=mi zrHui@?Hx^S3f{IQ-xp2>=Iec|iHdvkaZZ8I1w~FDzhCs7nDGhH0wlP+3$hbLr9t`BNPlgpB<7%^#MqYp{lEt%;7Wd`FkK& zyO@Blkyg5cnF0=`R^Wo!$`0oB8 zVUaK0vD=z#2ic0=5KtM1!icfM4{E;)xY;N!415N=f2LV7kjz#=@X94s`@ z(VzP{^+ws?bIFVv2XPD+R%^|lL?Ny8Ig$+(fT-}C-l@_yZ8tBOBG@@BCtOQWWhtC4 z_Ows1&xIA9Ufc{oYQnf=eW9{N?5N~+S*In#O^|7{84Oq&Maf@LS?c}#Q?>+FRjM1$ z8aWuso$k&6o5bY-gFUhR7cFl?E#D^n)n|0~hbx}KDqfY<)O$D3AT+@JxZt>w`gB0heZO_#@gb=+)m5AwE*IZso&KIafa>@zrb!AQujNZr%& zxl)fFe)KVpNILobb2o{N8qr#txd{hhlg`} z7fJxde;&>LXh=l}{Z*jiGxopwu!5g(-x2QjhodYN)`P%Z_ifjJ+pzBexh@q_%d;b2 zl&AZD?X3t1zH}g&e#chH>`zrgbPg^c$=*efnx1KivdxvkXyyR<#*);F9HYu$q6T7)G-?WAm0%whG%y-hC+fD*kORr_qUa>;NQqd@d9N#hfJQ*mB zH+6gmI7ooMf$w6fjnI22wn>f3k5Fe1p~=;xk8|R zQ8Cy4O-Z*bW5!l1IEPzUg&}r1N}pS;$D-at3dY85k*y%JT~2r~s_cSK+SfqfbU1$O zws8$Ka#_l&ami(CaGRN5VFg*3kYvjcL>#Ws)FCh`(MuBG!zfAagv*%1G2jz+xK=XY zb5P@9%o?4?K=v2HBcukYv8sv^`cW@ygXvqXcUR-9_hM>GH&Imf_nT{|l4>5`pMo?7+PvIfh?aV>Y5(EWAz zc>Y*W9>^3I7PQ(bFx->e_k0qsF3nGb1KZrTkW6$<)RWOK2=&b^C>Zl^ei&k}YY2}Y*stTE887%u-0RUjOM%IlqfqNJ)`GmeEJoD&r~l1^V}P4+y$BHtxF1r;{~B{%zu4uY^m zR?ESl@wWM`AWy)iT@=ZkHs3?E8;-eYqKA~h!asRKvYC*rRUlsc%Ab2^0o)IEw^{p~ z!ZB`py3YpMd3O`zxA5kF91s64J|Fq8FMBBsQZL3{E*LMUR75}JrOX*L2-fxw%#S5@ z?c(4&80|D^YM66&^Z|a!O?)N_%+usbje`wnLYj3Mm~aA(mM(qH7!Kd6!C`%N^o4E% zabkTo{+tlPEV{!HY2?alS6$WNPZ*l?UR|)qQI(H@>eh`BQr~^M^&Mw@pAR!J$9Cv* zd4{%?>E!8{qvUl7!IcQ|b0{gaU=fcCn5|I7$nF_4PfAqgX=-sEkkez-s{sh_O4VCe!0Y8tz7)x=u* zNsn#Ywi(Z{U7);9UpMdh3LitZIBd+n0q3D79IF{LpogNi^yc_;eQE=tmAId6BS5L2 zAsC5a(PD?frfuvq=V;O@U2q`L!5T?NwdhcXA_y_Kt4q7Vya%%dNM>3TbAMZ2Ov%=T}y zbaO+2peh`y&48SAM*=0ayovjT2eCY*6ACMpPR8bBJ6p?-!ZgXZLkp8PlMMzxQzAKC@I+Br@E@97PPC&HT&ZWQswA z%X77UNx`5{1K5PrjoyHZUg9^A{0NY)pd2|H7`s8>*TYVnuWB*16B>G zQZK3miYOns3VhH!Og$FGskO-*Y_-lhf=60GbF4Ty=`erWWOGJK+tZsBDfYruWt%iN z2fm-EjN|4ms1G?eo0K3fIZUXu-6~FGm!fE1Vn5-i)g{YNd&}n={8iirGy?BdpC87f z_|%MxsT3esj2yYIfoZ!{)AFens7of>1zTxA3sJT)u}(l^Q{=!ZL$*E5vOm!W={eXs zkF1^U^Z9F@t|{SMLYccS1qR=4QyV_cM2e#0EpT&)PR^Wyh`LM+@{IHj_71bH2_8nM zph{})bFi@^>%(4KAtGJ=c-`E5L42vW)MfJbw?JSG5C)`jGG7%m!WNark~Hnu)hyJN zu9V{|?`uO>-`42B4dmIiZm6lFFCy2oE?2E9{rJi40Eey88)P7q2cCek#|~H5I4uhM zj-}YbR|k?B$p25?3@y{~eeRDTuiB3htNwqWv$V4}as00U3n#k&XTvIF;A~)RXZGLD z?8ySM7xeIOZ#?xSLTZTY zj*IHCDCexN1+7@jqxGxwr55}!wT`*od*x+$T-Vi%6fRbD^-3(L~330>~iyt@M)xD%pIRVx@=*Npg|9Jm3 z99lrTt;CP%dxjvwp)pf(->$4JL8>y+WV26Zp|{W?gqUlc)Q^PWvVZj6%99Ce^*yx} z3TGnljWuCS_;tk05j1Y1)jzz?=>y@IUSZAoRWm86NJDDV{lfix;2Y?RB|C5T&{6i6 zrj88#F#tL4NR4JpKv<4`T?g$>9l8V{?BxUmuH(fpzV%mar{>1XHwYoG-Ex~{74N^* zj(%`ihy9=00R;7*v52sDv~&Im`1^^cur+mY`k%>zs*ck?h2uo+^41vBlG6j)rc7J1 z?B^UNV*IMvZs5l{g{UGCx+LfGrHipOA)wi#(-#0MXPd|Cc@SFHWe=rKy)x%`eL|4_ zy8kF^QfjPS2PKL=;iCV`m{^g*?I%-YQTt7{cf@g?8JyEAV`nd(%*i})=sHid*<##0cc#qQ8B%nq-XG3P-%H>` zQ)F;I$}2|v%&oHs3ku!nwZi&jFG*2@fi&)dC1KTiXo4iHr9eiY5YOots%nD3T0Hy{ zE87ejKhE(W3iL42@Ff)4_(41Jcc9Hb9oC3hK51euvZBixqv^X*YBdH80UZR z=+Ey|OGRR54V)YIv7m_xAh9L|$^3+T4=f3*ceWXypd0JC*_eqvWFg|g{`1MYRT8t2Y((%Q*xymN-#Co(bX!b1IHNNb}c%@ z)G_bUOSv2e9@)38W?R;tcm2Uom!^?$nKfZG)4<{n-now3O>^=Zy_|rqQuoSasoRro z_T6-gGZ%E}P=ROVcXyL+=)aVK*n9A@R4`B8h`&`1O_b;7Di6^V&rovN>d+!SR!WhR zcTje|VOlbWqQMu^B9fVdvbx9*UbXI~CjqCx_U$e_8)$~bxA@@f$5H{Yy@?IXMafRI zYho8)(icoE6}Y;!mo1!6)fHbTf`vny3t7E6I{?}MtKs%0y*kC!`RyE)S9$2*170}x zpu3&;bTp0ed4D~*mDxZVayCDhYV!Dn9TxP=9IEPTYASLWl&ax_BV$0G7BEVBxO^i} z2e$*;(dkHh#$w``+g|3ZjUwuS`)QY5`eOi^TQ|Sx0PN-DrFiH`+TJ0m{E#!ysX?=y zmlv8rsRyD=F3AC|M7>ORENzWEcFmw+bA((G}?1Kz)`|CfDcfm8fMAxiv!it&G- z;QSA$2%ESII64}5$QyWA+Zh=D3&zx_82n@Z{dKM9z*H|_i^$;`U{Ic>ADLq?qSzIl zWGbM5-0Ym%F;*<9=(@%7*GDX(m4w8#%K!*5;kfJIpvz79Lj_nD@X@4Gl{**f_MPT5 z*R>1YiD|afmmKZtVv=82@;3^BD-}^d28`XuRE)%K^JdlZgc*mKUS)d@vikOK%x5~Wq)DXxt3q3mz#oFz%UF9l zwa8MRY#w4QX^hkgRN+4iX)!G>{jWd4m~YRrJonl(Nx=ePMm_AEYq{ zLqeC$v`3H*O)|je0>JH4!pR~cV_C&?t8_2KbY5dXTpv%f2IN{@_O}Q$He}D znr1lO(urJubH^$&(GGW{A;^#nYVtE=A>IQ59GM}ECp&?{3l>y z?;nc#CO11{!e+@Pehi)!HgQH}9Fivf1s>g=Fd>)1jGn1mB=A|x$f6${$BVXs2Z=*I zyaH^henan^9m+TWoDWJv_6>kXQK6t={^keuNt4+T?JE7(SnAj;l^wO9+<2 zbvH?H%VhlLU=zX81@QYeiJ!mfA@gH@2klVxtqX`DhGOU3$16``m0mu z?t96q?kv2b0+G686RcA!W;bp|r#OC*gh&f3JkJ5X1K6#!40@FMnmkfy1|p_139U8dlnMtkVM6uq2%t@{zWYu^_RHVt{W8f6A3 ziknmpSeQwR;@^cbAt} zaO#S8^SwY)boQYlx_KYr4fR?Iw~!fKfRt!S|K-!#@BlI7&rBEt}xNoi7Y@uGp zC-4KHgJMSUHHhNIcno5ATm4Z`AY3778hZ$2Zj|hCcmgs`k$lJzI{x3v_?A`}Z%myD z3#+wf|3!l~w6cC<#oTkhX!NhEapFcStVX9st$U+P^^)u?*T^a6GvwdBME}qrFQ8P! zns}RtYJCoJ80r;q)++2PZKp{SZjd5ZRx?Z->7kfq@2vGyYZkGIo-_Ud28b^UfT(;p zKG`40v0 zWm@3E@tjr3qSV;Y|ru~btnO4fRsl(3NClezv71xK-*E`#F| zcvPh1mA(*4@2e;6(UMHO^x;qeDGPUhYr{s+l*rJzcTzc~n6!;Jj9Wg1$%+aW&lhzp(Et?nqySglV;mBH1Lk z^6o(ni*{AX`I+uz3aqb~GqmwO(*N(Og;>t=o(JJJbSl6Wde;w=V`y<8JKo@;&QW}x6w zNG9cLd4ua_Ob)B1#EP_o3pv$>5&S_!$TPFgWq zEzftdJi8yv{GK$&HAs_e!B*jwcw2||lp1rnPZ?$D&Pty+$buM?4&RiZsPQGTELj{R zxqdYzobk))*S0FLdxbM-TBW4(6<_mw(IZnq?2xfo!@q@VEXwoJGWouFUsBMco9y`a zG}kZkN?iY+&Kd~eKQn#%|02kL%eOgdT5%if$i63P+4snrmX#it+Re_in$1e(p=YYg zmUz;Jfo{^-EjZ|%`@J^}N$juzt{dV-5|>VIGgnO*J=gtK{#F?`$Z~36g%^O?JzQKt z$yq85_zl`|xVEDjg~W35D-pX7=_Z*Z^2QKK`l`?)95Hu#Elk0D84KE`_M$ri#-Q)Z zs($v@*8lWTok7x=18dLgF_Sr=f&<>)%RYea6hH@Oq=ql06i#+?(9Leq25fd1LT#N0-GVZE{TE?s@*aByL$#rO(cwyGN=|hKwEP z0E3x1IIo$M7ytvuEVa*rE9Djw~1Q&*~aN(z?dZZWWYx^azoQf-{ zd#H}$E<9E6Qa)Zbp~r>qfj4{Za8k*kBj^Y`ho5Xr$5|u5{^a@uOY;%75p)TE zy&=sGPHl=YD3w=hY<{rKl8+rfZITpEy~dE&n^?KclcZCLPq1vylK`nu!r){!5-e+i z2x*;|zI^q~MRH-Za8airT09>)goaL7Y7yQHV!`E@e@~l!!PJuOpgjAW4&}lsumQSn zvE1DBj1QU%!VvRv>)yt9J)*!xV-J}m9iiy{xkVPl#%znLBPfvAXMv5riYqRowT|MH zW~xzF?pmqT&xwjBt%fAcU*R4yUxi3D)U94sz7n+hus@~>g?dmSI}=_Jk`t%_hA_lJ zs#8E0+H0*e(P4yMzVDAv4E}vbtME(ASUt*BYgL{qE2q>}IY9(gc2|5+riddL4{Q#d z_<4nmb@@snFT9|_<0yDY@O&jXO-WgUhfgsL)bRVl&R!l45q(6HOWr!7Rka|>Q>reW zKQH!5S<)?in`q6FLOMbw|7H?6TM?3b&F97&{Gtw;-)3jkNg~8lpi9~8uZRy^Cy*{p zfjzun&#vj%)r4V;B}!wVXQW#ot;EXtit(G{8BW4fMf1lI8fn|L4O{>7es7ee9S-+Z zt1!JN%4IiE;|*eYk)8v9B8Vcr6H>DKq=CC*s9v(Elx&{AF94OH7UA1ZbuexHq!dcvq?YS z>7X2LKfBv{OFufB!4w^1S$88_=TcW;%UH7lCpO`bUM^a3F}n*dvE4V{u&K}E(Vud< z*NP0{;s9~eiF~<*18rUQpvz*kyQL7j$1#B$V;c^GL`z+ts6-i!<7@R-nLtz%PT`~M zSHfgDlXA@`>|}+n79)m5;}JYG7;m!Ajo-hvxQ1@FE&@OR00KX4uJ(Vn#Z_{4w6HZ3 zwKMyl#hss=_Sg-2_?{Cg(QJK@B$Ux@DJA{oa_WR%m#%UtNOFN9^*WpD{*_-Zu|nng zo0U%_4PVF8Ub9HsAojrYD(~jPEiUxgvHFf&8T=$$t>c4&S4GR*saxdz5S#sIh5Qx? zLPQ*x_FBQ}O@X{$)9AT#>IKBo16t^wefhnZ(brtDMV9)rvG^%LBZLXRpi0USZsqe` z@rmV~bf8F~f>RHjV>~nKi9F6El&{hMV5pdHq@;=KUsrF|)i}M=MsBpiXq0g%mqwl= zt%yb$bLyEsz!i7ZZH!^ofClYi8H_pkf|N?A_B$eKHK8U0s$vv#m33dP{30`E0jrW+ zWemyAZ$9|yaom`Sw0l*mnbI&p3aJ#lY|OuI1773d7K z=*%X$Al6y92HZb_@|H+#V!$^M^|{TDapPwUnMLwI(+zbeDNrVpP&FcuRETHMV5t@? zU!ua4h~+O@hq}O9N#y5)laK1LpK=lFeY=k-^f%n`!1bJ&!{?etEa?@Z&1NiMoiO-w z9pwK=aj*l(fjiK%uO7z4&0V-jDLY3V=)x&=!ztG;b_TS4_((0k6upJWTEuPglwVmX z)n9P9{iZygC~7->3F`|IkQe#;QD@#>_+^f6)7;N-7pFUCg10m|8UdS5BKQ%u6BWvP z_&sts-zqv-n6nt{kJ0DTrc(FX)NHe#$#hC31!87$$79lH*l)Qjtj~a6Rg@wDrqE|iDXQNTWf5JFyr)-=^xI9P!3r|4^y$;@x%S<@kube2 z0LB9lRlH)6V?zy8fU~u;wIeukO{yCdw*`+Hmmku+Pp=34KK$9j3w?K>R*RI38f8yqK08cD7c1@ zQy4FYgeu|tM(k*V@drbM{5^#^q0f4FQwPgxd0W4J^GZdYA80W|u!>CTxY zXZCbe4SmM9zwOL=3%oc(0moZq!-b!@Ba3Wg_%=113>i^Fkr9$8_cmM;$znz^SowE8 z>JkF^l9p|DedsSvKK_xmEk-SF%cmnq7*6J6v$U{7XqLtWDdsP;=#CUlWlhcKOP?~K z&*D}aeRk#9IK~;K?%r69{I`i+VQz>MayIB_oF(m1Ps@&@3<$B0@W))urD$ATsD=5^ zUVV1zo28hERb()Q5%YH=Mmgd6j|5~0jGZ$>g(0wW@Ln#Q6Zw)is3ziHXw*TA8+mDm z2noJ`{jKJ)(Gz`*x>bs|McDKZ)s=QUm0;hD9A}tIQa-1xidzB=c3(%&mhJ-pxcqz9 z*_UbguobnPlIevxRRe4SbW_Ap7llj{+{X!8MxJ<&-bX^~M|n<;MaK-RUcLmN;&Fl2 zbC)zpXGCW*&rqEvOf#bf=$*cn$~JTx8_R9r_@PgNbLPD!L}N&Ss|B?!sHEmAMLnqQ zT?_q+J2x}uAs9HnaE0f4cFCF!2L@2DL`Rg@%j{js1dm)PoNzjjANLvnSkAhtni0rN z*_allpD44<#e03{2K&mmp$;VEL%NBEAE>Qn-UaWK9Itha`J^tC)V{d=cZL2qvgk>V zq*=C8$(estM2nax{+OnLIYPu2XnA9tgtLw6%k7M1&Qo* z742lm&Z)x=)Bi`%(`UW`@!*0RVh3)AO_SCeB5!lixq%I)4$$-wt|;cuEyA~XTs&9A z#0L4ofE${q8tJQZ?%u+ZciG6-UkX==<*f15Qgx_T4Lx5<7GSr%miI^e300quU)usN zF*>e8IOEEKxSW6gO~)!wx#o}j0kwpmV?~|+AgGC2SewWi*qHnqrv2zy?8rZQ*4Dk^ zVk2Qz8;p#ZM&b;kO@5FBlMiw$eI~jD)i{AP*-AUQ#CO0T?;D<%Tqk1g_qiZA z0Hq4pOfoH~erJF*w6wH%`>yE~;>51`dsjk38jt7(k5@Ka1_O2IjPM^%GZT6R=7B6f z#$Y^YELu?QM5tfd{JVVTa3dZuK~wr-aQMX`Q}omWFxKu9{ybvRKY|v#c1d<*ct7su zcz`!XBHG(o)L2Uix*UVhpE?;H#B!Ps*VPqG7Z%K`7caqw+=!)davH1D7J%^_>rb>Gg4}=dVX-t_?M{dWv=D%#L$-d z^lFC9oa%FU(<*R0J7qo}gaPXFpF9b6sIc0xLF=cReP2+xq$5X0y=hw^b!vmo^xY}d zreSP9pMddCGVh#eyU@OPrXhn_$u5X`nd?_$2U*=Q^`ej%YE8yS5${1FY#CwZFFi%L8?~vlz-2-@-KK{h%@h5MLC+ zQQ?P7zp9O6VNfDKwXw)wb?2h)EAKY}`up@qg;avh=i%S4Al2gSH2peaBr#v@VFIr< zYkXlVlkY3}#Ro10k4hoHh*Owp8SLB-Q!98ufZ^U1qhDTtbjm%Z&Ifr39?FGw%;fVZ zQ^s-5qg$cghp}gRgW=gEQB>9;+nnF7FzY+c1?023jqt`;(RE8YD>xYhaNu6l_iQ4; zB^`P#|0E#80pSI&2kF6JcGTA!xl$PkKa*fzOP5cDGA<@i1wgrZ$oKfTp?m|1T)D<3 zc4&kwM*XR~X-9uetYQ8QF_G*>?wVTaQY(jS$9i(@@uaGu*O`5S`ME>z$FiZjha==q zt##0*YzZ@EBxkn)#{xuf+Kl9SW<`rDuO1{C{r0}Y*uL6)tTEBXo(_x;71W9;3lU?uH#sf&fY;GjPrz?FR9ismQ$7_2!ml!ABi+ zIt_7MB_wwTmFT%*&tTA4Pgr^+n_f$iv`!A;p$k!tauZ3Y!`}e~4mr2TOv*vV32axZ z^|i@s?>}RKP(-hzA>dL|xoBB?U#C7c#(8*7SC(!oGN4?xnHan-D7PZ;&AWCB_S6Sl zmFwv0k#saQg9wA{-obpMW&rmU(ygo>S^c1uobJGlsJd}H=llF|8Zt9u5HoW;y#kP; z9D?G1YZ4mxVYYh|xc98|=E(dIND{v#E>ec0;!~ew3$T+c)ypC*5*HinDu%^wcs>;o z?iaky{ymUUC$EoB>BsTf;K%X$KM8^|2DTQaCQi=(0)jPa|DCt{Be>Di^IPbwGjtkA zWg5mFw2C5e)hGSd$AZ)>w4r6JNKn?c8}r*$C^VK-y);heT|<7`y1Rbex?A#{_eTTp zL9ip%qGoabB06>L)KRDJkv8?kSG^j~9~Gid4_`y}9S52~fg$)qkdmK_;M9INJmhk3J1K1|1VKh8Yaf7>~T#OmA98vKURLnLngm7f~!KGnSlc zoqDRc=7=@#hUOnYgq_(#0bM4;ej^jMnEG?E;{IUZ{WHh)N|La1X2O;>;12k9cV_6u zh!uN%hV?9}yLDjiGzT0`|HJ#}MI8ffPRevwY=GHKQ9^=rOvofL%&hN(ns4Qu5Dyv> z(q5KWBnGe4VK{+ZEeH&Qhi^z#8X;Te`pJmZf`xv}RRkWln3im;J#e}^A8$eMr4A_r z?6YB>?<06lDPP$KmkQDQ@NxX|b4RooGqXTD?jLD1UN5(O@x-X-v;pfJfTi!3)`yg4d`UvjmndYhkfrSxT%&LV84+$bU{-KDfhTsD|hJfd&x@dWS5R|taErr z?mVhWJdu>+gj^@;L#aA%fCl3i;YGzM9AMb6LT6rWA@LL92jsDu+mI_Y>3Fx#Zm_qd+rm^%C{SJI)OMv8t=&2H*|x3uO>#G6h$PKr zGY#p68jqE}+}whSTg)e!Jn%_JEr66)Ho2Wi1g;u zvxG)fEyL=j+-KSQyID(Pi_U?6uIs8so0c)iHdwiEt@^7DHkv3tIG2TO-&&Gz!0uxu zO6sO{9tDKgGMD@3uom?^LTGIBA2#Zp(k^fFy$^WkYM!@JX~;9(|4uF+we_FwZ*BwJRS74Euy32$cy=ja-iF`7>MWg z5q#Z%^;x4qN@Mr*dD1-A2R9ee)Wn=BN5Mv?rwS!=j7lEd$x!DCX`2ne2aIr?Zp`Vh zF1BG1RX~||oRtv#CwQi!m^+_>EN8ZD!ba)Dp=5;H3Pt84-jR>QU_}u9o}JiDFwF-- z`S6NFVN?|>-tjQ|mzmND1QQFY=`){^ghkEJI2lW|7rM)qfF#bU{dwBV{9|G%;vYE*aa_C?`+PwLR`>>10PIgT2(awY&Rsu9^kw2Qnd zQ=jzh7`m>nF#{_s zF4_#DhqRuI$B(twAkfHhWq}v%tT?Qu|1^TrE`UdxxPs9!qf=x5n;z@;FNM zOU>t%Q8%QD3h$7?yIsfE%YXFl>&yKPenz#vJ8ayM0S0g2C@|Mnzxx%oHzeu|1^+4f zeox8N8&p{7-Pcf=*)C))zkZ&CBEi=vzv<%C-_{0TRvFcM#=DQN|61yP_5T>MCu z^E$FfR)=@KUd(3aot;_MG(JtU@Y;?cQ5Gu|<4V3=;YXrvcF@7cGTY?BIiiT&8Iis_ z3w=bYq;{jq!MbB*H%ckIX-~vzzNRTgh}inEj?}bX2T5V#&Y9mmpmD5xB5b2@^Nv(S z&roPV>zHcUtDrkBWY)Da_m1nHG`e%nkiy_qe%#*e@G~$2MUtp(z3iX-jxu}WtmAvj zWva-KSK#tbEpeByt%8U+? zWw~{$JGt>TJXxv_dWsV7u5?4qdP605wgXXe@v`j<}Z&6 zc)?sMdXuvA7%%V3N**=oHI+;^VyNlM=)V5^6rxF&4LSx2 zD!+Rj_+D^Fk`BBk1PzF(eK&3Sz;C{{^T2{{T|bnCq8jqMoSsb4v&vbZ41RvJEV6U5 z>(O14VbA+&K;NB4|BBwL;NkNKqGf~RE@Lf8>#MtX`5SfimF}{|{vpnX5$H>~I`|E+ z(?exxR9-mISAG50Jal5qhl|PLtUg^|W@onNWQXrxF{XH|450Z3W9)xUCw@}Q0SxS| zOpGmlhL|*_F3v8F7EaCy6GEaIi$?E2uGE4v&|s8m6`jKrMhM<)&3aH4R7+uC`z2?@-}2m*0j38?eU* z1<}oj3BYPt*COEy`XC+A@LcE5Zix%NTX=IacD`Se8=y( zHNF|WGzT8+dGTb^lJ0;^ozSOC+meoqSxc62pv!jmR>vP(;lx)I@V&>ICj){Z&8S3E z!k~tj5E?3lGoXbKqT(BqBxaC;g|FnLBq14>v<$REU?ixufE621QaA6nMJ!Fq1;Vy= z*hwj=7sskb3JI<05mhZxEle1i*>YedlsA4uU{_qF?!@ZRPg(dp;C_!sKH9){af*CK z-LNA?%9tKB!cpM8ryo&KvIbL-f#Xr7On6u-h=OT4`f?MRk_5a#d|x?hUzliKw!1tu zddMrt_B8Q)_f!z5loN@}kpioHJ%=Noj~*%~=6}zHUEjn#tUGdRegiJ|0bB_-!d|1a2b#*GInTGYqkg`p~_U82RfnGO^nG{E_ zLHRCR)mCb6>XMBhBR)+T1+WNmd-1ncv`6j+*L0gYc@KnPE+*dZeBiNZ_Y{<2m%+i{ zip3%F@?SkPgs_;eZhHL378_ja2f4~5aL%uDm*8lUIu4;!MT(q{xE(s+JaHW@9kB~Q z$|bx#T-nD1Hxp3nh*0i(ibLj?;^XPp1Um2QMOAg$U^I_3Ip4JlA94LUo=W#`MyDlR z(!AxsdOP4NE@WO($8{BuYyxqyztd?0TjCzEuX)wb(y%1-qg`evphxeQ@4i39jK7y! z)+tkBZi93T`n0;vXuniR4lSJx3JKTZP%N!;ry4TX#`pjNYXd{`~|<6 zd#00K?x^$ih5AiZ_c=Qka-)~DmdzSA^KWwB;`k-yKT96KKT96}$ptOXojBl>IrZjf#8H&-kS>FM$dDykHzTt`|SIGBYM)R8PVo78EKa*EE1M9HE%A z5m$nt20WDGAd(O_2*TAU-ICp__MWK;FCi`GmnRu6Ylj6bq}rW65xsbHreCvW1#IvI z7pw)_Dp=k#bY#t)8TEPWS?ZEySAit{VlzS{(!2IAKGhOWJ!K%nf=3*aR7|!o@ZJ?K z)o45qKy287m#E1Jr=VG9T#UIyi8TZ}2bjW>=);;eV0_t|o%d$E(V)sBRl6}=RlBut z_Tb3Wl^JnL*BMy1_T=rzoGN{NL=|0}z4c|}xd9wrB0$(KT^RC@WlU1V?7*I(uwh4l zI!Tta7&AmQbRMT9qJpGy5HkrB5Rg2|q-Yw1)M*w2X4hhpY1Y|HHBU2??d8NJcrkc zM%L6&)5hsXA+;cFq@7%y#VCZ*O>}N5`ve%FbJcBOx^=_$YnPZXwkX+}*rQ-Xhn;OND$h`6+g>z#w7_<|Y);IE16bNAkzE=6X5wW{=&C zO?BJ=LpLOGl==1qjw?YsQMQQsC?3S@DWH%57JaoRKXT4uy0LaIU29Ka3wPpnK`9Yu zcx?j?m#FF7uZfVzoZ&q_s#W09kqhOUPusR-0pjHhY093Dd%cqA-*39qh*vy>HYWGe z5VKy#?oxx$X_yEcrdr@7v33I<=R0e^uhCSdlR5l&%5!HOMi@riM%`vJ?5~JPwdc#; z=_en5BaOZ}wi9@RB+-`FGc%4!iX`N0vtq$du)^iiEhZCDhy^l)@>x%l}3 z(uyk|J4S+f&s>Vg9bV6kaJom7zu+0;Vq0nj?5xbJG2lrL^$P1f7qR+Lm~+mRFQ{Tl z4zm7j;BkZvge6ZHuW$HjSs%1fWe8ikSpH4NJy=C>(5+LZc@4Yu#iFzZ6&XQUPNP-S zQfo{U6n}aP_PNoV+*`KS%i3hpn_y@p^~5N}thJ~(Tlc6*tRe*%iL%_d@z}lH0L)bj zLRCrkU>vKAE0?h?#6z_kfR3ad@uFmQICf4d#pEQq%K5!r_om$TU2M(6ppo z=x6BY@%ByQW&*@&J@@!14XNCu)_{Fyh>m(?A5u)P;GM#n62Pvp@H8#OxqD zKwX#P9350F?2MsE8-8(Mk5J-4ru0V?Ks_R5uyz2(TE$u6;CfOwD4`T-`Ec(#;p6F_ z1cM>D=Z~7IZ+g|H18uZyQrD(i2dw&rBcAiLh?Mnw6ZSP=&iE$nt5!{xV3-;(%I8!| zak>GPPS{4sN@S+g3RV$7f^{)1e)Xd1G$gVZB0W2kY0=EcF!yr+-)3HHeNHfR159Qo z?T03#&vv&*mJLm+MfJdwy~WEdy~BweJ22Ijx=kn$K){o z1E|=07@A>Ng__2)d?lZmruq|>GB-A%Q+P?ka3XTaZ)V2GsFDr)OxkP?5GYUGGtMq^ zcR^8#2#M1JA6a53o-M@3k^6Y{e!(NwJT}DSPOaT5X4K3Tm9vrhl=_{d4%LC?^XCCC z6I&aU4Lhh{)!GTkV@i*qS1ciYBzRMTm<)3%W^hTK#N?9y*G0-@$pa=VkT6BjH)Y|i z6hoOqtB#rcFy=D0pBty^H>D)-Z@yGqe%$g_IWu8@OA`*3T)kf|16K2N1?|e_Jt?fd zKKY?5+@foT&?ABgs3?0XawZQkr$Ljyy-JF0p79}CD_vEF&9Eri9DT73lb8*uraw0; z2BBy4(g#AZZCJ)?I!`V-H+Xe~0!w-AV{SF!r*G~($6&)dfIF1efUykDPOv~~57fJB zREw^>{K}Ng3BIE8d|i_@yYYpN){?AseibEtXAD({4Z3EU8c(?FDBi>`xG0BMv4NqP zdt_jbMzi|}FS&+h&?+7*eRdrDE7-RWW+7l1ploZY_w{INaqfI~0_#HmWCXZ3 z?%wok<1cZsC^^>IQ&@|A&en5t$)00Q##pk5JDE}?LrNM9%mwSCPQlP8&-2mJ1xzDT zsy7_(TrXiIy$nro?2c2{HnvIQF%--JzdFsUY=czMM9cbh4{mpADU07<-H$n2$Pezj z9X}!Y*{PDGz2sga%6u6aCZ-ubg!;df#=9w$+~)b8J;@q!uHl4jD@P^-?Rv0XIMf?k z3e_z>KHzl<8?;nRoV0qXqY*&Xd0RCsC_H=TOv84dXXHhDZ83nu}iL* zt&294EO0(PbHraW9>2KXltsTFyW#KN(aYVoK~T#6)V#aqQ|x6GjpD07ZcAk;g$^;9 zTxpWJ@tK_DqbR#+UXGcLRJT;g4*8EoFYLB5mO$GOv1D1^n3yINo}~jzUypUFP|aaE zk}WG|S`FeY9Noi5pbp?D1KEwNL{|JtB)Xz$c!l_5!mcP0<~$f=6sWR+Z9;=+_rnnT z_s8;LtXZGGj!0Ya|?%Y7h|B_aAr;Rjp0Ar@2oy^&bC;T zIp;vxD}rq9fe>>?A4q70kl1glQXLrbR%H2<#KgwWl zM9gyO&FSjd@mP4cdSAd1?8Y=fn}>3pMZr`^GGim-1{bzkW*sMi-1=gLGO2V8 zI|OJbUgXm?nJO)Tc06p#8K+#94L$!pm@4P1rAaJ}l($ytlM37Y& zu|n;mn}?9XJRD zJP~r9yd|eWF3hI(<`Np%?Wd@w*6IZ6GK7*Bn~)WhR0479!%3=FDpa$A20u4GOFK}+(5zLcg7o{(tb}AzvvsB(($=fb>yBG%k1zNKfEwc#IUXOj zeXS=wJ1z|V=_!X^M}TzCyD_yOiHCTD$Qup3yg3X3Isqm99K=yH=u?Gj>;YcNsbYUW z59k<}b5)J4owB{PF&xE~e>|9DjPM|fFtDsVdN-{I35*J z2V?XhCIMrn$n(!mSG5&uX4F`4RiXVjwMKiZrCsz4~^$tJ6662BK7 z{s9HsG>Vj$%Z9LSn6+;M_p+=S0o5E*$KOB#HpK#2zpDVI_Cb{SRRs$!@B8s3hjE3On31uZ_vVG z>v#^Dd<$tW6H2b%2X0!;_PddEkKJoc4hH&HyX+F#SSB4MkHZKH7w1Mfo4!f2B-NTk{UaW*eKa9T@wog5~p_Gr8+fOQPLpKq{50g6Lu(D&)vcx_?6+%kf zwUUe7@0RCuLUF}cQ@)*_H(7V_g^;Qh3NlyMX!aqiNO0_9ZQ8Cmd&j57PtEX1IXX|) zdm`288Gh7f>&%6Yj0~e#T{o}MC^CkW_?XcmV|FKB?5{Z59srz=lI?}so9e+2s$0!= zefjozF|^br6jVjMIR4bM_LQ3GVtOSVZ}57W@rbfx?cj=O=Zpv+V5M z-OgTQe~iol=DdXPbmS9q_q$$O{S*rGv9st4LzH5+)q2@||BupJYJzGh_n*?+E8PE1 z%fP>Wh~myR)OR$Dw%rk*fHUP;+j07v^F~-`;^mS7C7M_ zZE=`L&BqgOKW%YuV2SflW|Qzp6Fz?R>eT#;JiLU*>G41((4Yo=fL?^+l=cjaVeurSGVqvI9>hvX(jlRM zP=p2DGpnkDBNyGeQw4+VI(MEuZ4@usFomOP(;UZkvKF3y`UP?WZ$q}p_KX~)314^) z5QTZYh?zn5a5#bEcsfZ1gwF{L`H=xXdSl!7zYB#9^=Vg`4He_2j1ccN2r17`Vu64t zf%nCH78}cqnQaoNyf`ymi&N){y5QULZpO{L7#qgie#!;5Wyhbd->%PXow-8G+=lV~ z3i#s2?72b!pZ6nd1tX3E#5xA2bWnsUjZ(@^2Q62y8^h%}ffqiaL+a2sLg1+%3&|53 zFGP;94>GiqD+RfGkAR{+=nyemRCYXGliG4n|eEBp7X&}Pay5w@H8=HEZCVOf%Y zv>|HM!_I>kr^@O{{uK`aU?xx;E25|VH9Xk`#|`jz43X3V;~tz+9|J)N+%!~<2Pl{D zGwI;T*ZMDO_g{9*UhJra+r2X6~@Cwh6%-}8aSNQ>mAzt%_jV}YM0%<;<0%#WNZu0le5DQ;0SA+c0Nx1Q4b5TuH1G0p@+It=^3rkW!$5y*R3-0TRp2<1 zL+7q>NTooAEeob*t0yY)F|DIX!_^gl;4mZz_a3@a;x~mudOdt!x!c#0$f11#+H~pJprEm$0%_MW=Yvnbnj`d4}K|?W`P?A*7~SVKEh{9&wuZHiKsh z&t=!9MI;ZvB59Wj3~8zBHssMyI(ALpqMR`TzD@@w@Y1kP7gkG@GEMPtxz2&XHuRDx z2_i~I8(S`~qqx5|#{tilafDMCuP!>i0B2t#o$6D61fSPaY}Bbb3EF zt`)7sz^j?|!U5JPOoL8Ty^+)dxqSRg(>jkOylGSh=Lem#`+d z9I4Kgo|9DUCla}i7nb5^8G`(S06es>YS&MPpAN{!QDGsZyn-ch7c#a#NZ$H(?xG?^|Nw_g0RJ%Er=Qj(tDj|)g$k+;Z9124+10_&sBDxFm8(2 zHFZAmOZfW+A8=tY7s58s#X^owL8&L@mj103copQjB9$)8vv=-@=kXL%1=8rMmdPt_N2{NN8bi9YY%RYXZ zz%WQmLO7q(I!KFd>t;(dD4didNfW!sqqLSF^Q3HEg>)rFPYvm@tW?hoVCjcupA#=) zvXh3v6A-{^lkNUovilM4=IwrLaiGbC=M3r`=Sr>U`;UR5@w&n&C&poe$esvndjNIpy$O971}-AZ*+ zTK!|E81Ed=7SWN(uL-=u^$Qb9w<&zVE{qO8Mxu~3q7~nE>cP`dEmPveSeA>HatFHH zE9W&ZMPt#v)nUKvHmt2fyRF%evg~}gQDZt*o{m-pJ*7#Fo4ySpby3)tQ^AU+qpxag z*7{Q4Jo_nd=1J6Z9Y2U<#PRtJ^EXPMN@N0+jqN!14V9CCa9lCgpl8G{KA0hXQK}aI zu;Uw8ZlN7~I_i!v|1MKbtIN6+T3GUEEEZh!eho)EDnNJKP3sc&DdqkqIV&lKUDh}w zz7Q8~)<=jH@*E?s#YgFMEZNKtO|T{Wmf z+!p?s7n+D~BQaNF*GLD}6E)xnD^k0$3fH2Ql;=CVI2j`)Yhf!tV=Sf4uS(WN#@ESc zCC6Sx%40Uf^^8fst0Esaw(RIzJJF+pjGk&TD%(ZIM2@rh$ThWjo~^3~{k_Q*>Oy=- zDxF+MN4+CO?B;DGwC2NkKA!73KjU*(z22a!>priZ*+2bGF6||HJdL;f!Xtx|x`*KF z2$g{gAA5Ozqhq5}bT1d#xwBqnf8RfjRL-82u=U)Cub~^gc^KlFuq8gg;l7p@{xhi{ zA8sdb;n6DXlN`bdj{ zk1CXAvnPrrXPrVMAcSOsr~{zXNPO=7;g3WSUs#eds|=z6i1O*W4O;%(0oeuIo;WOa z_oUz7dAI+85J6M0g*l2DX3Vio@e@lvfHbgt=8j35r}9%EmGRp;)7xlO4wf19BPDWn9jhHt7P;p8l4>A%|UH?JF$q7jHQc@V9mKkhO@K(#z-PDXZ z-vQM>EcdrS5WtW*FhU4fm`?PDZtJW2)pkd-ZXLM7sx4Z-+rQ)aOtBq$g<8uiRQ~~| zH@H%UNk5G_YA_el2q#b4_HHbZ(;eQB8{A_}d=WU}J!jNRx|moBqv&BQnNLKXKH1S4 zvO+%p0&L8E7MkgKHJJv>oTs0eM-88vL@t`8JNTQgAsD;D-cHWw^TB{oAV4w0iWm~F zcYBK21i}+niQ6YdBBMc#p4(tBpT%0Hv1J9iE9M4_71(38sc@Rn@iXQ#!wmlIIe>Cz zxzSeI*%R>tokwwykC61357cK2Xx*ww7yEdh%f44pY> z7Qt29>>A572zZf5r)Vg|Iid;22Fi-R=u9$#4atQy`hd;xdJK;CBEBBO@|r$v3j%A> zC1chTmo$+PxfwinPus)62B)Eao;C4|C@nDstPI3HA$#J9N*3g$n5`#`d0^ESUg>Rw z#XW(=9F;!k83?2*lzfhW{_+^4&h0}#u^_w_VYfUIJ-i|Uem|y-Shj-?#!yM#%BgXm zVD^VEB;g;|mW2D-ljxD9j{}7tEUlvljGmdn3H^%+lh32)kmFD9P=83y0@7dF+I19U zW-~%f1DxtwGArJiYEQ!)VtNco+&(Ns`fzBC{3- zc`C6UBa{9-9vaNe2t&LAy#DaTezxsp z^3$fVkJ~SABBwcQ1-*NRL(8kH%}@QCQ?F6Jo?ZG zoV&Q+N)n#8kWKIpiitPy45o9X=;qx7@krt%{(&rhQqVR&5CWJg;UA!^3{ZlAM6-x} zM&Wg&Y(fRpP*j0lHG$FET7BQwk?_?P}5T9Z8=G;rC;Df z3&y-3{OweATp9mB(TLG9JLvKP&OxY-r-85@Xvt%_S106Zoao!N)C-RC&|8|cX%|5w zLmIWHpSsHZa3mb;u;T5t1=sR~=x+zr{P3o|Xvcl(-+VmV{Js2GAIYNhnZqt%LYF2~ z>LE&zJG;RA9&o=QNY!|LNHh=oMy0sGffU*QAkoYqzT#IaLrxfDM5aJQWJWvT5e;7g zwh)WP7s!SSN>^I%eV2<*yv%C6U-0)Akn~z4pPc^QQ<9)n3M?t zq_mRJgi*>^xIKj%=(2Yk_?d|~PKsy6hg@mft`Dj_SQQS=T=-AVv9eK4B6|zG)A{X7 zlcPzCiA*JeJ<(64E#n}NW;5rhESE!|nHcAf>^s@e(`?V6zttUeHbW`$J!_igPyT&e z+@wiTa_F|~1K;U0Ewb`!PoMn`H9R)wLGSC6t;p0AUYCC2XBIeX3_QzGLT%Z^GPe&( zGbY>b2QX}2DOEFZp&A6CSv^mmv`O8v!g>jnDLllsRI)^=<5J~z{1P4X3#9F?L#8Ky z$8}2yX#T|Rwr&U}T*z^{-$q>WVo6r_Ff&1DJv}X<>wXMfv_-x2AGT4#uk$K7rbAo( z1cY9u16+5Z$NOTsw-b%Ap6jaOkm<#ytDz1}g=il&8QlJ99P%Kk^eIny-{3!$SOi*^ zfAps>B7B!BLgKWt?a)E)no^ooiA@a<&9d@{h8(DTtQkH!q!@yfTWFqN`O|e@UlS9M z)N12GE~pThipn%hyA`d1v&7$?*>@tJ$G5w%$&8UQ^kA0RzX70&-oqs{p`^B)qI%(r zd^_0ezq9&>OQSI;XCPOsCtDMIH$}UL?GewIqZWenDV1Gjz3dUjQcNtHVfBZs%*sXC z?Vz;W_5S2ulSL~gkP9GElHW!tiN(ZhBY$$|b0neLJYq+#-~>*;s{;!aB8RD}zN3DP zi}}aGb-}lHZ!lO_fX)1!%7>LWOYkOZVel`4bZy+l4Uh%;x%_I75IGGI@>wL>K*?>G zi@?klUx4Kn+gJf3cV^qfY44}ABe-9dSjec4Ho?s6T%Yu*GftNr6V~7>Sxzq3T+V;) zD*Cw22`oRmO6!k8`roiU{r~3C|JU}Eqp}sdM33Nes|MpCsgO0ut5_pUAtKBlwdv?p zxow=t!tPq1quadcXZD+T$9V&Ykgmq;A8=_0M$gTlG5{qNJeD~->fj|_ZJw^q!0fFo zOKg%#3>q`!49gLvLC-g@+Kro|4uQEgpYH`n zOhsVehjb7!iJxE(jEN56E?(c*495Ij-Cmm6CZ0J zjm4fwcmHvHxP;X!ojNt)jXS4WuRiF^;D=jxG?FcAr_cBo?Dp{e3hw@K4pu`Cs zK8EKRErMK$ab=o`tv5&1&ec84Gq;`wV}2wnTBYPK)cG%4mw zg)BdIJS?-~gq1GgoxcGTZIVeeMvz~aub#y67G8)QNA0)H)aM8c5?U%&k)X(E~=HpJ-%_87#ukk1{ zg&ky03pB<{4Q>$k{pQ&$I}_`?uLH2wkKF75Hy=HXn~P9FgcvrXjRUMM2u&gxSmtwW zJik63mJ{k}?A0G(;6ot5(4W`xV}PG|l#+H@8s7i5ARJ9;F#2L_8byRA8V8;jH+K$B zVN&QTfoGF!Q<9jUKjm^%PjHd>K87_%0K-E!|EBZcu|EokJAM3yKekO|xdHcq|MTj^ zjJne@-$S+2tr_7A&mwov02kkGx9Z^9Urea9eoGxHs%3E@Ulu>#kGcGYd7u^9Fohzo#oX=E0uRo2NJhLMeQg`Q;@9J zj75IHU}d>G&%XbWf{ty4ICi8Fa?#K zJcr`61(23dWcV?)3#c@vHZO*&y*n=cQ4f1uR@n6V?3vqIUqCO@-j6eEO?F2tQ3N3$}tx+niSL zn!9kj|KR?f6?-e%>8Jz{xu8eP2@_oN7tTmciA9F}lWZGr9~7JnQ!%7{s_(KL6)rXa zom;-IjuNaaow1CYD$alhd$*BHQFv&^RWedh399@@fylr}MnHm5eLYx=)07h7ZJGq` z+X4k@oB_eI&a60{Zid%#qzC(wsK8~~>_ONNdF59bIrA&GYe zdMk*uTg5d?FW*wNMH~WqD?gnodz+f&7Pf4 zM7W<+M;WOd_?4V|#Vye4*h&~g^c%x)*1W8t?V14nDnMPBm{GF`xg!yI>-nQqFaZv^dp5C`-vkfdkzgEEiD@{J;@)*7^G}sGqRMT|!XoGs zs89Cc%9@O$SYu*?eujM?TXWLwMP1XtrsJ#xMj8E;*23qM&AYM&BPXD2o?P4@8I83& zGS$GOB>X#eP|DpkKs zN3{w&8c!eFng?+lV9wPz>hauyQr2~(xZe!CQ9oHO#LgBGW>zra(H0J8_Q9bK1}^f= zNIE<@&msdnUZxi^@?BqR3qXEYjNOUvaW0;cJGIeMN1UaeKB6W@q z>eRnzRt-oR>-add5@_wLSZwJwaMGL&}6PB}{PT8inen`FPm`)d9s3{1&k+k^5Lb@0Dk(ZE857&1=z_cVS=LeEw$RwQt1I~XgmO|=uBmBiE*T;gek7yy=6T8IgFM-=|)+7Dk z$fTwy+0y_QsW)?p#`PoeAjga$LguVpq5W|*;b6McXcK+zX8;zsv8Z3sPsPeQr`{S) z`yzEWQ8wohJ!yi{=-7c|d1bI!^6g3DYfeV81h8`depF zx3z^yqhIGKTKFJSX2dEHf|JTs%myNNMt8(!x#DNasSN4Bay$h^lhO_zVv%>lxa=3L zsPK1-Fl*OfJ*B^PL4+YR-mZT=L62{(9G_fsDNW|#IXml zqvZq}YYthw^*dgyPgwp+T^1ua@{-vJ2I+j3X=$Q9_14cTmHCD3~CvB64bs`LQH_Do8uaB0yR($y!&4557 zeeM$H+WjPM36f*~s4sWGldRtyFTY)&fG8ZLDYWWd+?m3YG%`LVPyxN}JNljj1F~V* z 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 diff --git a/apkeditor-futuristic-base/ARCHITECTURE.md b/apkeditor-futuristic-base/ARCHITECTURE.md deleted file mode 100644 index 0b614cd3..00000000 --- a/apkeditor-futuristic-base/ARCHITECTURE.md +++ /dev/null @@ -1,41 +0,0 @@ -# Arquitectura - -## Capas - -### Core -Contratos pequeños y agnósticos de interfaz. - -### Operations -Un único punto para registrar las operaciones disponibles. - -### GUI -Swing puro. Ninguna clase GUI importa `Builder`, `Decompiler`, etc. directamente. - -### Legacy engine -El código original permanece en sus paquetes para minimizar el riesgo de romper imports. - -## Flujo de una operación - -```text -GUI - ↓ -OperationView - ↓ -LegacyOptionsOperation - ↓ -Options.validate() - ↓ -Options.runCommand() - ↓ -Builder / Decompiler / Merger / ... - ↓ -CommandExecutor - ↓ -ExecutionContext - ↓ -OperationListener - ↓ -LogConsole / ProgressPanel -``` - -Esto permite que la misma operación pueda ser llamada desde CLI, GUI o una futura API. diff --git a/apkeditor-futuristic-base/PROJECT_INVENTORY.json b/apkeditor-futuristic-base/PROJECT_INVENTORY.json deleted file mode 100644 index b43b1095..00000000 --- a/apkeditor-futuristic-base/PROJECT_INVENTORY.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "original_files": 64, - "java_files": 61, - "resource_files": 3, - "new_files": 22 -} \ No newline at end of file diff --git a/apkeditor-futuristic-base/README_GUI_ARCHITECTURE.md b/apkeditor-futuristic-base/README_GUI_ARCHITECTURE.md deleted file mode 100644 index 528e4c42..00000000 --- a/apkeditor-futuristic-base/README_GUI_ARCHITECTURE.md +++ /dev/null @@ -1,102 +0,0 @@ -# APKEditor — base GUI futurista - -Esta versión parte directamente del código reunido en `todo_el_codigo_limpio.txt`. - -## Qué se conserva - -Se restauran los 64 archivos fuente y recursos que estaban en el documento original, manteniendo sus paquetes: -- `com.reandroid.apkeditor` -- `compile` -- `decompile` -- `merge` -- `refactor` -- `protect` -- `info` -- `smali` -- `common` -- `utils` -- `com.reandroid.commons` - -No se reemplazó el motor existente por una implementación ficticia. - -## Nueva arquitectura - -```text - ┌─────────────────────┐ - │ GUI Swing │ - │ gui/view/components │ - └──────────┬──────────┘ - │ - ┌──────────▼──────────┐ - │ Operation │ - │ core/operations │ - └──────────┬──────────┘ - │ - ┌──────────▼──────────┐ - │ LegacyOptionsAdapter│ - └──────────┬──────────┘ - │ - ┌──────────▼──────────┐ - │ Motor APKEditor │ - │ Builder/Decompiler │ - │ Merger/Refactor... │ - └─────────────────────┘ -``` - -La GUI no debe contener lógica de APK. El motor tampoco debe conocer Swing. - -## Entrada GUI - -```bash -java -cp "..." com.reandroid.apkeditor.gui.GUIApplication -``` - -El classpath/dependencias deben ser los mismos que ya utiliza el proyecto original. - -## Estructura nueva - -```text -src/main/java/com/reandroid/apkeditor/ -├── core/ -│ ├── ExecutionContext.java -│ ├── LegacyOptionsOperation.java -│ ├── Operation.java -│ ├── OperationListener.java -│ ├── OperationRegistry.java -│ └── OperationResult.java -├── operations/ -│ └── OperationCatalog.java -├── gui/ -│ ├── GUIApplication.java -│ ├── MainWindow.java -│ ├── components/ -│ ├── model/ -│ ├── navigation/ -│ ├── theme/ -│ └── view/ -└── ... motor existente ... -``` - -## Regla de mantenimiento - -- `core`: contratos y ejecución. -- `operations`: conecta casos de uso con el motor existente. -- `gui`: presentación. -- `CommandExecutor`: sigue siendo parte del motor; solamente publica eventos mediante `ExecutionContext`. -- `cli`: permanece independiente. -- No meter lógica de APK en una vista Swing. -- No meter componentes Swing en `Builder`, `Decompiler`, `Merger`, etc. - -## Siguiente refactor recomendado - -1. Extraer modelos de configuración GUI de `Options`. -2. Crear adaptadores específicos `DecodeOperation`, `BuildOperation`, `MergeOperation`, etc. -3. Separar validación de entrada/salida del parser CLI. -4. Crear un `ProjectSession` para archivos temporales y proyectos abiertos. -5. Añadir tareas cancelables y progreso real. -6. Añadir tests de `core` sin iniciar Swing. -7. Cuando la arquitectura esté estable, retirar duplicaciones del motor una por una. - -## Nota - -El ZIP es una base estructural. La integración completa depende de las dependencias externas que no estaban incluidas dentro de `todo_el_codigo_limpio.txt` (por ejemplo ARSCLib, dexlib, jcommander interno del proyecto y demás librerías). diff --git a/src/main/resources/apkeditor.properties b/src/main/resources/apkeditor.properties new file mode 100644 index 00000000..ea8267a9 --- /dev/null +++ b/src/main/resources/apkeditor.properties @@ -0,0 +1,4 @@ +app.name=APKEditor +app.version=${version} +app.repo=https://github.com/REAndroid/APKEditor +app.description=Android binary resource files editor diff --git a/src/main/resources/strings/strings-ar.properties b/src/main/resources/strings/strings-ar.properties new file mode 100755 index 00000000..9c477cc5 --- /dev/null +++ b/src/main/resources/strings/strings-ar.properties @@ -0,0 +1,125 @@ +################################################################################################ +# Localized strings used by APKEditor +# File naming: +# strings-[language]-[country(optional)].properties +# default: +# strings.properties +# e.g. : strings-en-US.properties, strings-en.properties +# +# Content: The content is as per specification of java.util.Properties +# Encoding: utf-8 only. If utf-8 can not handle, use escaped hex encoding. +# format: +# name={VALUE} +# name: A unique string of characters starting with a-z , digits 0-9 and underscore '_' +# {VALUE}: the value +# +# +# Comment: New line starting with '#' character +# +# NOTES: +# 1 - Optionally, keep the list alphabetically sorted by name. +# 2 - If the name and {VALUE} is the same as default, the entry can be ignored +# +################################################################################################ +# Authors: github.com/REAndroid, +################################################################################################ + +app_version=استعراض معلومات الاصدار و الخروج +app_help=استعراض المساعدة والخروج +build_description=يبني الملف الثنائي لأندرويد من json/xml/raw. +build_example_1=[أساسي]\n java -jar APKEditor.jar b -i مسار/دليل_الإدخال +build_example_2=[تحديد الإخراج]\n java -jar APKEditor.jar b -i مسار/دليل_الإدخال -o مسار/الإخراج.apk +build_example_3=[استعادة التوقيعات]\n java -jar APKEditor.jar b -t sig -i مسار/الإدخال.apk -sig مسار/دليل_التوقيعات +build_example_4=[تحديد الإطار]\n java -jar APKEditor.jar b -i مسار/دليل_الإدخال -framework framework-res.apk -framework platforms/android-32/android.jar +build_no_cache=تجاهل ملفات .dex المخزنة مؤقتًا وإعادة بناء ملفات smali. +build_types=أنواع البناء، افتراضيًا يتم تحديد أنواع البناء عن طريق المسح السريع لملفات دليل الإدخال. القيم هي: +clean_meta=ينظف دليل META-INF مع كتلة التوقيع. +decode_description=يفك تشفير الموارد الثنائية لأندرويد إلى json/xml/raw قابلة للقراءة. +decode_example_1=[أساسي]\njava -jar APKEditor.jar d -i مسار/الإدخال.apk +decode_example_2=[تحديد الإخراج]\njava -jar APKEditor.jar d -i مسار/الإدخال.apk -o مسار/الإخراج.apk +decode_example_3=[تحديد نوع فك التشفير]\njava -jar APKEditor.jar d -t xml -i مسار/الإدخال.apk +decode_example_4=[تحديد ملف(ات) الإطار]\njava -jar APKEditor.jar d -i مسار/الإدخال.apk -framework framework-res.apk -framework platforms/android-32/android.jar +decode_example_5=[فك تشفير كتلة توقيع apk]\njava -jar APKEditor.jar d -t sig -i مسار/الإدخال.apk -sig مسار/دليل_التوقيعات +decode_types=أنواع فك التشفير: +decode_usage=d [الخيارات، الأعلام] +dump_dex_markers=يفرغ علامات dex (ينطبق فقط عند وضع smali). +duplicate_option_exception=خيار مكرر '%s' +empty_command_args_exception=أمر فارغ، قم بالتشغيل مع -h للحصول على المساعدة +empty_command_option_exception=خيارات فارغة، قم بالتشغيل مع `<الأمر>` -h للحصول على المساعدة +force_delete=فرض حذف مسار الإخراج. +framework_version_number=رقم إصدار الإطار المفضل +help_description=يعرض هذه المساعدة ويخرج. +help_main_footer=للحصول على مساعدة حول كل أمر قم بالتشغيل مع: +info_activities=يطبع اسم الفئة الرئيسية للنشاط. إذا كان في الوضع المفصل، يطبع جميع الأنشطة المعلنة بما في ذلك ``. +info_app_class_name=اسم فئة التطبيق. +info_app_icon=مسار/قيمة أيقونة التطبيق. إذا كان في الوضع المفصل، يطبع جميع التكوينات. +info_app_icon_round=مسار/قيمة أيقونة التطبيق الدائرية. إذا كان في الوضع المفصل، يطبع جميع التكوينات. +info_app_name=اسم التطبيق. إذا كان في الوضع المفصل، يطبع جميع التكوينات. +info_app_version_code=رمز إصدار التطبيق. +info_app_version_name=اسم إصدار التطبيق. +info_description=يطبع معلومات عن apk. +info_dex=يطبع معلومات dex. +info_example_1=[أساسي]\n java -jar APKEditor.jar info -i ملف.apk +info_example_2=[تحديد الإخراج والنوع]\n java -jar APKEditor.jar info -i مسار/الإدخال.apk -t json -v -o ملف_المعلومات.json +info_example_3=[طباعة نوع محدد فقط]\n java -jar APKEditor.jar info -i مسار/الإدخال.apk -resources -filter-type drawable +info_filter_type=يطبع فقط أسماء نوع المورد المحدد\n *ينطبق هذا فقط عند استخدام العلم '-resources'.\n *يمكن أن يكون متعددًا. +info_invalid_output_extension=امتداد ملف غير صالح! المتوقع '%s'، '%s' +info_configurations=طباعة التكوينات في APK. +info_languages=طباعة اللغات في APK. +info_locales=طباعة الإعدادات المحلية في APK. +info_list_files=قائمة الملفات داخل apk. +info_list_xml_files=قائمة ملفات xml المجمعة داخل apk. +info_min_sdk_version=الحد الأدنى لإصدار SDK. +info_package_name=اسم الحزمة (معرف التطبيق) من الملف التعريفي وإذا كان في الوضع المفصل، يطبع حزم جدول الموارد. +info_permissions=الأذونات. +info_print_types=أنواع/تنسيقات الطباعة: +info_res=يطبع إدخالات الموارد المحددة بواسطة أي من:\n 1) معرف المورد السداسي العشري أو العشري.\n 2) الاسم الكامل للمورد مثل @string/app_name.\n *يمكن أن يكون متعددًا. +info_resources=يطبع جميع الموارد +info_signatures=يطبع معلومات التوقيع. +info_signatures_base64=يطبع معلومات التوقيع مع شهادات base64. +info_strings=طباعة محتويات مجموعة السلاسل في جدول الموارد في APK. +info_target_sdk_version=إصدار SDK المستهدف. +info_verbose_mode=الوضع المفصل. +info_xml_tree=يطبع ملفات xml المجمعة في الأصول المعطاة.\n *يمكن أن يكون متعددًا +info_xml_strings=طباعة سلاسل ملفات xml المجمعة المعطاة.\n *يمكن أن يكون متعددًا +input_path=مسار الإدخال. +invalid_sig_parameter_combination=مجموعة معلمات غير صالحة!\nتم توفير دليل التوقيعات ولكن يفتقد: -t sig +invalid_type_format=سلسلة `<%s>` غير صالحة '%s' +keep_original_res=يحتفظ بمسارات ملفات res/* الأصلية:\n *ينطبق فقط عند فك التشفير إلى xml\n *سيتم وضع جميع ملفات res/* في الدليل ``\n *سيتم ربط المسارات النسبية بـ values/*xml +merge_description=يدمج ملفات apk المقسمة من الدليل أو ملفات apk المضغوطة مثل XAPK، APKM، APKS ... +merge_example_1=[أساسي]\n java -jar APKEditor.jar m -i مسار/الإدخال -o مسار/الإخراج.apk +missing_input_file=ملف الإدخال مفقود. +missing_sig_directory=دليل التوقيعات مفقود. +missing_value_exception=قيمة مفقودة لـ '%s' +no_dex_debug=يسقط جميع معلومات التصحيح من smali/dex. +no_such_directory=لا يوجد مثل هذا الدليل: '%s' +no_such_file=لا يوجد مثل هذا الملف: '%s'. +no_such_file_or_directory=لا يوجد مثل هذا الملف أو الدليل: '%s' +output_path=مسار الإخراج. اختياري، إذا لم يتم توفيره فسيتم إنشاء ملف جديد في نفس الدليل كإدخال +path_already_exists=المسار موجود بالفعل: '%s' +path_is_directory_expect_file=المسار هو دليل يتوقع ملفًا: '%s' +path_is_file_expect_directory=المسار هو ملف يتوقع دليلًا: '%s' +path_of_framework=مسار ملف الإطار (يمكن أن يكون متعددًا). +protect_description=يحمي/يشوه ملفات موارد apk. باستخدام تقنيات تشويه فريدة. +protect_example_1=[أساسي]\n java -jar APKEditor.jar p -i مسار/الإدخال.apk -o مسار/الإخراج.apk +protect_keep_type=الاحتفاظ بأسماء نوع مورد محددة (مثل drawable)، افتراضيًا يحتفظ فقط بنوع المورد ``.\n *يمكن أن يكون متعددًا +protect_skip_manifest=عدم حماية الملف التعريفي. +raw_dex=نسخ ملفات dex الخام / تخطي smali. +res_dir_name=يعين اسم الدليل الجذر لملفات الموارد. على سبيل المثال، للتشويه لنقل الملفات من 'res/*' إلى 'r/*' أو العكس. +refactor_description=يعيد هيكلة أسماء الموارد المشوهة +refactor_example_1=[أساسي]\n java -jar APKEditor.jar x -i مسار/الإدخال.apk -o مسار/الإخراج.apk +refactor_fix_types=يصحح أسماء نوع المورد بناءً على الاستخدامات والقيم +refactor_public_xml=مسار ملف xml لمعرفات الموارد (public.xml)\nيحمل الأسماء ويطبقها على الموارد من ملف 'public.xml' +signatures_path=مسار دليل التوقيعات. +split_json=يقسم resources.arsc إلى أجزاء متعددة وفقًا لإدخالات النوع (استخدم هذا للملفات الكبيرة) +title_commands=الأوامر: +title_app_description=محرر ملفات الموارد الثنائية لأندرويد +title_example=أمثلة: +title_flags=الأعلام: +title_options=الخيارات: +title_other_options=خيارات أخرى: +title_usage=الاستخدام: +unknown_command_exception=أمر غير معروف: '%s' +unknown_option_exception=خيار غير معروف: '%s' +validate_modules=يتحقق من نفس رقم الإصدار لـ base.apk مع ملفات apk المقسمة. +validate_resources_dir=التحقق من صحة اسم دليل الموارد\n(على سبيل المثال، إذا كان مسار ملف مورد drawable هو 'res/abc.png' فسيتم نقله إلى 'res/drawable/abc.png)' diff --git a/src/main/resources/strings/strings-fr.properties b/src/main/resources/strings/strings-fr.properties new file mode 100755 index 00000000..4c562976 --- /dev/null +++ b/src/main/resources/strings/strings-fr.properties @@ -0,0 +1,137 @@ +################################################################################################ +# Localized strings used by APKEditor +# File naming: +# strings-[language]-[country(optional)].properties +# default: +# strings.properties +# e.g. : strings-en-US.properties, strings-en.properties +# +# Content: The content is as per specification of java.util.Properties +# Encoding: utf-8 only. If utf-8 can not handle, use escaped hex encoding. +# format: +# name={VALUE} +# name: A unique string of characters starting with a-z , digits 0-9 and underscore '_' +# {VALUE}: the value +# +# +# Comment: New line starting with '#' character +# +# NOTES: +# 1 - Optionally, keep the list alphabetically sorted by name. +# 2 - If the name and {VALUE} is the same as default, the entry can be ignored +# +################################################################################################ +# Authors: github.com/REAndroid, +################################################################################################ + +app_version=Affiche les informations de versions. +app_help=Affiche cette aide et quitte. +build_description=Construit un fichier binaire Android à partir de fichiers json/xml/raw. +build_example_1=[Rudimentaire]\n java -jar APKEditor.jar b -i chemin/répertoire_d_entrée +build_example_2=[Spécifier la sortie]\n java -jar APKEditor.jar b -i chemin/répertoire_d_entrée -o chemin/sortie.apk +build_example_3=[Restaurer les signatures]\n java -jar APKEditor.jar b -t sig -i chemin/entrée.apk -sig chemin/répertoire_de_signatures +build_example_4=[Spécifier le framework]\n java -jar APKEditor.jar b -i chemin/répertoire_d_entrée -framework framework-res.apk -framework plates-formes/android-32/android.jar +build_no_cache=Ignore les fichiers .dex préconstruits en cache et reconstruit les fichiers smali. +build_types=Types de construction, par défaut les types de construction sont déterminés par un balayage rapide des fichiers du répertoire d'entrée. Valeurs: +clean_meta=Nettoie le répertoire META-INF ainsi que le bloc de signature. +# translation-required +# comment_level=[Baksmali] Définit le niveau de commentaire.\n 1) off : Aucun commentaire ne sera imprimé.\n 2) basic : Imprime les commentaires de base et les identifiants de ressources.\n 3) detail : Imprime les relations entre classes et méthodes.\n 4) full : Imprime tous les commentaires.\n **Par défaut = detail +decode_description=Décode les fichiers binaires de ressources Android aux formats json/xml/raw lisibles. +decode_example_1=[Basic]\njava -jar APKEditor.jar d -i chemin/entrée.apk +decode_example_2=[Spécifier la sortie]\njava -jar APKEditor.jar d -i chemin/entrée.apk -o chemin/sortie.apk +decode_example_3=[Spécifier le type de décodage]\njava -jar APKEditor.jar d -t xml -i chemin/entrée.apk +decode_example_4=[Spécifier les fichiers de framework]\njava -jar APKEditor.jar d -i chemin/entrée.apk -framework framework-res.apk -framework plates-formes/android-32/android.jar +decode_example_5=[Décoder le bloc de signatures d'un fichier APK]\njava -jar APKEditor.jar d -t sig -i chemin/entrée.apk -sig chemin/répertoire_de_signatures +decode_load_dex=Nombre de fichiers dex à charger à la fois.\nSi le nombre de fichiers dex de l'APK est supérieur à cette valeur, le décodeur charge un dex à la fois.\n *S'applique uniquement lorsque -dex-lib est défini sur interne.\n *Par défaut = 3\n *Voir ci-dessous. +decode_note_1=[internal] Générateur Dex\:\n* Prise en charge complète des fichiers dex jusqu'à 042.\n* Compression de fichier dex maximale.\n* Construction avec un ordre de sections dex similaire à celui de r8/dx.\n* Édition pratique des marqueurs dex, voir le fichier smali/classes/dex-file.json \n* Commentaires smali utiles supplémentaires : par exemple, hiérarchie classe/méthode.\n* Prise en charge des espaces dans le SimpleName de la classe, comme introduit dans dex 040+ +decode_note_2=[-load-dex] Pour afficher correctement la hiérarchie des classes/méthodes, il est nécessaire de charger tous les fichiers DEX simultanément. Cela peut entraîner une consommation de mémoire importante et une erreur « OutOfMemoryError ». Il est donc nécessaire de limiter le nombre de fichiers DEX à charger simultanément. Ce problème peut être contourner avec l'argument mémoire -Xmx, par exemple : java -Xmx8g -jar APKEditor.jar ... +decode_types=Types de décodage\: +decode_usage=d [Options, commutateurs] +dump_dex_markers=Extrait les marqueurs des fichiers DEX (s'applique uniquement en mode smali). +duplicate_option_exception=Option en double '%s'. +dex_lib=Bibliothèque Dex à utiliser\:\n 1) internal : utiliser la bibliothèque interne, prend en charge les versions dex jusqu'à 042.\n 2) jf : utiliser la bibliothèque de JesusFreke/smali, prend en charge les versions dex 035 et inférieures.\n *Par défaut = jf\n **AVERTISSEMENT : la valeur par défaut sera remplacée par « internal » dans les versions à venir.\n *Voir ci-dessous. +empty_command_args_exception=Commande imcomplète, utiliser l'option « -h » pour obtenir de l'aide. +empty_command_option_exception=Options manquantes, ajouter l'option « -h » pour obtenir de l'aide. +extract_native_libs=Définit l'attribut extractNativeLibs du manifeste et applique la compression des fichiers de bibliothèque (*.so).\n *Par défaut = manifest\n 1) manifest : lire et appliquer à partir du manifeste.\n 2) none : supprimer l'attribut du manifeste et stocker les bibliothèques compressées.\n 3) true : définir l'attribut du manifeste sur « true » et stocker les bibliothèques compressées.\n 4) false : définir l'attribut du manifeste sur « false » et stocker les bibliothèques non compressées avec un alignement 4096. +force_delete=Entraîne la suppression du chemin de sortie. +framework_version_number=Numéro de version de framework privilégié. +help_description=Affiche cette aide et quitte. +help_main_footer=Pour obtenir de l'aide sur chaque commande, exécutez\: +info_activities=Affiche le nom de la classe d'activité principale. En mode verbeux, affiche toutes les activités déclarées, y compris les « ». +info_app_class_name=Nom de la classe fille d' « Application ». +info_app_icon=Chemin/valeur de l'icône de l'application. En mode verbeux, affiche toutes les configurations. +info_app_icon_round=Chemin/valeur de l'icône ronde de l'application. En mode verbeux, affiche toutes les configurations. +info_app_name=Nom de l'application. En mode verbeux, affiche toutes les configurations. +info_app_version_code=Affiche la valeur de versionCode. +info_app_version_name=Affiche la valeur de versionName. +info_description=Affiche les informations du fichier APK. +info_dex=Affiche les informations des fichiers DEX. +info_example_1=[Rudimentaire]\n java -jar APKEditor.jar info -i fichier.apk\n +info_example_2=[Spécifier la sortie et le type]\n java -jar APKEditor.jar info -i chemin/entrée.apk -t json -v -o fichier_info.json\n +info_example_3=[Affiche uniquement le type spécifié]\n java -jar APKEditor.jar info -i chemin/entrée.apk -resources -filter-type drawable +info_filter_type=Affiche uniquement les types de ressources spécifiés\n *Cela s'applique uniquement lorsque le commutateur '-resources' est utilisé.\n *Peut être multiple. +info_invalid_output_extension=Extension de fichier invalide ! Attendu '%s', '%s' +info_configurations=Affiche les configurations de l'APK. +info_languages=Affiche les langues prises en charge dans l'APK. +info_locales=Affiche les paramètres régionaux pris en charge dans l'APK. +info_list_files=Liste les fichiers présents dans l'APK. +info_list_xml_files=Liste les fichiers XML compilés présents dans l'APK. +info_min_sdk_version=Version minimale du SDK. +info_package_name=Nom du paquet (identifiant de l'application) à partir du manifeste et, si le mode verbeux est activé, affiche les paquets de la table de ressources. +info_permissions=Autorisations. +info_print_types=Types/formats d'affichage\: +info_res=Affiche les entrées de ressources spécifiées par\:\n 1) ID de ressource hexadécimal ou décimal.\n 2) Nom de ressource complet e.g @string/app_name.\n *Peut être multiple. +info_resources=Affiche toutes les ressources. +info_signatures=Affihe les informations de signature. +info_signatures_base64=Affiche les informations de signature avec certificats base64. +info_strings=Affiche le contenu du « string pool » de la table de ressources de l'APK. +info_target_sdk_version=Version cible du SDK. +info_verbose_mode=Mode Verbeux. +info_xml_tree=Affiche les fichiers XML compilés des ressources données.\n *Peut être multiple +info_xml_strings=Affiche les chaînes des ressources XML compilées données.\n *Peut être multiple +input_path=Chemin d'entrée. +invalid_sig_parameter_combination=Combinaison de paramètres non valide !\nRépertoire de signatures fourni mais « -t sig » est manquant. +invalid_type_format=Chaîne <%s> '%s' non valide. +keep_original_res=Conserve les chemins d'accès aux fichiers res/*\:\n *S'applique uniquement lors du décodage en xml\n *Tous les fichiers « res/* » sont placés dans le répertoire « »\n *Les chemins relatifs seront liés aux fichiers « values/*xml ». +merge_description=Fusionne les fichiers APK fractionnés à partir d'un répertoire ou de fichiers APK archivés comme XAPK, APKM, APKS... +merge_example_1=[Rudimentaire]\n java -jar APKEditor.jar m -i chemin/entrée -o chemin/sortie.apk +missing_input_file=Fichier d'entrée manquant. +missing_sig_directory=Répertoire de signatures manquant. +missing_value_exception=Valeur manquante pour '%s'. +no_dex_debug=Supprime toutes les informations de débogage des fichiers smali/dex. +no_such_directory=Répertoire inexistant\: '%s'. +no_such_file=Fichier inexistant: '%s'. +no_such_file_or_directory=Fichier ou répertoire inexistant: '%s'. +output_path=Chemin de sortie. Facultatif, si non fourni, un nouveau fichier sera généré dans le même répertoire que celui d'entrée. +path_already_exists=Ce chemin existe déjà: '%s'. +path_is_directory_expect_file=Chemin d'un répertoire au lieu d'un fichier: '%s'. +path_is_file_expect_directory=Chemin d'un fichier au lieu d'un répertoire: '%s'. +path_of_framework=Chemin du fichier de framework (peut être multiple). +protect_confuse_zip=Obscurcie la structure du zip. Lorsque cette option est activée :\n * Les applications peuvent planter en cas d'accès direct aux fichiers APK, par exemple Class.getResourceAsStream().\n * Certains scanners APK peuvent signaler un « ZIP mal formé ». +protect_description=Protège/Masque les fichiers de ressources, en utilisant des techniques d'odfuscation uniques. +protect_dic_dir_name=Chemin vers un fichier texte contenant une liste de noms de répertoires séparés par une nouvelle ligne. +protect_dic_file_name=Chemin vers un fichier texte contenant une liste de noms de fichiers séparés par une nouvelle ligne. +protect_example_1=[Rudimentaire]\n java -jar APKEditor.jar p -i chemin/entrée.apk -o chemin/sortie.apk +protect_keep_type=Conserve les noms de type de ressource spécifiques (par exemple, drawable). Par défaut, conserve uniquement le type de ressource .\n *Peut être multiple +protect_skip_manifest=Préserve le manifeste. +raw_dex=Copie les fichiers DEX bruts / ignore smali. +res_dir_name=Définit le nom du répertoire des fichiers de ressources.\nPar exemple, pour l'obfuscation, assure le déplacement des fichiers de « res/* » vers « r/* » ou vice versa. +refactor_description=Refactorise les noms de ressources obscurcis. +refactor_example_1=[Rudimentaire]\n java -jar APKEditor.jar x -i chemin/entrée.apk -o chemin/sortie.apk +refactor_fix_types=Corrige les noms des types de ressources en fonction de leurs utilisations et de leur valeurs. +refactor_public_xml=Chemin du fichier des IDs de ressources « public.xml ».\nLes noms seront appliqués aux ressources. +signatures_path=Chemin du répertoire de signatures. +smali_registers=[Baksmali] Utilise la directive « .registers » au lieu de la directive par défaut « .locals ». +split_json=Divise « resources.arsc » en plusieurs parties selon le type d'entrée (utiliser cette option pour les fichiers volumineux). +title_commands=Commandes\: +title_app_description=Éditeur de fichiers binaires de ressources Android +title_example=Exemples\: +title_flags=Commutateurs\: +title_options=Options\: +title_other_options=Autres options\: +title_notes=Notes\: +title_usage=Utilisation\: +unknown_command_exception=Commande inconnue\: '%s' +unknown_option_exception=Option inconnue\: '%s' +validate_modules=Exige la même valeur « versionCode » pour le fichier base.apk et les fichiers APK fractionnés. +validate_resources_dir=Valide le nom du répertoire de ressources \n(par exemple, si le chemin d'un fichier de ressources drawable est « res/abc.png », il sera déplacé vers « res/drawable/abc.png »). diff --git a/src/main/resources/strings/strings.properties b/src/main/resources/strings/strings.properties new file mode 100644 index 00000000..0fffe57e --- /dev/null +++ b/src/main/resources/strings/strings.properties @@ -0,0 +1,141 @@ +################################################################################################ +# Localized strings used by APKEditor +# File naming: +# strings-[language]-[country(optional)].properties +# default: +# strings.properties +# e.g. : strings-en-US.properties, strings-en.properties +# +# Content: The content is as per specification of java.util.Properties +# Encoding: utf-8 only. If utf-8 can not handle, use escaped hex encoding. +# format: +# name={VALUE} +# name: A unique string of characters starting with a-z , digits 0-9 and underscore '_' +# {VALUE}: the value +# +# +# Comment: New line starting with '#' character +# +# NOTES: +# 1 - Optionally, keep the list alphabetically sorted by name. +# 2 - If the name and {VALUE} is the same as default, the entry can be ignored +# +################################################################################################ +# Authors: github.com/REAndroid, +################################################################################################ + +app_version=Displays version information and exit +app_help=Displays this help and exit +build_description=Builds android binary from json/xml/raw. +build_example_1=[Basic]\n java -jar APKEditor.jar b -i path/input_directory +build_example_2=[Specify output]\n java -jar APKEditor.jar b -i path/input_directory -o path/output.apk +build_example_3=[Restore signatures]\n java -jar APKEditor.jar b -t sig -i path/input.apk -sig path/signatures_dir +build_example_4=[Specify framework]\n java -jar APKEditor.jar b -i path/input_directory -framework framework-res.apk -framework platforms/android-32/android.jar +build_no_cache=Ignore built cached .dex files and re-build smali files. +build_types=Build types, By default build types determined by quick scanning of input directory files. Values are\: +clean_meta=Cleans META-INF directory along with signature block. +comment_level=[Baksmali] Sets the comment level.\n 1) off : No comment will be printed.\n 2) basic : Prints basic and resource id comments.\n 3) detail : Including , Prints class & method relation comments.\n 4) detail2 : Including , Prints encoded hex strings with literal as comment.\n 5) full : Prints all comments.\n **Default = detail +decode_description=Decodes android resources binary to readable json/xml/raw. +decode_dex_profile=Decodes dex profile binary files under assets/dexopt to readable json files. +decode_example_1=[Basic]\njava -jar APKEditor.jar d -i path/input.apk +decode_example_2=[Specify output]\njava -jar APKEditor.jar d -i path/input.apk -o path/output.apk +decode_example_3=[Specify decode type]\njava -jar APKEditor.jar d -t xml -i path/input.apk +decode_example_4=[Specify framework file(s)]\njava -jar APKEditor.jar d -i path/input.apk -framework framework-res.apk -framework platforms/android-32/android.jar +decode_example_5=[Decode apk signature block]\njava -jar APKEditor.jar d -t sig -i path/input.apk -sig path/signatures_dir +decode_no_cache=Do not create dex .cache files. +decode_load_dex=Number of dex files to load at a time.\nIf the apk dex files count greater than this value, then the decoder loads one dex at a time.\n *Applies only when -dex-lib set to internal.\n *Default = 3\n *See below. +decode_note_1=[internal] Dex builder\:\n* Fully supports dex files up to 042.\n* Highest dex file compression.\n* Builds with similar dex-section order as r8/dx.\n* Convenient dex markers editing, see file smali/classes/dex-file.json \n* Additional helpful smali comments: e.g class/method hierarchy.\n* Supports whitespaces on class simple name as introduced on dex 040+ +decode_note_2=[-load-dex] To print correct class/method hierarchy, it is necessary to load all dex files at once. This may result high memory consumption and could fail with "OutOfMemoryError" thus you are required to limit the number of dex files to load at a time. You can overcome this problem with -Xmx memory arg e.g java -Xmx8g -jar APKEditor.jar ... +decode_types=Decode types\: +decode_usage=d [Options, flags] +dump_dex_markers=Dumps dex markers (applies only when smali mode). +duplicate_option_exception=Duplicate option '%s' +dex_lib=Dex library to use\:\n 1) internal : Use internal library, supports dex versions up to 042.\n 2) jf : Use library by JesusFreke/smali, supports dex versions 035 and below.\n *Default = internal\n *See below. +dex_protect_level=Dex protection level (0-5).\n 0 - Off\n 1 - Basic\n 2 - Normal (Not implemented yet)\n 3 - High (Not implemented yet)\n 4 - Max (Not implemented yet)\n * Default 0 +empty_command_args_exception=Empty command, run with -h to get help +empty_command_option_exception=Empty options, run with -h to get help +encode_dex_profile=Encodes decoded dex profile json files to binary assets/dexopt files. +extract_native_libs=Sets extractNativeLibs attribute on manifest and applies compression of library files (*.so).\n *Default = manifest\n 1) manifest: read and apply from manifest.\n 2) none: remove attribute from manifest and store libraries compressed.\n 3) true: set manifest attribute 'true' and store libraries compressed.\n 4) false: set manifest attribute 'false' and store libraries un-compressed with 4096 alignment. +force_delete=Force delete output path. +framework_version_number=Preferred framework version number +help_description=Displays this help and exit. +help_main_footer=To get help about each command run with\: +info_activities=Prints main activity class name. If verbose mode, prints all declared activities including . +info_app_class_name=Application class name. +info_app_icon=App icon path/value. If verbose mode, prints all configurations. +info_app_icon_round=App round icon path/value. If verbose mode, prints all configurations. +info_app_name=App name. If verbose mode, prints all configurations. +info_app_version_code=App version code. +info_app_version_name=App version name. +info_description=Prints information of apk. +info_dex=Prints dex information. +info_example_1=[Basic]\n java -jar APKEditor.jar info -i file.apk +info_example_2=[Specify output and type]\n java -jar APKEditor.jar info -i path/input.apk -t json -v -o info_file.json +info_example_3=[Print only specific type]\n java -jar APKEditor.jar info -i path/input.apk -resources -filter-type drawable +info_filter_type=Prints only the specified resource type names\n *This applies only when flag '-resources' used.\n *Can be multiple. +info_invalid_output_extension=Invalid file extension! Expected '%s', '%s' +info_configurations=Print the configurations in the APK. +info_languages=Print the languages in the APK. +info_locales=Print the locales in the APK. +info_list_files=List files inside apk. +info_list_xml_files=List compiled xml files inside apk. +info_min_sdk_version=Minimum SDK version. +info_package_name=Package name(application id) from manifest and if verbose mode, prints resource table packages. +info_permissions=Permissions. +info_print_types=Print types/formats\: +info_res=Prints resource entries specified by either of\:\n 1) Hex or decimal resource id.\n 2) Full resource name e.g @string/app_name.\n *Can be multiple. +info_resources=Prints all resources +info_signatures=Prints signature information. +info_signatures_base64=Prints signature information with base64 certificates. +info_strings=Print the contents of the resource table string pool in the APK. +info_target_sdk_version=Target SDK version. +info_verbose_mode=Verbose mode. +info_xml_tree=Prints the compiled xmls in the given assets.\n *Can be multiple +info_xml_strings=Print the strings of the given compiled xml assets.\n *Can be multiple +input_path=Input path. +invalid_sig_parameter_combination=Invalid parameter combination!\nSignatures directory provided but missing: -t sig +invalid_type_format=Invalid <%s> string '%s' +keep_original_res=Keeps original res/* file paths\:\n *Applies only when decoding to xml\n *All res/* files will be placed on dir \n *The relative paths will be linked to values/*xml +merge_description=Merges split apk files from directory or compressed apk files like XAPK, APKM, APKS ... +merge_example_1=[Basic]\n java -jar APKEditor.jar m -i path/input -o path/output.apk +missing_input_file=Missing input file. +missing_sig_directory=Missing signatures directory. +missing_value_exception=Missing value for '%s' +no_dex_debug=Drops all debug info from smali/dex. +no_such_directory=No such directory: '%s' +no_such_file=No such file: '%s'. +no_such_file_or_directory=No such file or directory: '%s' +output_path=Output path. Optional, if not provided then a new file will be generated on same directory as input +path_already_exists=Path already exists: '%s' +path_is_directory_expect_file=Path is a directory expecting file: '%s' +path_is_file_expect_directory=Path is a file expecting directory: '%s' +path_of_framework=Path of framework file (can be multiple). +protect_confuse_zip=Confuse zip structure. When this turned on:\n * Apps might crash if accessing apk files directly e.g Class.getResourceAsStream().\n * Some apk scanners might flag it as "Malformed zip" +protect_description=Protects/Obfuscates apk resource files. Using unique obfuscation techniques. +protect_dic_dir_name=Path to a text file containing a list of directory names separated by new line. +protect_dic_file_name=Path to a text file containing a list of file names separated by new line. +protect_example_1=[Basic]\n java -jar APKEditor.jar p -i path/input.apk -o path/output.apk +protect_keep_type=Keep specific resource type names (e.g drawable), By default keeps only resource type.\n *Can be multiple +protect_skip_manifest=Do not protect manifest. +raw_dex=Copy raw dex files / skip smali. +res_dir_name=Sets resource files root dir name. e.g. for obfuscation to move files from 'res/*' to 'r/*' or vice versa. +refactor_description=Refactors obfuscated resource names +refactor_example_1=[Basic]\n java -jar APKEditor.jar x -i path/input.apk -o path/output.apk +refactor_fix_types=Corrects resource type names based on usages and values +refactor_public_xml=Path of resource ids xml file (public.xml)\nLoads names and applies to resources from 'public.xml' file +remove_annotation=[Baksmali] Type name of annotation to remove from dex\n e.g: -remove-annotation Lkotlin/Metadata;\n *Can be multiple. +signatures_path=Signatures directory path. +smali_registers=[Baksmali] Use ".registers" directive instead of the default ".locals". +split_json=Splits resources.arsc into multiple parts as per type entries (use this for large files) +title_commands=Commands\: +title_app_description=Android binary resource files editor +title_example=Examples\: +title_flags=Flags\: +title_options=Options\: +title_other_options=Other options\: +title_notes=Notes\: +title_usage=Usage\: +unknown_command_exception=Unknown command\: '%s' +unknown_option_exception=Unknown option\: '%s' +validate_modules=Validates for same versionNumber of base.apk with split apk files. +validate_resources_dir=Validate resources dir name\n(eg. if a drawable resource file path is 'res/abc.png' then it will be moved to 'res/drawable/abc.png)'