Compare commits

...

2 commits

Author SHA1 Message Date
Dmitry Isaenko
3981d0d8ca Merge remote-tracking branch 'origin/master'
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-09 15:26:32 +03:00
Dmitry Isaenko
29f29b7d31 Minor fixes 2023-02-09 15:25:13 +03:00
24 changed files with 139 additions and 42 deletions

View file

@ -42,6 +42,7 @@ Sometimes I add new posts about this project [on my blog page](https://developer
* [Pablo Curiel (DarkMatterCore)](https://github.com/DarkMatterCore) * [Pablo Curiel (DarkMatterCore)](https://github.com/DarkMatterCore)
* [wolfposd](https://github.com/wolfposd) * [wolfposd](https://github.com/wolfposd)
* [agungrbudiman](https://github.com/agungrbudiman) * [agungrbudiman](https://github.com/agungrbudiman)
* Perfect algorithms and great examples taken from mrdude project [mrdude2478/IPS_Patch_Creator](https://github.com/mrdude2478/IPS_Patch_Creator/)
* French by [Stephane Meden (JackFromNice)](https://github.com/JackFromNice) * French by [Stephane Meden (JackFromNice)](https://github.com/JackFromNice)
* Italian by [unbranched](https://github.com/unbranched) * Italian by [unbranched](https://github.com/unbranched)
@ -63,9 +64,7 @@ Sometimes I add new posts about this project [on my blog page](https://developer
### System requirements ### System requirements
JRE/JDK 8u60 or higher for Windows JDK 11 for macOS and Linux
JDK 11 for MacOS and Linux
### Supported Goldleaf versions ### Supported Goldleaf versions
| Goldleaf version | NS-USBloader version | | Goldleaf version | NS-USBloader version |
@ -130,8 +129,6 @@ Set 'Security & Privacy' settings if needed.
##### Windows: ##### Windows:
* [Download and install Java JRE](http://java.com/download/) (8u60 or higher)
* Get this application (JAR file) and double-click on it (alternatively open 'cmd', go to place where jar located and execute via `java -jar thisAppName.jar`)
* Once application opens click on 'Gear' icon. * Once application opens click on 'Gear' icon.
* Click 'Download and install drivers' * Click 'Download and install drivers'
* Install drivers * Install drivers
@ -235,10 +232,10 @@ Handling successful/failed installation is a purpose of the other side applicati
#### What is this '-legacy' jar?! #### What is this '-legacy' jar?!
**JAR with NO postfixes** recommended for Windows users, Linux users and MacOS users who're using Mojave or later versions. **JAR with NO postfixes** recommended for Windows users, Linux users and macOS users who're using Mojave or later versions.
**JAR with '-legacy' postfix** is for MacOS users who're still using OS X releases before (!) Mojave. **JAR with '-legacy' postfix** is for macOS users who're still using OS X releases before (!) Mojave.
(It also works for Linux and for Windows but sometimes it doesn't work for Windows and I don't know why). (It also works for Linux and for Windows, but sometimes it doesn't work for Windows and I don't know why).
We have this situation because of weird behaviour inside usb4java library used in this application for USB interactions. In '-legacy' it's v1.2.0 and in 'normal' it's v1.3.0 We have this situation because of weird behaviour inside usb4java library used in this application for USB interactions. In '-legacy' it's v1.2.0 and in 'normal' it's v1.3.0

View file

@ -144,4 +144,9 @@ public class AppPreferences {
public String getPatchesSaveToLocation(){ return FilesHelper.getRealFolder(preferences.get("patches_saveto", System.getProperty("user.home"))); } public String getPatchesSaveToLocation(){ return FilesHelper.getRealFolder(preferences.get("patches_saveto", System.getProperty("user.home"))); }
public void setPatchesSaveToLocation(String value){ preferences.put("patches_saveto", value); } public void setPatchesSaveToLocation(String value){ preferences.put("patches_saveto", value); }
public boolean getPatchesTabInvisible(){return preferences.getBoolean("patches_tab_visible", true); }
public void setPatchesTabInvisible(boolean value){preferences.putBoolean("patches_tab_visible", value);}
public String getPatchOffset(String type, int moduleNumber, int offsetId){ return preferences.get(String.format("%s_%02x_%02x", type, moduleNumber, offsetId), ""); }
public void setPatchOffset(String fullTypeSpecifier, String offset){ preferences.put(fullTypeSpecifier, offset); }
} }

View file

@ -70,9 +70,13 @@ public class NSLMainController implements Initializable {
MediatorControl.getInstance().setController(this); MediatorControl.getInstance().setController(this);
if (AppPreferences.getInstance().getAutoCheckUpdates()){ AppPreferences preferences = AppPreferences.getInstance();
if (preferences.getAutoCheckUpdates())
checkForUpdates(); checkForUpdates();
}
if (preferences.getPatchesTabInvisible())
mainTabPane.getTabs().remove(3);
openLastOpenedTab(); openLastOpenedTab();
} }

View file

@ -24,7 +24,9 @@ import javafx.fxml.Initializable;
import javafx.scene.input.DragEvent; import javafx.scene.input.DragEvent;
import javafx.scene.input.TransferMode; import javafx.scene.input.TransferMode;
import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.FileReader;
import java.net.URL; import java.net.URL;
import java.util.List; import java.util.List;
import java.util.ResourceBundle; import java.util.ResourceBundle;
@ -128,7 +130,10 @@ public class PatchesController implements Initializable {
List<File> filesDropped = event.getDragboard().getFiles(); List<File> filesDropped = event.getDragboard().getFiles();
for (File file : filesDropped){ for (File file : filesDropped){
if (file.isDirectory()) { if (file.isDirectory()) {
locationFirmwareLbl.setText(file.getAbsolutePath()); if (file.getName().toLowerCase().contains("atmosphe"))
locationAtmosphereLbl.setText(file.getAbsolutePath());
else
locationFirmwareLbl.setText(file.getAbsolutePath());
continue; continue;
} }
String fileName = file.getName().toLowerCase(); String fileName = file.getName().toLowerCase();
@ -137,10 +142,42 @@ public class PatchesController implements Initializable {
! fileName.equals("dev.keys") && ! fileName.equals("dev.keys") &&
! fileName.equals("title.keys"))) ! fileName.equals("title.keys")))
locationKeysLbl.setText(file.getAbsolutePath()); locationKeysLbl.setText(file.getAbsolutePath());
else if (fileName.equals("offsets.txt"))
setOffsets(file);
} }
event.setDropCompleted(true); event.setDropCompleted(true);
event.consume(); event.consume();
} }
private void setOffsets(File fileWithOffsets){
AppPreferences preferences = AppPreferences.getInstance();
try (BufferedReader reader = new BufferedReader(new FileReader(fileWithOffsets))) {
String fileLine;
String[] lineValues;
while ((fileLine = reader.readLine()) != null) {
lineValues = fileLine.trim().split("\\s+?=\\s+?", 2);
if (lineValues.length == 2) {
String[] pointer = lineValues[0].split("_", 3);
if (! pointer[0].equals("ES") && ! pointer[0].equals("FS"))
continue;
if (! pointer[1].matches("^([0-9A-Fa-f]{2})$"))
continue;
if (! pointer[2].matches("^([0-9A-Fa-f]{2})$"))
continue;
if (! lineValues[1].matches("^(([0-9A-Fa-f]{2})|\\.)+?$"))
continue;
preferences.setPatchOffset(lineValues[0], lineValues[1]);
System.out.println(pointer[0]+"_"+pointer[1]+"_"+pointer[2]+" = "+lineValues[1]);
}
}
}
catch (Exception e){
e.printStackTrace();
}
}
@FXML @FXML
private void selectFirmware(){ private void selectFirmware(){
DirectoryChooser directoryChooser = new DirectoryChooser(); DirectoryChooser directoryChooser = new DirectoryChooser();

View file

@ -32,9 +32,6 @@ import javafx.scene.layout.VBox;
import javafx.stage.Stage; import javafx.stage.Stage;
import nsusbloader.AppPreferences; import nsusbloader.AppPreferences;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ResourceBundle; import java.util.ResourceBundle;
public class DriversInstall { public class DriversInstall {

View file

@ -19,6 +19,7 @@
package nsusbloader.Utilities.patches.es.finders; package nsusbloader.Utilities.patches.es.finders;
import libKonogonka.Converter; import libKonogonka.Converter;
import nsusbloader.AppPreferences;
import nsusbloader.Utilities.patches.AHeuristic; import nsusbloader.Utilities.patches.AHeuristic;
import nsusbloader.Utilities.patches.BinToAsmPrinter; import nsusbloader.Utilities.patches.BinToAsmPrinter;
import nsusbloader.Utilities.patches.SimplyFind; import nsusbloader.Utilities.patches.SimplyFind;
@ -26,7 +27,7 @@ import nsusbloader.Utilities.patches.SimplyFind;
import java.util.List; import java.util.List;
class HeuristicEs1 extends AHeuristic { class HeuristicEs1 extends AHeuristic {
private static final String PATTERN = "1F90013128.8052"; private static final String PATTERN = AppPreferences.getInstance().getPatchOffset("ES", 1, 0);
private final List<Integer> findings; private final List<Integer> findings;
private final byte[] where; private final byte[] where;

View file

@ -19,6 +19,7 @@
package nsusbloader.Utilities.patches.es.finders; package nsusbloader.Utilities.patches.es.finders;
import libKonogonka.Converter; import libKonogonka.Converter;
import nsusbloader.AppPreferences;
import nsusbloader.Utilities.patches.AHeuristic; import nsusbloader.Utilities.patches.AHeuristic;
import nsusbloader.Utilities.patches.BinToAsmPrinter; import nsusbloader.Utilities.patches.BinToAsmPrinter;
import nsusbloader.Utilities.patches.SimplyFind; import nsusbloader.Utilities.patches.SimplyFind;
@ -27,7 +28,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
class HeuristicEs2 extends AHeuristic { class HeuristicEs2 extends AHeuristic {
private static final String PATTERN = ".D2.52"; private static final String PATTERN = AppPreferences.getInstance().getPatchOffset("ES", 2, 0);
private List<Integer> findings; private List<Integer> findings;
private final byte[] where; private final byte[] where;

View file

@ -19,6 +19,7 @@
package nsusbloader.Utilities.patches.es.finders; package nsusbloader.Utilities.patches.es.finders;
import libKonogonka.Converter; import libKonogonka.Converter;
import nsusbloader.AppPreferences;
import nsusbloader.Utilities.patches.AHeuristic; import nsusbloader.Utilities.patches.AHeuristic;
import nsusbloader.Utilities.patches.BinToAsmPrinter; import nsusbloader.Utilities.patches.BinToAsmPrinter;
import nsusbloader.Utilities.patches.SimplyFind; import nsusbloader.Utilities.patches.SimplyFind;
@ -26,8 +27,8 @@ import nsusbloader.Utilities.patches.SimplyFind;
import java.util.List; import java.util.List;
class HeuristicEs3 extends AHeuristic { class HeuristicEs3 extends AHeuristic {
private static final String PATTERN0 = "..FF97"; private static final String PATTERN0 = AppPreferences.getInstance().getPatchOffset("ES", 3, 0);
private static final String PATTERN1 = "......FF97"; // aka "E0230091..FF97"; private static final String PATTERN1 = AppPreferences.getInstance().getPatchOffset("ES", 3, 1);
private final List<Integer> findings; private final List<Integer> findings;
private final byte[] where; private final byte[] where;

View file

@ -77,9 +77,9 @@ public class FsIniMaker {
private void makeFwVersionInformationNotice(boolean isFat32, byte[] fwVersion){ private void makeFwVersionInformationNotice(boolean isFat32, byte[] fwVersion){
String fwVersionFormatted = fwVersion[3]+"."+fwVersion[2]+"."+fwVersion[1]+"."+fwVersion[0]; String fwVersionFormatted = fwVersion[3]+"."+fwVersion[2]+"."+fwVersion[1]+"."+fwVersion[0];
if (isFat32) if (isFat32)
firmwareVersionInformationNotice = "\n#FS "+fwVersionFormatted+"\n"; firmwareVersionInformationNotice = "\n#FS (FAT)"+fwVersionFormatted+"\n";
else else
firmwareVersionInformationNotice = "\n#FS "+fwVersionFormatted+"-ExFAT\n"; firmwareVersionInformationNotice = "\n#FS (ExFAT) "+fwVersionFormatted+"\n";
} }
private void makeSectionDeclaration(String patchName){ private void makeSectionDeclaration(String patchName){

View file

@ -88,13 +88,6 @@ public class FsPatch {
logPrinter.print(" == Debug information ==\n"+wizard.getDebug(), EMsgType.NULL); logPrinter.print(" == Debug information ==\n"+wizard.getDebug(), EMsgType.NULL);
} }
private KIP1Provider getKIP1Provider() throws Exception{ private KIP1Provider getKIP1Provider() throws Exception{
System.out.println("ncaProvider "+ncaProvider);
System.out.println("CONTENT "+ncaProvider.getNCAContentProvider(0));
System.out.println("CONTENT "+ncaProvider.getNCAContentProvider(1));
System.out.println("CONTENT "+ncaProvider.getNCAContentProvider(2));
System.out.println("CONTENT "+ncaProvider.getNCAContentProvider(3));
RomFsProvider romFsProvider = ncaProvider.getNCAContentProvider(0).getRomfs(); RomFsProvider romFsProvider = ncaProvider.getNCAContentProvider(0).getRomfs();
FileSystemEntry package2FsEntry = romFsProvider.getRootEntry().getContent() FileSystemEntry package2FsEntry = romFsProvider.getRootEntry().getContent()

View file

@ -19,6 +19,7 @@
package nsusbloader.Utilities.patches.fs.finders; package nsusbloader.Utilities.patches.fs.finders;
import libKonogonka.Converter; import libKonogonka.Converter;
import nsusbloader.AppPreferences;
import nsusbloader.Utilities.patches.AHeuristic; import nsusbloader.Utilities.patches.AHeuristic;
import nsusbloader.Utilities.patches.BinToAsmPrinter; import nsusbloader.Utilities.patches.BinToAsmPrinter;
import nsusbloader.Utilities.patches.SimplyFind; import nsusbloader.Utilities.patches.SimplyFind;
@ -27,7 +28,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
class HeuristicFs1 extends AHeuristic { class HeuristicFs1 extends AHeuristic {
private static final String PATTERN = "..0036....1F..71..0054..4839"; // TBZ private static final String PATTERN = AppPreferences.getInstance().getPatchOffset("FS", 1, 0); // TBZ
private final byte[] where; private final byte[] where;
private final List<Integer> findings; private final List<Integer> findings;

View file

@ -19,6 +19,7 @@
package nsusbloader.Utilities.patches.fs.finders; package nsusbloader.Utilities.patches.fs.finders;
import libKonogonka.Converter; import libKonogonka.Converter;
import nsusbloader.AppPreferences;
import nsusbloader.Utilities.patches.AHeuristic; import nsusbloader.Utilities.patches.AHeuristic;
import nsusbloader.Utilities.patches.BinToAsmPrinter; import nsusbloader.Utilities.patches.BinToAsmPrinter;
import nsusbloader.Utilities.patches.SimplyFind; import nsusbloader.Utilities.patches.SimplyFind;
@ -27,7 +28,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
class HeuristicFs2 extends AHeuristic { class HeuristicFs2 extends AHeuristic {
private static final String PATTERN = "...94081c00121f050071..0054"; // "...94"->BL "081c0012"->AND "1f050071"->CMP "..0054"->B.cond (only '54' is signature!) private static final String PATTERN = AppPreferences.getInstance().getPatchOffset("FS", 2, 0);
private final byte[] where; private final byte[] where;
private final List<Integer> findings; private final List<Integer> findings;

View file

@ -67,6 +67,11 @@ public class CommandLineInterface {
new GoldLeafCli(arguments); new GoldLeafCli(arguments);
return; return;
} }
if (cli.hasOption("experimental")){
final String[] arguments = cli.getOptionValues("experimental");
new ExperimentalCli(arguments);
return;
}
/* /*
if (cli.hasOption("x") || cli.hasOption("nxdt")){ if (cli.hasOption("x") || cli.hasOption("nxdt")){
final String[] arguments = cli.getOptionValues("nxdt"); final String[] arguments = cli.getOptionValues("nxdt");
@ -153,6 +158,12 @@ public class CommandLineInterface {
.hasArgs() .hasArgs()
.argName("...") .argName("...")
.build(); .build();
final Option experimentalOption = Option.builder()
.longOpt("experimental")
.desc("Enable testing and experimental functions")
.hasArgs()
.argName("y|n")
.build();
/* nxdumptool */ /* nxdumptool */
/* /*
final Option nxdtOption = Option.builder("x") final Option nxdtOption = Option.builder("x")
@ -183,6 +194,7 @@ public class CommandLineInterface {
group.addOption(helpOption); group.addOption(helpOption);
group.addOption(tinfoilOption); group.addOption(tinfoilOption);
group.addOption(glOption); group.addOption(glOption);
group.addOption(experimentalOption);
//group.addOption(nxdtOption); //group.addOption(nxdtOption);
group.addOption(splitOption); group.addOption(splitOption);
group.addOption(mergeOption); group.addOption(mergeOption);

View file

@ -0,0 +1,46 @@
/*
Copyright 2019-2023 Dmitry Isaenko
This file is part of NS-USBloader.
NS-USBloader is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
NS-USBloader is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with NS-USBloader. If not, see <https://www.gnu.org/licenses/>.
*/
package nsusbloader.cli;
import nsusbloader.AppPreferences;
public class ExperimentalCli {
ExperimentalCli(String[] arguments) throws IncorrectSetupException{
if (arguments == null || arguments.length == 0)
throw new IncorrectSetupException("No arguments.\nShould be 'y' or 'n'");
if (arguments.length > 1)
throw new IncorrectSetupException("Too many arguments.\nShould be 'y' or 'n' only");
String arg = arguments[0].toLowerCase().substring(0, 1);
if (arg.equals("y")) {
AppPreferences.getInstance().setPatchesTabInvisible(false);
System.out.println("Experimental functions enabled");
return;
}
if (arg.equals("n")) {
AppPreferences.getInstance().setPatchesTabInvisible(true);
System.out.println("Experimental functions disabled");
return;
}
throw new IncorrectSetupException("Incorrect arguments.\nCould be 'y' or 'n' only");
}
}

View file

@ -34,7 +34,7 @@ public class GoldLeafCli {
private int parseFileSince = 1; private int parseFileSince = 1;
public GoldLeafCli(String[] arguments) throws InterruptedException, IncorrectSetupException{ GoldLeafCli(String[] arguments) throws InterruptedException, IncorrectSetupException{
this.arguments = arguments; this.arguments = arguments;
checkArguments(); checkArguments();
@ -43,7 +43,7 @@ public class GoldLeafCli {
runGoldLeafBackend(); runGoldLeafBackend();
} }
public void checkArguments() throws IncorrectSetupException{ private void checkArguments() throws IncorrectSetupException{
if (arguments == null || arguments.length == 0) { if (arguments == null || arguments.length == 0) {
throw new IncorrectSetupException("No arguments.\n" + throw new IncorrectSetupException("No arguments.\n" +
"Try 'ns-usbloader -g help' for more information."); "Try 'ns-usbloader -g help' for more information.");
@ -83,7 +83,7 @@ public class GoldLeafCli {
return builder.toString(); return builder.toString();
} }
public void parseGoldLeafVersion() throws IncorrectSetupException{ private void parseGoldLeafVersion() throws IncorrectSetupException{
String argument1 = arguments[0]; String argument1 = arguments[0];
if (! argument1.startsWith("ver=")) { if (! argument1.startsWith("ver=")) {
@ -107,7 +107,7 @@ public class GoldLeafCli {
getGlSupportedVersions()); getGlSupportedVersions());
} }
public void parseFilesArguments() throws IncorrectSetupException{ private void parseFilesArguments() throws IncorrectSetupException{
filesList = new ArrayList<>(); filesList = new ArrayList<>();
File file; File file;
@ -123,7 +123,7 @@ public class GoldLeafCli {
} }
} }
public void runGoldLeafBackend() throws InterruptedException { private void runGoldLeafBackend() throws InterruptedException {
Runnable task = new UsbCommunications(filesList, Runnable task = new UsbCommunications(filesList,
"GoldLeaf"+goldLeafVersion, "GoldLeaf"+goldLeafVersion,
filterForNsp); filterForNsp);

View file

@ -27,7 +27,7 @@ public class NxdtCli {
private final String[] arguments; private final String[] arguments;
private String saveTo; private String saveTo;
public NxdtCli(String[] arguments) throws InterruptedException, IncorrectSetupException{ NxdtCli(String[] arguments) throws InterruptedException, IncorrectSetupException{
this.arguments = arguments; this.arguments = arguments;
parseArgument(); parseArgument();
runBackend(); runBackend();

View file

@ -29,7 +29,7 @@ public class TinfoilUsbCli {
private final String[] arguments; private final String[] arguments;
private List<File> filesList; private List<File> filesList;
public TinfoilUsbCli(String[] arguments) throws InterruptedException, IncorrectSetupException{ TinfoilUsbCli(String[] arguments) throws InterruptedException, IncorrectSetupException{
this.arguments = arguments; this.arguments = arguments;
checkArguments(); checkArguments();
parseFilesArguments(); parseFilesArguments();

View file

@ -52,7 +52,7 @@ Steps to roll NXDT functionality back:
<fx:include fx:id="PatchesTab" source="PatchesTab.fxml" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" VBox.vgrow="ALWAYS" /> <fx:include fx:id="PatchesTab" source="PatchesTab.fxml" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" VBox.vgrow="ALWAYS" />
</content> </content>
<graphic> <graphic>
<SVGPath content="M 5.8828125 0.2109375 C 5.0191331 0.17810553 4.0925755 0.5807669 3.421875 1.3671875 L 0.88671875 4.3398438 C -0.18640328 5.598116 -0.18550892 7.3497981 0.890625 8.2675781 L 4.625 11.451172 L 0.76367188 14.517578 C -0.34380932 15.397272 -0.4055432 17.146472 0.62304688 18.441406 L 3.0527344 21.501953 C 4.0813235 22.796885 5.8007221 23.131646 6.9082031 22.251953 L 12.283203 17.982422 L 17.5 22.431641 C 18.57613 23.34942 20.305782 23.07468 21.378906 21.816406 L 23.914062 18.84375 C 24.987183 17.585475 24.986236 15.833793 23.910156 14.916016 L 20.164062 11.722656 L 24.001953 8.6738281 C 25.109433 7.7941344 25.171167 6.0449323 24.142578 4.75 L 21.712891 1.6914062 C 20.684303 0.39647305 18.964905 0.059759405 17.857422 0.93945312 L 12.505859 5.1914062 L 7.3007812 0.75195312 C 6.8972331 0.40778617 6.4010201 0.23063678 5.8828125 0.2109375 z M 10.304688 5.703125 C 10.467609 5.685648 10.663263 5.7499911 10.828125 5.890625 L 11.210938 6.21875 L 6.5957031 9.8847656 L 10.060547 5.8242188 C 10.120897 5.7534558 10.206934 5.7136111 10.304688 5.703125 z M 14.550781 5.7402344 C 14.6898 5.7328444 14.815451 5.7759495 14.892578 5.8730469 L 18.494141 10.408203 C 18.648395 10.602401 18.552761 10.932817 18.28125 11.148438 L 10.611328 17.238281 C 10.339882 17.453897 9.9980038 17.47154 9.84375 17.277344 L 6.2421875 12.744141 C 6.0879337 12.549944 6.1836297 12.221473 6.4550781 12.005859 L 14.123047 5.9140625 C 14.258772 5.806255 14.411762 5.7476235 14.550781 5.7402344 z M 13.505859 7.1542969 A 0.76761252 0.76761252 0 0 0 13.0625 7.3222656 A 0.76761252 0.76761252 0 0 0 12.943359 8.4023438 A 0.76761252 0.76761252 0 0 0 14.023438 8.5195312 A 0.76761252 0.76761252 0 0 0 14.140625 7.4414062 A 0.76761252 0.76761252 0 0 0 13.505859 7.1542969 z M 16.201172 10.509766 A 0.76742482 0.76742482 0 0 0 15.757812 10.677734 A 0.76742482 0.76742482 0 0 0 15.640625 11.757812 A 0.76742482 0.76742482 0 0 0 16.71875 11.875 A 0.76742482 0.76742482 0 0 0 16.837891 10.796875 A 0.76742482 0.76742482 0 0 0 16.201172 10.509766 z M 12.322266 10.855469 A 0.76742482 0.76742482 0 0 0 11.878906 11.023438 A 0.76742482 0.76742482 0 0 0 11.759766 12.101562 A 0.76742482 0.76742482 0 0 0 12.839844 12.220703 A 0.76742482 0.76742482 0 0 0 12.957031 11.140625 A 0.76742482 0.76742482 0 0 0 12.322266 10.855469 z M 8.4589844 11.199219 A 0.76742482 0.76742482 0 0 0 8.0136719 11.367188 A 0.76742482 0.76742482 0 0 0 7.8964844 12.447266 A 0.76742482 0.76742482 0 0 0 8.9746094 12.566406 A 0.76742482 0.76742482 0 0 0 9.09375 11.486328 A 0.76742482 0.76742482 0 0 0 8.4589844 11.199219 z M 18.248047 13.244141 L 14.707031 17.396484 C 14.546099 17.585183 14.205167 17.555044 13.941406 17.330078 L 13.537109 16.986328 L 18.248047 13.244141 z M 11.15625 14.570312 A 0.76742482 0.76742482 0 0 0 10.712891 14.738281 A 0.76742482 0.76742482 0 0 0 10.595703 15.816406 A 0.76742482 0.76742482 0 0 0 11.671875 15.935547 A 0.76742482 0.76742482 0 0 0 11.791016 14.855469 A 0.76742482 0.76742482 0 0 0 11.15625 14.570312 z" /> <SVGPath content="M 5.7207031,0.20898438 C 4.9048038,0.22904941 4.0506554,0.62991967 3.421875,1.3671875 L 0.88671875,4.3398438 C -0.18640114,5.5981134 -0.18550676,7.3497999 0.890625,8.2675781 L 4.0273438,10.941406 C 6.6544469,8.8548374 9.2821295,6.7689991 11.910156,4.6835938 L 7.3007812,0.75195312 C 6.8972341,0.40778687 6.4010191,0.23063674 5.8828125,0.2109375 5.8288326,0.20888551 5.7750964,0.20764671 5.7207031,0.20898438 Z M 19.292969,0.44921875 C 18.77426,0.4506047 18.272727,0.60956864 17.857422,0.93945312 13.098348,4.719624 9.1497641,7.8546793 4.625,11.451172 H 4.62305 c -1.286759,1.021757 -2.5730291,2.044129 -3.85937502,3.066406 -1.107479,0.879692 -1.16921304,2.628898 -0.140625,3.923828 l 2.42968752,3.060547 c 1.0285869,1.29493 2.7479899,1.629691 3.8554687,0.75 L 24.001876,8.6737831 C 25.109431,7.7941362 25.171165,6.0449297 24.142578,4.75 L 21.712891,1.6914062 C 21.070024,0.8820747 20.157482,0.44690884 19.292969,0.44921875 Z M 14.550781,5.7402344 c 0.139019,-0.00739 0.26467,0.035715 0.341797,0.1328125 l 3.601563,4.5351561 c 0.154252,0.194198 0.05862,0.524614 -0.212891,0.740235 l -7.669922,6.089843 C 10.339882,17.453897 9.9980034,17.47154 9.84375,17.277344 L 6.2421875,12.744141 C 6.0879341,12.549944 6.1836303,12.221473 6.4550781,12.005859 L 14.123047,5.9140625 c 0.135725,-0.1078073 0.288715,-0.166439 0.427734,-0.1738281 z m -1.044922,1.4140625 c -0.161808,0.0078 -0.316999,0.066599 -0.443359,0.1679687 -0.331549,0.2651389 -0.384928,0.7490485 -0.119141,1.0800782 0.265722,0.3309315 0.749564,0.3834278 1.080079,0.1171874 0.329672,-0.2655771 0.3821,-0.7479194 0.117187,-1.078125 C 13.98715,7.2496671 13.751194,7.1429424 13.505859,7.1542969 Z m 2.695313,3.3554691 c -0.161811,0.0078 -0.317006,0.06659 -0.44336,0.167968 -0.331029,0.265668 -0.383535,0.749595 -0.117187,1.080078 0.265523,0.32977 0.74795,0.382208 1.078125,0.117188 0.330388,-0.264941 0.383708,-0.747437 0.119141,-1.078125 -0.153867,-0.192337 -0.390703,-0.299131 -0.636719,-0.287109 z m -3.878906,0.345703 c -0.161811,0.0078 -0.317006,0.06659 -0.44336,0.167969 -0.330387,0.264941 -0.383706,0.747436 -0.11914,1.078124 0.265085,0.331648 0.74908,0.385036 1.080078,0.119141 0.331029,-0.265668 0.383535,-0.749595 0.117187,-1.080078 -0.153858,-0.191033 -0.389764,-0.297009 -0.634765,-0.285156 z m -3.8632816,0.34375 c -0.1624871,0.0074 -0.3184262,0.0662 -0.4453125,0.167969 -0.3310296,0.265668 -0.3835352,0.749595 -0.1171875,1.080078 0.2649414,0.330388 0.747437,0.383707 1.078125,0.11914 C 9.3062569,12.301321 9.3596452,11.817326 9.09375,11.486328 8.9402947,11.294564 8.7043254,11.187834 8.4589844,11.199219 Z M 20.761719,12.232422 12.880859,18.492188 17.5,22.431641 c 1.076128,0.917777 2.805784,0.643037 3.878906,-0.615235 l 2.535156,-2.972656 c 1.073119,-1.258273 1.072172,-3.009959 -0.0039,-3.927734 z m -9.605469,2.33789 c -0.161811,0.0078 -0.317006,0.06659 -0.443359,0.167969 -0.32977,0.265523 -0.382208,0.74795 -0.117188,1.078125 0.264795,0.329134 0.745796,0.382385 1.076172,0.119141 0.331648,-0.265085 0.385036,-0.74908 0.119141,-1.080078 -0.153858,-0.191034 -0.389765,-0.29701 -0.634766,-0.285157 z" />
</graphic> </graphic>
</Tab> </Tab>
<Tab closable="false"> <Tab closable="false">

View file

@ -129,8 +129,8 @@
<Pane VBox.vgrow="ALWAYS" /> <Pane VBox.vgrow="ALWAYS" />
<HBox alignment="CENTER" spacing="5.0"> <HBox alignment="CENTER" spacing="5.0">
<children> <children>
<Button fx:id="makeEsBtn" contentDisplay="TOP" mnemonicParsing="false" styleClass="buttonUp" text="%tabPatches_Btn_MakeEs" />
<Button fx:id="makeFsBtn" contentDisplay="TOP" mnemonicParsing="false" styleClass="buttonUp" text="%tabPatches_Btn_MakeFs" /> <Button fx:id="makeFsBtn" contentDisplay="TOP" mnemonicParsing="false" styleClass="buttonUp" text="%tabPatches_Btn_MakeFs" />
<Button fx:id="makeEsBtn" contentDisplay="TOP" mnemonicParsing="false" styleClass="buttonUp" text="%tabPatches_Btn_MakeEs" />
<Button fx:id="makeLoaderBtn" contentDisplay="TOP" mnemonicParsing="false" styleClass="buttonUp" text="%tabPatches_Btn_MakeAtmo" /> <Button fx:id="makeLoaderBtn" contentDisplay="TOP" mnemonicParsing="false" styleClass="buttonUp" text="%tabPatches_Btn_MakeAtmo" />
</children> </children>
</HBox> </HBox>

View file

@ -79,3 +79,4 @@ windowBodyFilesScanned=\u30B9\u30AD\u30E3\u30F3\u3055\u308C\u305F\u30D5\u30A1\u3
tab2_Lbl_AwooBlockTitle=Awoo\u30A4\u30F3\u30B9\u30C8\u30FC\u30E9\u30FC\u3068\u4E92\u63DB\u6027 tab2_Lbl_AwooBlockTitle=Awoo\u30A4\u30F3\u30B9\u30C8\u30FC\u30E9\u30FC\u3068\u4E92\u63DB\u6027
tabRcm_Lbl_Payload=\u30DA\u30A4\u30ED\u30FC\u30C9\uFF1A tabRcm_Lbl_Payload=\u30DA\u30A4\u30ED\u30FC\u30C9\uFF1A
tabRcm_Lbl_FuseeGelee=Fus\u00E9e Gel\u00E9e RCM tabRcm_Lbl_FuseeGelee=Fus\u00E9e Gel\u00E9e RCM

View file

@ -85,7 +85,7 @@ tabPatches_Btn_MakeEs=\u0421\u0433\u0435\u043D\u0435\u0440\u0438\u0440\u043E\u04
tabPatches_Btn_MakeFs=\u0421\u0433\u0435\u043D\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0434\u043B\u044F FS tabPatches_Btn_MakeFs=\u0421\u0433\u0435\u043D\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0434\u043B\u044F FS
tabPatches_Lbl_Atmo=Atmosphere: tabPatches_Lbl_Atmo=Atmosphere:
tabPatches_Lbl_Firmware=\u041F\u0440\u043E\u0448\u0438\u0432\u043A\u0430: tabPatches_Lbl_Firmware=\u041F\u0440\u043E\u0448\u0438\u0432\u043A\u0430:
tabPatches_Lbl_Keys=\u041A\u043B\u044E\u0447\u0438 tabPatches_Lbl_Keys=\u041A\u043B\u044E\u0447\u0438:
tabPatches_Lbl_Title=\u041F\u0430\u0442\u0447\u0438 tabPatches_Lbl_Title=\u041F\u0430\u0442\u0447\u0438
tabPatches_ServiceWindowMessageEsFs=\u0414\u043B\u044F \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u043F\u0430\u0442\u0447\u0435\u0439 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0443\u043A\u0430\u0437\u0430\u0442\u044C \u043A\u0430\u043A \u043F\u0443\u0442\u044C \u043A \u043F\u0440\u043E\u0448\u0438\u0432\u043A\u0435, \u0442\u0430\u043A \u0438 \u043F\u0443\u0442\u044C \u043A \u0444\u0430\u0439\u043B\u0443 \u043A\u043B\u044E\u0447\u0435\u0439. \u0418\u043D\u0430\u0447\u0435 \u043D\u0435 \u043F\u043E\u043D\u044F\u0442\u043D\u043E \u0447\u0442\u043E \u0436\u0435 \u043F\u0430\u0442\u0447\u0438\u0442\u044C. tabPatches_ServiceWindowMessageEsFs=\u0414\u043B\u044F \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u043F\u0430\u0442\u0447\u0435\u0439 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0443\u043A\u0430\u0437\u0430\u0442\u044C \u043A\u0430\u043A \u043F\u0443\u0442\u044C \u043A \u043F\u0440\u043E\u0448\u0438\u0432\u043A\u0435, \u0442\u0430\u043A \u0438 \u043F\u0443\u0442\u044C \u043A \u0444\u0430\u0439\u043B\u0443 \u043A\u043B\u044E\u0447\u0435\u0439. \u0418\u043D\u0430\u0447\u0435 \u043D\u0435 \u043F\u043E\u043D\u044F\u0442\u043D\u043E \u0447\u0442\u043E \u0436\u0435 \u043F\u0430\u0442\u0447\u0438\u0442\u044C.
tabPatches_ServiceWindowMessageLoader=\u0414\u043B\u044F \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u043F\u0430\u0442\u0447\u0430 \u00ABLoader\u00BB \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0443\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u0443\u0442\u044C \u043A Atmosphere. tabPatches_ServiceWindowMessageLoader=\u0414\u043B\u044F \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u043F\u0430\u0442\u0447\u0430 \u00ABLoader\u00BB \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0443\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u0443\u0442\u044C \u043A Atmosphere.

View file

@ -85,7 +85,7 @@ tabPatches_Btn_MakeEs=\u0421\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0434\u0
tabPatches_Btn_MakeFs=\u0421\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0434\u043B\u044F FS tabPatches_Btn_MakeFs=\u0421\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0434\u043B\u044F FS
tabPatches_Lbl_Atmo=Atmosphere: tabPatches_Lbl_Atmo=Atmosphere:
tabPatches_Lbl_Firmware=\u041F\u0440\u043E\u0448\u0438\u0432\u043A\u0430: tabPatches_Lbl_Firmware=\u041F\u0440\u043E\u0448\u0438\u0432\u043A\u0430:
tabPatches_Lbl_Keys=\u041A\u043B\u044E\u0447\u0456 tabPatches_Lbl_Keys=\u041A\u043B\u044E\u0447\u0456:
tabPatches_Lbl_Title=\u041F\u0430\u0442\u0447\u0438 tabPatches_Lbl_Title=\u041F\u0430\u0442\u0447\u0438
tabPatches_ServiceWindowMessageEsFs=\u0414\u043B\u044F \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043D\u044F \u043F\u0430\u0442\u0447\u0456\u0432 \u043D\u0435\u043E\u0431\u0445\u0456\u0434\u043D\u043E \u0432\u043A\u0430\u0437\u0430\u0442\u0438 \u044F\u043A \u0448\u043B\u044F\u0445 \u0434\u043E \u043F\u0440\u043E\u0448\u0438\u0432\u043A\u0438, \u0442\u0430\u043A \u0456 \u0434\u043E \u0444\u0430\u0439\u043B\u0443 \u043A\u043B\u044E\u0447\u0456\u0432. \u0411\u043E \u0456\u043D\u0430\u043A\u0448\u0435 \u043D\u0435 \u0437\u0440\u043E\u0437\u0443\u043C\u0456\u043B\u043E \u0449\u043E \u0436 \u0442\u0440\u0435\u0431\u0430 \u043F\u0430\u0442\u0447\u0438\u0442\u0438. tabPatches_ServiceWindowMessageEsFs=\u0414\u043B\u044F \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043D\u044F \u043F\u0430\u0442\u0447\u0456\u0432 \u043D\u0435\u043E\u0431\u0445\u0456\u0434\u043D\u043E \u0432\u043A\u0430\u0437\u0430\u0442\u0438 \u044F\u043A \u0448\u043B\u044F\u0445 \u0434\u043E \u043F\u0440\u043E\u0448\u0438\u0432\u043A\u0438, \u0442\u0430\u043A \u0456 \u0434\u043E \u0444\u0430\u0439\u043B\u0443 \u043A\u043B\u044E\u0447\u0456\u0432. \u0411\u043E \u0456\u043D\u0430\u043A\u0448\u0435 \u043D\u0435 \u0437\u0440\u043E\u0437\u0443\u043C\u0456\u043B\u043E \u0449\u043E \u0436 \u0442\u0440\u0435\u0431\u0430 \u043F\u0430\u0442\u0447\u0438\u0442\u0438.
tabPatches_ServiceWindowMessageLoader=\u0414\u043B\u044F \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0456\u0457 "Loader"-\u043F\u0430\u0442\u0447\u0443 \u043D\u0435\u043E\u0431\u0445\u0456\u0434\u043D\u043E \u0432\u043A\u0430\u0437\u0430\u0442\u0438 \u0448\u043B\u044F\u0445 \u0434\u043E Atmosphere. tabPatches_ServiceWindowMessageLoader=\u0414\u043B\u044F \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0456\u0457 "Loader"-\u043F\u0430\u0442\u0447\u0443 \u043D\u0435\u043E\u0431\u0445\u0456\u0434\u043D\u043E \u0432\u043A\u0430\u0437\u0430\u0442\u0438 \u0448\u043B\u044F\u0445 \u0434\u043E Atmosphere.

View file

@ -410,7 +410,7 @@
-fx-min-width: 36; -fx-min-width: 36;
} }
.regionCake{ .regionCake{
-fx-shape: "M12,1.5A2.5,2.5 0 0,1 14.5,4A2.5,2.5 0 0,1 12,6.5A2.5,2.5 0 0,1 9.5,4A2.5,2.5 0 0,1 12,1.5M15.87,5C18,5 20,7 20,9C22.7,9 22.7,13 20,13H4C1.3,13 1.3,9 4,9C4,7 6,5 8.13,5C8.57,6.73 10.14,8 12,8C13.86,8 15.43,6.73 15.87,5M5,15H8L9,22H7L5,15M10,15H14L13,22H11L10,15M16,15H19L17,22H15L16,15Z"; -fx-shape: "M4,8H8V4A2,2 0 0,1 10,2H14A2,2 0 0,1 16,4V8H20A2,2 0 0,1 22,10V14A2,2 0 0,1 20,16H16V20A2,2 0 0,1 14,22H10A2,2 0 0,1 8,20V16H4A2,2 0 0,1 2,14V10A2,2 0 0,1 4,8Z";
-fx-background-color: #71e016; -fx-background-color: #71e016;
-size: 24; -size: 24;
-fx-min-height: -size; -fx-min-height: -size;

View file

@ -328,7 +328,7 @@
-fx-min-width: 36; -fx-min-width: 36;
} }
.regionCake{ .regionCake{
-fx-shape: "M12,1.5A2.5,2.5 0 0,1 14.5,4A2.5,2.5 0 0,1 12,6.5A2.5,2.5 0 0,1 9.5,4A2.5,2.5 0 0,1 12,1.5M15.87,5C18,5 20,7 20,9C22.7,9 22.7,13 20,13H4C1.3,13 1.3,9 4,9C4,7 6,5 8.13,5C8.57,6.73 10.14,8 12,8C13.86,8 15.43,6.73 15.87,5M5,15H8L9,22H7L5,15M10,15H14L13,22H11L10,15M16,15H19L17,22H15L16,15Z"; -fx-shape: "M 52.622991,6.7185427 C 52.213045,6.4681532 51.742193,6.3616112 51.258618,6.4438832 45.71725,7.3866127 41.12023,8.1676407 35.850536,9.0660487 l -0.0016,-9.79e-4 c -1.498122,0.254615 -2.996147,0.509996 -4.49419,0.765259 C 30.065184,10.04972 29.18995,11.524098 29.389694,13.13662 l 0.471017,3.81051 c 0.199745,1.61252 1.398275,2.734352 2.687806,2.51496 l 19.903814,-3.38653 c 1.28957,-0.219316 2.164805,-1.693694 1.965061,-3.306216 L 53.945504,8.9605237 c -0.12484,-1.007826 -0.639267,-1.824665 -1.322511,-2.241981 z m -6.241938,2.250248 c 0.113185,0.06107 0.191964,0.159083 0.206942,0.279995 l 0.698924,5.6470533 c 0.02995,0.241824 -0.201633,0.4796 -0.517755,0.533347 l -8.92955,1.517244 c -0.316067,0.05378 -0.59416,-0.0969 -0.62412,-0.338696 l -0.699845,-5.645371 c -0.02995,-0.241824 0.200761,-0.477898 0.516831,-0.53167 l 8.92893,-1.5198703 c 0.158036,-0.02689 0.306459,-0.0031 0.419645,0.05797 z m -1.492669,0.709292 c -0.131362,-0.07177 -0.281599,-0.09647 -0.429205,-0.07058 -0.386891,0.06721 -0.657665,0.4574873 -0.60436,0.8710843 0.0533,0.41348 0.410276,0.693298 0.796873,0.624636 0.38562,-0.0685 0.654902,-0.457888 0.601897,-0.870353 -0.0305,-0.2393373 -0.166256,-0.4455623 -0.365205,-0.5547893 z m 0.541258,4.1929763 c -0.131364,-0.07178 -0.2816,-0.09649 -0.42919,-0.07067 -0.386733,0.06792 -0.656825,0.458632 -0.602817,0.87203 0.05369,0.412385 0.409579,0.691467 0.79533,0.62369 0.385885,-0.06761 0.655942,-0.456693 0.603438,-0.869405 -0.03053,-0.240037 -0.166944,-0.446749 -0.366746,-0.555731 z m -3.224035,-1.584024 c -0.131362,-0.07178 -0.281601,-0.09649 -0.429187,-0.07067 -0.385883,0.06761 -0.65594,0.456692 -0.603438,0.869403 0.05246,0.413787 0.409134,0.694445 0.79595,0.626315 0.386733,-0.06792 0.656825,-0.458632 0.602818,-0.872031 -0.03114,-0.238911 -0.167205,-0.44447 -0.366127,-0.553105 z m -3.210781,-1.578124 c -0.131709,-0.07245 -0.282538,-0.0975 -0.430755,-0.07148 -0.386733,0.06792 -0.656824,0.458632 -0.602819,0.872031 0.05295,0.412634 0.408466,0.692506 0.79441,0.625367 0.386945,-0.06712 0.657765,-0.457462 0.604359,-0.871084 -0.03048,-0.239347 -0.166236,-0.445584 -0.365203,-0.554786 z m 0.535415,4.207358 c -0.131364,-0.07178 -0.281601,-0.09649 -0.429189,-0.07067 -0.385669,0.06841 -0.654999,0.457862 -0.601896,0.870353 0.05342,0.411484 0.407796,0.690572 0.792868,0.624421 0.386945,-0.06712 0.657766,-0.457462 0.60436,-0.871085 -0.03114,-0.238912 -0.167207,-0.444469 -0.366128,-0.553106 z";
-fx-background-color: #71e016; -fx-background-color: #71e016;
-size: 24; -size: 24;
-fx-min-height: -size; -fx-min-height: -size;