From 57f6a7917f7640bd65cefb3f66b24ea34b817e0c Mon Sep 17 00:00:00 2001 From: thehun927 Date: Mon, 18 May 2026 20:11:39 -0400 Subject: [PATCH] 0.1.1 --- .../AbsorbentSoilMod.cs | 194 ++++++++---------- .../bin/Release/net6.0/AbsorbentSoil.pdb | Bin 22600 -> 22468 bytes .../net6.0/AbsorbentSoil.AssemblyInfo.cs | 2 +- .../AbsorbentSoil.AssemblyInfoInputs.cache | 2 +- .../obj/Release/net6.0/AbsorbentSoil.dll | Bin 11264 -> 10752 bytes .../obj/Release/net6.0/AbsorbentSoil.pdb | Bin 22600 -> 22468 bytes .../obj/Release/net6.0/ref/AbsorbentSoil.dll | Bin 7168 -> 7168 bytes .../Release/net6.0/refint/AbsorbentSoil.dll | Bin 7168 -> 7168 bytes 8 files changed, 85 insertions(+), 113 deletions(-) rename AbsorbentSoilMod.cs => AbsorbentSoil/AbsorbentSoilMod.cs (63%) diff --git a/AbsorbentSoilMod.cs b/AbsorbentSoil/AbsorbentSoilMod.cs similarity index 63% rename from AbsorbentSoilMod.cs rename to AbsorbentSoil/AbsorbentSoilMod.cs index 4fb8f14..936251a 100644 --- a/AbsorbentSoilMod.cs +++ b/AbsorbentSoil/AbsorbentSoilMod.cs @@ -4,12 +4,11 @@ using System.Linq; using System.Reflection; using HarmonyLib; using MelonLoader; -using ScheduleOne.Growing; -using ScheduleOne.ItemFramework; -using ScheduleOne.ObjectScripts; -using UnityEngine; +using Il2CppScheduleOne.Growing; +using Il2CppScheduleOne.ItemFramework; +using Il2CppScheduleOne.ObjectScripts; -[assembly: MelonInfo(typeof(AbsorbentSoil.AbsorbentSoilMod), "Absorbent Soil", "0.1.0", "AttilaG")] +[assembly: MelonInfo(typeof(AbsorbentSoil.AbsorbentSoilMod), "Absorbent Soil", "0.1.1", "AttilaG")] [assembly: MelonGame(null, "Schedule I")] namespace AbsorbentSoil @@ -23,16 +22,15 @@ namespace AbsorbentSoil MelonLogger.Msg("Absorbent Soil loaded. Additive retention is active for long-life soils."); } - // This keeps slot/session bleed low if the player backs out and loads another save without restarting. - // It does NOT persist anything to disk. It only tracks pots currently seen in the running game session. public override void OnSceneWasLoaded(int buildIndex, string sceneName) { + // Prevent save-slot/session bleed if the player returns to menu and loads another save. if (!string.IsNullOrWhiteSpace(sceneName) && (sceneName.IndexOf("menu", StringComparison.OrdinalIgnoreCase) >= 0 || sceneName.IndexOf("main", StringComparison.OrdinalIgnoreCase) >= 0 || sceneName.IndexOf("load", StringComparison.OrdinalIgnoreCase) >= 0)) { - AdditiveMemory.Clear(); + AdditiveMemory.ClearAll(); MelonLogger.Msg($"Cleared additive memory on scene load: {sceneName}"); } } @@ -80,12 +78,22 @@ namespace AbsorbentSoil if (pot == null) return; - string key = PotKeyHelper.GetPotKey(pot); - if (!string.IsNullOrWhiteSpace(key)) - AdditivesByPotKey.Remove(key); + Forget(PotKeyHelper.GetPotKey(pot)); } - public static void Clear() => AdditivesByPotKey.Clear(); + public static void Forget(string potKey) + { + if (string.IsNullOrWhiteSpace(potKey)) + return; + + if (AdditivesByPotKey.Remove(potKey) && AbsorbentSoilMod.VerboseLogging) + MelonLogger.Msg($"Cleared retained additives for pot '{potKey}'."); + } + + public static void ClearAll() + { + AdditivesByPotKey.Clear(); + } } internal static class PotKeyHelper @@ -95,13 +103,10 @@ namespace AbsorbentSoil if (pot == null) return string.Empty; - // Most Schedule I buildable/grid items have a GUID inherited from a base class. - // Use reflection so this survives minor EA API shifts. object guid = ReadMember(pot, "GUID") ?? ReadMember(pot, "Guid") ?? ReadMember(pot, "guid"); if (guid != null && !string.IsNullOrWhiteSpace(guid.ToString())) return guid.ToString(); - // Fallback for testing only. Not stable across reloads, but better than hard failing. return $"scene:{pot.GetInstanceID()}"; } @@ -111,92 +116,6 @@ namespace AbsorbentSoil return null; Type type = instance.GetType(); - - PropertyInfo prop = AccessTools.Property(type, name); - if (prop != null) - { - try { return prop.GetValue(instance); } catch { } - } - - FieldInfo field = AccessTools.Field(type, name); - if (field != null) - { - try { return field.GetValue(instance); } catch { } - } - - return null; - } - } - - internal static class SoilHelper - { - // Adjust these after checking the actual IDs/names from item definitions or Melon logs. - // The helper checks IDs/names case-insensitively and allows partial matches. - private static readonly string[] RetainingSoilTokens = - { - "longlife", - "long_life", - "long-life", - "long life", - "extralonglife", - "extra_long_life", - "extra-long-life", - "extra long life" - }; - - public static bool IsRetainingSoil(Pot pot) - { - if (pot == null) - return false; - - // In current Pot.cs, soil identity is probably on GrowContainer/PotData/base state rather than Pot itself. - // Try several likely member names so the mod remains resilient to EA renames. - foreach (string memberName in new[] - { - "SoilID", "soilID", "SoilId", "soilId", - "SoilDefinition", "soilDefinition", "SoilItem", "soilItem", - "Soil", "soil", "CurrentSoil", "currentSoil" - }) - { - object value = ReadMemberRecursive(pot, memberName); - if (MatchesRetainingSoil(value)) - return true; - } - - // Last resort: inspect chunks/transforms/names. This is intentionally broad but only affects whether - // additives are remembered/reapplied; if it is too broad, tighten RetainingSoilTokens above. - string potName = SafeLower(pot.name); - if (ContainsAnyToken(potName)) - return true; - - return false; - } - - private static bool MatchesRetainingSoil(object value) - { - if (value == null) - return false; - - if (ContainsAnyToken(SafeLower(value.ToString()))) - return true; - - foreach (string memberName in new[] { "ID", "Id", "Name", "name", "ItemID", "itemID", "Definition", "definition" }) - { - object nested = ReadMemberRecursive(value, memberName); - if (nested != null && ContainsAnyToken(SafeLower(nested.ToString()))) - return true; - } - - return false; - } - - private static object ReadMemberRecursive(object instance, string name) - { - if (instance == null || string.IsNullOrWhiteSpace(name)) - return null; - - Type type = instance.GetType(); - while (type != null) { PropertyInfo prop = AccessTools.Property(type, name); @@ -216,22 +135,61 @@ namespace AbsorbentSoil return null; } + } - private static bool ContainsAnyToken(string text) + internal static class SoilHelper + { + public static bool IsRetainingSoil(Pot pot) { - if (string.IsNullOrWhiteSpace(text)) + string soilId = GetSoilId(pot); + if (string.IsNullOrWhiteSpace(soilId)) return false; - return RetainingSoilTokens.Any(token => text.Contains(token)); + soilId = soilId.ToLowerInvariant(); + return soilId.Contains("longlifesoil") || soilId.Contains("extralonglifesoil"); } - private static string SafeLower(string value) => value == null ? string.Empty : value.ToLowerInvariant(); + public static string GetSoilId(Pot pot) + { + if (pot == null) + return string.Empty; + + object soilId = ReadMember(pot, "SoilID") ?? ReadMember(pot, "soilID") ?? ReadMember(pot, "SoilId") ?? ReadMember(pot, "soilId"); + return soilId?.ToString() ?? string.Empty; + } + + private static object ReadMember(object instance, string name) + { + if (instance == null || string.IsNullOrWhiteSpace(name)) + return null; + + Type type = instance.GetType(); + while (type != null) + { + PropertyInfo prop = AccessTools.Property(type, name); + if (prop != null) + { + try { return prop.GetValue(instance); } catch { } + } + + FieldInfo field = AccessTools.Field(type, name); + if (field != null) + { + try { return field.GetValue(instance); } catch { } + } + + type = type.BaseType; + } + + return null; + } } [HarmonyPatch(typeof(Pot), "ApplyAdditive")] internal static class Pot_ApplyAdditive_Patch { private static bool _suppressCapture; + private static readonly MethodInfo ApplyAdditiveMethod = AccessTools.Method(typeof(Pot), "ApplyAdditive"); public static void Postfix(Pot __instance, AdditiveDefinition __result, string additiveID, bool isInitialApplication) { @@ -259,8 +217,7 @@ namespace AbsorbentSoil if (pot == null || string.IsNullOrWhiteSpace(additiveID)) return; - MethodInfo applyAdditive = AccessTools.Method(typeof(Pot), "ApplyAdditive"); - if (applyAdditive == null) + if (ApplyAdditiveMethod == null) { MelonLogger.Warning("Could not find Pot.ApplyAdditive via reflection."); return; @@ -269,7 +226,7 @@ namespace AbsorbentSoil try { _suppressCapture = true; - applyAdditive.Invoke(pot, new object[] { additiveID, true }); + ApplyAdditiveMethod.Invoke(pot, new object[] { additiveID, true }); } catch (Exception ex) { @@ -293,8 +250,12 @@ namespace AbsorbentSoil return; Pot pot = __instance.Pot; + if (!SoilHelper.IsRetainingSoil(pot)) + { + AdditiveMemory.Forget(pot); return; + } IReadOnlyList additiveIds = AdditiveMemory.Get(pot); if (additiveIds.Count == 0) @@ -317,8 +278,20 @@ namespace AbsorbentSoil { public static void Postfix(Pot __instance) { - // Intentionally do nothing. This patch exists as a reminder that retained additives should survive harvest. - // Do NOT clear AdditiveMemory here, because long-life/extra-long-life soil should carry additives forward. + try + { + if (__instance == null) + return; + + // After the game's harvest logic runs, if soil was consumed/removed or is no longer retaining soil, + // clear the retained additives so freshly re-poured soil starts clean. + if (!SoilHelper.IsRetainingSoil(__instance)) + AdditiveMemory.Forget(__instance); + } + catch (Exception ex) + { + MelonLogger.Warning($"OnPlantFullyHarvested postfix failed: {ex}"); + } } } @@ -327,7 +300,6 @@ namespace AbsorbentSoil { public static void Prefix(Pot __instance) { - // If the pot itself is destroyed/sold, stop tracking its additives. try { AdditiveMemory.Forget(__instance); } catch { } } diff --git a/AbsorbentSoil/bin/Release/net6.0/AbsorbentSoil.pdb b/AbsorbentSoil/bin/Release/net6.0/AbsorbentSoil.pdb index d181b8db0a49274deac428ba4bd8a5f3767cd848..4e949ea2e92d33dee57712d65d2bbda17e9a0dd0 100644 GIT binary patch delta 1395 zcmZuxU2F_d6h8Ov-QC%3hh4kdR;#vYDK<8%sM_!RqEQ#1y33?X2; z6EF(_;T%5s7k}ySAmVZINSuwI0sabh0*GLI$jR4~!}$<-K?TsmtYd!42l&S=fFu0J z4%wdBwpxLwq$1ms9rv$)g{@|vTmiHOp4kI-Q?4qgrlUndoCkTen1?nOXmILIr!xbY z!@HW&)Zdrs#jEE~CQZ9DyL!_!VC=V=Ri)LhE|qmW9`c93T?{S#TIyaDoIE;y{PD@a z=;xVto^-4)d-r>fRqeh~RyqI7@U6~NLo3_TctU zcUQA0u-dlV6LG7!HC~FwaG7Uj=`~dB*W9#5;>3kIkVL_j#jX9V$-!FPN2OBp&;n(6 zsX~%wQ<+po1RDr6L-$He&>Ur;Q>0N0Z)KaVWxZ>a5vF>nMIasE7B1eQqv53Cf!(&i z7ey5UJ;)K}Ikqb!Mzy?%LaBMFQW-@ZxcA9^J&*FGCMn8`z`4|TtcPuN8%l72qvo)V zP+pkMAr&05QQCJsV4j~!Z4N0TNij)VIiY#={~5h2v95^u%!;=sW9wiqGe7FV>{iN@ zq0?HW`9Zm(1Qq#l+v>3@>uh^@oIfIa%}2hyFsjUnU?C54(@b8^T!rP8C~Og9(Hb7> zeS2eb0uvMtl?3eyN?NEH8kKV$P%DXwV2XOB#kgFsrNK>IK9mUY6>mfynGmo7tYwJ) E0G1-KwEzGB delta 1548 zcmZvce`s4(6vxlIc}d<&^V+0Mnx>PctX<<=yL6phGq=^OuAS9(WTt61e^Arrt&OH> zY}2{tALbPV5sSDzbsGwb{^Jzgbm9+07|wwMM?qu=!eD`+sg-ts4bbDLPy_0-45{6M6yhj=UA$=kSokAa=Zv1e$8DF#o*#lL?J|NK)^cb`NeE^A+M6*y4ufX|Mta+)c%yr%50CRPsw;%<~9)1## z3Ub=q0rr4hHrIe_Zei~lehP67?6${`fos8@Dwk1=sP10}S!*~8yUperOqhiofqWS6 zwG$q)Spzr1z6bInUT4R*g6qLPn|t<8<#3#d;qD1-zdI{`0z(;DXE)4YZ?Fh9H+*!usqtLsLz zy)uShQPAy`b~9QB-G-KCp7&**iEm|*yJc^U{3O+pY6Z{EpYEa`?qU|y3 z`?0t*VENO{*$7_Pm()~p3q_)hvf-w7fpgs=6dY1fnHN3~<>}*_)Cg`7-y}u{gyN!y z72^&{aDk9e+|=PRMw~?Pf>uLbp$Lj_wqBX6x6`q**A)^-2oH|1d0e|2DeKMGGzV!s zwnsMVtFy-BJBNA4{WKv{pZugkg92x`k`X&3j1CuRwf8^BrOfyLQwy_t6-6Pxz-J$k z10L-39=;rW!ulfJ*%{#C8nv4jHLY5AtM=og4w^q$bM!VEZ6x%JjY34uCRfZw1PWj mt9xRolZ#5rUFtgY>zB7R@QpMi$SGpgzl)X1@tA=5P4C}ryvzIm diff --git a/AbsorbentSoil/obj/Release/net6.0/AbsorbentSoil.AssemblyInfo.cs b/AbsorbentSoil/obj/Release/net6.0/AbsorbentSoil.AssemblyInfo.cs index 972d1a6..9d98a04 100644 --- a/AbsorbentSoil/obj/Release/net6.0/AbsorbentSoil.AssemblyInfo.cs +++ b/AbsorbentSoil/obj/Release/net6.0/AbsorbentSoil.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("AbsorbentSoil")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+1374b2e929263849b9362bc2032e73ac19079563")] [assembly: System.Reflection.AssemblyProductAttribute("AbsorbentSoil")] [assembly: System.Reflection.AssemblyTitleAttribute("AbsorbentSoil")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/AbsorbentSoil/obj/Release/net6.0/AbsorbentSoil.AssemblyInfoInputs.cache b/AbsorbentSoil/obj/Release/net6.0/AbsorbentSoil.AssemblyInfoInputs.cache index 9e8ac38..de68f8b 100644 --- a/AbsorbentSoil/obj/Release/net6.0/AbsorbentSoil.AssemblyInfoInputs.cache +++ b/AbsorbentSoil/obj/Release/net6.0/AbsorbentSoil.AssemblyInfoInputs.cache @@ -1 +1 @@ -54ce364b284ea9f7c7e326b3938578be61e76fb507bfb64c59c1c67e28888f74 +c2488a0a4e0149be33c85611dadce8edca6655bd5fdedcb3c238565f85b2d0ec diff --git a/AbsorbentSoil/obj/Release/net6.0/AbsorbentSoil.dll b/AbsorbentSoil/obj/Release/net6.0/AbsorbentSoil.dll index a199e3eb7fb5eadb1112f2e48d99f82a28ddb604..454561f98ab8e2dd5a141c23c26e3e7508c8d28b 100644 GIT binary patch delta 4091 zcmbtXdvKK16+h>G-`;PtNtW!F&E`!u**uobCTt$&ArA>b9*PA7RJ2S9A!SliHrXU9 zEoNiUVl8%zpTlTXu#Tm^##bzAwKK{nLyO}RTOW{8u+!SwqW)1|W!m4pyV+3N=|8=b z?|kQX&bjBFd(OG{+l*f}zV4PAs~*pFKSk+rf~tbq93!fNK&FJh?wWY;67Mx#M5~lw z6VdI)L}h-?I8hGp_#&cpPNj%C8@SH%S|vn5JXOw3JllJ_0d^A}6Hm2sfa^HyOmS85 z!*Hj@ay)`ubYC6Ou_7XNnrhme)ncdfo;Z`dT=>HQB2SbfB8uK9vxYOl>!l)%L>C~5Zj!1QW=+PUc|%7 z6ie3I9IgN#Au5dt`X&NFs(d2qHo|r{6j9-ih&a?9PkpyE!u8;?Eq^$wbh(y@H-O2V zYN?$fXd3}?-2U)ft#yld%$Xw>Bn7p=u}e7)&%$OrGL=9Ph{!lp9*;~MM0oL5@C`XK zacmky3RQ*#ZNz*vzLFu4K=lU0c{)K6WW+lIRldqJOlq}CSY$?R*81yRI%PEtvNn}) zEbyOMP+R%`lE5kp^Sq^~v`R4g+Bar8B~~m6R!%jbIu)}sb?Q(trs^caD8_V&!sj58 zDMBe2`&FZ(gBnmgE{#e0F|cx+PEdoYpNgC#W5~Pd54S0low!PQSDqqNIG%)iQ|m?1 z&3<^Q2^ja*6c+AAb@|?SJIrdQmU${FiiTAaWuuGUo{7!~&xQ~(+xTA*TY+)4%rO-> zykJ9AcQGwefuk|%Y3r?IDRJVpLWsg0@R=xqN54PZ34UCKkGZIfL0{qx-aBxQ;)zUb&0U2g<4Uy5kGLg00>Cp1Q+(pZM9hSrWG`nPQzR+E?DTz8<( zq4jHNM?R5i(a^H>E0*BB8+bL!7+O3K->i%=a98rB1;U*LKlBB+5bjw9+k__@56qQ_ z&=Z8@D?X|FL@AV^>KUwu@ujJ-O4fQ~LQ49XrbA*(&Z5WF38S|-;POz!_!RUm@u^GF zqvEt7=|{$5@Y$Lk7K;CarlVSNgXR|serB_ z+d(BwfY#9OLF?%{E%9-y*-XV;&F!FX8}mV9))KlyYv=IC)_OGSOUAdTiM?VN?Kp&U zl|#9%o4_BTTj>QzZU;SN20>4dqHnnNQWqz)-4EfwJz^cegx8H*wd)tbA4kjO=mm;7 z+xSTDhMW^L&^lxEn6Y`9fw+T7&qaj9N#jntJ6;^aJ7(Bhs$Z1t5IFAqLK0`3$&ENpdo4kt*2qo7P=mE9vuYjrnf*Zq?4d) zDR~;NE3~2)w41J^kkO6%DrEF(zBkPeQ`j*0yR^y(fxcpNgDy3D6>nZZ_ae=wsDi@? z{TsBMMtKL{%;vc2le5SBxZQDkXU5%0#_wG{EHvEo_!KSo6+`~;?0IR!1KLg?L@_;; z-a+erbzHC4INQP9xMP)--9=9zB~Ks~zr!;ZhR*%I9w*P`&db2uwQ0o)!pAswTAo5Px-I{v+u}T3w#f09-^ZoSvt=br&eP>j zL@ru|6<1@89=u0rDUE_3Kn<7cD6i5{jHqaxrL$}E>Q|mvUUBHH^T*HMz3|=B?c1Ck zvtPuiHN0N0(_QhkE)v2nunP=}y=IVwS6afp*4JZt*uK_M%29h%21Qv}d6`9Q7x>1X z$t4rg0&lrpfIo+W{#-R9NcKiqV2}UOsS1Xi3xeef>`_-xu-hw1u)WcnMOZ-g~_U$>j&se(TPGjFo6(4=}rL(+xusJPUcSTyLeE;Lz zGfwWI8&4cQlYhxQm_I#!q4?lLWk5XK<%pUA$6LG5JAdZ5(0s$Wyml|&<$PWn;%g?$ z>z-xfdoO29@lXTwNoo?re>6}6I4BIkaj@Y33(^@Hpn(pFK7%%S+?Wd14$F~ eF`!O5N6#Y1HRt}UMX7()Uv8T8MNacX%=#A;KY^D3 delta 4502 zcmZ`+eRNdC6~8m@y?Jjp$(r5lZZ_XbHXqAo6P6D_1Tl~ZL`C^jKxtS*z+lMYCQzs) zn;yTZP~-DZT6;JItsk^n6;y0bTdiRIXlYd}7BL6T@elOWa$2oaj-~z0yv-7+&e?Zo z?(g1r=iWPaX5J1g9$0$+J=N0=TJKY~ouKM)9!n6_01yrsYZ=^oo#(w-MAu4SB~hz3 zIHo9nfG8jQiJ3%;?J+!VFJtxYLT&5_&sScX3=H>oqkjNcpF&@SI!Y!gc z@QwNXkm@2;4W=&Eq_|WBOsuIF(YObsI7U>I(C9m`1&?yJM1QSR?ZlOh?<<2wxnP>wB@dA^l;usVRN9u+N;zls}mOt90 zq!v$&Q&Iy`f6NtQaD=Fq+~Y{|Beg^=HVs&NWUR_cQCJ^ zUYI}5=T@{3rVCtgzw3hOd?hq2e!2|5Np$wBRy-CFxT17w@SpO*bi^EPbWw%hPLBUyGZ@74(z=EjrS%vU4`4=J@X$6{ zY_&lRMN)hpYLo3rT?&o5;W>F#RiR$FJ@S1#y;{Di_6OIZ@Wl;m_j$~80^n-9I02YJ zHN|mRv>B(mXHX*Wc(JnLOSiW|v_L&g$ilW>2NpTVRp(^Mf zY^mX<+1h;JrUQIFbl&8(x}d$L(IJH_=h9~8sJ0a1ji#gNeoOcvA7&<0CWf~n<+zy%}&M+ML_l+U69rT=ejv4e`mV42(xFC16 zBb$sDO$sW`F=J9qRyM)%aFc%S$Y{FobBm(59i>gTQOeykNpXWzYJ_nkn(FCqt#Z77t;M%&g5s9pH|h4$R_b1-BCZn zS-hC;$#P|u#Y6P8;+%|@Q09PQZ^z2L&g8yiRESf6(+je8=$t9XA1Pdp9b|+qfexpa zbDE4k(WK63JP+1J@I^}hCD_sE0Bq`XR|fSuGL3{7Nu{sSO@@n(2u5B|SvW_q+sA_z z(p1n=nh6@FHboaGx=hieqFsvKs_14=fm|OEwR94+fimAyke991Cr}A%W>Y{t`gG98 z%vSo5l8$9-ttHq6C$+US9$%WhsQM!!1LRs`E5@JE1N1VGouFUpVNe&7v_b5mnd}bh zXVk`G*7MLe^#?#F!-;%lxg-PeVeHpA`YsyF_R?GG<#&PnoqbHp*jDQ_u#MIk&=0l$ z0x4lS`zw%qP>GCX8{ynoItl%;z{_z(91-JL8@tAu0`1q$UF2n#BfPP+ovmcc*i?2i z`-0Y58`)--`4;PEjD2qYgw@dB%(o~`uZmx=Np!+|iQUV%b%+hJX6%F^$6vPGe4W+f zq+4b*Q65d>O;kj!pk>qn8li5`26_r~BK;P08vO^fg$lJMTw4{Oizo(qgTgy9=vwF& zx>&>4C}@WocVx%Cbg8DX+bF3;Ku>5bpiA`*Io5Ay@~tar4;`e}=mhy$4ZDh6&+cUH zv>90$Vvn;InLZ$^X>=Qhij((^)9~SPn7x|SFj1EyZNAbuuPF68P`MYji8!?N)Pq)n1iAO61jOqK2PElAguUc$~UaztC}N`izeD_SUZ6_1($ME#1l9-bw8V zn%+ryf}4BXU~kA+S?QM9}1IV_J*F0l@si^H);RSd&Rzwy!&}*W3qcg zCoSwuuA0}m?xxQ4!p@Ej>E5o5`yTQKn3$LB>$tho9tu?0zYoL$7n-I%Ot9~CU=lMI zC0BP|o%*&NF8+aUVW)HeUkZy-UERtD`^n;ctk1qNG>gydu^$d$^3YYx?k|mJj5fkI z1L!JzTV6v+T8A5vTs{vJRUVdIephxj-u@IglqeLSLDTfD2>3dg2e$5HK99$n zRHnk@TOokGZ11g%74xQzR|LMDm~Vy0MNC=ntuXL4qNqnwOyB{+ zeJga(au5%6b!hlD*!5NGS;F2~b+^mS$Qa+0XiDr`5T3{<5uG};<0P?p^W|3Df@jh! zJn9a0wxirqMR@A*JOkM?HTLt>)rG@XJWzYz$FpY*oc+u1z6_r}V4td9KOqY)Y|etx zcKf=a!s9G|$)8$Hbi6XyQ_RE+HT diff --git a/AbsorbentSoil/obj/Release/net6.0/AbsorbentSoil.pdb b/AbsorbentSoil/obj/Release/net6.0/AbsorbentSoil.pdb index d181b8db0a49274deac428ba4bd8a5f3767cd848..4e949ea2e92d33dee57712d65d2bbda17e9a0dd0 100644 GIT binary patch delta 1395 zcmZuxU2F_d6h8Ov-QC%3hh4kdR;#vYDK<8%sM_!RqEQ#1y33?X2; z6EF(_;T%5s7k}ySAmVZINSuwI0sabh0*GLI$jR4~!}$<-K?TsmtYd!42l&S=fFu0J z4%wdBwpxLwq$1ms9rv$)g{@|vTmiHOp4kI-Q?4qgrlUndoCkTen1?nOXmILIr!xbY z!@HW&)Zdrs#jEE~CQZ9DyL!_!VC=V=Ri)LhE|qmW9`c93T?{S#TIyaDoIE;y{PD@a z=;xVto^-4)d-r>fRqeh~RyqI7@U6~NLo3_TctU zcUQA0u-dlV6LG7!HC~FwaG7Uj=`~dB*W9#5;>3kIkVL_j#jX9V$-!FPN2OBp&;n(6 zsX~%wQ<+po1RDr6L-$He&>Ur;Q>0N0Z)KaVWxZ>a5vF>nMIasE7B1eQqv53Cf!(&i z7ey5UJ;)K}Ikqb!Mzy?%LaBMFQW-@ZxcA9^J&*FGCMn8`z`4|TtcPuN8%l72qvo)V zP+pkMAr&05QQCJsV4j~!Z4N0TNij)VIiY#={~5h2v95^u%!;=sW9wiqGe7FV>{iN@ zq0?HW`9Zm(1Qq#l+v>3@>uh^@oIfIa%}2hyFsjUnU?C54(@b8^T!rP8C~Og9(Hb7> zeS2eb0uvMtl?3eyN?NEH8kKV$P%DXwV2XOB#kgFsrNK>IK9mUY6>mfynGmo7tYwJ) E0G1-KwEzGB delta 1548 zcmZvce`s4(6vxlIc}d<&^V+0Mnx>PctX<<=yL6phGq=^OuAS9(WTt61e^Arrt&OH> zY}2{tALbPV5sSDzbsGwb{^Jzgbm9+07|wwMM?qu=!eD`+sg-ts4bbDLPy_0-45{6M6yhj=UA$=kSokAa=Zv1e$8DF#o*#lL?J|NK)^cb`NeE^A+M6*y4ufX|Mta+)c%yr%50CRPsw;%<~9)1## z3Ub=q0rr4hHrIe_Zei~lehP67?6${`fos8@Dwk1=sP10}S!*~8yUperOqhiofqWS6 zwG$q)Spzr1z6bInUT4R*g6qLPn|t<8<#3#d;qD1-zdI{`0z(;DXE)4YZ?Fh9H+*!usqtLsLz zy)uShQPAy`b~9QB-G-KCp7&**iEm|*yJc^U{3O+pY6Z{EpYEa`?qU|y3 z`?0t*VENO{*$7_Pm()~p3q_)hvf-w7fpgs=6dY1fnHN3~<>}*_)Cg`7-y}u{gyN!y z72^&{aDk9e+|=PRMw~?Pf>uLbp$Lj_wqBX6x6`q**A)^-2oH|1d0e|2DeKMGGzV!s zwnsMVtFy-BJBNA4{WKv{pZugkg92x`k`X&3j1CuRwf8^BrOfyLQwy_t6-6Pxz-J$k z10L-39=;rW!ulfJ*%{#C8nv4jHLY5AtM=og4w^q$bM!VEZ6x%JjY34uCRfZw1PWj mt9xRolZ#5rUFtgY>zB7R@QpMi$SGpgzl)X1@tA=5P4C}ryvzIm diff --git a/AbsorbentSoil/obj/Release/net6.0/ref/AbsorbentSoil.dll b/AbsorbentSoil/obj/Release/net6.0/ref/AbsorbentSoil.dll index bf946c7995f00d394e42c1992fb8be6db5093399..d376aebc2b2efbd0b00c20dcbd0eaab4a633142b 100644 GIT binary patch delta 1611 zcmZWqYiL|W7(H|6?p^cR+|4#=(g#@A7)#1_cW=7Mr6HtEB!;9-n~;_!f0ErUH8u8; z25B2~w<*4Ae;6;6T118ZNfjz(Q~egu{djlv*G2ol%`3lLycBrm_gv6i5e9laVTF9N6@cKlX77;o zc;-nH2tNCv9suxhshT0`pU?wfL1@RDO;<#H5JrKu8ph0W0;nEaj0D_?#0@W zE@54%<>u7_=2>c9Wq<{qthQn>KTxivUc<8NVXZhj%Q#Mf69)i+e? zUn~U;Rp3>o8n{a?^|>{1g{QnQkvhrwoOLWg$P`?b z+VDDJDRye^5^d}wZb3KkVI0ds()ka=k8b=j5yv|Q-1DXp{=abf`zY@SI5mRWiPZp zxbgYs)t4Rdccmu>PLGY}&X-B)?-);yPV5`^E(9{(zky}%r^-ip?fLES|L!}l)o$~i zv$y+9{t5%$4g0Eyc@4pr;*LNh7KuipjWMUWDH%_@aW|fDTAJLX>m=gIR6Od$)6LFk zD&|I;-8~5>_hB$$c&j11qMa9Up$&Nzo3@JH+|Es(2`^C77HHj2V5{_oYTgoWdJk&C z;(TuV=8uG&#%}Ms+QxxK#Q3F}(S#)8NW&$no}k-8*QM{0C+H>lG2*<09AcVd9E{S5 cF&?FIu}6=B=c}77Y0v*BjJN5lekSVw4;|qEi2wiq delta 1518 zcmZ9MUuaxK6vn@~Gkdq2q&K@sU6XDC39D@-HC=6}t(7IsCd5+Ore*w+PU_nw;?Kl4I{1#mY6(2aOsFYeI}8@s#jU?=-k>JKG#$K*?=s7-S?@$m?+LD`intTJ@vj$EvJaD=N>bJ4ID(l_&koFeFQu6Er0vT;%I=KTF+JN%XXv z1;0@j+Hy&Eq3=1c9=;t@>HC6kCWippPT4fiVWJ#UPI z8`l2X+9%7lfbnGguEcqU9emD!#4g$jv%KSe)Uh4`le5kc%n3$F7xiQX9XhjNL~VBpOKr^#zPY8=VeIyN zb5yhy4s7{K=yp-3y=c-~U0*R)9X$|zM?9_nipIr5g~kUz6*2)=|4`SW2kJl22`3$D O_aDJ@(!R#|MDRagmg?33 diff --git a/AbsorbentSoil/obj/Release/net6.0/refint/AbsorbentSoil.dll b/AbsorbentSoil/obj/Release/net6.0/refint/AbsorbentSoil.dll index bf946c7995f00d394e42c1992fb8be6db5093399..d376aebc2b2efbd0b00c20dcbd0eaab4a633142b 100644 GIT binary patch delta 1611 zcmZWqYiL|W7(H|6?p^cR+|4#=(g#@A7)#1_cW=7Mr6HtEB!;9-n~;_!f0ErUH8u8; z25B2~w<*4Ae;6;6T118ZNfjz(Q~egu{djlv*G2ol%`3lLycBrm_gv6i5e9laVTF9N6@cKlX77;o zc;-nH2tNCv9suxhshT0`pU?wfL1@RDO;<#H5JrKu8ph0W0;nEaj0D_?#0@W zE@54%<>u7_=2>c9Wq<{qthQn>KTxivUc<8NVXZhj%Q#Mf69)i+e? zUn~U;Rp3>o8n{a?^|>{1g{QnQkvhrwoOLWg$P`?b z+VDDJDRye^5^d}wZb3KkVI0ds()ka=k8b=j5yv|Q-1DXp{=abf`zY@SI5mRWiPZp zxbgYs)t4Rdccmu>PLGY}&X-B)?-);yPV5`^E(9{(zky}%r^-ip?fLES|L!}l)o$~i zv$y+9{t5%$4g0Eyc@4pr;*LNh7KuipjWMUWDH%_@aW|fDTAJLX>m=gIR6Od$)6LFk zD&|I;-8~5>_hB$$c&j11qMa9Up$&Nzo3@JH+|Es(2`^C77HHj2V5{_oYTgoWdJk&C z;(TuV=8uG&#%}Ms+QxxK#Q3F}(S#)8NW&$no}k-8*QM{0C+H>lG2*<09AcVd9E{S5 cF&?FIu}6=B=c}77Y0v*BjJN5lekSVw4;|qEi2wiq delta 1518 zcmZ9MUuaxK6vn@~Gkdq2q&K@sU6XDC39D@-HC=6}t(7IsCd5+Ore*w+PU_nw;?Kl4I{1#mY6(2aOsFYeI}8@s#jU?=-k>JKG#$K*?=s7-S?@$m?+LD`intTJ@vj$EvJaD=N>bJ4ID(l_&koFeFQu6Er0vT;%I=KTF+JN%XXv z1;0@j+Hy&Eq3=1c9=;t@>HC6kCWippPT4fiVWJ#UPI z8`l2X+9%7lfbnGguEcqU9emD!#4g$jv%KSe)Uh4`le5kc%n3$F7xiQX9XhjNL~VBpOKr^#zPY8=VeIyN zb5yhy4s7{K=yp-3y=c-~U0*R)9X$|zM?9_nipIr5g~kUz6*2)=|4`SW2kJl22`3$D O_aDJ@(!R#|MDRagmg?33