From f2b6466fc2f974edf6b087db65b441e8816a329e Mon Sep 17 00:00:00 2001 From: Jade Macho Date: Tue, 1 Jul 2025 03:36:16 +0200 Subject: [PATCH] game: Implement functional supersampling (game > 1x) --- .../CustomResolution2782.csproj | 11 + CustomResolution2782/DisplaySizeState.cs | 116 ++- CustomResolution2782/GameSizeState.cs | 300 ++++-- CustomResolution2782/Hooks/WndProcHook.cs | 4 +- CustomResolution2782/Plugin.cs | 2 - CustomResolution2782/RefPtr.cs | 35 + CustomResolution2782/Service.cs | 4 + CustomResolution2782/Windows/ConfigWindow.cs | 87 +- CustomResolution2782/packages.lock.json | 947 ++++++++++++++++++ 9 files changed, 1359 insertions(+), 147 deletions(-) create mode 100644 CustomResolution2782/RefPtr.cs diff --git a/CustomResolution2782/CustomResolution2782.csproj b/CustomResolution2782/CustomResolution2782.csproj index d003edb..9ad28f0 100644 --- a/CustomResolution2782/CustomResolution2782.csproj +++ b/CustomResolution2782/CustomResolution2782.csproj @@ -63,6 +63,17 @@ $(DalamudLibPath)Serilog.dll false + + $(DalamudLibPath)SharpDX.dll + false + + + $(DalamudLibPath)SharpDX.Mathematics.dll + false + + + + diff --git a/CustomResolution2782/DisplaySizeState.cs b/CustomResolution2782/DisplaySizeState.cs index ab2129a..8c4f3bf 100644 --- a/CustomResolution2782/DisplaySizeState.cs +++ b/CustomResolution2782/DisplaySizeState.cs @@ -7,11 +7,13 @@ using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel; using FFXIVClientStructs.FFXIV.Client.Graphics.Render; using FFXIVClientStructs.FFXIV.Client.System.Framework; using FFXIVClientStructs.Interop; +using FloppyUtils; using ImGuiNET; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; +using System.Text; using TerraFX.Interop.Windows; using static TerraFX.Interop.Windows.Windows; @@ -19,6 +21,8 @@ namespace CustomResolution; public unsafe class DisplaySizeState : IDisposable { + private StringBuilder _dbg = new(); + private bool _dbgLog = false; private bool _wasEnabled = false; private HWND _currentHwnd; private bool _currentHwndMismatch = false; @@ -36,6 +40,8 @@ public unsafe class DisplaySizeState : IDisposable public bool CurrentBorderlessFullscreen { get; private set; } + public string DebugInfo => _dbg.ToString(); + public void Dispose() { Service.Framework.RunOnFrameworkThread(Update); @@ -117,6 +123,9 @@ public unsafe class DisplaySizeState : IDisposable public void Update() { + _dbg.Clear(); + _dbgLog = false; + bool unloading = Service.Plugin.Unloading; ref var cfg = ref Service.Config._.Display; @@ -134,8 +143,8 @@ public unsafe class DisplaySizeState : IDisposable if (!_currentHwndMismatch) { _currentHwndMismatch = true; - Service.PluginLog.Error($"HWND MISMATCH between GameWindow and Device: 0x{(long) (IntPtr) (_currentHwnd):X16} vs 0x{(long) dev->hWnd:X16}"); - Service.PluginLog.Info($"dev is at: 0x{(long) (IntPtr) dev:X16}"); + Service.PluginLog.Error($"HWND MISMATCH between GameWindow and Device: 0x{(long) (nint) _currentHwnd:X16} vs 0x{(long) (nint) dev->hWnd:X16}"); + Service.PluginLog.Info($"dev is at: 0x{(long) (nint) dev:X16}"); CheckHWND("GameWindow", _currentHwnd); CheckHWND("Device", (HWND) dev->hWnd); } @@ -242,8 +251,8 @@ public unsafe class DisplaySizeState : IDisposable _wasEnabled = enabled; } - //Service.PluginLog.Debug($"NewWidth 0x{(long) (IntPtr) (&dev->NewWidth):X16}"); - //Service.PluginLog.Debug($"GameWindow->Width 0x{(long) (IntPtr) (&win->WindowWidth):X16}"); + //Service.PluginLog.Debug($"NewWidth 0x{(long) (nint) (&dev->NewWidth):X16}"); + //Service.PluginLog.Debug($"GameWindow->Width 0x{(long) (nint) (&win->WindowWidth):X16}"); //Service.PluginLog.Info($"Game window at {win->WindowWidth} x {win->WindowHeight}"); @@ -264,6 +273,20 @@ public unsafe class DisplaySizeState : IDisposable CurrentHeight = height; CurrentWindowWidth = (uint) rectWidth; CurrentWindowHeight = (uint) rectHeight; + + if (Service.DebugConfig.IsDebug) + { + _dbg.AppendLine(@$"RESIZE {dev->RequestResolutionChange} {dev->RequestResolutionChangeUnk1} {dev->RequestResolutionChangeUnk2} {dev->RequestResolutionChangeUnk3}"); + _dbgLog |= dev->RequestResolutionChange != 0; + _dbgLog |= dev->RequestResolutionChangeUnk1 != 0; + _dbgLog |= dev->RequestResolutionChangeUnk2 != 0; + _dbgLog |= dev->RequestResolutionChangeUnk3 != 0; + } + + if (_dbgLog) + { + Service.PluginLog.Debug(_dbg.ToString()); + } } private void SetDXVKDWMHack(DXVKDWMHackMode mode) @@ -281,19 +304,19 @@ public unsafe class DisplaySizeState : IDisposable var fullscreen = (style & WS.WS_SYSMENU) == 0; + _dbg.Clear(); if (Service.DebugConfig.IsDebug) { - Service.PluginLog.Info("--------"); - Service.PluginLog.Info($"STYLE: 0x{style:X8}"); - Service.PluginLog.Info($"EXSTYLE: 0x{GetWindowLong(_currentHwnd, GWL.GWL_EXSTYLE):X8}"); + _dbg.AppendLine($"STYLE: 0x{style:X8}"); + _dbg.AppendLine($"EXSTYLE: 0x{GetWindowLong(_currentHwnd, GWL.GWL_EXSTYLE):X8}"); Span name = stackalloc ushort[256]; GetClassName(_currentHwnd, name.GetPointer(0), name.Length); WNDCLASSEXW wce; GetClassInfoEx(GetModuleHandle(null), name.GetPointer(0), &wce); - Service.PluginLog.Info($"CLASS: {new string((char*) name.GetPointer(0))}"); - Service.PluginLog.Info($"CLASS.style: 0x{wce.style:X8}"); + _dbg.AppendLine($"CLASS: {new string((char*) name.GetPointer(0))}"); + _dbg.AppendLine($"CLASS.style: 0x{wce.style:X8}"); } if (fullscreen) @@ -321,15 +344,16 @@ public unsafe class DisplaySizeState : IDisposable if (Service.DebugConfig.IsDebug) { - Service.PluginLog.Info($"NEWSTYLE: 0x{style:X8}"); - Service.PluginLog.Info($"NEWEXSTYLE: 0x{exstyle:X8}"); + _dbg.AppendLine($"NEWSTYLE: 0x{style:X8}"); + _dbg.AppendLine($"NEWEXSTYLE: 0x{exstyle:X8}"); } if (style != styleOrig || exstyle != exstyleOrig || _currentDXVKDWMHackMode != mode) { if (Service.DebugConfig.IsDebug) { - Service.PluginLog.Info("UPDATE"); + _dbg.AppendLine("UPDATE"); + _dbgLog = true; } SetWindowLong(_currentHwnd, GWL.GWL_STYLE, (int) style); @@ -340,7 +364,7 @@ public unsafe class DisplaySizeState : IDisposable } else if (Service.DebugConfig.IsDebug) { - Service.PluginLog.Info("SAME"); + _dbg.AppendLine("SAME"); } _currentDXVKDWMHackMode = mode; @@ -354,37 +378,6 @@ public unsafe class DisplaySizeState : IDisposable Service.PluginLog.Info($"{from} is sus: {Marshal.GetLastPInvokeErrorMessage()}"); } } - - [StructLayout(LayoutKind.Explicit)] - private struct DeviceEx - { - [FieldOffset(0)] - public Device _; - - public ref byte RequestResolutionChange => ref _.RequestResolutionChange; - - public ref uint Width => ref _.Width; - - public ref uint Height => ref _.Height; - -#if CRES_CLEAN || true - public ref void* hWnd => ref _.hWnd; - - public ref uint NewWidth => ref _.NewWidth; - - public ref uint NewHeight => ref _.NewHeight; -#else - // 7.2 adds 1B8 before hWnd (previously 820, now 9D8) - [FieldOffset(0x9D8)] - public unsafe void* hWnd; - - [FieldOffset(0x9D8 + 0x10)] - public uint NewWidth; - - [FieldOffset(0x9D8 + 0x14)] - public uint NewHeight; -#endif - } } public enum ForceSizeMode @@ -405,3 +398,38 @@ public enum ForceSizeMode /// LegacyRequestResolutionChange = 1 } + +[StructLayout(LayoutKind.Explicit)] +public unsafe struct DeviceEx +{ + [FieldOffset(0)] + public Device _; + + public ref byte RequestResolutionChange => ref _.RequestResolutionChange; + + public ref byte RequestResolutionChangeUnk1 => ref RefPtr.For(ref _.RequestResolutionChange).Offs(0x1).Ref; + public ref byte RequestResolutionChangeUnk2 => ref RefPtr.For(ref _.RequestResolutionChange).Offs(0x2).Ref; + public ref byte RequestResolutionChangeUnk3 => ref RefPtr.For(ref _.RequestResolutionChange).Offs(0x3).Ref; + + public ref uint Width => ref _.Width; + + public ref uint Height => ref _.Height; + +#if CRES_CLEAN || true + public ref void* hWnd => ref _.hWnd; + + public ref uint NewWidth => ref _.NewWidth; + + public ref uint NewHeight => ref _.NewHeight; +#else + // 7.2 adds 1B8 before hWnd (previously 820, now 9D8) + [FieldOffset(0x9D8)] + public unsafe void* hWnd; + + [FieldOffset(0x9D8 + 0x10)] + public uint NewWidth; + + [FieldOffset(0x9D8 + 0x14)] + public uint NewHeight; +#endif +} diff --git a/CustomResolution2782/GameSizeState.cs b/CustomResolution2782/GameSizeState.cs index ba29664..631e2dd 100644 --- a/CustomResolution2782/GameSizeState.cs +++ b/CustomResolution2782/GameSizeState.cs @@ -1,18 +1,31 @@ using CustomResolution.Hooks; using Dalamud.Game.ClientState.Keys; using Dalamud.Game.Config; +using Dalamud.Hooking; using Dalamud.Plugin; using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel; using FFXIVClientStructs.FFXIV.Client.Graphics.Render; using FFXIVClientStructs.FFXIV.Client.System.Framework; +using FFXIVClientStructs.FFXIV.Client.System.Input; +using FFXIVClientStructs.FFXIV.Client.System.String; +using FFXIVClientStructs.FFXIV.Client.UI; +using FFXIVClientStructs.FFXIV.Client.UI.Misc; +using FFXIVClientStructs.FFXIV.Common.Math; +using FFXIVClientStructs.FFXIV.Component.GUI; +using FFXIVClientStructs.FFXIV.Component.Text; using FFXIVClientStructs.Interop; +using FFXIVClientStructs.STD; +using FloppyUtils; using ImGuiNET; using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Text; using System.Xml.Linq; +using TerraFX.Interop.DirectX; using TerraFX.Interop.Windows; using static TerraFX.Interop.Windows.Windows; @@ -20,54 +33,107 @@ namespace CustomResolution; public unsafe class GameSizeState : IDisposable { + private StringBuilder _dbg = new(); + private Hook _rtmApplyScalingHook; + private Hook _rtmDestroyAfterResizeHook; + private Hook _rtmRegenAfterResizeHook; + private bool _wasEnabled = false; - private bool? _forceDynRezoConfig; + private bool _resetSuperSampling = false; + + public GameSizeState() + { + /* Writes DynamicResolutionTargetHeight to size[1] near the end, + * but only if in (gpose || main menu), only scale < 1?? + * + * RVAs: + * 7.2: 140470150 + */ + _rtmApplyScalingHook = Service.GameInteropProvider.HookFromAddress( + Service.SigScanner.ScanText("48 89 5C 24 18 55 56 57 41 56 41 57 48 83 EC 20 8B 42 04 0F 57 C0 48 8B"), + RTMApplyScalingDetour + ); + _rtmApplyScalingHook.Enable(); + + /* Device.RequestResolutionChange and other triggers run some callbacks, namely + * (at the time of 7.2) 0x40 for RTM destruction and 0x48 for RTM reconstruction, + * registered in RTM init and run in PostTick. + * + * We don't care about destruction as much because its behavior is unchanged, but + * we do want to call it instead of triggering a slow full game resize, + * which causes some annoyances with ReShade and possibly other external factors too. + * + * We care about reconstruction so that we can force the game to create larger RTs. + * It's most notable for not being called directly (only via a shim that gets icalled), + * and for being in the stack trace when dxgi updates the RT ptrs. + */ + _rtmDestroyAfterResizeHook = Service.GameInteropProvider.HookFromAddress( + Service.SigScanner.ScanText("40 53 48 83 EC 20 48 8B 05 ?? ?? ?? ?? 48 8B D9 80 78 7A 00 ?? ?? ?? ?? ?? ?? 48 89 6C 24"), + RTMDestroyAfterResizeDetour + ); + _rtmDestroyAfterResizeHook.Enable(); + _rtmRegenAfterResizeHook = Service.GameInteropProvider.HookFromAddress( + Service.SigScanner.ScanText("40 55 57 41 55 48 8D 6C 24 B9 48 81 EC A0 00 00 00 48 8B 05 50 10 2C 02 48 33 C4 48 89 45 27 4C"), + RTMRegenAfterResizeDetour + ); + _rtmRegenAfterResizeHook.Enable(); + } public bool ConfigDynRezo { get; private set; } public ResolutionScalingMode ConfigGraphicsRezoType { get; private set; } public float ConfigGraphicsRezoScale { get; private set; } - public string DebugInfo { get; private set; } = ""; + public uint CurrentWidth { get; private set; } + public uint CurrentHeight { get; private set; } + + public string DebugInfo => _dbg.ToString(); + + // [UnmanagedFunctionPointer(CallingConvention.FastCall)] + private delegate void RTMApplyScaling(RenderTargetManagerEx* rtm, uint* size, byte unk1); + + // [UnmanagedFunctionPointer(CallingConvention.FastCall)] + private delegate void RTMDestroyAfterResize(RenderTargetManagerEx* rtm); + + // [UnmanagedFunctionPointer(CallingConvention.FastCall)] + private delegate void RTMRegenAfterResize(RenderTargetManagerEx* rtm); public void Dispose() { + _rtmApplyScalingHook.Dispose(); + _rtmDestroyAfterResizeHook.Dispose(); + _rtmRegenAfterResizeHook.Dispose(); Service.Framework.RunOnFrameworkThread(Update); } - public void ForceDynRezoConfig(bool value) - { - _forceDynRezoConfig = value; - } - public void Update() { - ref var cfg = ref Service.Config._.Game; + _dbg.Clear(); - if (_forceDynRezoConfig.HasValue) - { - Service.GameConfig.System.Set(SystemConfigOption.DynamicRezoType.ToString(), _forceDynRezoConfig.Value ? 1U : 0U); - _forceDynRezoConfig = null; - } + ref var cfg = ref Service.Config._.Game; ConfigDynRezo = Service.GameConfig.System.GetUInt(SystemConfigOption.DynamicRezoType.ToString()) != 0U; // GameConfig starts with FSR at 0; GraphicsConfig starts with FSR at 1 ConfigGraphicsRezoType = (ResolutionScalingMode) (Service.GameConfig.System.GetUInt(SystemConfigOption.GraphicsRezoUpscaleType.ToString()) + 1); ConfigGraphicsRezoScale = Service.GameConfig.System.GetUInt(SystemConfigOption.GraphicsRezoScale.ToString()) / 100f; - var dev = Device.Instance(); - var gfx = GraphicsConfig.Instance(); + var dev = (DeviceEx*) Device.Instance(); + var gfx = (GraphicsConfigEx*) GraphicsConfig.Instance(); var rtm = (RenderTargetManagerEx*) RenderTargetManager.Instance(); - //Service.PluginLog.Debug($"GraphicsRezoScale 0x{(long) (IntPtr) (&gfx->GraphicsRezoScale):X16}"); - //Service.PluginLog.Debug($"RTM 0x{(long) (IntPtr) rtm:X16}"); - if (Service.DebugConfig.IsDebug) { - DebugInfo = @$"DR {gfx->DynamicRezoEnable} + _dbg.Append(@$"RTMApplyScaling 0x{(_rtmApplyScalingHook.IsDisposed ? null : _rtmApplyScalingHook.Address):X16} +RTMRegenAfterResize 0x{(_rtmRegenAfterResizeHook.IsDisposed ? null : _rtmRegenAfterResizeHook.Address):X16} +DR !{gfx->DynamicRezoEnable} ?{gfx->DynamicRezoEnableBeyond1} _{gfx->DynamicRezoEnableCutScene} ?{gfx->DynamicRezoEnableUnkx47} ?{gfx->DynamicRezoEnableUnkx48} +GR x{gfx->GraphicsRezoScale} ?{gfx->GraphicsRezoUnk1} _{gfx->GraphicsRezoUpscaleType} ?{gfx->GraphicsRezoUnk2} +DEV 0x{(long) (nint) dev:X16} +GFX 0x{(long) (nint) gfx:X16} +RTM 0x{(long) (nint) rtm:X16} RTM {rtm->Resolution_Width} x {rtm->Resolution_Height} RTM H {rtm->DynamicResolutionActualTargetHeight} {rtm->DynamicResolutionTargetHeight} {rtm->DynamicResolutionMaximumHeight} {rtm->DynamicResolutionMinimumHeight} -RTM S {rtm->GraphicsRezoScalePrev} {rtm->GraphicsRezoScaleGlassWidth} {rtm->GraphicsRezoScaleGlassHeight} {rtm->GraphicsRezoScaleGlassWidth} {rtm->GraphicsRezoScaleGlassHeight}"; +RTM S {rtm->GraphicsRezoScalePrev} {rtm->GraphicsRezoScaleGlassX} {rtm->GraphicsRezoScaleGlassY} {rtm->GraphicsRezoScaleGlassX} {rtm->GraphicsRezoScaleGlassY} +"); } bool unloading = Service.Plugin.Unloading; @@ -80,6 +146,7 @@ RTM S {rtm->GraphicsRezoScalePrev} {rtm->GraphicsRezoScaleGlassWidth} {rtm->Grap if (enabled) { gfx->GraphicsRezoUpscaleType = (byte) (cfg.Scale <= 1f ? Service.Config._.ResolutionScalingMode : ResolutionScalingMode.Fast); + rtm->DynamicResolutionMinimumHeight = rtm->DynamicResolutionMaximumHeight; } else { @@ -88,28 +155,144 @@ RTM S {rtm->GraphicsRezoScalePrev} {rtm->GraphicsRezoScaleGlassWidth} {rtm->Grap _wasEnabled = enabled; } - if (enabled) + var scale = MathF.Max(1f, enabled ? cfg.Scale : 1f); + var widthS = (ushort) MathF.Round(dev->Width * scale); + var heightS = (ushort) MathF.Round(dev->Height * scale); + + // TODO: Figure out a more consistent way to get to the currently allocated size. + // Check if the backing RTs are the expected size. + var tex = rtm->_.Unk20[0].Value; + if (tex->AllocatedWidth != widthS || tex->AllocatedHeight != heightS) { - rtm->DynamicResolutionMinimumHeight = rtm->DynamicResolutionMaximumHeight; + // TODO: Figure out why this is causing sporadic crashes. +#if CRES_WIP + if (dev->RequestResolutionChange == 0 && !_rtmDestroyAfterResizeHook.IsDisposed && !_rtmRegenAfterResizeHook.IsDisposed) + { + dev->RequestResolutionChange = 1; + RTMDestroyAfterResizeDetour(rtm); + RTMRegenAfterResizeDetour(rtm); + dev->RequestResolutionChange = 0; + } + else +#endif + { + dev->RequestResolutionChange = 1; + } } - /* - rtm->Resolution_Width = (ushort) (dev->Width * gfx->GraphicsRezoScale); - rtm->Resolution_Height = (ushort) (dev->Height * gfx->GraphicsRezoScale); - rtm->DynamicResolutionActualTargetHeight = (ushort) (dev->Height * gfx->GraphicsRezoScale); - rtm->DynamicResolutionTargetHeight = (ushort) (dev->Height * gfx->GraphicsRezoScale); - rtm->DynamicResolutionMaximumHeight = (ushort) (dev->Height * gfx->GraphicsRezoScale); - rtm->DynamicResolutionMinimumHeight = (ushort) (dev->Height * gfx->GraphicsRezoScale); - */ + // Check if the RTM size didn't go back to the screen size when switching f.e. in / out of gpose. + if (scale > 1f) + { + if (rtm->Resolution_Width != widthS || rtm->Resolution_Height != heightS) + { + // TODO: Forcing a resolution change via Device in this scenario is annoying, but this feels disgusting. + if (!_resetSuperSampling) + { + gfx->DynamicRezoEnable = 0; + gfx->GraphicsRezoScale = 0.5f; + _resetSuperSampling = true; + } + else + { + gfx->DynamicRezoEnable = 1; + gfx->GraphicsRezoScale = scale; + _resetSuperSampling = false; + } + } + // TODO: Figure out what's going on with GraphicsRezoScaleGlassXY and GraphicsRezoUnk1 + } + + CurrentWidth = rtm->Resolution_Width; + CurrentHeight = rtm->Resolution_Height; } - // RenderTargetManager is updated very sporadically, and some fields we need flew out - // https://github.com/aers/FFXIVClientStructs/commit/589df2aa5cd9c98b4d62269034cd6da903f49b5f#diff-8e7d9b03cb91cb07a8d7b463b5be4672793a328703bde393e7acd890822a72cf - [StructLayout(LayoutKind.Explicit)] - private struct RenderTargetManagerEx + private void RTMApplyScalingDetour(RenderTargetManagerEx* rtm, uint* size, byte unk1) { - [FieldOffset(0)] - public RenderTargetManager _; + ref var cfg = ref Service.Config._.Game; + if (Service.Plugin.Unloading || !cfg.IsEnabled) + { + _rtmApplyScalingHook.Original(rtm, size, unk1); + return; + } + + var gfx = (GraphicsConfigEx*) GraphicsConfig.Instance(); + var _DynamicRezoEnableBeyond1 = gfx->DynamicRezoEnableBeyond1; + gfx->DynamicRezoEnableBeyond1 = 1; + + Service.PluginLog.Info($"Applying scaling, before: {size[0]} {size[1]} {unk1}"); + _rtmApplyScalingHook.Original(rtm, size, unk1); + Service.PluginLog.Info($"Applying scaling, after: {size[0]} {size[1]} {unk1}"); + + gfx->DynamicRezoEnableBeyond1 = _DynamicRezoEnableBeyond1; + } + + private void RTMDestroyAfterResizeDetour(RenderTargetManagerEx* rtm) + { + ref var cfg = ref Service.Config._.Game; + if (Service.Plugin.Unloading || !cfg.IsEnabled) + { + _rtmDestroyAfterResizeHook.Original(rtm); + return; + } + + Service.PluginLog.Info($"Destroying RTM resources"); + _rtmDestroyAfterResizeHook.Original(rtm); + } + + private void RTMRegenAfterResizeDetour(RenderTargetManagerEx* rtm) + { + ref var cfg = ref Service.Config._.Game; + if (Service.Plugin.Unloading || !cfg.IsEnabled) + { + _rtmRegenAfterResizeHook.Original(rtm); + return; + } + + var dev = (DeviceEx*) Device.Instance(); + + var _Width = dev->Width; + var _Height = dev->Height; + + var scale = MathF.Max(1f, cfg.Scale); + dev->Width = (ushort) MathF.Round(_Width * scale); + dev->Height = (ushort) MathF.Round(_Height * scale); + + Service.PluginLog.Info($"Regenerating RTM resources: {dev->Width} x {dev->Height}"); + _rtmRegenAfterResizeHook.Original(rtm); + + dev->Width = _Width; + dev->Height = _Height; + } +} + + +[StructLayout(LayoutKind.Explicit)] +public unsafe struct GraphicsConfigEx +{ + [FieldOffset(0)] + public GraphicsConfig _; + +// CRES_CLEAN never + public ref byte DynamicRezoEnable => ref _.DynamicRezoEnable; + // Set to 0 in main menu and gpose, preventing scaling beyond 1. + public ref byte DynamicRezoEnableBeyond1 => ref RefPtr.For(ref DynamicRezoEnable).Offs(0x1).Ref; + public ref byte DynamicRezoEnableCutScene => ref RefPtr.For(ref DynamicRezoEnable).Offs(0x2).Ref; + public ref byte DynamicRezoEnableUnkx47 => ref RefPtr.For(ref DynamicRezoEnable).Offs(0x3).Ref; + public ref byte DynamicRezoEnableUnkx48 => ref RefPtr.For(ref DynamicRezoEnable).Offs(0x4).Ref; + + public ref float GraphicsRezoScale => ref _.GraphicsRezoScale; + public ref float GraphicsRezoUnk1 => ref RefPtr.For(ref GraphicsRezoScale).Offs(0x4).Ref; + public ref byte GraphicsRezoUpscaleType => ref _.GraphicsRezoUpscaleType; + public ref byte GraphicsRezoUnk2 => ref RefPtr.For(ref GraphicsRezoUpscaleType).Offs(0x1).Ref; +} + +// RenderTargetManager is updated very sporadically, and some fields we need flew out +// https://github.com/aers/FFXIVClientStructs/commit/589df2aa5cd9c98b4d62269034cd6da903f49b5f#diff-8e7d9b03cb91cb07a8d7b463b5be4672793a328703bde393e7acd890822a72cf +[StructLayout(LayoutKind.Explicit)] +public unsafe struct RenderTargetManagerEx +{ + [FieldOffset(0)] + public RenderTargetManager _; #if CRES_CLEAN || false public ref uint Resolution_Width => ref _.Resolution_Width; @@ -120,30 +303,29 @@ RTM S {rtm->GraphicsRezoScalePrev} {rtm->GraphicsRezoScaleGlassWidth} {rtm->Grap public ref ushort DynamicResolutionMinimumHeight => ref _.DynamicResolutionMinimumHeight; public ref float GraphicsRezoScale => ref _.GraphicsRezoScale; #else - [FieldOffset(0x428)] - public uint Resolution_Width; - [FieldOffset(0x428 + 0x4)] - public uint Resolution_Height; + [FieldOffset(0x428)] + public uint Resolution_Width; + [FieldOffset(0x428 + 0x4)] + public uint Resolution_Height; - [FieldOffset(0x6F0 + 2 * 0)] - public ushort DynamicResolutionActualTargetHeight; - [FieldOffset(0x6F0 + 2 * 1)] - public ushort DynamicResolutionTargetHeight; - [FieldOffset(0x6F0 + 2 * 2)] - public ushort DynamicResolutionMaximumHeight; - [FieldOffset(0x6F0 + 2 * 3)] - public ushort DynamicResolutionMinimumHeight; + [FieldOffset(0x6F0 + 2 * 0)] + public ushort DynamicResolutionActualTargetHeight; + [FieldOffset(0x6F0 + 2 * 1)] + public ushort DynamicResolutionTargetHeight; + [FieldOffset(0x6F0 + 2 * 2)] + public ushort DynamicResolutionMaximumHeight; + [FieldOffset(0x6F0 + 2 * 3)] + public ushort DynamicResolutionMinimumHeight; - [FieldOffset(0x70C + 4 * 0)] - public float GraphicsRezoScalePrev; - [FieldOffset(0x70C + 4 * 1)] - public float GraphicsRezoScaleGlassWidth; - [FieldOffset(0x70C + 4 * 2)] - public float GraphicsRezoScaleGlassHeight; - [FieldOffset(0x70C + 4 * 3)] - public float GraphicsRezoScaleUnk1; - [FieldOffset(0x70C + 4 * 4)] - public float GraphicsRezoScaleUnk2; + [FieldOffset(0x70C + 4 * 0)] + public float GraphicsRezoScalePrev; + [FieldOffset(0x70C + 4 * 1)] + public float GraphicsRezoScaleGlassX; + [FieldOffset(0x70C + 4 * 2)] + public float GraphicsRezoScaleGlassY; + [FieldOffset(0x70C + 4 * 3)] + public float GraphicsRezoScaleUnk1; + [FieldOffset(0x70C + 4 * 4)] + public float GraphicsRezoScaleUnk2; #endif - } } diff --git a/CustomResolution2782/Hooks/WndProcHook.cs b/CustomResolution2782/Hooks/WndProcHook.cs index 31c2fd8..f4ddc9e 100644 --- a/CustomResolution2782/Hooks/WndProcHook.cs +++ b/CustomResolution2782/Hooks/WndProcHook.cs @@ -106,7 +106,7 @@ public sealed unsafe class WndProcHook : IDisposable private void InvokePre(WndProcEventArgs args) { - if (Service.Plugin is not { } plugin) + if (Service.Plugin.Unloading) { return; } @@ -185,7 +185,7 @@ public sealed unsafe class WndProcHook : IDisposable private void InvokePost(WndProcEventArgs args) { - if (Service.Plugin is not { } plugin) + if (Service.Plugin.Unloading) { return; } diff --git a/CustomResolution2782/Plugin.cs b/CustomResolution2782/Plugin.cs index 97ff124..a0d3b4e 100644 --- a/CustomResolution2782/Plugin.cs +++ b/CustomResolution2782/Plugin.cs @@ -84,8 +84,6 @@ public sealed unsafe class Plugin : IDalamudPlugin Service.WndProcHook.Dispose(); Service.PluginUI.Dispose(); - - Service.Plugin = null!; } private void OnFrameworkUpdateForSize(ref ConfigurationV1.SizeConfig size) diff --git a/CustomResolution2782/RefPtr.cs b/CustomResolution2782/RefPtr.cs new file mode 100644 index 0000000..d6902fe --- /dev/null +++ b/CustomResolution2782/RefPtr.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace FloppyUtils; + +public static unsafe class RefPtr +{ + public static RefPtr For(ref T at) where T : unmanaged + { + return new() + { + Ref = ref at + }; + } +} + +public unsafe ref struct RefPtr where TAt : unmanaged +{ + public ref TAt Ref; + + public TAt* Ptr + { + get => (TAt*) Unsafe.AsPointer(ref Ref); + set => Ref = ref Unsafe.AsRef(value); + } + + public RefPtr Offs(int offs) where T : unmanaged => new() + { + Ptr = (T*) ((nint) Ptr + offs) + }; +} diff --git a/CustomResolution2782/Service.cs b/CustomResolution2782/Service.cs index 6c45e7c..d3577e5 100644 --- a/CustomResolution2782/Service.cs +++ b/CustomResolution2782/Service.cs @@ -1,4 +1,5 @@ using CustomResolution.Hooks; +using Dalamud.Game; using Dalamud.Game.Text; using Dalamud.IoC; using Dalamud.Plugin; @@ -38,6 +39,9 @@ public sealed class Service [PluginService] public static IGameInteropProvider GameInteropProvider { get; private set; } = null!; + [PluginService] + public static ISigScanner SigScanner { get; private set; } = null!; + [PluginService] public static IPluginLog PluginLog { get; private set; } = null!; diff --git a/CustomResolution2782/Windows/ConfigWindow.cs b/CustomResolution2782/Windows/ConfigWindow.cs index dee28c0..7e8bdc3 100644 --- a/CustomResolution2782/Windows/ConfigWindow.cs +++ b/CustomResolution2782/Windows/ConfigWindow.cs @@ -16,6 +16,7 @@ public class ConfigWindow : Window, IDisposable private readonly int[] _displayCurrentWH = new int[2]; private readonly int[] _displayCurrentWindowWH = new int[2]; + private readonly int[] _displayCurrentGameWH = new int[2]; private ConfigurationV1 _; @@ -49,18 +50,18 @@ public class ConfigWindow : Window, IDisposable _displayCurrentWH[1] = (int) Service.DisplaySize.CurrentHeight; _displayCurrentWindowWH[0] = (int) Service.DisplaySize.CurrentWindowWidth; _displayCurrentWindowWH[1] = (int) Service.DisplaySize.CurrentWindowHeight; + _displayCurrentGameWH[0] = (int) Service.GameSize.CurrentWidth; + _displayCurrentGameWH[1] = (int) Service.GameSize.CurrentHeight; - ImGui.BeginDisabled(); - ImGui.InputInt2("Current window size", ref _displayCurrentWindowWH[0]); - ImGui.InputInt2("Current display size", ref _displayCurrentWH[0]); - ImGui.EndDisabled(); + using (ImRaii.Disabled()) + { + ImGui.InputInt2("Window size", ref _displayCurrentWindowWH[0]); + } using (var imTabBar = ImRaii.TabBar("MalfunctionMainTabs")) { DrawDisplayTab(); - DrawGameTab(); - DrawCommonTab(); } @@ -97,7 +98,31 @@ Changed via /cres"); return; } - DrawSizeTabContents(ref _.Display, "Display"); + using (ImRaii.Disabled()) + { + ImGui.InputInt2("Current size", ref _displayCurrentWH[0]); + } + + DrawSizeTabShared(ref _.Display, "Display"); + + ImGui.Checkbox("Use scale", ref _.Display.IsScale); + + if (_.Display.IsScale) + { + ImGui.InputFloat("Scale", ref _.Display.Scale, 0.01f, 0.1f, "%.3f", ImGuiInputTextFlags.None); + } + else + { + unsafe + { + ImGui.InputInt2("Size in pixels", ref _.Display.WH[0]); + } + } + + if (Service.DebugConfig.IsDebug) + { + ImGui.Text(Service.DisplaySize.DebugInfo); + } } private void DrawGameTab() @@ -124,23 +149,23 @@ Changed via /gres"); return; } -#if false - if (Service.GameSize.CurrentDynRezoConfig) + using (ImRaii.Disabled()) { - using (ImRaii.PushColor(ImGuiCol.Border, 0xff00ffff)) - { - if (ImGui.Button(@"This might not work properly while in-game dynamic resolution is enabled! -Click here to disable it.")) - { - Service.GameSize.ForceDynRezoConfig(false); - } - - ImGui.Dummy(new Vector2(0, ImGui.GetTextLineHeight() * 0.1f)); - } + ImGui.InputInt2("Current size", ref _displayCurrentGameWH[0]); } -#endif - DrawSizeTabContents(ref _.Game, "Game", scaleOnly: true); + DrawSizeTabShared(ref _.Game, "Game", scaleOnly: true); + + using (_.Game.Scale > 2f ? ImRaii.PushColor(ImGuiCol.Border, 0xff00ffff) : null) + { + ImGui.InputFloat("Scale", ref _.Game.Scale, 0.01f, 0.1f, "%.3f", ImGuiInputTextFlags.None); + } + + if (_.Game.Scale > 2f && ImGui.IsItemHovered()) + { + ImGui.SetTooltip(@"Scaling larger than 2x currently doesn't improve antialiasing! +This is still being worked on before the v1.0 release."); + } if (ImGui.BeginCombo("Graphics Upscaling", _.ResolutionScalingMode.ToHumanNameString())) { @@ -167,7 +192,7 @@ Click here to disable it.")) } - private void DrawSizeTabContents(ref ConfigurationV1.SizeConfig size, string name, bool scaleOnly = false) + private void DrawSizeTabShared(ref ConfigurationV1.SizeConfig size, string name, bool scaleOnly = false) { ImGui.Checkbox("Enabled", ref size.IsEnabled); @@ -216,24 +241,6 @@ Click here to disable it.")) ImGui.SameLine(); ImGui.Text("Hotkey"); - - - if (!scaleOnly) - { - ImGui.Checkbox("Use scale", ref size.IsScale); - } - - if (size.IsScale || scaleOnly) - { - ImGui.InputFloat("Scale", ref size.Scale, 0.01f, 0.1f, "%.3f", ImGuiInputTextFlags.EnterReturnsTrue); - } - else - { - unsafe - { - ImGui.InputInt2("Size in pixels", ref size.WH[0]); - } - } } private void DrawCommonTab() diff --git a/CustomResolution2782/packages.lock.json b/CustomResolution2782/packages.lock.json index e6da79b..6b40e5f 100644 --- a/CustomResolution2782/packages.lock.json +++ b/CustomResolution2782/packages.lock.json @@ -8,11 +8,958 @@ "resolved": "12.0.0", "contentHash": "J5TJLV3f16T/E2H2P17ClWjtfEBPpq3yxvqW46eN36JCm6wR+EaoaYkqG9Rm5sHqs3/nK/vKjWWyvEs/jhKoXw==" }, + "SharpDX.D3DCompiler": { + "type": "Direct", + "requested": "[4.2.0, )", + "resolved": "4.2.0", + "contentHash": "Rnsd6Ilp127xbXqhTit8WKFQUrXwWxqVGpglyWDNkIBCk0tWXNQEjrJpsl0KAObzyZaa33+EXAikLVt5fnd3GA==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "SharpDX": "4.2.0" + } + }, + "SharpDX.Direct2D1": { + "type": "Direct", + "requested": "[4.2.0, )", + "resolved": "4.2.0", + "contentHash": "Qs8LzDMaQf1u3KB8ArHu9pDv6itZ++QXs99a/bVAG+nKr0Hx5NG4mcN5vsfE0mVR2TkeHfeUm4PksRah6VUPtA==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "SharpDX": "4.2.0", + "SharpDX.DXGI": "4.2.0" + } + }, + "SharpDX.Direct3D11": { + "type": "Direct", + "requested": "[4.2.0, )", + "resolved": "4.2.0", + "contentHash": "oTm/iT5X/IIuJ8kNYP+DTC/MhBhqtRF5dbgPPFgLBdQv0BKzNTzXQQXd7SveBFjQg6hXEAJ2jGCAzNYvGFc9LA==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "SharpDX": "4.2.0", + "SharpDX.DXGI": "4.2.0" + } + }, "TerraFX.Interop.Windows": { "type": "Direct", "requested": "[10.0.22621.2, )", "resolved": "10.0.22621.2", "contentHash": "lORoYCoURS33Vi7PDvubRugLF2+l5v3rX2oVEqNhpBLjs3aZpqapRvTHPKVwsC+dGrsGuqJ/3yXuxVUb0vl3vg==" + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "SharpDX": { + "type": "Transitive", + "resolved": "4.2.0", + "contentHash": "3pv0LFMvfK/dv1qISJnn8xBeeT6R/FRvr0EV4KI2DGsL84Qlv6P7isWqxGyU0LCwlSVCJN3jgHJ4Bl0KI2PJww==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "SharpDX.DXGI": { + "type": "Transitive", + "resolved": "4.2.0", + "contentHash": "UjKqkgWc8U+SP+j3LBzFP6OB6Ntapjih7Xo+g1rLcsGbIb5KwewBrBChaUu7sil8rWoeVU/k0EJd3SMN4VqNZw==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "SharpDX": "4.2.0" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } } } }