diff --git a/Aki.Core/InternalData.cs b/Aki.Core/InternalData.cs index a585717..1c31cbb 100644 --- a/Aki.Core/InternalData.cs +++ b/Aki.Core/InternalData.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.IO; namespace SPT_AKI_Installer.Aki.Core { @@ -18,7 +19,16 @@ namespace SPT_AKI_Installer.Aki.Core /// The original EFT game version /// public string OriginalGameVersion { get; set; } + + /// + /// Patcher zip file info + /// + public FileInfo PatcherZipInfo { get; set; } + /// + /// SPT-AKI zip file info + /// + public FileInfo AkiZipInfo { get; set; } /// /// The release download link for SPT-AKI diff --git a/Aki.Core/Model/LiveTableTask.cs b/Aki.Core/Model/LiveTableTask.cs index d96f080..34f9677 100644 --- a/Aki.Core/Model/LiveTableTask.cs +++ b/Aki.Core/Model/LiveTableTask.cs @@ -29,7 +29,8 @@ namespace SPT_AKI_Installer.Aki.Core.Model /// public int RowIndex { get; set; } - private bool _continueRendering = false; + private bool _continueRenderingProgress = false; + private bool _continueRenderingIndeterminateProgress = false; private int _indeterminateState = 0; @@ -66,14 +67,19 @@ namespace SPT_AKI_Installer.Aki.Core.Model /// this doesn't need to be called if you set isIndeterminate in the constructor. You need to set IsIndeterminate to false to stop this background task public void StartDrawingIndeterminateProgress() { - _continueRendering = true; - new Task(new Action(() => { RenderIndeterminateProgress(ref _continueRendering); })).Start(); + _continueRenderingProgress = false; + _continueRenderingIndeterminateProgress = true; + + new Task(new Action(() => { RenderIndeterminateProgress(ref _continueRenderingIndeterminateProgress); })).Start(); } public void StartDrawingProgress() { - _continueRendering = true; - new Task(new Action(() => { RenderProgress(ref _continueRendering); })).Start(); + Progress = 0; + _continueRenderingIndeterminateProgress = false; + _continueRenderingProgress = true; + + new Task(new Action(() => { RenderProgress(ref _continueRenderingProgress); })).Start(); } private void ReRenderEntry(string message) @@ -134,7 +140,8 @@ namespace SPT_AKI_Installer.Aki.Core.Model if (stopRendering) { - _continueRendering = false; + _continueRenderingProgress = false; + _continueRenderingIndeterminateProgress = false; ReRenderEntry(message); } } diff --git a/Aki.Core/SPTInstaller.cs b/Aki.Core/SPTInstaller.cs index 953c452..b80e362 100644 --- a/Aki.Core/SPTInstaller.cs +++ b/Aki.Core/SPTInstaller.cs @@ -30,42 +30,6 @@ namespace SPT_AKI_Installer.Aki.Core .RunTasksAsync(taskList) .GetAwaiter() .GetResult(); - - // GameCopy(originalGamePath, targetPath); - - // if (DownloadHelper.patchNeedCheck) - // { - // PatcherCopy(targetPath, patcherZipPath); - // PatcherProcess(targetPath); - // } - - // AkiInstall(targetPath, akiZipPath); - // DeleteZip(patcherZipPath, akiZipPath); - // } - - // static void GameCopy(string originalGamePath, string targetPath) - // { - // LogHelper.Info("Copying game files"); - // FileHelper.CopyDirectory(originalGamePath, targetPath, true); - // } - - // static void PatcherCopy(string targetPath, string patcherZipPath) - // { - // LogHelper.Info("Extracting patcher"); - // ZipHelper.ZipDecompress(patcherZipPath, targetPath); - // FileHelper.FindFolder(patcherZipPath, targetPath, out DirectoryInfo dir); - // FileHelper.CopyDirectory(dir.FullName, targetPath, true); - - // if (dir.Exists) - // { - // dir.Delete(true); - // dir.Refresh(); - // if (dir.Exists) - // { - // LogHelper.Error("unable to delete patcher folder"); - // LogHelper.Error($"please delete folder called {dir.FullName}"); - // } - // } } public SPTinstaller( @@ -91,6 +55,7 @@ namespace SPT_AKI_Installer.Aki.Core #endif await LiveTableTaskRunner.RunAsync(tasks); + CloseApp("SPT is Ready to play"); } private static IHost ConfigureHost() @@ -102,37 +67,12 @@ namespace SPT_AKI_Installer.Aki.Core services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); }) .Build(); } - //static void PatcherProcess(string targetPath) - //{ - // LogHelper.Info("Starting patcher"); - // ProcessHelper patcherProcess = new(); - // patcherProcess.StartProcess(Path.Join(targetPath + "/patcher.exe"), targetPath); - - // FileHelper.DeleteFiles(Path.Join(targetPath, "/patcher.exe")); - //} - - //static void AkiInstall(string targetPath, string akiZipPath) - //{ - // ZipHelper.ZipDecompress(akiZipPath, targetPath); - // LogHelper.Info("Aki has been extracted"); - //} - - //static void DeleteZip(string patcherZipPath, string akiZipPath) - //{ - // FileHelper.DeleteFiles(patcherZipPath, false); - // FileHelper.DeleteFiles(akiZipPath, false); - - // LogHelper.User("Removed Zips, Press enter to close the installer, you can then delete the installer"); - // LogHelper.User("ENJOY SPT-AKI!"); - // Console.ReadKey(); - // Environment.Exit(0); - //} - static void CloseApp(string text) { AnsiConsole.MarkupLine($"[yellow]{text.EscapeMarkup()}[/]"); diff --git a/Aki.Core/Tasks/CopyClientTask.cs b/Aki.Core/Tasks/CopyClientTask.cs index 978e678..99e5dc4 100644 --- a/Aki.Core/Tasks/CopyClientTask.cs +++ b/Aki.Core/Tasks/CopyClientTask.cs @@ -1,4 +1,5 @@ using SPT_AKI_Installer.Aki.Core.Model; +using SPT_AKI_Installer.Aki.Helper; using System; using System.IO; using System.Threading.Tasks; @@ -18,30 +19,12 @@ namespace SPT_AKI_Installer.Aki.Core.Tasks { SetStatus("Copying", false); - try - { - int totalFiles = Directory.GetFiles(_data.OriginalGamePath, "*.*", SearchOption.AllDirectories).Length; - int processedFiles = 0; + var originalGameDirInfo = new DirectoryInfo(_data.OriginalGamePath); + var targetInstallDirInfo = new DirectoryInfo(_data.TargetInstallPath); - foreach (string dirPath in Directory.GetDirectories(_data.OriginalGamePath, "*", SearchOption.AllDirectories)) - { - Directory.CreateDirectory(dirPath.Replace(_data.OriginalGamePath, _data.TargetInstallPath)); - } + var progress = new Progress((d) => { Progress = (int)Math.Floor(d); }); - foreach (string newPath in Directory.GetFiles(_data.OriginalGamePath, "*.*", SearchOption.AllDirectories)) - { - File.Copy(newPath, newPath.Replace(_data.OriginalGamePath, _data.TargetInstallPath), true); - processedFiles++; - - Progress = (int)Math.Floor(((double)processedFiles / totalFiles) * 100); - } - - return GenericResult.FromSuccess(); - } - catch(Exception ex) - { - return GenericResult.FromError(ex.Message); - } + return FileHelper.CopyDirectoryWithProgress(originalGameDirInfo, targetInstallDirInfo, progress); } } } diff --git a/Aki.Core/Tasks/DownloadTask.cs b/Aki.Core/Tasks/DownloadTask.cs index 2cad08e..e14f5f2 100644 --- a/Aki.Core/Tasks/DownloadTask.cs +++ b/Aki.Core/Tasks/DownloadTask.cs @@ -22,7 +22,7 @@ namespace SPT_AKI_Installer.Aki.Core.Tasks { var mirrorListInfo = new FileInfo(Path.Join(_data.TargetInstallPath, "mirrors.json")); - SetStatus("Downloading mirror list", false); + SetStatus("Downloading Mirror List", false); var progress = new Progress((d) => { Progress = (int)Math.Floor(d); }); @@ -45,11 +45,11 @@ namespace SPT_AKI_Installer.Aki.Core.Tasks return GenericResult.FromError("Failed to deserialize mirrors list"); } - private async Task DownloadPatcherFromMirrors(FileInfo patcherZip, IProgress progress) + private async Task DownloadPatcherFromMirrors(IProgress progress) { foreach (string mirror in _data.PatcherReleaseMirrors) { - SetStatus($"Download Patcher: {mirror}", false); + SetStatus($"Downloading Patcher: {mirror}", false); // mega is a little weird since they use encryption, but thankfully there is a great library for their api :) if (mirror.StartsWith("https://mega")) @@ -63,7 +63,7 @@ namespace SPT_AKI_Installer.Aki.Core.Tasks try { using var megaDownloadStream = await megaClient.DownloadAsync(new Uri(mirror), progress); - using var patcherFileStream = patcherZip.Open(FileMode.Create); + using var patcherFileStream = _data.PatcherZipInfo.Open(FileMode.Create); { await megaDownloadStream.CopyToAsync(patcherFileStream); } @@ -77,7 +77,7 @@ namespace SPT_AKI_Installer.Aki.Core.Tasks } } - var result = await DownloadHelper.DownloadFile(patcherZip, mirror, progress); + var result = await DownloadHelper.DownloadFile(_data.PatcherZipInfo, mirror, progress); if(result.Succeeded) { @@ -90,12 +90,12 @@ namespace SPT_AKI_Installer.Aki.Core.Tasks public override async Task RunAsync() { - var patcherZipInfo = new FileInfo(Path.Join(_data.TargetInstallPath, "patcher.zip")); - var akiZipInfo = new FileInfo(Path.Join(_data.TargetInstallPath, "sptaki.zip")); + _data.PatcherZipInfo = new FileInfo(Path.Join(_data.TargetInstallPath, "patcher.zip")); + _data.AkiZipInfo= new FileInfo(Path.Join(_data.TargetInstallPath, "sptaki.zip")); if (_data.PatchNeeded) { - if (patcherZipInfo.Exists) patcherZipInfo.Delete(); + if (_data.PatcherZipInfo.Exists) _data.PatcherZipInfo.Delete(); var buildResult = await BuildMirrorList(); @@ -103,13 +103,11 @@ namespace SPT_AKI_Installer.Aki.Core.Tasks { return buildResult; } - - SetStatus("Downloading Patcher", false); Progress = 0; var progress = new Progress((d) => { Progress = (int)Math.Floor(d); }); - var patcherDownloadRresult = await DownloadPatcherFromMirrors(patcherZipInfo, progress); + var patcherDownloadRresult = await DownloadPatcherFromMirrors(progress); if (!patcherDownloadRresult.Succeeded) { @@ -117,7 +115,7 @@ namespace SPT_AKI_Installer.Aki.Core.Tasks } } - if (akiZipInfo.Exists) akiZipInfo.Delete(); + if (_data.AkiZipInfo.Exists) _data.AkiZipInfo.Delete(); SetStatus("Downloading SPT-AKI", false); @@ -125,7 +123,7 @@ namespace SPT_AKI_Installer.Aki.Core.Tasks var akiProgress = new Progress((d) => { Progress = (int)Math.Floor(d); }); - var releaseDownloadResult = await DownloadHelper.DownloadFile(akiZipInfo, _data.AkiReleaseDownloadLink, akiProgress); + var releaseDownloadResult = await DownloadHelper.DownloadFile(_data.AkiZipInfo, _data.AkiReleaseDownloadLink, akiProgress); if (!releaseDownloadResult.Succeeded) { diff --git a/Aki.Core/Tasks/IntializationTask.cs b/Aki.Core/Tasks/IntializationTask.cs index caec87f..0123545 100644 --- a/Aki.Core/Tasks/IntializationTask.cs +++ b/Aki.Core/Tasks/IntializationTask.cs @@ -28,17 +28,17 @@ namespace SPT_AKI_Installer.Aki.Core.Tasks if (_data.OriginalGamePath == null) { - GenericResult.FromError("Unable to find EFT OG directory \n please make sure EFT is installed \n please also run EFT once"); + return GenericResult.FromError("Unable to find EFT OG directory, please make sure EFT is installed. Please also run EFT once"); } if (_data.OriginalGamePath == _data.TargetInstallPath) { - GenericResult.FromError("Installer is located in EFT's original directory \n Please move the installer to a seperate folder as per the guide"); + return GenericResult.FromError("Installer is located in EFT's original directory. Please move the installer to a seperate folder as per the guide"); } if (File.Exists(Path.Join(_data.TargetInstallPath, "EscapeFromTarkov.exe"))) { - GenericResult.FromError("Installer is located in a Folder that has existing Game Files \n Please make sure the installer is in a fresh folder as per the guide"); + return GenericResult.FromError("Installer is located in a Folder that has existing Game Files. Please make sure the installer is in a fresh folder as per the guide"); } return GenericResult.FromSuccess($"Current Game Version: {_data.OriginalGameVersion}"); diff --git a/Aki.Core/Tasks/SetupClientTask.cs b/Aki.Core/Tasks/SetupClientTask.cs index 4cef8d1..6d76b42 100644 --- a/Aki.Core/Tasks/SetupClientTask.cs +++ b/Aki.Core/Tasks/SetupClientTask.cs @@ -1,8 +1,8 @@ using SPT_AKI_Installer.Aki.Core.Model; +using SPT_AKI_Installer.Aki.Helper; using System; -using System.Collections.Generic; +using System.IO; using System.Linq; -using System.Text; using System.Threading.Tasks; namespace SPT_AKI_Installer.Aki.Core.Tasks @@ -18,12 +18,71 @@ namespace SPT_AKI_Installer.Aki.Core.Tasks public override async Task RunAsync() { - /* TODO: - * patch if needed - * extract release - */ + // extract patcher files + SetStatus("Extrating Patcher", false); - throw new NotImplementedException(); + var extractPatcherProgress = new Progress((d) => { Progress = (int)Math.Floor(d); }); + + var patcherOutputDir = new DirectoryInfo(Path.Join(_data.TargetInstallPath, "patcher")); + + var extractPatcherResult = ZipHelper.Decompress(_data.PatcherZipInfo, patcherOutputDir, extractPatcherProgress); + + if(!extractPatcherResult.Succeeded) + { + return extractPatcherResult; + } + + // copy patcher files to install directory + SetStatus("Copying Patcher", false); + + var patcherDirInfo = patcherOutputDir.GetDirectories("Patcher*", SearchOption.TopDirectoryOnly).First(); + var targetInstallDirInfo = new DirectoryInfo(_data.TargetInstallPath); + + var copyPatcherProgress = new Progress((d) => { Progress = (int)Math.Floor(d); }); + + var copyPatcherResult = FileHelper.CopyDirectoryWithProgress(patcherDirInfo, targetInstallDirInfo, copyPatcherProgress); + + if(!copyPatcherResult.Succeeded) + { + return copyPatcherResult; + } + + // run patcher + SetStatus("Running Patcher"); + StartDrawingIndeterminateProgress(); + + var patcherEXE = new FileInfo(Path.Join(_data.TargetInstallPath, "patcher.exe")); + + var patchingResult = ProcessHelper.PatchClientFiles(patcherEXE, targetInstallDirInfo); + + if(!patchingResult.Succeeded) + { + return patchingResult; + } + + // extract release files + SetStatus("Extracting Release"); + StartDrawingProgress(); + + var extractReleaseProgress = new Progress((d) => { Progress = (int)Math.Floor(d); }); + + var extractReleaseResult = ZipHelper.Decompress(_data.AkiZipInfo, targetInstallDirInfo, extractReleaseProgress); + + if(!extractReleaseResult.Succeeded) + { + return extractPatcherResult; + } + + // cleanup temp files + SetStatus("Cleanup"); + StartDrawingIndeterminateProgress(); + + patcherOutputDir.Delete(true); + _data.PatcherZipInfo.Delete(); + _data.AkiZipInfo.Delete(); + patcherEXE.Delete(); + + return GenericResult.FromSuccess("SPT is Setup. Happy Playing!"); } } } diff --git a/Aki.Helper/FileHelper.cs b/Aki.Helper/FileHelper.cs index 15f11c7..423decc 100644 --- a/Aki.Helper/FileHelper.cs +++ b/Aki.Helper/FileHelper.cs @@ -1,36 +1,38 @@ using System; using System.IO; using Spectre.Console; +using SPT_AKI_Installer.Aki.Core.Model; namespace SPT_AKI_Installer.Aki.Helper { public static class FileHelper { - public static void CopyDirectory(string oldDir, string newDir, bool overwrite) + public static GenericResult CopyDirectoryWithProgress(DirectoryInfo sourceDir, DirectoryInfo targetDir, IProgress progress) { - int totalFiles = Directory.GetFiles(oldDir, "*.*", SearchOption.AllDirectories).Length; - - AnsiConsole.Progress().Columns( - new PercentageColumn(), - new TaskDescriptionColumn(), - new ProgressBarColumn(), - new ElapsedTimeColumn(), - new SpinnerColumn() - ).Start((ProgressContext context) => + try { - var task = context.AddTask("Copying Files", true, totalFiles); + int totalFiles = sourceDir.GetFiles("*.*", SearchOption.AllDirectories).Length; + int processedFiles = 0; - foreach (string dirPath in Directory.GetDirectories(oldDir, "*", SearchOption.AllDirectories)) + foreach (var dir in sourceDir.GetDirectories("*", SearchOption.AllDirectories)) { - Directory.CreateDirectory(dirPath.Replace(oldDir, newDir)); + Directory.CreateDirectory(dir.FullName.Replace(sourceDir.FullName, targetDir.FullName)); } - foreach (string newPath in Directory.GetFiles(oldDir, "*.*", SearchOption.AllDirectories)) + foreach (var file in sourceDir.GetFiles("*.*", SearchOption.AllDirectories)) { - File.Copy(newPath, newPath.Replace(oldDir, newDir), overwrite); - task.Increment(1); + File.Copy(file.FullName, file.FullName.Replace(sourceDir.FullName, targetDir.FullName), true); + processedFiles++; + + progress.Report((int)Math.Floor(((double)processedFiles / totalFiles) * 100)); } - }); + + return GenericResult.FromSuccess(); + } + catch(Exception ex) + { + return GenericResult.FromError(ex.Message); + } } public static void DeleteFiles(string filePath, bool allFolders = false) diff --git a/Aki.Helper/PreCheckHelper.cs b/Aki.Helper/PreCheckHelper.cs index 54fdc5b..a12da89 100644 --- a/Aki.Helper/PreCheckHelper.cs +++ b/Aki.Helper/PreCheckHelper.cs @@ -27,29 +27,29 @@ namespace SPT_AKI_Installer.Aki.Helper return FileVersionInfo.GetVersionInfo(Path.Join(gamePath + "/EscapeFromTarkov.exe")).ProductVersion.Replace('-', '.').Split('.')[^2]; } - public static string GetPatcherZipPath(string gameVersion, string targetPath) - { - // example patch name - Patcher.12.12.15.17861.to.12.12.15.17349.zip - var patchZip = FileHelper.FindFile(targetPath, gameVersion, "Patcher"); - if (patchZip == null) - { - patchZip = FileHelper.FindFile(targetPath, "PATCHERZIP"); - } + //public static string GetPatcherZipPath(string gameVersion, string targetPath) + //{ + // // example patch name - Patcher.12.12.15.17861.to.12.12.15.17349.zip + // var patchZip = FileHelper.FindFile(targetPath, gameVersion, "Patcher"); + // if (patchZip == null) + // { + // patchZip = FileHelper.FindFile(targetPath, "PATCHERZIP"); + // } - return patchZip; - } + // return patchZip; + //} - public static string GetAkiZipPath(string targetPath) - { - // example aki name - RELEASE-SPT-2.3.1-17349.zip - var akiZip = FileHelper.FindFile(targetPath, "SPT", "RELEASE"); + //public static string GetAkiZipPath(string targetPath) + //{ + // // example aki name - RELEASE-SPT-2.3.1-17349.zip + // var akiZip = FileHelper.FindFile(targetPath, "SPT", "RELEASE"); - if (akiZip == null) - { - akiZip = FileHelper.FindFile(targetPath, "AKIZIP"); - } + // if (akiZip == null) + // { + // akiZip = FileHelper.FindFile(targetPath, "AKIZIP"); + // } - return akiZip; - } + // return akiZip; + //} } } diff --git a/Aki.Helper/ProcessHelper.cs b/Aki.Helper/ProcessHelper.cs index 0fa8794..e859e42 100644 --- a/Aki.Helper/ProcessHelper.cs +++ b/Aki.Helper/ProcessHelper.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using System.IO; using SPT_AKI_Installer.Aki.Core.Model; namespace SPT_AKI_Installer.Aki.Helper @@ -14,13 +15,18 @@ namespace SPT_AKI_Installer.Aki.Helper PatchFailed = 15 } - public class ProcessHelper + public static class ProcessHelper { - public GenericResult PatchClientFiles(string exeDir, string workingDir) + public static GenericResult PatchClientFiles(FileInfo executable, DirectoryInfo workingDir) { + if(!executable.Exists || !workingDir.Exists) + { + return GenericResult.FromError($"Could not find executable ({executable.Name}) or working directory ({workingDir.Name})"); + } + var process = new Process(); - process.StartInfo.FileName = exeDir; - process.StartInfo.WorkingDirectory = workingDir; + process.StartInfo.FileName = executable.FullName; + process.StartInfo.WorkingDirectory = workingDir.FullName; process.EnableRaisingEvents = true; process.StartInfo.Arguments = "autoclose"; process.Start(); diff --git a/Aki.Helper/ZipHelper.cs b/Aki.Helper/ZipHelper.cs index e047a71..84a0490 100644 --- a/Aki.Helper/ZipHelper.cs +++ b/Aki.Helper/ZipHelper.cs @@ -1,38 +1,56 @@ using SharpCompress.Archives; using SharpCompress.Archives.Zip; using SharpCompress.Common; -using Spectre.Console; +using SPT_AKI_Installer.Aki.Core.Model; +using System; +using System.IO; using System.Linq; namespace SPT_AKI_Installer.Aki.Helper { public static class ZipHelper { - public static void ZipDecompress(string ArchivePath, string OutputFolderPath) + public static GenericResult Decompress(FileInfo ArchivePath, DirectoryInfo OutputFolderPath, IProgress progress = null) { - AnsiConsole.Progress().Columns( - new PercentageColumn(), - new TaskDescriptionColumn(), - new ProgressBarColumn(), - new ElapsedTimeColumn(), - new SpinnerColumn() - ).Start((ProgressContext context) => + try { - using var archive = ZipArchive.Open(ArchivePath); - var entries = archive.Entries.Where(entry => !entry.IsDirectory); - var task = context.AddTask("Extracting Files", true, entries.Count()); + OutputFolderPath.Refresh(); - foreach (var entry in entries) + if (!OutputFolderPath.Exists) OutputFolderPath.Create(); + + using var archive = ZipArchive.Open(ArchivePath); + var totalEntries = archive.Entries.Where(entry => !entry.IsDirectory); + int processedEntries = 0; + + foreach (var entry in totalEntries) { - entry.WriteToDirectory($"{OutputFolderPath}", new ExtractionOptions() + entry.WriteToDirectory(OutputFolderPath.FullName, new ExtractionOptions() { ExtractFullPath = true, Overwrite = true }); - task.Increment(1); + processedEntries++; + + if (progress != null) + { + progress.Report(Math.Floor(((double)processedEntries / totalEntries.Count()) * 100)); + } } - }); + + OutputFolderPath.Refresh(); + + if(!OutputFolderPath.Exists) + { + return GenericResult.FromError($"Failed to extract files: {ArchivePath.Name}"); + } + + return GenericResult.FromSuccess(); + } + catch(Exception ex) + { + return GenericResult.FromError(ex.Message); + } } } } diff --git a/Properties/PublishProfiles/FolderProfile.pubxml.user b/Properties/PublishProfiles/FolderProfile.pubxml.user index fe4b3b5..b3fad3b 100644 --- a/Properties/PublishProfiles/FolderProfile.pubxml.user +++ b/Properties/PublishProfiles/FolderProfile.pubxml.user @@ -4,6 +4,6 @@ https://go.microsoft.com/fwlink/?LinkID=208121. --> - True|2022-06-21T18:47:38.7532473Z;True|2022-06-08T18:26:47.7977621+01:00;True|2022-06-06T15:07:18.8067168+01:00;True|2022-06-05T22:55:20.5192697+01:00;True|2022-05-30T13:11:30.6942032+01:00;True|2022-05-30T13:08:08.4269393+01:00;True|2022-05-17T01:06:33.6758525+01:00;True|2022-05-14T01:56:09.8410037+01:00;True|2022-05-14T00:54:24.0683990+01:00;True|2022-05-14T00:53:04.7105427+01:00;True|2022-05-14T00:51:00.6280767+01:00;True|2022-05-14T00:49:19.4630888+01:00;True|2022-05-14T00:47:59.2166156+01:00; + True|2022-07-09T17:06:26.5751622Z;True|2022-07-09T12:56:17.1018408-04:00;True|2022-07-09T12:38:17.0878078-04:00;True|2022-07-09T12:18:23.6469737-04:00;True|2022-06-21T14:47:38.7532473-04:00;True|2022-06-08T13:26:47.7977621-04:00;True|2022-06-06T10:07:18.8067168-04:00;True|2022-06-05T17:55:20.5192697-04:00;True|2022-05-30T08:11:30.6942032-04:00;True|2022-05-30T08:08:08.4269393-04:00;True|2022-05-16T20:06:33.6758525-04:00;True|2022-05-13T20:56:09.8410037-04:00;True|2022-05-13T19:54:24.0683990-04:00;True|2022-05-13T19:53:04.7105427-04:00;True|2022-05-13T19:51:00.6280767-04:00;True|2022-05-13T19:49:19.4630888-04:00;True|2022-05-13T19:47:59.2166156-04:00; \ No newline at end of file diff --git a/SPT_AKI_Installer.csproj.user b/SPT_AKI_Installer.csproj.user index f965575..a3d4ff2 100644 --- a/SPT_AKI_Installer.csproj.user +++ b/SPT_AKI_Installer.csproj.user @@ -1,6 +1,6 @@  - <_LastSelectedProfileId>C:\Users\craig\source\repos\CWXDEV\CWX-SPTinstaller\Properties\PublishProfiles\FolderProfile.pubxml + <_LastSelectedProfileId>Z:\dev_stuff\SPT-AKI-Installer\Properties\PublishProfiles\FolderProfile.pubxml \ No newline at end of file