├── .gitignore ├── Properties ├── Settings.settings ├── Settings.Designer.cs ├── AssemblyInfo.cs ├── Resources.Designer.cs └── Resources.resx ├── FileFormats ├── MashedFile.cs └── PIZ │ ├── MagicNumbers.cs │ ├── FileHeader.cs │ ├── PIZFile.cs │ └── FileSignature.cs ├── App.xaml ├── App.xaml.cs ├── .github └── FUNDING.yml ├── MainWindow.xaml ├── MainWindow.xaml.cs └── SciLors Mashed File Extractor.csproj /.gitignore: -------------------------------------------------------------------------------- 1 | bin/** 2 | obj/** -------------------------------------------------------------------------------- /Properties/Settings.settings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /FileFormats/MashedFile.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.IO; 6 | 7 | namespace SciLors_Mashed_File_Extractor.FileFormats { 8 | public class MashedFile { 9 | 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /App.xaml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /App.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Configuration; 4 | using System.Data; 5 | using System.Linq; 6 | using System.Windows; 7 | 8 | namespace SciLors_Mashed_File_Extractor { 9 | /// 10 | /// Interaction logic for App.xaml 11 | /// 12 | public partial class App : Application { 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: SciLor # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /FileFormats/PIZ/MagicNumbers.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | 6 | namespace SciLors_Mashed_File_Extractor.FileFormats.PIZ { 7 | public class MagicNumbers { 8 | public static readonly byte[] FILE_SIGNATURE = new byte[] { 0x50, 0x49, 0x5A }; //PIZ 9 | public static readonly byte[] FILE_SIGNATURE_APPENDIX = new byte[] { 0x00, 0x03, 0x00, 0x00, 0x00 }; 10 | 11 | public const int FILE_SIGNATURE_APPENDIX2_LENGTH = 4; 12 | 13 | public const int OFFSET_FILE_COUNT = 0x08; 14 | public const int OFFSET_SECOND_FILE_SIGNATURE_APPENDIX = 0x0D; //0x00 or 0xCC 15 | public const int OFFSET_FILE_HEADER = 0x800; 16 | public const int OFFSET_FILE_HEADER_SIZE = 0x80; 17 | 18 | public const int OFFSET_FILE_HEADER_FILE_NAME_MAX_SIZE = 0x73; 19 | public const int OFFSET_FILE_HEADER_FILE_OFFSET = 0x74; 20 | public const int OFFSET_FILE_HEADER_FILE_SIZE = 0x78; 21 | public const int OFFSET_FILE_HEADER_FILE_UNKNOWN = 0x7C; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /MainWindow.xaml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace SciLors_Mashed_File_Extractor.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Resources; 3 | using System.Runtime.CompilerServices; 4 | using System.Runtime.InteropServices; 5 | using System.Windows; 6 | 7 | // General Information about an assembly is controlled through the following 8 | // set of attributes. Change these attribute values to modify the information 9 | // associated with an assembly. 10 | [assembly: AssemblyTitle("SciLors Mashed File Extractor")] 11 | [assembly: AssemblyDescription("")] 12 | [assembly: AssemblyConfiguration("")] 13 | [assembly: AssemblyCompany("")] 14 | [assembly: AssemblyProduct("SciLors Mashed File Extractor")] 15 | [assembly: AssemblyCopyright("Copyright © 2016")] 16 | [assembly: AssemblyTrademark("")] 17 | [assembly: AssemblyCulture("")] 18 | 19 | // Setting ComVisible to false makes the types in this assembly not visible 20 | // to COM components. If you need to access a type in this assembly from 21 | // COM, set the ComVisible attribute to true on that type. 22 | [assembly: ComVisible(false)] 23 | 24 | //In order to begin building localizable applications, set 25 | //CultureYouAreCodingWith in your .csproj file 26 | //inside a . For example, if you are using US english 27 | //in your source files, set the to en-US. Then uncomment 28 | //the NeutralResourceLanguage attribute below. Update the "en-US" in 29 | //the line below to match the UICulture setting in the project file. 30 | 31 | //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] 32 | 33 | 34 | [assembly: ThemeInfo( 35 | ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located 36 | //(used if a resource is not found in the page, 37 | // or application resource dictionaries) 38 | ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located 39 | //(used if a resource is not found in the page, 40 | // app, or any theme specific resource dictionaries) 41 | )] 42 | 43 | 44 | // Version information for an assembly consists of the following four values: 45 | // 46 | // Major Version 47 | // Minor Version 48 | // Build Number 49 | // Revision 50 | // 51 | // You can specify all the values or you can default the Build and Revision Numbers 52 | // by using the '*' as shown below: 53 | // [assembly: AssemblyVersion("1.0.*")] 54 | [assembly: AssemblyVersion("1.0.0.0")] 55 | [assembly: AssemblyFileVersion("1.0.0.0")] 56 | -------------------------------------------------------------------------------- /FileFormats/PIZ/FileHeader.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | 6 | namespace SciLors_Mashed_File_Extractor.FileFormats.PIZ { 7 | public class FileHeader { 8 | public String fileName { get; set; } 9 | public int fileOffset { get; set; } 10 | public int fileSize { get; set; } 11 | public int fileUnknown { get; set; } 12 | 13 | public FileHeader(byte[] header) { 14 | if (header.Length != MagicNumbers.OFFSET_FILE_HEADER_SIZE) 15 | throw new IndexOutOfRangeException("File header must be " + MagicNumbers.OFFSET_FILE_HEADER_SIZE + "bytes long"); 16 | fileName = extractFileName(header); 17 | fileOffset = extractFileOffset(header); 18 | fileSize = extractFileSize(header); 19 | fileUnknown = extractFileUnknown(header); 20 | } 21 | private String extractFileName(byte[] header) { 22 | StringBuilder fileNameBuilder = new StringBuilder(); 23 | for (int i = 0; i < MagicNumbers.OFFSET_FILE_HEADER_FILE_NAME_MAX_SIZE; i++) { 24 | if (header[i] != 0x00) { 25 | fileNameBuilder.Append(Convert.ToChar(header[i])); 26 | } else { 27 | break; 28 | } 29 | } 30 | return fileNameBuilder.ToString(); 31 | } 32 | 33 | private int extractFileOffset(byte[] header) { 34 | int offset = header[MagicNumbers.OFFSET_FILE_HEADER_FILE_OFFSET + 0] << 0; 35 | offset += header[MagicNumbers.OFFSET_FILE_HEADER_FILE_OFFSET + 1] << 8; 36 | offset += header[MagicNumbers.OFFSET_FILE_HEADER_FILE_OFFSET + 2] << 16; 37 | offset += header[MagicNumbers.OFFSET_FILE_HEADER_FILE_OFFSET + 3] << 24; 38 | return offset; 39 | } 40 | 41 | private int extractFileSize(byte[] header) { 42 | int size = header[MagicNumbers.OFFSET_FILE_HEADER_FILE_SIZE + 0] << 0; 43 | size += header[MagicNumbers.OFFSET_FILE_HEADER_FILE_SIZE + 1] << 8; 44 | size += header[MagicNumbers.OFFSET_FILE_HEADER_FILE_SIZE + 2] << 16; 45 | size += header[MagicNumbers.OFFSET_FILE_HEADER_FILE_OFFSET + 3] << 24; 46 | return size; 47 | } 48 | 49 | private int extractFileUnknown(byte[] header) { 50 | int size = header[MagicNumbers.OFFSET_FILE_HEADER_FILE_UNKNOWN + 0] << 0; 51 | size += header[MagicNumbers.OFFSET_FILE_HEADER_FILE_UNKNOWN + 1] << 8; 52 | size += header[MagicNumbers.OFFSET_FILE_HEADER_FILE_UNKNOWN + 2] << 16; 53 | size += header[MagicNumbers.OFFSET_FILE_HEADER_FILE_UNKNOWN + 3] << 24; 54 | return size; 55 | } 56 | 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /FileFormats/PIZ/PIZFile.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.IO; 6 | 7 | namespace SciLors_Mashed_File_Extractor.FileFormats.PIZ { 8 | public class PIZFile : MashedFile { 9 | public string filePath { get; set; } 10 | public string fileName { get; set; } 11 | public FileSignature fileSignature { get; set; } 12 | public List files { get; set; } 13 | public PIZFile(string path) { 14 | filePath = path; 15 | fileName = Path.GetFileName(path); 16 | 17 | using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read)) { 18 | byte[] signatureBytes = new byte[FileSignature.Length]; 19 | 20 | readBytesSafe(stream, signatureBytes); 21 | fileSignature = new FileSignature(signatureBytes); 22 | 23 | stream.Position = MagicNumbers.OFFSET_FILE_HEADER; //Jump to File Table 24 | byte[] headerBytes = new byte[MagicNumbers.OFFSET_FILE_HEADER_SIZE]; 25 | files = new List(); 26 | for (int i = 0; i 0) { 40 | n = stream.Read(target, bytesRead, bytesToRead); 41 | if (n == 0) 42 | throw new FileFormatException("File too small"); 43 | bytesRead += n; 44 | bytesToRead -= n; 45 | } 46 | } 47 | 48 | public void extractFile(FileHeader fileHeader, string targetPath) { 49 | using (FileStream streamRead = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { 50 | using (FileStream streamWrite = new FileStream(targetPath, FileMode.Create, FileAccess.Write)) { 51 | streamRead.Position = fileHeader.fileOffset; 52 | copyStream(streamRead, streamWrite, fileHeader.fileSize); 53 | } 54 | } 55 | } 56 | private void copyStream(Stream input, Stream output, int bytes) { 57 | byte[] buffer = new byte[32768]; 58 | int read; 59 | while (bytes > 0 && (read = input.Read(buffer, 0, Math.Min(buffer.Length, bytes))) > 0) { 60 | output.Write(buffer, 0, read); 61 | bytes -= read; 62 | } 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace SciLors_Mashed_File_Extractor.Properties { 12 | 13 | 14 | /// 15 | /// A strongly-typed resource class, for looking up localized strings, etc. 16 | /// 17 | // This class was auto-generated by the StronglyTypedResourceBuilder 18 | // class via a tool like ResGen or Visual Studio. 19 | // To add or remove a member, edit your .ResX file then rerun ResGen 20 | // with the /str option, or rebuild your VS project. 21 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 22 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 23 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 24 | internal class Resources { 25 | 26 | private static global::System.Resources.ResourceManager resourceMan; 27 | 28 | private static global::System.Globalization.CultureInfo resourceCulture; 29 | 30 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 31 | internal Resources() { 32 | } 33 | 34 | /// 35 | /// Returns the cached ResourceManager instance used by this class. 36 | /// 37 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 38 | internal static global::System.Resources.ResourceManager ResourceManager { 39 | get { 40 | if ((resourceMan == null)) { 41 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SciLors_Mashed_File_Extractor.Properties.Resources", typeof(Resources).Assembly); 42 | resourceMan = temp; 43 | } 44 | return resourceMan; 45 | } 46 | } 47 | 48 | /// 49 | /// Overrides the current thread's CurrentUICulture property for all 50 | /// resource lookups using this strongly typed resource class. 51 | /// 52 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 53 | internal static global::System.Globalization.CultureInfo Culture { 54 | get { 55 | return resourceCulture; 56 | } 57 | set { 58 | resourceCulture = value; 59 | } 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /FileFormats/PIZ/FileSignature.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.IO; 6 | 7 | namespace SciLors_Mashed_File_Extractor.FileFormats.PIZ { 8 | public class FileSignature { 9 | public static int Length { get { 10 | return MagicNumbers.OFFSET_SECOND_FILE_SIGNATURE_APPENDIX + MagicNumbers.FILE_SIGNATURE_APPENDIX2_LENGTH; 11 | } 12 | } 13 | public byte fileCount { get; set; } 14 | public Appendix2Enum appendix2 { get; set; } 15 | 16 | private byte[] signature; 17 | 18 | public enum Appendix2Enum { 19 | TYPE_4x00 = 0x00, 20 | TYPE_4xCC = 0xCC, 21 | NONE = 0xFF 22 | } 23 | 24 | public FileSignature(byte[] signature) { 25 | if (signature.Length != Length) 26 | throw new FileFormatException(String.Format("File header length is {0}, but it should be {1}bytes long", signature.Length, Length)); 27 | 28 | this.signature = signature; 29 | 30 | int pos = 0; 31 | pos = checkSignature(pos); 32 | pos = checkSignatureAppendix(pos); 33 | extraxtUnknownInfo(); 34 | checkAndExtractSecondAppendix(); 35 | 36 | } 37 | 38 | private int checkSignature(int start) { 39 | int pos = start; 40 | for (int i = 0; i < MagicNumbers.FILE_SIGNATURE.Length; i++) { 41 | if (signature[i + start] != MagicNumbers.FILE_SIGNATURE[i]) 42 | throw new FileFormatException(String.Format("File signature wrong")); 43 | pos = i; 44 | } 45 | return pos + 1; 46 | } 47 | private int checkSignatureAppendix(int start) { 48 | int pos = start; 49 | for (int i = 0; i < MagicNumbers.FILE_SIGNATURE_APPENDIX.Length; i++) { 50 | if (signature[i + start] != MagicNumbers.FILE_SIGNATURE_APPENDIX[i]) 51 | throw new FileFormatException(String.Format("File signature appendix wrong")); 52 | pos = i; 53 | } 54 | return pos + 1; 55 | } 56 | private void extraxtUnknownInfo() { 57 | fileCount = signature[MagicNumbers.OFFSET_FILE_COUNT]; 58 | } 59 | private void checkAndExtractSecondAppendix() { 60 | appendix2 = Appendix2Enum.NONE; 61 | int pos = MagicNumbers.OFFSET_SECOND_FILE_SIGNATURE_APPENDIX; 62 | IEnumerable secApps = Enum.GetValues(typeof(Appendix2Enum)).Cast(); 63 | foreach (Appendix2Enum app in secApps) { 64 | if (signature[pos + 0] == (int)app && signature[pos + 0] == (int)app && signature[pos + 0] == (int)app && signature[pos + 0] == (int)app) { 65 | appendix2 = (Appendix2Enum)signature[pos]; 66 | break; 67 | } 68 | 69 | if (app == Appendix2Enum.NONE) 70 | throw new FileFormatException( 71 | String.Format("File signature second appendix is unknown: #{0:X}{1:X}{2:X}{3:X}", 72 | signature[pos + 0], signature[pos + 1], signature[pos + 2], signature[pos + 3]) 73 | ); 74 | } 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /MainWindow.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.IO; 6 | using System.Windows; 7 | using System.Windows.Controls; 8 | using System.Windows.Data; 9 | using System.Windows.Documents; 10 | using System.Windows.Input; 11 | using System.Windows.Media; 12 | using System.Windows.Media.Imaging; 13 | using System.Windows.Navigation; 14 | using System.Windows.Shapes; 15 | using Microsoft.Win32; 16 | using SciLors_Mashed_File_Extractor.FileFormats.PIZ; 17 | 18 | namespace SciLors_Mashed_File_Extractor { 19 | /// 20 | /// Interaction logic for MainWindow.xaml 21 | /// 22 | public partial class MainWindow : Window { 23 | private List files = new List(); 24 | public MainWindow() { 25 | InitializeComponent(); 26 | } 27 | 28 | private void mniOpen_Click(object sender, RoutedEventArgs e) { 29 | OpenFileDialog openFileDialog = new OpenFileDialog(); 30 | openFileDialog.Multiselect = true; 31 | openFileDialog.Filter = "PIZ files (*.piz)|*.piz";//|RWS files (*.RWS)|*.rws|"; 32 | if (openFileDialog.ShowDialog() == true) { 33 | tvwContent.Items.Clear(); 34 | foreach (string filePath in openFileDialog.FileNames) { 35 | PIZFile file = new PIZFile(filePath); 36 | TreeViewItem baseItem = new TreeViewItem(); 37 | baseItem.Tag = file; 38 | baseItem.Header = file.fileName + " [" 39 | + String.Format("Appendix2=0x{0:X2}", (byte)file.fileSignature.appendix2) 40 | + "]"; 41 | 42 | TreeViewItem baseInfoItem = new TreeViewItem(); 43 | baseInfoItem.Header = "Files [" + file.files.Count + "]"; 44 | foreach (FileHeader fileHeader in file.files) { 45 | TreeViewItem fileInfoItem = new TreeViewItem(); 46 | fileInfoItem.Tag = fileHeader; 47 | fileInfoItem.Header = fileHeader.fileName; 48 | fileInfoItem.ItemsSource = new string[] { 49 | String.Format("Offset=0x{0:X8}", fileHeader.fileOffset), 50 | "Size=" + fileHeader.fileSize, 51 | String.Format("Unknown=0x{0:X8}", fileHeader.fileUnknown), 52 | }; 53 | ContextMenu ctxFile = new ContextMenu(); 54 | MenuItem extractMenu = new MenuItem(); 55 | extractMenu.Header = "Extract File"; 56 | extractMenu.Click += new RoutedEventHandler(tvwContext_ExtractFile); 57 | 58 | ctxFile.Items.Add(extractMenu); 59 | fileInfoItem.ContextMenu = ctxFile; 60 | baseInfoItem.Items.Add(fileInfoItem); 61 | } 62 | 63 | baseItem.Items.Add(baseInfoItem); 64 | tvwContent.Items.Add(baseItem); 65 | } 66 | } 67 | 68 | } 69 | 70 | private void tvwContext_ExtractFile(object sender, RoutedEventArgs e) { 71 | TreeViewItem parent = (TreeViewItem)((ContextMenu)((MenuItem)sender).Parent).PlacementTarget; 72 | PIZFile pizFile = (PIZFile)((TreeViewItem)((TreeViewItem)parent.Parent).Parent).Tag; 73 | FileHeader fileHeader = (FileHeader)parent.Tag; 74 | SaveFileDialog saveFileDialog = new SaveFileDialog(); 75 | saveFileDialog.FileName = fileHeader.fileName; 76 | saveFileDialog.ShowDialog(); 77 | 78 | pizFile.extractFile(fileHeader, saveFileDialog.FileName); 79 | 80 | } 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /SciLors Mashed File Extractor.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Debug 5 | x86 6 | 8.0.30703 7 | 2.0 8 | {BB7F7B34-206C-4E05-B0DD-C720FE9480C5} 9 | WinExe 10 | Properties 11 | SciLors_Mashed_File_Extractor 12 | SciLors Mashed File Extractor 13 | v4.0 14 | Client 15 | 512 16 | {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 17 | 4 18 | 19 | 20 | x86 21 | true 22 | full 23 | false 24 | bin\Debug\ 25 | DEBUG;TRACE 26 | prompt 27 | 4 28 | 29 | 30 | x86 31 | pdbonly 32 | true 33 | bin\Release\ 34 | TRACE 35 | prompt 36 | 4 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 4.0 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | MSBuild:Compile 56 | Designer 57 | 58 | 59 | MSBuild:Compile 60 | Designer 61 | 62 | 63 | App.xaml 64 | Code 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | MainWindow.xaml 73 | Code 74 | 75 | 76 | 77 | 78 | Code 79 | 80 | 81 | True 82 | True 83 | Resources.resx 84 | 85 | 86 | True 87 | Settings.settings 88 | True 89 | 90 | 91 | ResXFileCodeGenerator 92 | Resources.Designer.cs 93 | 94 | 95 | SettingsSingleFileGenerator 96 | Settings.Designer.cs 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 111 | -------------------------------------------------------------------------------- /Properties/Resources.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | text/microsoft-resx 107 | 108 | 109 | 2.0 110 | 111 | 112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 113 | 114 | 115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | --------------------------------------------------------------------------------