From d4843adcab6296f3cd2bf629b55628e130af4818 Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Tue, 16 Apr 2019 21:51:54 +0100 Subject: [PATCH 01/22] Update README.md --- README.md | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 126 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a2edc9f..99837f6 100644 --- a/README.md +++ b/README.md @@ -17,12 +17,22 @@ C# is meant to make things easier. So lets try to wrap it up in a way that makes ## What -So say you want to print a list of your friends? +### Get your own information ```csharp -foreach ( var friend in client.Friends.All ) +SteamClient.SteamId // Your SteamId +SteamClient.Name // Your Name +``` + +### View your friends list + +```csharp +foreach ( var friend in SteamFriends.GetFriends() ) { - Console.WriteLine( "{0}: {1}", friend.Id, friend.Name ); + Console.WriteLine( "{friend.Id}: {friend.Name}" ); + Console.WriteLine( "{friend.IsOnline} / {friend.SteamLevel}" ); + + friend.SendMessage( "Hello Friend" ); } ``` @@ -31,11 +41,122 @@ But what if you want to get a list of friends playing the same game that we're p ```csharp foreach ( var friend in client.Friends.All.Where( x => x.IsPlayingThisGame ) ) { - Console.WriteLine( "{0}: {1}", friend.Id, friend.Name ); + // } ``` -You can view examples of everything in the Facepunch.Steamworks.Test project. +### App Info + +```csharp +Console.WriteLine( SteamApps.GameLanguage ); // Print the current game language +var installDir = SteamApps.AppInstallDir( 4000 ); // Get the path to the Garry's Mod install folder + +var fileinfo = await SteamApps.GetFileDetailsAsync( "hl2.exe" ); // async get file details +DoSomething( fileinfo.SizeInBytes, fileinfo.Sha1 ); +``` + +### Get Avatars + +```csharp +var image = await SteamFriends.GetLargeAvatarAsync( steamid ); +if ( !image.HasValue ) return DefaultImage; + +return MakeTextureFromRGBA( image.Data, image.Width, image.Height ); +``` + +### Get a list of servers + +```csharp +using ( var list = new ServerList.Internet() ) +{ + list.AddFilter( "map", "de_dust" ); + await list.RunQueryAsync(); + + foreach ( var server in list.Responsive ) + { + Console.WriteLine( $"{server.Address} {server.Name}" ); + } +} +``` + +### Achievements + +List them + +```csharp +foreach ( var a in SteamUserStats.Achievements ) +{ + Console.WriteLine( $"{a.Name} ({a.State}})" ); +} +``` + +Unlock them + +```csharp +var ach = new Achievement( "GM_PLAYED_WITH_GARRY" ); +ach.Trigger(); +``` + +### Voice + +```csharp + +SteamUser.VoiceRecord = KeyDown( "V" ); + +if ( SteamUser.HasVoiceData ) +{ + var bytesrwritten = SteamUser.ReadVoiceData( stream ); + // Send Stream Data To Server or Something +} + +``` + + +### Auth + +```csharp + +// Client sends ticket data to server somehow +var ticket = SteamUser.GetAuthSessionTicket(); + + +// server listens to event +SteamServer.OnValidateAuthTicketResponse += ( steamid, ownerid, rsponse ) => +{ + if ( rsponse == AuthResponse.OK ) + TellUserTheyCanBeOnServer( steamid ); + else + KickUser( steamid ); +}; + +// server gets ticket data from client, calls this function.. which either returns +// false straight away, or will issue a TicketResponse. +if ( !SteamServer.BeginAuthSession( ticketData, clientSteamId ) ) +{ + KickUser( clientSteamId ); +} + +// +// Client is leaving, cancels their ticket OnValidateAuth is called on the server again +// this time with AuthResponse.AuthTicketCanceled +// +ticket.Cancel(); + +``` + +### Utils + +```csharp +SteamUtils.SecondsSinceAppActive; +SteamUtils.SecondsSinceComputerActive; +SteamUtils.IpCountry; +SteamUtils.UsingBatteryPower; +SteamUtils.CurrentBatteryPower; +SteamUtils.AppId; +SteamUtils.IsOverlayEnabled; +SteamUtils.IsSteamRunningInVR; +SteamUtils.IsSteamInBigPictureMode; +``` # Usage From bc658d0a31b06ae257510be76e0989f70cb98d17 Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Tue, 16 Apr 2019 21:56:29 +0100 Subject: [PATCH 02/22] Update README.md --- README.md | 84 +++++++++++++++++++------------------------------------ 1 file changed, 29 insertions(+), 55 deletions(-) diff --git a/README.md b/README.md index 99837f6..5257565 100644 --- a/README.md +++ b/README.md @@ -162,79 +162,53 @@ SteamUtils.IsSteamInBigPictureMode; ## Client -Compile the Facepunch.Steamworks project and add the library to your Unity project. To create a client you can do this. +To initialize a client you can do this. ```csharp -var client = new Facepunch.Steamworks.Client( 252490 ); +using Steamworks; + +// ... + +try +{ + SteamClient.Init( 4000 ); +} +catch ( System.Exception e ) +{ + // Couldn't init for some reason (steam is closed etc) +} ``` -Replace 252490 with the appid of your game. This should be a singleton - you should only create one client, right at the start of your game. +Replace 4000 with the appid of your game. You shouldn't call any Steam functions before you initialize. -The client is disposable, so when you're closing your game should probably call.. +When you're done, when you're closing your game, just shutdown. ```csharp -client.Dispose(); +SteamClient.Shutdown(); ``` -Or use it in a using block if you can. - - ## Server To create a server do this. ```csharp -ServerInit options = new ServerInit("GameDirectoryName", "GameDescription"); -``` - -```csharp -var server = new Facepunch.Steamworks.Server(252490, options); -``` - -This will register a secure server for game 252490, any ip, port 28015. Again, more usage in the Facepunch.Steamworks.Test project. - -## Lobby - -To create a Lobby do this. -```csharp -client.Lobby.Create(Steamworks.Lobby.Type.Public, 10); -``` - -Created lobbies are auto-joined, but if you want to find a friend's lobby, you'd call -```csharp -client.LobbyList.Refresh(); -//wait for the callback -client.LobbyList.OnLobbiesUpdated = () => +var serverInit = new SteamServerInit( "gmod", "Garry Mode" ) { - if (client.LobbyList.Finished) - { - foreach (LobbyList.Lobby lobby in client.LobbyList.Lobbies) - { - Console.WriteLine($"Found Lobby: {lobby.Name}"); - } - } + GamePort = 28015, + Secure = true, + QueryPort = 28016 }; -//join a lobby you found -client.Lobby.Join(LobbyList.Lobbies[0]); + +try +{ + Steamworks.SteamServer.Init( 4000, serverInit ); +} +catch ( System.Exception ) +{ + // Couldn't init for some reason (dll errors, blocked ports) +} ``` -Your can find more examples of Lobby functionality in the Lobby.cs file in the test project. Sending chat messages, assinging lobby data and member data, etc. - - -# Unity - -Yeah this works under Unity. That's half the point of it. - -There's another repo with an example project with it working in Unity. You can find it [here](https://github.com/Facepunch/Facepunch.Steamworks.Unity/blob/master/Assets/Scripts/SteamTest.cs). - -The TLDR is before you create the Client or the Server, call this to let Facepunch.Steamworks know which platform we're on - because it can't tell the difference between osx and linux by itself. - -```csharp -Facepunch.Steamworks.Config.ForUnity( Application.platform.ToString() ); -``` - -You'll also want to put steam_api64.dll and steam_appid.txt (on windows 64) in your project root next to Assets, and use an editor script like [this](https://github.com/Facepunch/Facepunch.Steamworks.Unity/blob/master/Assets/Scripts/Editor/CopySteamLibraries.cs) to copy them into standalone builds. - # Help Wanna help? Go for it, pull requests, bug reports, yes, do it. From d2a3e0b1da246d3d3e47f7619734bef5e8fea7a6 Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Wed, 17 Apr 2019 08:26:31 +0100 Subject: [PATCH 03/22] Stats callbacks --- .../Facepunch.Steamworks.Test.csproj | 12 ++-- Facepunch.Steamworks.Test/UserStatsTest.cs | 21 ++++++ ....TestPlatform.TestFramework.Extensions.dll | Bin 39984 -> 40192 bytes ...isualStudio.TestPlatform.TestFramework.dll | Bin 73456 -> 73264 bytes Facepunch.Steamworks.Test/packages.config | 4 +- Facepunch.Steamworks/SteamClient.cs | 7 +- Facepunch.Steamworks/SteamUserStats.cs | 67 ++++++++++++++++++ 7 files changed, 100 insertions(+), 11 deletions(-) diff --git a/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj b/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj index 6507d08..6302394 100644 --- a/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj +++ b/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj @@ -1,6 +1,6 @@  - + Debug AnyCPU @@ -76,10 +76,10 @@ - ..\packages\MSTest.TestFramework.1.4.0\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll + ..\packages\MSTest.TestFramework.2.0.0-beta4\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll - ..\packages\MSTest.TestFramework.1.4.0\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll + ..\packages\MSTest.TestFramework.2.0.0-beta4\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll ..\packages\Newtonsoft.Json.9.0.2-beta1\lib\net45\Newtonsoft.Json.dll @@ -114,10 +114,10 @@ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - + + - + TAGRdYFv9FYtFjNt)l7^JZm z7gK9?$zBAs28EiQd;#Rda65EDjjwYk|Bs+kr>pg|kh#Sdir(649$!|vsc+3B^L~+e z1yqb~Q-~=+#%#tA9AYaJ*Ei;6biur|g+J!?@%&Cjo-!bMh;2#hC0NC)5_{2nvIZ`x_QmZjWVx2thRQ#E!rd6+qbY| zn;ts?;y(VFg7mPSx!L!>>+Y4N%iLw@cbvM69mAWXF2mBk&%+Hz_8U93_N+noc?q4qj@{r&jkNLhgn~1lm_#{kbPxr}m-1HxNFrsx@Fap6CYsR%Ir3Z#;z?^jp<5 zK-zi58}wV1f!!5&P=S;~O`JgQkaDjV?+eQ6QRtXrOimg!zmce5yEmcF(MGUx5L0#g z5yzWQNH^qs9<$zhF1r=2T0CbhZ+sbut8aG6eM90_X{>-Ly>Gt;f(Js;^>@lnuO^$P z>P`F>zyKDGdDnyoQo$BqC6uC2LA*_3F_||4dx^p1J%+}mz3Gy1-eMVww~)#~xc8(a zC8keH8wNMqxXR~_QPuM2BJ}Z6h-HrqiZcezcZDO!r&tULz)@93JB6d>CKspP&vO={ z(#}4-fteJ$v3xZ7(cF61L{tSE7oBazq=J>QPMyewb_LsU$_%8TA*Fh-*k&=VR`slP zsr;aIhJfwF?_?N!Z;U2ihkoQ4Bi0(8&5ltV7-tkoY(&qu^y)&e zBYvUkmugzn28|BoQ}C6ZpIveY&=|;bt)VYVa;@hN&q!inql^2p#AkTT>oS&$S6}Vo zgX0GdPwUrfl$)<6N_v~aYEFZ#>r!0&SlU~#S(oBY@LC_Fo^6xW;(kafuL|rm6ZAQM zaOBB1`$HpJZ}t~?BRx+YnZG$^2?}ra7kkUQzJ|TwuCFCtJD#Fu z@u-!i>H{=Pp#O(RV;ueAgn|IQzEdP-?<&Anji2}w`VRav+)!=kpeTwth^`HHTMEoTweW&4%}tUIVFK><1|!RGpy2iS=g(b=)| z=w|0fHjfR2Bb!r+VzKQ_^Y1QB(M4KRt{s|Dw|Ts`or1br7A+p{pa|1gF4>T~*Xjs6 zdKoKqDuLwwF@sVwPkgZ4vt5+IgUe~7_{`~p)vGh`LY}?WL;!0nX4i$@@3rm*Hn|E6 z?(Tzb-+rXiUHr*$1+@<0ck)o>W9`5uCHE_}!-QZ629v{ZIWh6$$0(9yp1LP=J@Fo~ zctYbRtNCT#Rd&n^5l6bxwRBh-!(G{=h{I$JQERKSe7IT8cRgS1&+lC2fUUJa#ACs_ zDza%I(sV{`NIdCnL{1g4l7}vL&ucJu(WKjNF87kdNk>H{@LT2{nYu7%_I-5fu1nox zQuo-@JuY>RPu<6+E{ndUM@nn%iK%;%T#cuV)DOI7#VggYT025r_`~trwaLy0A;Qee zj91E4KhWWmhjmd#8}m*A$x7SO&xcH=s60yKu|;`Ee!D|+tJ=oPod=xrCFOm3Xd>3+ zWaui_Rz}Gwc+mcc@6jk<$cEa^(|Uot9R&4YsCOr^4pQhhW^C<^v(&+c?epHnZaY1j zUyxgMtgG)aDF(R-s=8|GRC4kXM6xBjrE?lHPzz~lsdYL(+Z4)D8{bV%tebz+0?NuO z7p{E0LXXNm^T`H%qoKTiUJ9Y{-g1I?UmT4RL95IC_@$}>-0S6D#}h~#^oLB|{EiMK zN`#|C@n;o7e9+&uPzRH{lsyZzK2sJ=AoCh;b{W%2%A3g>e@qD8>=O8v%xYA&Tb0na zUjs2xPxe}<4~CP>Na+oJbg1X?Q5}x&(;L-r5|KW|yqO08_xv2dJOGLrz&rp-8NfUM zu&d*enCCjLbq7>V=7Fa5JQUvx#2XoiKPmdD{?F;#pA41qiQa_VdN>v6)0wRfgAYTDo__hJ-%3JKymjuMOba`j4iEzFZcqb7qJF?< z%mfcci^dlMel=MRj~6ne5OX%T*Ip!vULUt;2megFJDoVc`B|0?p3l-0Q@^z6p?reR zs;g7F-rD-Cc(q1WHtwX`xh)sL5ZBttZ3V+ub>^-Hc^9ofY2J48g-o9Kn%r9t zou}O-LukvqweNR+$$hoZOKv~w+_)AxTRN{3$;;h`$q;QSZZ1DQ6M4e!rEiCDen|_% z{Z#zc*O(+Y!;8N~a@T{(bm(<-+Q|A*awieO<$KzbV_pH#Yu$C6;pyHuJq+E+=YmCl_n*7ubNvcz4A(?GxW79T!xFr zm&EteCF|#g+PxE}br(Z0c{aYvgEVG2oslG zes*?Q!Y`As7X|5a)FUIr&|d+dWyg32$@lfg4E=rJQxDG^7(dj&crqzRw<#ok0(CR> z)0uG|=nNi(#7`s+>uH$d7E12-v`yU>c+`D;QjOb|`TV=0E5O^1d*P#bir&s~AZsL=h&5@mYP z2r6omj{qt(uchzqMwyvZD`0TU^r+pXmB~j9#jfzjs?;aZzIH(~xes5Iyck037q)&P zDjA*Zg^4|VBnD+{0@^Kyo$xLRa@$f2Yg5B$gu5+KDVyT@ei`a*f~n@&NV7YhTLrnu3mI~Eb9JP-1U*< z=_J(w==MyD)zLj*bkCrvlYeUS#=SH8N0rm=+q&y+t-TnjcHF($j=Pf!AX$B&hYl%! zvdC5!X6_*-fQPBGqTR%GOqxHSDS~;^;?{>GT1>u9pVd%ikWv7zBnnNS-QM>dt(Z;GIIBw4;K2LXr>CVzJkb}2%{diHP{K>#8| z$v<2K)MK#!vak@pJdGd#5emsXJjT3!3J3TIRtFI-4N)_eS+)(zxmk$lfZO1?p}CQm1sKjl$>Y0^vQ0lipI zTcqk|`N{cw4Vkf=Mz8yFS}|)tWr6WGg-R=q-xc2IPd|<))S2<)QJ-XjXr7sg^u)j8K04Tvb6firF<6bv#8HY_$=Bd z0|}C^;2TYnb4l&)!gHH2_uu5@uG;9LNuMs9gaaGWl`DA~^;TN_BI2>LdO9BioHGsd zG5`nq^P}4A%Uu z&7W4YJBT`p*iL1CoPT2$`PSUcQHK4cx=4#t{i*%4Qn{5vT3+rz{BId|h&f>g8F*}) zUzA$Hj(<0z%U?1`*y&2^3W`wj%NSpak}L5?wyBm1SGE zuL5oIBG6!;${XDkvHEubGk))@K<(6>g>cQ+C`Q5cVffJ(lQzw#FHEj)e>HkKdOx+J zr;pDT-R$Dq^f4JEV=){qSS*Leu~{jz#f^!ZP}mzxUM*6O<_jZKOV||!gWKIQ_8<#S zy~xUBF_ty!YAVSb!(=mQknCNnqB(ZKrqzOREXgYgbv%iriGQ(rT?Z_y*X}w{6Nyz` z^9G_uRtG)2MMUgW9@5iMxvDMSz0fYMD^qX5mFOr^^DM9mw76Ke)*WUm4u)B?_L@E@YeCv< z`r!75v)P(eRlVOT+mR&X6{@-b+pT9_&8%DYjame=)&awp|JQTnv{`!CJ*4L`tgZ4 z=&5M+Ek|32nAvdjMfBYhefN6PctJUS3gBmQ)dWFIsJO!s+O z+W=dN((3m*5Lf-Caz>WgZ;EHupBJRI(-0J77kl?@KAcT59(LNqD91mij6wVYe%(~V zYMRcDqs@y?NT(!#L05dQE57Fx#rJ9cIg5-`zYFv8+nBvMZTaopyy0UI7fyZ6kTaL)#BGj z$dVav4_Vf0&9D4(v~i~<`hoz#_%6>WA|pq84V9!z6%w~sZ4qcb=Opcxm(cVWPfMDN zGA1pzd^`JS?2#ld{5&O^r@rPV_km@U!;%|F+L{kTe2wpRZYI4e*PggeA=K*NX*+Wqgt};XR=KcvJ6_Z?NP!t=Fs*=NHQ`1#S--v2!4Rgp7w8G zmng3B2KbzL-EuhYch1}^@6-g?BJSumg~agCwfH<^b5lLMQ*-+!nI7Igxyx>JY?0nE zV=&}A8(VimcfIJh@|ufl2=ITX2{Gf#w-b-Exoq#~I|V!2JGxD6@&nDYR2!lgp8n8> z-@U11Phf``)|q)W*7lRUZ@W*3=~X1IC@otW?lAlgkJ-AkT_#-8Q1`BrJYpmoVd6s{ z=4zrCaf%6_Bv&|^Q@;Q@(JIjPCot7G-cn5;WK! z73v50g^5!rxNU*)pRB#$1BBv7CoHg?D+ar2PmSv5p%HMkI+iY@4z=!Q;&jQPjKdY zhBk|K$tFn1{1P7o@zcPdeFNJ*gv-x{V3QsAg+|Z9-d%egBD#BP2xDPO-M-&~`gZMg zfP(rIgz{Tp8+r?xziY3<6f|E!EOLQuW!GM@f+`AP z`+?T1H40?R2s%|keU_@;S4iH}?nmk_NCgBaB#0Bk_|qzJPnN+9iXSg53$vgZWSyp< z1qAhlgJ-xy3p2Yi9x%Gjz&e|`T!eN2Cu_KfF`w6%|0NR)XS-U4n!jZ>?6ReAR{9f( z9mVj;qDx~aax2sC+v}{Y#;8VR_DdGgJd=MA`?f3ml_sxiXd##9JIOOto{uO`+6Iiy z7E-hCWY(E?sH5G?G^y++)DxHPA<}aQ%pyUPO<2>jXhKw+a;N)=q(4HE4^59|G$j#L z7Ui9kwhkjGaSYm;L{5r$Wx!YimUn;6g~8Ntt@@nGyMW#_AQ=^$=~3fX2Yk*0j}h2? zCyJdLYJHx-Z8{MgDcuNX>WvPz?kMGCQmb{hxroxX0+FCW)2DjNUU&)7mo0sEsA{SBr{#Jxr9_zst zxux3P{??ZZ(C2TFn|zqkGd(o-p;6LJRkBnyLVBG^FT{Pm_(VVc6NN&WlT6YeE8TkH z=Z+v8{yGas8p+|{6fqk6qX|Yo!i43d9Pc^$b?O$+Rg;FO7H`87>EPBO&l>>xecRWZ zJu_cnt#T3RdAJ^jR{sk&oGpN1-(okH(4l zfRvX?_0!_(aFQ4CW5<`ZLs36X-=BFgz|i#ZILix@mnh=(ZCITv`>gPlw=Owq`8(dYxHe38xO4Pe^MSs-%R+b!# zZKA{YzDm?uAoe9ozI5(rj>johBORbK9Mk(E@5`0%$gMb#PxaNisf!YI#1*%ZbBu;^ zGcF^MlD&_o_qQ}9DhEsS^BBea0}3$=5Z+MNOpQ?}jeE25n} zz&0NX_7&vVVxjoW*BZEb&OP7Qm(`Kg0qY04avDE{8bHz(cu0``hTp_0mJ}=7m1xz? zT1jtEOX&OpuI4arLJjXHH>#}Cj5OtOOI$r0__2ztD%^neNHLNdFtGF&P;bK+wkiG1 zm#d?C^W5p9auiThkAJx#{{{YQ#YNTO>hdbLznf#HFj~G$4PLW^y@hzHviciGR;`=J z3Jr+ZW1c9-FH`O>=clLk3F1u*&e3V@9|wo-ZbsC{T&44Z2~9SsJ_D+%9; zWCVUPJsF=B7{7`bb(l=xxj`KymVmp40<%iCl&&140=~Rv6 zyfZE}uM##5fi$LL8@0i+-W*yy}>n!F0FpvSv17NQV zU>*R28NfUMhBAP80APs4AvF(x#Tmdn0ERPwdC;6;YouN_=!jh;>gH_5B}zzL&TPkJ zKxxPLyD}R$p*XG`1@|WOJ9j%;%>T=FT)KOn){cUE6Z)OI9p}n(&+SNEEeDk~k$C`& zWB~I#F{q}(7hJQId8WMhNRho)ik5c(h0sYi zr3oR~#}Lz4ug0$*pGIVF(d4nh>BTwitn$071fYP5zq zG3QUib33T_9O1GRY07hmizgg&^ z?IW^fbTph)b$R~ud$PRaQz^EUcc`@bJuCuq)3xSU4GGo|9KEY%$up1G>u6?C_v(I7+dV^r~+&Qlin5QmkW`zcVf=Its+)Lpw> zk=jLoqnt%dyTbNN%)ilJ(oVQrgQPt!J{rnPt2rWr^y9PQXQU$^m_@qlbDfw@1?1nV z@Hu*g<=z-`yQJoVQ(4Ynb=j%-W_K{=253kDtS@oLGn~{2=Cw67@TG9*5_lh*|0tT=ys% ziP?BgCl#9`U}kcCw#M%Vd2898<-Fw43+)G1RJ31T|iBJZKGgj=D&uaez)4TfFS#Z-}D;eTK<^wn~yw#E&C7XJ`Av4aX-rKe7;J zXXi)I62y1060AZnCDV&;sgMVvS$bHllpKV9w(c4Tz8N@97sVYb_eOhffRI7caT0D zNI@s3K|1}O)Q1D{%vUVkh2#yu2M@98X9y*;Y~eGeuy zbEgh0%3G`s8q&4|KgG`45Uxs`ZA+4m?tbha?V>*$Xuu-N{K9A8x1Sbe{)uiyKY{UuPLi z!+H;hIZRzrIOYDo!l@A;oO1vF;e^l0Ei^hc;Od9EA(y<(%8rtUt|VlI=Zn@UHGbu^ zKiEE}+R5pDP$!g24s_=m+Pg@e#eID0Km)9PkaLrFINV|KPD7nf&gxX`BQq+N^jX~w zkGZ7=h-(E6-ja_F{0?~zuLT`VRTglZx!aALpk4VGMbH0*VyE#kTcbd9Znt5 z8rpQH_#_o(LcbYr<=WHncr1k48aw0BlS1uH=yx`cx6bi+VeU%k*kW{SB3k1KyZ1Op z28X~aJ8vnpiJAp=lEsV$WAcR7o6xUg^3)MD{x$=#p>G}l=Vbu%ToD7~rAN%uo9O-5nr*$h~t@rRVdA=wE z{APjQEAaaSzChq~L@&*D`x>5h@Evc*m*UpivKQmuZ=Tp*F(-sINZt=7%$9xt2T|{B zIOWLRSRKpfBM$1#thr>#s0`%>XX6kFLGnR|<3olcpL`hCP&ieS`?J;hhvjs&4w@IY z$?zwis$v9_7s|;`J`JaOukW5c(bDd3VVmzI`*I-CvFzeb7!Z?{>^VBE%XXfOJ7hE- zH80J}-+BkhF&DC+c@3EwUS~ndn^4XnZEjglDCguDor>Jvo&8p2&(UOuj0N*Jzm&*R zSEfp~Ogx=kf_Z3K=eaoZT#|V%%{-T7p35`O6`6-l?vf{&=c>%}jLg%_Jg9fL$P9~` zdg{|vcjBPUqXQR{1TC|^VFxhU6?n_tHwiAv5|{_T#Tmdn04~V@=3!;LTfOR9Z=y*+ zqr$w`?r@U=xd0K9DCKJ*MjlT$(Ae2&D^#|D@80#Cyh^c%ePtF~o;}8XMjG2vNo*z$ zyD7^HELr%ail>S&4*{2D0P_H732-YhnF8R3QnXb*c&d~1D%BR!;?zH<$JT&+&4P=dll!fNlF4d(< z0e5JKP~lrti)s?{PzyT$I}&%X>eKC4y~Qp&-wc(+-yo+{iZQiSHEUctXOkaSy+&Tx z=E*fbJp!&_aJ5j4DM_f|*6h+~xG4FAK)=Zr_VQ>n{6!g;!)H_;CL97mr zIqB#5vtZaI{e2slAFbqI;vS7wm@>s*t|?YX~#V|p%}!RlB)(W4}j-p z0P_IYmI2HI;CUIqJOHlE0OkSk909I&uJ6WFA6W>@7V6mwCD!w^Waa_zf(&3D058k{ z<^gbB1~3nR7i9qR0C;f*FwY5|yOpB-_{6gmbQE3bnRp<_zIQn)op8uZ!MGGFczlp( zjYZ6Dy37+_M8#PW5GW+Ym+506NnyWoH371X^+kq)t{mgNPebc4&+lm0sO&ExqE)+j z09>B|%md)18NfUMZpZ-U0dQjmFb{y6GJtsiyetEl2f)iSfO!DCA_JHQz$-I=d6?Ci@SNCy*o7-|>pE1~~|)lYf4-CWY8 z+LGU8UDKa@9Z6}5PZ6+%@x5g7^+LYfU0PyZ*4Y0GV_*7iob!lkY15Y0JS1T9E57UV zbOK}{cN0>=ysU%IhdI6n$VzNUp*cbH?-M;;44xZye?7y6IhbjlHdeTg)MjdTxVx4w z{p1w8i|L}IiQR`wJkTBP63?qf^}U-L9-mIHj(l%Iwc*r5k#~mIFmc`s{Zxa^r|354 zmRLOu$HQG5*e)? zsA3mmA8$f+A0?k7K@T=$RHK2jkKh&DgA^`G@_AycnjT>NkMCv}_|5uhDL=;Wd!t&^ zPnJ=D$v3Gn@AM|N<4WuJ3nXm)5hl5LEGe4X`DuL-*rX!3Xb4;<-k|6U&;!W#1+4;P zObX)QNty4yV65EiJKgDmV%XMFPysGwx%uKw(14{iIr2`*4_Wjh?#c9p@iNt+Hz6X| z+(4M~CUr6xS~V3WMLdnG(ReK3arfw_U#10KcV}$>*od0J`rK96Pp;#XgZjd#$s}@B zDjt?e?Q+yyPZ;+x?xUdb+eljO3%3q{r%~p*PoC$Fkkj&xz33R?X@{gic0qm6uj^9# zgz7U{OKpb9^9Tr&evySy0|oeDYcZe6Wfraw%|7uG@wxPwF!w^vSC*^II|fe!Q_!a1 zLNEd2$<2`wQkMPX?@-d{@taSC;utXyYPJbnQMhRQ)M(;ZqAwb+M_br4dMMf^hl!9v zVDj>sj3*ugpttB31_t7zp%K&#`^jI)fLmN?Ne?C0MPrY3 z`3{dC;mb0Mv%=DR0A#7fj{RIZ7ixTGS48T~usWKTjE_fKUI5MZMtpKpO0_nCwVp~o zNL~j-$`(G)M4_m0gpuyj4vqJFfgf#o3CR_9Vp^=9&RMMHQ5)I=TGe*Lek8L;ysrQ^YXHk97~AeVu7 ze|_gUDU3GSI z1DfUdb`8sfK&rbjn0w88at9sACu8?!`d6dJ^I9Jv+N8c5tSa98#iUuGda+tDsc=x= z=*HRf$5hSjL0OOd_~0TH>Ifbwj~|rA(_XI=udz47hG) zGUcWTBU>{u={_`=z#xUSMOn?y=Sn94ZjV4v&rViJwM^q3e)CCZWCOM%hvqeLSI=Iq zlDj;$zax3!Gnfm^m-tCLxnsQ1ZNZFXD^y%uwW(y3Uu5#39^t-AGm?~p{ z;^uIS`l`c@z$?u|cE^c`%KZVJfn`2RK$%RXn+y^WiZ-EBkN=$zviT>S-R*Q@>*-nO^>>6q8KBjX@Ty^gHQ zL9k{Y`8LA2JIGdeSORkeA#{XXA* z|Eyp4bb#SS6p`cD9{s|g9t5S@MSYkr=?jvw8ljYWO11U*I`^?pU<#`jom;9M;n&yr z$q5Fdw6@CjyEK=6S`1^X6kp(RJ&EXx7GcRSp|T29hGd zXLZNO6QiLRtTk0s(hinihP+ndsk+gqrHIj|Ce-LVj`lh`bsxZ8%=Z}otB>M`>&WgfZcNe-Ca{c8RN;4H&tuG807URc}ANQY&5K^vsm9hnew!T&K zvLEbWETU7jiw>V=(nx2pb)PkVXI=hoAzPQ%yxW3Qau<1MoP}t~S$i5N4A)8zx4j3L z6tv#BN`nGhuY3EVwYw-Xg!e9-AFmP33o7$X)d-CUzxg5%yCLn)<0YSPBQS6G)7_cp z!Nk1a344xdCzp1(shCGTaZfQTy@?6$iG*(B9y0bS3!t_yz;ZU^uB^TAAcW9p0VhfVEq z6JaHPl`B>d~MoMG*L{YL1So18RT60<=<5vb^PPW2pP!=IVe||vf$H@`+ z>s-|_4_9>-;yp^RV(RJV0A;HZa7ks&P4pn{@a%_@a_I8mKxz;9^cB)he=)hrNJLC) zZE(DKeO=cEVeu*~;)!El%(5k(r}^$Dr%0*w!g?EhR&U1M4;WMLC%+{ohUS_dV8mFZ zV2J4Qf}^!iu&GLSW!%(JDQW|xxdr1;W3)rq)JU^*^~2myNrxnt_l!@rmC|B4H78^h zSv+N3yFWB0+E8#suGm*BTIL(V=3k)S;JPqZA45l56Q`L>&~T<^Dy3k3emxXLeZ}>* zXw&SjL@pCnB=wE|rj@zKKdWyHuY1V)Mtj+YN#%Q}N& z``7%Ow#*77Zfc}BHtMQiq&&97pQ{IDE3)#Py-~n2h00cN4}qur8EEF{AP&vU{!y6G zJ&vEzJy2?Q-J^>y?(~tup1R0Tb*Q}hU6j)Gk#x6H&&u4cJXq_ja}=#_xEMp_+Lf+} z)077|cpuB!TophAssc#%7}o>RWcxcfnapbOY-`oWb3dFP4Pw)TN;Jmy@DpHn#FS_s z^IBRlRv$ovN5-55j%v(DiOj1=miBVmzOlJ4PdL_{6<#1bpPb5wBZ&(?tS=-SbI%Gd z5*{Y=NiT~tmY(Bq+eSSdZmPBz=qtclTR?L2MC2pS8m>v?SYqsILb}tO*g_gEfyxpz zj?6bFoaiyh>|Dydh-UHJbUc$z>k7}vqr4Daqql_b0cU-Y-+bDvIIfepmaiY()gOje z9qhh_yZ1@W&veqKMiIJZi}r2hV}tdb3*wFqJP^Ymd0X5Y`}xhkW@v!v@upzCId1x~ zZ9ErZHsmpzW826LRHoCNe|2u3+jC2`|B|dgTn7K#=os>w&v;5&{Ge;!nBS_s|7hc| z=GPT$E64XXr#@Rb*yoGI=B%%?a>&x3Q9-`SN2~;Q#VZ;A)7gBeQ^yC=z~#RD+H;8p ze?X(I2GUzt^H%8Ny)%~Ib1q1U%m1r&|DdPtIp)lDzkK1IVn)f)^vTA4EJAY0{|Emh zuIVN&@QOa29U+qmLfBPj-$zoGm4*6cQKE?T;UdR3c=Bep$26_uN7&=_*3Na=)%SK0 zFps9~#g|x}v6Y6cjbvZyxf1l&4vCV(!60i+QL+|a#$6Os=AyXuG1O$er)Vmb$)ljJ z7E86$qGUC(Ri5LY)-JpB$-7z{wPF+V6#Mc{&eNkYDnXB~{&bZQuKl;ZRwbPncI{d; zR2n00YqET7Fb$ue%XPNgD7ov6;@{K0Rm~aM2=jt!5FgFh>!UZZGh6djVlbif1y1>k zjbIKxjBv2#T6K=VI9Hh5iKBtlj|=QgzxrYT>i`6{4;+e@f~)-C^GOjVUx(Zq&`e5S zFIaS14AsmFjRo%y zqB@g%c(^uGu!}r^qx>c_oG=DsVD*!Nz!#>I-AOYhyTjATt}kz^A3ercr0--k;pE+^ zj9j(RHSIaXT!ppQ1MDUe4-heR*xd1A>ZPte0?*kO4W42AXKC<^^e6yx5oD(2sN^T# zhD>z#5lY!fk0fZxcZ~F1{IbTRi^pZ!ihr4bwP@^YWRF2OG!8zi$&>rApVn2E8~RE^ zXRvnH5AG{^?KNDOp$4vKg56rsScuO}OsGGmim+h(jp$)#_BcJL>6`I07P6Fx%SFUj zAYy2occ{wta;I;n#n?|vI&n;<_YqwLC?7!yvE8hP$q%sImi?Q}Lpr7N=fMs^o$^XA-Q zt!K;qU~_;a6rFoKkMIWcxhjYE*uBc#!&7N>c6!F_3g__>tMEBuq!qpZ(Q{W7i~Y7{ zXSlX)nz9z=#-Jx?&%fVmm&;ji>+E9#o7?O4AkiJ6dMQ72Mvxqfx0)Zsr-^^iOldfs zc|<|;s)6;w`qFk>Zf$E4uNRQ?YwBjMX5tX!h`^a4?MtiVN_yDP_(~UQic;lv+Q`zD z$v1K;@`0_3-82Pep-wAG{i3XeXRpwHGrD+BVH)Fs-U_n&%7Ja0RrXhjR#*1d<8@`% zp1Qm2+8SqN?~40xmy}x4Hrr}RM*<~E8rp`N+S10qn}UC@q?hfnq_P3|WXh?(ble=% zHEtHK8h2ldXN;R4&4q6}n^_YjT!&_;_cgN+}N|zu0xr*Jjrs`;t7&(Kz&a>xd9}Ng?TS;M$C*&O>P91 zPmXJcNU70<9B&~KIgU0eD@mkC1KG6H>(Fhzo~o5)jRo%8cmrGS?ZR$g%Y=k&!()S$ zaLM6cW>{9jk>0~)XK1y4>4p__ zd!nuVr%0Cmv(TL@`^!P|q)wY_rAUd;;#?^^UWHb(iY~U#n|gw-lZRq`Nzt(*{T`Bw z)c%}KmAF?vti)=-PFuMXrv3tAD(;*g0H3(?RD_OEz7hq-HU#c4smC2AmAzo7V24RH zZ`bh7y@$AizBFiVyi~`nTJdKK;n~M9dHs-(wF}sp^4X_;=O{iZ>xGBofx9^75E_lY zpYi_{{y#(;>-<7%368;^i0^RvcrAsi&%-6=xLC)=OMI{K@1?A-`*GUWee3IVQ*rv% zgL%oT-CcXKSIt^qGv=Ph6=YPp=gp1!l0w!(1=>U8{2$u>1WwMX%KyhJ&r@C1Ro$JWx;x!Tcaly5 zX&$<&8b}Lt5@bgN2M}ZnDEq!W(3K$2bchSC0Tp*tR20W?*Kt7|9mQQo2OW1IF5ryY zIO-_wncw?!&hu0~)!kWmegFS{y{eyk&pmfP_ug~QJ@;Hc_vw z)DV3$TJ3lk<;&c|%D=Cy5y3eRGGtDUDqYh@FQkU z2bKD|lW2WCz1{Y%T&2g=+`1iQVSefZbS_o|j8n$wjAs-5j08jj4{xI*yoYPIwHjgR zcu%Esc>FRo$M~A+(T!`^5+fPys4VoFU>;(jwQyx2G<0~T!PLUM>CtSuDpXbwm6fmF zC6yJ{ZxVGCjJi1R1~W>iD~v>4yh2L5Eao3t&f9*Sd$DM0n0a{}5b;fVi^=xKo#dN)~q{cuGQmPWQVn&4#;xW1W`M)HOoSq9U8Mwo;^=wsIchsgdlU~2{T=k zQsT>Lx`&Zy=lVJ^abbj5(#%oX1tE5}2+`*dEZG_zuB+q`aeB1AuHLc}VwV#lCgjvi zDIq3Xw%&Y#-z3BxjQ{mJvvW+A3W`Pr$(sl{xaG#La?ckHXl;HIeYTE1^P}jpD_%}a zeOpvy;+3GeH<>?teqI#4I7HxTyIT6jbbwp$3>yuoNo3+?k%vmI-a^E7|>MCCUhFR1c z?itLU!#nGoklPeK%_|6?f@okbxaWkM-G5%by)VPJZ=R-lWwq|Enb5S_g|ylQt9EEi zS+mo7N_2S%zUUZeb@FKbWxJfkYHpWjWrlgP_X&ZUA$16-c0Q}6Hbu2FaY%!&ei9Db zt@l?XrJS{27et|awEIjnV6c(PlummhU7Vn^>gXzIHmgoKDcQys%eQI=6E$%`F#b9S z@N+Ci+Ou;URzX>*!#1;Kqih+g-A&-s76+9Qj7hROma7P2#HN6ptc>M6YA)E1elsN+ z-SHIG!2)A5J9)!4nHCHyBqpy;AwQeF9|z6f%9P?XU&wGR=;s(wqA`@q$ljx(>wzh3buAgcQ zX(9X+7+V)~B(DU({c`p0PpI`ZzRjp!yG6CR=-i?|35bcjG`G@5z6>2xIR4A+36_wJhN;TR+Nc|kZf5*oOd{>=SvAepV z(&e(s@g#7jHAxEHhLGdpq6X+I`x!x4-*?z49899Yx5&&tAJ;uXwHcGMWo z3$gZ;PMNs0R5S@dho30{a5z7$v^V@1AZ}5@`fs(|-l)>1AaM81x#6Bxw7y=@jePoo zN^hml1+*(Fy(Xz-R_ZeeZKdKho4i<2du__yaF*PC>z~ReY111R{e((HYI=x${gwVi z*RxUSH)YShCC#)=qTDx78CZ`s!dzuZWxx*u266V8GhRkN^ewISRhF8utiENH!OF6P z^Iq!1>CuPLx5-tOx}B?`$`BT^hWz$)lKJqF_X(rl6+wn)<-feLeEsbTA2yLqy;NDA zYDNrKmb+%eNM)pNMGK*?h0xbTh?zpmeJiUgD=T9z6P5c`RaW$_imt}VhpR#5ct26q zN-y^JcJx(NTAA0@LpDT7iIa9tDQM^4=TcBU{vz#L<2fduCwPu2nIu+MRvV4fhaHFR zTRpA0h>!X>KAVV1()Juv8)ahZr z;m6onZb=5d0_lm?tS9sB%fPQ7eu)Hc0G>^Ud#||-;C*Qp{3rPT0XV7>O?=ttzb{R5 zu6%mgxpL zS7kngdLP2N-S`QU5>I^kp+rtSUsKeHR_q%(q**0!fN^u#s zjg*|9E2J`v`d~+E!%)iX7tq@oWeql#Y=uk;78F@?m2+k`xlf|D4)<*7Dkx39Lt4$! zDswC?ULDS??kc-^`f(_wkRdT&La` zN9yqfpmjPzSa!-$uC8<_CuPlCgq7w}s2{mE+p}=${b@%#ADy9Pnfo=KU3)$ZA>|IG zZ^Yml1JU73`QTipTuMtPbl6zk8n!cVe-Q)s2s6amZ3@|%Zx8;ff*-YDg+w>gm9wOi zE?#7>=YksT_4-T08-K%`qAj1M@yRdn&qd+B%jZ5f>w&b@Hz=GzrFkT?!`tvWpvhP| z#=mx}W@sJuL^M+lwavB%Zb?N2$dC3onD#+bowji$i7bbhX_S@aZ2 z{O|yfWD4W50eUfE#2%?oXGg68M4aEN@B|d1lL=^xJ^5n7lIaD5vU}dErt$%1JyM)K z>n%mFn940^(UzDblfCx1szB(Q+@7}buSx+ zRiHDP7>O~;Z^}ng`TJ*S;9KdUBbk@deXORa5AhE%WA0acQ(i#p$mJjR?8XVrmIDru3KhJ8yO|uwd#3_Od}{;kWUtxmA3I{(NSM zrI|iBaai88E8X7ketFko?PT{`AIh7`r-$_9P1({lG|?~kHFT#ZjASF{1k&6_eUddn z#&CT_C_4mgP!4g$6Ykizt7Gav)1oJgS$WJ!fC4bCZoEAKADspf%8#j$Rn@CpIg{rH)Ex(_eHp*`tpug zx8s}d!RhP`^{p=v#_jb5<|vaw4=HSv#A5P)`BxZ3ZqOJt7}(rq|~y7tP#bA#(q_1Jk>03)pU{GYzYHT{$kfK zSjv?d-h^O4>B{Fy23o#0oJiZCU(K5}B%nIV#WwVT|2=kcV23U4oUT*CfevT60K5548&E&Fo z(mq5I**j@dVSV-`K5Z0|n|#jCoU5ey>##%Tk!a$WV36S}h3@Ej(yPHV>0%g^;A$V2 z01Qog+b>ZAmwFmcD}WW+-LJ7WnDniSxwk?G&;##K!sopd)G@Sf^|l2Z&QFQIwtnI$ zdb9>9*zKLQ^~q5*Zw=yCcGlKMM?37o&f5C&QJ>Y4GflgxgK}XFrA z6aE0c*hB=SB>oL)PSareor)ynx-^8^5b}JIOhT?zNPhGEK+>DLFnNXO78bMkX&ex6 zjm}c{F59u|5W%&4xm`!pEM1Nl_ztZi< z5mk-O*h1UL?-DH=FS%oA0vN}ODrj_OHrXdS0f^{=eVL4H@-RfEx`6sESA`|LJB zy8>HNr>cPS3wlvm=e@hzi4sUE*)8b0fDhZJ1 zTbZ9v6lT&Y5O5x@$mS?cPMM^t94KkVN>$2*5kW82^}nOeQ#Y{!ba8{WIQ8LlEyylx zZzFfEhwn(k{9?AVffm-(RD;XmvLG3DcOJ*a!PHIq`9783B=nbK(z`&DUUFT=8Jt>j zMJ3_A_ieE~HbG7WH?cq|qYQ%sk+>{l4{^_%CoXpv?3|2kmg$i*%%XGEs7aDf^sg0X z**eS>iVIto%-2(ISBjG1vLekZbMZ^G##ANKV9b}0yAMdYT zgkegWX)1qnl2@k5i+-CYVR=w1>qQ&^P8Y_<0$+gTdx)8j2 zu;WPBl|Gz7hzflti8$x5KgUz~4mWv`&UOf-?}(I?C}%Mi;ZNHoPX5Sa(N9 z{AE1rUAiP^K7Km?rC7H90eS-Q)$b@xUvZL_m0lPu8+)jLEfh8@%f{aD2smCWRVH3C zO@b?W8+M8kqZyT;^jFF%xUoV@Lmu?rO6@IzC18vZimL6{n@ED26SJ`^Wm7{E`$Wlf z)V1Lp4%#{GDk73Ex`5j`5AOi~?;P5u_z#r0MS{*t9hR$Jp4(sJCdhpy_wJh(bc-HE zH!q}5kDyPPR*i{o;KwaR>-CZu>tH1xZKf>ixk{aQx5#^fV;Z}^5_aEDgKl6}B)*tf z<7lW*f{2FDyRQ+T1Q1Dd1FrSQXD!P6)AB&E@9_+-5WP zOIzOQM$y&8Oq5|3PYtYf7ubf^kVwat7m^avmi8^uSaP3lDyIt`*Nz2kke)@vPZIkPS>m5=l|sC=6W?Z zf8Fn#H-GU3`eU1&@QgN&?Fy903aV;`7)fE=$XJYy*k(RooR7}5OzWT_ZJ8IPCF`(- zbpGWuA9e)MY2+AF@7*6@r0M=-Z_?e>G(iVw|A(L?cO-K_zNw=I_^MI?-#B~!j0{>%G$V@E2Qo6ziv_SkWZ?6vjMC`Sf9#iI35=&vX- zpE}8oAe${$$(e-NM9I#E+rqA*X}F6enhPB7;8w+x$ER^mk-g#v{{vSkU zI~TaVM=|~*2z{_WtsZrmfXw;i5yH0hXd)O;kEUVG9z_D%T0A5vr0(zBB-FHhSS<~F|!7?t-`7}7t)$@Yc)TJ$;xuDG)+iS1Ri0#U~MW&(Cc?? z({E8mc#;{w#S6OU?NgJhSk}j~>#3^%x0}=T#Z}s$E^j!NF^n!)#g!E|P91hDGvPeS zie0YMp5d`m2E4gX*#l*YyYuBj&wZ6m84<;+WWwg;l?@~CLd+VpYqy4QA?VqL=PcG^p=wbTFq$n(Ay0&t%9_I&h@TtA3kCdID8 zxf@Rj5?94 zT;Grz?vs5kCks;WaTb^7<4VoO-m#XmhCG)A($Sl!+rf}#8TLejYs0zD*6MBFM2Tx} z*;=MT>XADZ5sve<(tJ4gzy)i4{{2YqT^FZ3ZkRhtsQe`)dX2cHi4K=;B(Q4*b9u&6 zY`kGV;=RlRW{5JmnAenRgtlHD2W_-nlV?om7QN)|FVz%sf!(6d+>-BTza@Vt^1yB> zYHJZj(j~#5uGw>MaNcY5VS0@|xlb?IJwh~&Q_$YMoSg0P?!u6{*RyBOb<~FZywiDY z7iXGLqnlwk^R<1+@fdQfB{sJbZw61h;^})}(Gz1x+=h~5#daFOv_!!ZY+p?aOnkrN zy226%!rH#F;$FzdFUTYDG5%I-(&rgpPofR;TaKh-q!({IhfJ*Ok>~IkNJXDLPreA) zuI9<)KGUq3^#!|#p?glg@^T7G7qJ{ZNSl^iB?$pK%IZ={@>H=BZ2LioK<^kZWC|KG zazoiRWC}!(@)DylvuYN79HR4D?626~*I3UbVs$#qXeXnx=p0c^&IC&XR9okEJjQQ2 z?J*Kf`5q&1CWWe$nv79rYZ0YB#t^O5KR4&P_~B6s~c=@@)R?kC&1 z9nD{=M{vBxjLQL!d>?QZ4fBMu1nMJ0Zt(EP_7bs>6^=D%0cS7S*+%bQ8Am{>O}f&6`|EQdL%Jf)e+!aNr{ zEzjt6If(LrVR^Rq_(2TkeiUbTf-B#W{7c7qo0U=`k^F(bg`8-U z>^W&*-Kld@x%Tp$R06}PkIp1Jp1nRN&E{KZ<}26Z$#?D6$B{2~SKh*85ynf9L+fc# z_i^lB7(=EhUp&|rgvsw#kj$30VqrP66@*#FOwg)qkc9lr)VTtg!9(8P3gQGc6U13v zE2!EQRLce-JI}=8=5Q+(*L^ZUTqJ1)?cWxJU4>TAer-YMNVI~mUzkY{71&mg&bV7m zgK}CcXrH#AeX~IraLdHv_`em4yA+uqZa}nxP+Q6b4P}F{fSU=zo^2}@2aA~?j>K9) zoDF1xkPx?m5Hn_i5Ky&(*r{fM*w?gzVCXYJu*0n&)|yNZGf^uDHZK#z!rltvG&d83 z#H$sAz0FL}Q?fz-&=z!3Ht6KGpi{CzsQ+dXJXOAPg6TIiHZZ(yUl!wg@#?(yX#|H; zFVrB^iw&6g6=D$DVmzY()xvsb221g0VR;sdJd02^OqdGD%ElwL6Voy29tzmAY)hj%y-B-|K zznsR@g5p>qdaa~DiKXcJqgWYX4h?cJb2<8@5=3aQV#u=?M4^%kHs8ebj^!Kqx{CD^ zu>A%??Wlr1nciKkbrzxvfEb=$j{Y%1?AoG|qZLaYvD32cF4jvtK`q{?{>7r57itcN z1jzSvDR9BU7UDY*+KllS0hJar7S?%jALDn zL1;S*f0vdUZaqX074==W^*y4!xKkeWoxdT-=%@t!gV8fcQKtoG7m9atV@vBSk2&jI z>8Y+g-e$eO)PK^ER=(D-uz?I_3XWF!1o zcdy9C=!T7bj^Rf?e3l02V)JX9ac^-j;<$>A*|!hO6EKD$OPAFJd`l={nh{=!PF11y#M5X#MbRPhtCbPPiA z(N>y@gR|S{3pJq?9ILPR0edc_G0b|)X{r6)_Evhyg)FBnZImE}sLa2WE$2|9D}^p? zIR_ivDbyd@*rtSbEFATBK-`z})OGl+es;M}ckbAy<`!ySsB`{F;HOcS+wNNAk1-@TWk-8qOXA-H2OfDd7n@ytIi$CILCy~`Kh3BKjEu> z#*y)VDvhxg_;+ z+^wl){ztqqj-f`Dj-TkF+uB$_Vx2*(S+A`t#I#y77ZB3d*3*Tohy}{72Sfw25O+ij;_ZzDIJFNxNa{J~zzFx^E0PV@+OEUm% z^5g3=0LcYnp3rJWK^9Ypk*`=oD$6DTdmgZ@;HvOpZ0<19M+EE$NU@p-<_;r$S_p`{ znh53&BYj#32+EoW<_;r$S_tIcL@;+4>C-}hJ8vSGJB;*cA;6P25zHM%`m_*uv!jV% zZeB1H!i`?d_+`y-cSZsoh7-MySc+ipBBO^GYIAm zBYj#3ug)Ntn`gg;V0_4vMTq=`ZvJmo+I4hyGh1`7h(4!Cy9^H_p|x^FsM$=w++n0o z3jw95CW5)cNS_wMD>4Y?4kLY92(S^&6wDn)`m_*Ul|e9f80phOcufYu++n0o3jsQA zW?}9y(x-*M^9@Y|bBB>WErgF}5X>D$`m_)}mO(Ig80pg_pj(>Zb|M@^0yIOXTcPHR z^uLw(tBQWH{6f$aE5rV1wGoQ4bH$)v%_Z#76520z{Yp9vWS`LX$5E;0>jx%uK9xvY(FJG8e$f=mGT@Ihdz0|Q$J>I7@#h;4*)3}7Os033#7)_Y6aB9J} zls_{o9F0RLv);R$Sl>=+Xh^ z0Prs0pPPKz#IUW zioB%e0Py(~U=9FZNCD;m@Wm8h4ggD@MFI8{ryx zY#b@yO*W3!rZIxXN5s{?2UeZIV~KZV$BNlt_3<*8E3fwPq8IS2EY~UNyTYlB>9EXa z%93w9W`+5a<*$0LC4VG&mDWyTtuby)E4DY_akXnfcFyXqq!k(?YL*|WSsJV4{IQ(j z%#YNpJ8=9&{%IkE@oEr)X$8f04h2c%m*z-DRY5fG@tGsy;1Z_$l>M~h>x;++qYoH~FepE{U- z@qY4hPJaE=5vf=G(~)~akjp(?>Bg53cYO~>nC|37g=0V+ic4&-kl%HZ%@$CSx)$O; z;OXw%@LdX4T>nA-d%VFr*peW{8rkO!vRYqm`VV-+p!B1OuR`~jZN%y|m?7x6TPAiq z^}b@so^2SM=qhnAe*#w-da8#zZ0UH(9m^(aI{S~tNUb(f=^R)$RO#e4H!XL-;!>s4 zbZwHjK|jwAV3Q49Da1vUJi?&uB`Q<0HtX)>@zLX{rjdtN!1Ur9&t(d~rIR;$EbJNF1|M;DVCOqj+#Lh2xcinH-kOGkh|xFg{fwT*}fndNxg>7a_PVS&dNe#h`Mz z57jmWVhj(f&E>cf=Q6I|n%INW>Rmd{UCQzVj!}qd5xf?MV{v z+55y#QQ}r7xx7wK#pQPGxIY!-e!Sq|fnXuDhWqf~;D);;cNH08$Q_$>8W)_s?}xsF zJ@)asR`=>bknJBQ-0wa-Uw!Nkhx9IpzYkkc>up>?j%)o@kN8sD+%vaiw(#6uW-Jw- z)#mNOyOo_Zc06c0o;CR&-1TmY&}m|dZW~UCJDAq=(AgWt6QI|E(pcabcg7c~?l^2{*7D?Y@E78koTQdKAr z6Am6Ot@`nSuV22g$FK$3_!(x1$&#V`=&H#>H@*f)Q;r274F&9h#vJojJl#OH6swmk{&ICtaAH@?`M3f;(>lbgiu z0YPWHWBcorXX!(izGfrBqy)6_MxpF)C?|jW_BU*V_aI1lY^>v)TxdZTz3s8DAAERe z)oHiC;iF3Bj~kDD-^Py;)j=E26zU@#^8fLFy1usYAWKEDHoinbU$mg>Kk$@aD)y&4 zC%&Xmz%Mm{46NKF?>mF}gC_7<0=~t7|J?-gByVo=P6PhE z34Eo1Hyg0$*=gPH74Q-R9?%57N5E4Icxn>}@12|6V8Bb8K$zIv# z@Wo9a{8eu9uaITu)Ek;W(ca{L8t_9+;2#D2x&gn?1pc3Z|6;)JG=T;DljyyX=1-eI z9sCH8Y$6 z9-pkh*C{YfZ>u0L%tEFGVO!b4xmA!$cah|23Vd=iFim$8b+FTscwZr~k(;luXDX~~ zPFRD;*EA4jmg7lb{G3tR-V7Ox4Z`@s9E?^04im!Lc7t%Z5N@A?aFMF;GZo?qLg0vG zRv}sl>x6(Z!7dSw76NJ+yF@rr2n*&QWa@c{Fc5(!Ni=)VDCrypKF|zIdLjO_DCy}6 zd)w@=sMSD`5N_WM!YByU%iDXvi1Y#loIFp!feJXdS;kxB9c_AVmUpl{nu-(u0|9Qj zZ^P7|&^JS7jUQolnM>bC8P5WHOi5qKzt{6C`p&iUS9AdyxzAd4wl# zi4Npe9nyMBbeb|;U_6E8KHg-T)@w%4@r##hHrwP0H&`{w@!2Hqg)UcDU^GId_we{E zf{Na&M*&W(9R8raoqVr%d~W~iyZACBz`-}bQW z_~Mb_r8;u=Qtu1Z_S)YibsTKf{++w8ecDAQc^7SF`xA6?{P$=0viML^tPM|9pPMwG zgEQNT1d*4G{~}SA`YzTMG3ncPw!Z-D=Vd|eiMdU$YW15oTo+M(ubxp*d@Koh)3Li9 zFYv_3X!UAGu+2r8Xqy}-ELGz?lTbWQ_HvU{X{Qi!ET6CCl+;^lkpPzIR zIy^f!_Uu-DenNdNZqi|yvUe9&ZhQ^U$+z;acfmlk6;{Vf*Im7))5r{U3X$!~@%`8u z8k_#h-RE88O(T1VF4{)Lv00vvW=IyT<-*P-PiI)7_T7%0v_D64H{Ij)mz-ihD#?Uh*_sd8(f8)`WJkF^F!h-< zG2gTJzSPbR!W;?>xl2XE9VYV(W>7M~HWLXTDlJIlxt>I#=dcOX24N!}&e8HYb`18{ zI1I?zssAI3K|T9{yXSei>qizRo?$#giMxt>Y2yCl0+5bOJlvkSer4i5L9tgQo-^dR z%{<#wCdo6fM&)uta{z$Xaez4h6jOjXp3OCbh>0HSNYM-EFzg>h&$Vwy^gK~6F*?&2 z<~TE$E&-?)qL1o`+JKdK3jo=ZQlKJ)~<_?~7xhKUd>5C(WmzBLfNM)l%) z9x6%ZOhfYS{cz}vzf|NhqOTx7qk?lOr-n701xp7aRvV*}1-Vs}d$Gn=bgmbnAAJxS z)i%xFyp3Azs=LyEnG=@jc%F@ap4S#EXeQmzts+b0|uhk zDZ#`yXuj^E)p7$W)ZCR&6BSKzWo8Dq0n9HQKL)k*Ix$C%jNZ(rK2hmdYkqt}8Pi=}S| z-z~7Xc?<)=D=Ed1+iYs|eZya1n@grDFLT6+@fP-yxs&+)lHcdxCLiPXMi9^8r|+b8 zZAm^Oi}TSNNVSz_TLHZLtqw^^OPh5!I(j2fP<~b~YCaqJLt=?dwnKBnGe2A0GvIgLxpI`d1%jvcdQ-H=z1_u`Ic@y(dv5 zj4BO!>#GeHc`B7ftuCEJ!z68rxgG8$>|NYjiJnSomBmS`-(!(9Dk_U@L?l--7)ohk zmCArmipDfnapi11J^B#`kIY?2{CNu*Iem5 z?=!;&Z82i;*0n}&p^Lsivyx_osZ zK=E{?^NrHVVHY=E1SopTcnYTBJT!4+pi8s6Ok-)1#?oD;Veb>?bKDHcG0Z9hWjc2_ zjEw&KMvg3p(ebKuXBd@Gb>)yDf^lFaJWiCs{9(UEeD~qkm3;gDAHRc1{Pa7V_|tC+ zA4%ZpH_cc6^v4{StFA5#UNFX@$-kBS1jf4-v6 zKy)7;=BOYy0To;;-s~Gd%7ILVA-3Sf_!Drj9ge;UJlWL#V%DbC$9GR|XusATNb>dT zH0K5JTZzf@e#TJga+=sD*%X%h#kiT6VwD5bxA6&WVbmtaMs0rNHnRh%0e*gLl?dXu z8{R?uk5)4J;(zk!?=bL$z$*lPr-R>R;DZGo5%}E>evg3V>-|#AtrxlS_h|7&Z5_+xyPu#|b?kK=Jr7z;r( zQ5_xoe9-tUzL|ZY;UGX$`rGo2%GWqi6U5+{|Iv5&2jo2s=Xx}yjTszzKAs? z`w8Rf{&PpURFe^RM&CpJmT-_;xL{>%L78a)d1f97RW5hEwdwjWK7}gsEKnhSDh@8t z)5SV&=3}SL-=zeJH1MG;KcE%R=Z11FT9?iZ9XYQ3~;zNfOF+L4H z5hX`?DtJ@Ei~o}x;-?XkKag8J9C{0ok531J`h>^Cm}mx#vupW^@fk`liBOEsl z@B1^Q;9340rvrb{0{&7!Z;M-?FYHbsD-ivK6#6WZ(cK#-ujoI(McQDYW@xt@8YRS= z!0W1RprOve#U+DJf?4k>G|t5v|0^B`!J=UQi}QPIPVzO{j?cqIOs=Vy>!0xJ2i&q~ zp5KeGW@XS*h(DFh;M10YKwR4Q47h!;w;5P#a_ER5mFfX-pBKv6QHcK~$pZ2y$Dgn) z1ky|K8k6y6;Gkcma(|I>=XVaE&DSiq8ot(xsIb7<81(7(Z zLvzP(^?MdU?lrmNf0(-ek~{2>1*S`IV|EJ3Od3tDWIwvlxDs=)U`8px8~`{la}09; z;HcUG<^WJl0p*YOXn&@l3M) zmYjI5W^%XBPEMiC8$~NlT(m&zg~#>12N;$ekGOb8T4G#24g_&JR63Z*J{B&j2QVv!iw@4E9zM zaLbY%3G=x+VLroz_w*i0IZ%}+;XuEWeHlvXB4k=PIeUFUZs^`to&J?NJ(D^;cpvpO8F9yUb6!ghwMC8V_^j=S zW6STr4w-VQZso?Vuf|;MWi=kOl~#z`6e2TD)#xt%apr#mU|NWkN`2)1!3iFL8i=O| zik_v0(Taqvm|F~^0l2G*JaRLR?tEtpB^fY3%?_BnjTN`29OPb-8+nh{?Zl4S!jv#N z;*Tl=uG+p59w3~0y(CkKnTaDA792aVJSCsvHb?k7GexZ( zcBB{$k*p^{*SuaW^X$N0n%KhW?J(9^HtUO8@{4Ju?VP|4YlJ*WBc;4_4B@Rbe`e&z zx~uw}r#M=mFnU@_2P@>bEE{O}On}!bL~{Io+W%(FsaxJd%P?{2uE9A99U#-juqV|Y zt(F5^=`dWuSAT)-;OmXq_y_uS2UCk*2z`~gTyjeg{~g$!`i@ZABXXW5L~ULoYQIk`y}~m9XNu#+2dDcU1m`c{r*>NiJ1o|45P?0 z6}~7f)9jlrzQ%Ot_M7lI3mRwRTZq;sd1;?9NnV4>D~#SwnV3;sS8LVOw9-|59Mn?M z^3hb-tOlixL$h}=%&DB4LmjXe1=M?mcsm`*EcrB2#*QjxQLLBaI{>fyL1J(8*WuKQ z4kRm0nBkU3A#v_aJd$P}MpfW`K5e5o2=5b4e1$6UyZPci_r*!UcNI4uU#ZBgcD$V$0H94DtJ82LrkJ0VQAigS%ca0oYz-v>`<#I5xX8b$-WDOiju5VIu zmshFmY&W3&_Zsa}&O*GASR9GDBRULUv+NAQeOvgT-1;>l>-nhZDt`Dmmi zm9EE9X``c5IN2^bS~=u>K<>=Ow4oX@Ll19fhJHXZbQphyPkr&!T0jnm$jY~*<+1h) za?)qY)~hz`1yAZE_2pT^{0NoC^dgTVE{azbo;Fbx{o<_kgM`NFhjJCM)!Ag560XZA zf0^ZaLc39`{`4_6oLlw;A7k@U^OaP`hSIJmayQhx=8iqYO-T3Tq(b|`PB?8`XiMaY zR&|@#8kARmbLX|ME0ekN+A_^+``?)qVE%axxjVC+J-XCTU(Y|qUBsU81f$O`dS~-L z({MBLkF^4N<_4VDit$0kkl$i>fW>GJcuFhAhZIA8i{SwlqZPm)I*Jjfew1uNw7~|3 zb8)RY;naVs=9-oUke{~e%?6xSM-8wvttEWpqglSOMH@r8RU4c(?h2+)qCBYI{I1!i z5knI$l}s9oXnco>KUZb70Dz%Y5$$#K_tGL4t3EfY_Ko`<-~f#^aCjAPIpVi=zY zmkL)06T*wLGY9h-yC>X2eHYYLg!blneMx96XT2xf!kRjaf`jgU4~%^~L|Xh9D*H+gEM>A3H&H^d0wk7JeQ(MAGCPttWl=Nb6&!< z$qfi6meY=@S|pc*DWb{*Q}a#C(#BsjjP6Ir?u-*u}f9~^wvwz zm+IDUHRY4|R80~-JX@)y^HplF*j_2oqcj@C^Dxr1+?NXj>q;!DTIOZ7_YfyAZ*Omh zj@+OBAKD>pfnq+ojy!6x97(SaB)uNchw9P2ZKJg3y>+~!t>;?}*XsErX{31@ut^R> zb6ajvuryE8y(&u&;%_(84lfWrcn#7K?KA9<)$+uWlB>*X#b=Xfh{@$J3l){A&%7i-u<~PV*)m3wPw~BD%8H)k}6R(8yLC zX!}mSS~JARNJZHhnY>7R-AfszPv)PGQbZK5p%~cJt#wUp71;UN=r!sz3(IdhsB7x6 zW)N2LeUkN-S(0eYhn@Mt*|M9CCVq4Ac_iB?6wd2;QEv5feC-ju%~6{_xs^gcvrIexu*Tl#OkS{K-vdcHP-e&Hha@1vS8Tg*L=3-wRWi8;3q#fU+${A~JE}!czCOzK^$+Q&>^#eZj)#22kY1?_L`D?$e?V)()TS?Gg zpe!6jjG5iX&>9iu)}hz(V$t8!cbfg>7OoHjY=JpK2$CP|uXaSb4^rzc1``V~_be*s zfLa?>o@48!&~M;Sc^%&leyYR-ewcDG+POFK&Hny|e;M%8_^#%sL6C+|BJIf8X1Axr z(9uShd-rO&Qr9HAo?NyBlUED*eggY=y)Z>bwOII-eAnbtW=Gfnz~A{avkJy?O5eH} zmp5h$ zM5uIPJ#gv=Db0A_wuBJQT{<~#c!al+nIk0UK7^8K{+cz{EKcScShV{{{KAyS{aJRJ z(E{)D%);FAF`s9Kw(6!jMtI_XAl?>Om<4O=;b{L@3{kbRGu)8aV+d&d`3VXG$+KAeM_7>g;`HpVTl?YWQU#mc31b{gJLvc27Wa>L9-h&cVy2Q`+0U2C-g%k0+HA0cS!6r%Uw1#T9-a#37 zOOnjXh2!!RN@Mp}ey`=XgWu#;Hd>ZZk)G<3Qmh%&l4M>?23ewk^T@-efa(VAHJs3| z?no{GnvzxH^;C`t!;>1xCRNa56mKAyJvS~J>Aq$D-ot;P5c4K#GisV#TgiCh$gA5d z8T++)6B$77#>;bsm#43@Gl)ef2RtRn80y%<+7xKq)VeiVI0pcwdSIoqR^v4fTPC=~ zkgSB`OOvQTPK1JaayJ=k+Lk0`dg+dR=d0D!S+8Klzmk8x;)`AuJb}!4331<(OcaTG zb8h_J)cu*l^t< zeDo$^I5gg(VaCSRVDCs!ySBa=la=RE&q= z^~3w*i0)NB12VI11z@k{u2@2cv7@6mDap5jv`rukV%)_(q>CT8ax{rm<^Ih zOJGl_K9B-{vl}l*-v(a2De=|flHGpwfe&L*uO=ZWyW5?wJtZIgfk=ZBN0-vTzbcUl zCPp#EDNye5MeR6?D)}VXCllY8Y&ga4AGGeQ+W23r@!y-f|H~;KUNAWm)#gnzztsCE z`6m0QzF;WXX3W{gED4r|QWVrm*SL>L`yLy1)KmE>aPh1k)tAFX5lHkF=-b90JZWpq zO{fROLG{*X!8#WsQqkv#yLF?a96ImXfMaLjB%RQ`jr`VbQ%Lky4RRBlXf4$F!8wxs zXNCB`VvHdcAD()}E7J|b95H?&`mzeDG}iAnjVHcp*J-NN`~%L{sn|Vz)#A+WDz18ApvSn#UOsRM8ZsL&vYmp|RB<4gF<| zm(3NeKBl6~6|D|Rw0i8Tld8=xS~bRaetD|O@$V`}dS3KO>OJecNag(h$$8P&l@aw+ zUv1>uc3xE5-#3wi&&g+toIxA z?7rU0YE(m3q&Pi01`=VzH?s_H|5&LtruWMoc$SapqdT;FQ*lo1cq)QFxYR7|v}WrO z$SEC~@t8bDw@WC$=(b6VZd3SF5G4LI9LYc1aXRd!Wg1Kc=H;oO#yhCpEmsAL++GtO zO^q!Y7FY00HApH8u=En_<}i`PW2Klxm!v~-4i3ch#@k-WIk1B^zmS7>5$8xad{y&~ zVPmR;7w?!5DTjBC_etZO)aI?cfij#Cdweb1J*~cZdhU?Byl<{!G@nnJYSOf2;&+kK z=-}9ffyT)$*gael-HU>0aUpB#!6U#4e-(?^VG26u>BqFClR<)?VsJ z+UPa3QGet8gmMaF>sS?umMvmhQl3CSW3gtH58xV|SE7~3>KEollQX5Et^cgth8iEV z&(;s=vmxXT0;L~pd{|z1Ellv_$F2(p*5$)x$dRNA(fBt?r{gmV1LyP>&fshu3j^m2 z;qX0EUltPir;k(%Q9sRl2l2Hzz~pz~+InHscE05dE^m1ZAelEl1eb5OI61tSBF`vA zh+XIS$?7#@nH?S03Jp#WB+|B_>vPW2$WMQ>LNk(3i8CZe*VlH-LHvLcAIL{K>h*wG z2%jckZ0ppf*CccBgA$g^-iEI_tE=pDe^Y(SL%dCs z>4fB@OGmKjcEfr?Vy#H4pZ9s@O~5@z4iXt2S5$0wRW0Nj($q*w?|nK-`9(vV!zx2p zpR?v+DdwQUl?FI2d8t&Z?o6=!a8pg83tJe1k<%pM_U68Y9of6W_zc$l${n1B!P#Q6goft+H(1ZAXpmCG$QQN8w@-7nKMvvr>1R!fTWD#Pb!;NNggh>4wr`~DBNMPvc&%?oaF89&_sx@r5!xfX6mFA4k=(k@l%R% zS%R@Ru;Mj74RA&&j;-^pigCgSpP)e1B5x%YDLUBamy8k*`7RrQN1z}x1nYO^@1+gRgE{J-ToPqgmr zL{i?oxA%!z3W~q1NbR7nBp?-k^AlN`oBAi>OaFs<-mQKO?L62jQ4a0XRj79q>zoo7 z5N5{zMs%I26zgmkQ;)kmP$$NP_^Y6GS1)53{Ti;GBA1A?p7wfa>m37q#T^#|6x(Aw z1d=S@xFVD7uo<+z5D}FojsBerz&}0AC}x08XT)& zMcCz@C*>NS@;g7{cK>6WMh!Dj7!?@F(g7Oji8|yIf57o+?sc?>?ThW@k#fNd26q*M z_*tf$`byU822ULpx_9)qHj*uM+fLDt>n``^mL&IE1MYE;9_0KE8^8mI&g)m3C`!HD z_&0ppdOk&X|MrBwJd+_x0*4TSHlkN&zjd^^`8rr~X^LuNICk4r(03cCv2k zyq=LUs5GCRrfCiU=cWL2_?-VP@<48xRj&c3c9N|b=r#8Q(C&|xDaGj zR=^|Vg!(|nV`1FT@Yh-GyFkv8*F5kBGjOENq`Aen)#1Z#pKn^X_J1Gj$CI1%3wX z9=OwRAhwe);%P0?I{!H0r?I7q@FcadR1wS}RfJ2OV?{w*stCu6EtB5qwGKWh^>1jB&)y2#;_SZW^v{jtNSEX;Q1kY_6o7INf)6G)1xwR zqRi4(O}|rObrIUU&E``1-C%_A)$}hLszJZl5S^h0QF}7KXb<_u`Nvb}2DnjXFx^8t zy6MhpaA_d<81BlABxe`z2q>hn%@05~w*Coc!$kHae45 zpeq&@ww_1R4n$|;N8GaTb;<~Ur0w{CBg!N=DqaNP4WiW%)p%A3t>c3U}~%61WDo83p}XWQ%bdulK1 zBNn7qah6FKpUo0xNsXcWbo6>}t1X!DX0?SntJxOc-BaeP)LF}t%;k}_l0Y30Do+pa zmhh~y#j=hvJTKdOC>yY}pIH8OSGGM7lIQA)c&=Nlv?*yRq>Z$aE}cbMjY6v;PH
  • vT1u=GpAgaX4~sEdsVKs ziR#--3ypuB-Cmwgwpib3;#qs`aXfxwuZq$(9yMpSjmKZB6`XGNnBT%T>x%`m99fUAy~o?H$p!l}kk1_{{8bc|O^4iIyF&S*~}s%5~lD%e8mJ-BvCUcjHsD z%jNlG%O#q3JS&&ZY~H1EW!SbhzH;wa6|9Xm`AS{j5UbKQb!l;DDrvUGyIXB>#qQf; z?-;eVwh*J%_*|<9KGr;+Y+Hzbb37}T)^uKvNY~D%?!H_*_i6%aThj+A*VTe|KS)m%M)u?d>Q3nkDRF zMlB)7&1fzRM?Y3(UVq;lr+Xjm!Ze{sg(W(#)in-4ikFmekNn==k!jl)5t+6%iRdvI zBYVtm@5rw$KapQsexkD^zxVB`4=&F#eUI&-58C$nttO2ASG1LF{&YT1oBt=RrtscN zc6-))V^h1%SM%4ldB(>@*Cu)s}srk$N)0v?|pYX`$RF6x$!Y zgR*>}HHUB@JZo-K!J7NYJr&Fs7EdH;J}YWc7;7CXYU7J7()IEt3&X7PR#EM;g;WLh zNW0!&T%2vg8~4Gjqx-lUd#<4bBTP9GLA(dxTU-!;K? zjiMaug6(2e{bI$M;HoB6jG{w9ktEMOB#_3FoT-T+Ay3mIVM)^?0Y%fJ?Tvd#s3$3a z_^>91c%LRlXM%B66G&mi@;A}NBQ!l)n459C6qj7Olkei>TTZ^|Rg&Js-={Chizu6k zR1%;@bPBW^r_3F@y)S-(#Np)rHGL%$moD8Z^>0SsbLx;cG0#aIuJJ?gxFV9u#ex|f8u^S)*0d}}$j&p*HIf-`>bYG3qi)N)SR19;u4^fVY zgZ{#XUk7M!ps3s}Q^bYZjLWxIPMp9=nVBSb5AnMn)+Hoan*kPw32Cvs<)6Q*)8iC8-}swRi=; z3cn7166YVqPs3f?lNa)v;rC{KujIFh-%0#F%J1F$zRvG+{C>{wVSWo1MSD_ahF!Ms5u!;Frt&YlmMgw+0{Z%jEuVhhHhTC?5F5a{tufSII5n z2Y!j%|LO26h)N^T7y;Lnts_EWuL zxiu_tZ^nJ~_Fs6w1q#scCcvJ6+Wt!qI9~yp1PHiZ?llg7hTNJqfL|*&7yOjNd2&C| z;pfP`%HdmZ6MTz68iBZPmfIF@?$Uektpc6u!P9cvs)gxqxiudWZL8d?E!7NRk8#+f zF(n(#up!`4S)=Edf`bQZmwXqMFa@nzzb`ULo>lEftGcFRwd0ZhzvY5j@EM(I# zy@WH~=mB{ly|;6WDBV-at2LvKFB1#vyaMdlcKRqC2Alo(`NNO)aP*f3qK_+C($HLf z4BwBDR@k_R()IJ4FcqI^o5sPP@?qTuCeX`XCm&__d;#C{ep3Iv?Ng2#SMDcF!^bVD*CF-4p&b7LP zb#Jo`e%M)CR87GB_jVT7{a%kASprGk&q?y$O`D)qmhF>)wl+B-O>dx!0xhRmD9~_N zvSyj5L_2mT@Ax>A=h_Dk$aAIQA$n_@PV(nMCH`NL;2zS%756{Vm4Nqe zf+ZIjPN4fVq1ssvCD5@ZRQsqDx?dBj9Zj0TswPwiJSi^r-;)AMT$|z!H=&XXjIBWr zZKDS1I&|^}(Bjl3Qbz9d)e6N>-gh*gWz;6ZnJW|`gF#|tF-?1={7% z>dBa%pe1Pce3;@GO;-`CFfPT{Zz@NW`IKYy^~9r0W&}wCzD+<=$6o7GqLV7biDD3a zLlMLHFg|3^TL{M&@)VnNhT@a>H-Q0udFm-Dla&0?xA=!qsCn`_8iKMC4CwKwf|MXd z7n&zH-Q+%m_*icCZ?YSmvzOQEnvtHyFEr#v7AD_C{*@*KhINrDOr0Odo~Y6>qg_+) zVm^%M`NA#Up5ia8o_0r7Qd|Kr2}SpYPzI)Z0m7>`XVG#|-ma4Ve7QbNFDa6@&Wh4xIyW?RSQ+iGP;2 zyy~SDE$<_ESGK$&(G0SvFoP^oO}uc7-kIGVS$^xqjGt9son?CXqd}NtBTVbBMILfq z5VA@5Z`hc6exzItAP+^c zOJPKxKMU-wO!m%zPNLjzt)bwmdBrFs7@_Qv2^nK#O+qz%@qD0br?Oj}{M1NGQydAP4 zLK%fC@e5&Y&X5x5fRPuj>kt7J6(ETc3DsbSh^28vtV>$4?BuhrBkx~b)hI-N@+`!F zf_zU4*%;BjV&1=<(Vs!Y3JgN`GR9Z*(VLPgo(3Xuzuk&!hlhQoynoBRr3z1I2zhGh zTX>(qcR)3qR%!Q}V!ZE&G)|E`j(F+@E+Tr_T96XtSg zZ7{xnrD8#s`quUjY8}DI5fiIBLN^m^HOQMgZ*Jooxw7qJq2A@>zy4mz5!S+dy`!UF zp*9&nKbjM|f|0QUR|g~A2lfQD!}yM0KFJwKE*KdaKZ&sM$;nRh9(CX%G9OO9%X+N{oc^R`!Kt-+erL76Dm(OHVPO;saC01&wx-5>=w!PiDW0M$BJI}QF|<| zPBLv&if0?|V2y!qQ=9LcHs85TU;n9Q-`%d^tqF!3wv?|4R=Q)fe}pR~n)`8exy#q$ zKT$3HF?2^*P`8e9VmM(=AKVCfR@<84tu&dm`hiI+M@j3hO4qKWH&}bD6JkByE=Szi^;~j;Oo{7!`IJQ!f zJ>&iOiWMXQ&5tLN&SuT42Gslq3#)K@j3AvHk3I3@~#kMufkQd*4w4Bv#&`BKyvx2aYysG5uXG(T|9Hiv#%IzJ@$ zfjxmOpQYm%z-9{Kw@NIVu#BI)g!87sMv-P7m33%p3zR76#7q zc7tPK;JidQoVm`J<3`T+Uh3z2m+O2lKXaKr9Wz(zn2&O7Rzni)rD-&CDB9f~ZOWtZ zT$7@0@o3X8OVQ0i{JTk6;ATg3Fwr!Q2}^jd3`#@5Ip= zL@5hoaj=3etghn7_;^QgT#s6>Ko1JTq>}EGJ zn+@6B92*`xvy)>XY!V>hhH%IwB-|ipAUvE&Kr&2N@B~8yLBW6=fq>kIfFPiPpxgwM zLxG4Ohkyv8+=SovTh;yM?IwW#fAZOR-PP6A)z#J2clW_aF_HBT!>4Z>1vgke6f@*z z^2E{_j;4f{lqArIixyTw-(@VLYyMhS;?7-Y6dyv~vKcO#W*Y}M0TAU;2=JQGu8lSs zi{I{9zlAv9@QZl@XI%}iTow#p(FX2UY=ZZIS!Xg3yI??)Y{sYVp|nlb;`4(wusOVj zw>0f?ltl{SD0pqS2cU06c|YW~2fLr=#>IeDE{?H zu-VNaa|4{~$Tbd32-#6yqzpG})WAd-_<6kIvfrV+rfR&VhVq&Ugx9p!k~X~B;*F#{ z8B6)1d#2=7afQ{g8|en_K`8og^zBd zF*yT&K!ld0H|M`dG})RSnf5VI$zVxX@{8xw(>}(NnZ$hDu3OlmC573S%qlA;7R_9Ef`m92*IT#42oCmn+wByO^+Fz3`S&3$7_>pv(uEq6x_Kqj1+{(V5sg`C80XW{RJ$?fjO`dD5T#0-G*U*sdjlq)IF5Q zNV&~6YL6wexUHsZ<{aA0FD~5?EhDm1=h)1Q7+#>wY4nHVEzMdk?WUNFm&K&cbZ%bb zund@%ZAf5aJ`Ok3(!hwEjnot`hf)8wu;{B+Ii!E2$+{;77R|M%F(X z+Bw`@{}0;mzb9D!E-OPK_%^En^2UA%_KrA@B9Cpjk!N5N8WSl$>BAURj|y*Me`9Lt zRnTNLrnA?{XV;u!Z)pVzZ=I0V#K^>#h`<=3ob*v(pg*b^9@Q#=i0N%(b1~fRZiIQy zb$}-qN39D)J2tv8KNTHn$fD6y(HeC;-wimD7@lnTn-pOxSjta2I6*$6`!Us#Y|-o7 zfM2*=$;jj$FlWOeJ|cvAn)ZfV*TXk?BBZeez^kWL1R;p{9< zDp&CB>6DaPlgUD(A(#|`ElFIoteo7xt6Rc-%O-&>lLf?J0$u6ihMEGd zd}robQ?(>gnnY^7NwB(WLedqQeG3}-NcoAbaq{yqY2StwTqe=AA$MOLgA{ucYA8~P zuD&^}f#uiGyTc|-ZvVy2{6p&E0QU&3lRuE_=9JY&{R?zap&>O|dJjFTyX?NT03Gto zsN$qlH(EPK3^+Qt9|MR7gk*}fx3mQ$q*XOFRx#p!6N;^nYKhClV-#im3@W!#!R(4l zqx0J(x)$N_+^whT7T>3;u2*AWarOJfRWOx6Y**FVB7y&nc(*G+^&_8-_OT@Cq) z#D-at0Za|8D=CZ`_MdaHglKOk!s%w;C47ju*O4@etsZ5kMU&rg-SGVxzP}0IsB{7( zx(*VrocTi2n4gkFLc_*2x)Z#2D1$iSqFS;}%MgRuOV@@43Vn3h&vPCZeU!$^|C(B?lYzldO`4KZw` zH^X{}Sq!)IZ|m)AbW0ytPr+?R*xH&Grw>Z;E3J~a9q^`V-m&mD)w~<@mPW#-x~zRo zY(aIN5W7EcGuf27hYL1kSQ=?{hMQBbe`2E02052dE6WGb7$t%OSZ{Txm6Y!HdW>43 ze^}ksv=Zo6eI2Cm2!N2xe@=6@J|$VFkf*bd**n*q;;O@8W@#Fpr}`G=f|p?Dsf>qt zcmCJOJ@>tH_V?3gIgX6Dfmk$Lb;<2%yY&Zd;i#;WYAAXmSytt%rc7i~(p0{tA}S_F_CWngjhcI2}I) z+BkDVdFh~bEoD|NMpr#=b6)t5p6wXJ{Ul)ZX~+i!%gN*dY?{8W(8)VJLaoe-E(+*|TQU zt8G+q@U+FF8Wk6fGtP~SBW)P>9AVE5c4#Ec-O0FR_AJnXsnX>QwfEGrKeJq<#+Nq! z84S&3+~hC;+qZ5&w*0dZ$*o+6l)chn2oCOp!1Ua`xA+ef_y}(mzuX6&MLq2;Eg}_~ ztLU;Ku9-|M`L|N)>&GUm+?ik!2XIz%?NaVCUK!NEFT(F*s8e0_{o~^PcHp-!=artY$;NeK$4I8gJ;+3D@6TWr;v7mKzlDOj(*3QG zH@D;#f=nJSu4S(Z`Dava`*I^BLdaJ82&5>*Yi>vQGOd1E4?EmD!|8vyKMPSR#c#EAFAF9WAB@x_O4=dT*09@#( zcw`;!EmK-8cv)h<&*PiduqNEFfTO6rxO|?!* zh-Llju)N1tlh>Ne`mnhS$A~hE2+r4)$AXKHeGH8f`5iR}M*OV4K_@el!nW3=x0+cI za;c^`AErtyBBY@Ymv}Jash|tLUO-Y>)*Z#`QFb*pLXk>e;w{MZ1(7MqL}jWk&j;Ng zC(^7RxCppO73hOZQ{|ls#t~(_#cRxe)jVbP5Rh8q7{~<^5ZGE*7xbaTa{Y~X3vFsk zo$LcCVmm}1cD)4?fr3}UjjL8Lbsh%tJXvqv3A=1fn|UV;ixDW8M6_Vcqe1(yDQ(mD zE4gM7MXPYh7>sSe^4rNdh%}_av!C#-j)VTQ(UIJT& zuYlSQA=cFYD%Zk1z6<8ODEx0oUR+U#0bII+V>?o>saUuZSM`L2mkfOT;@ajhu74%y zHYU^MjR^6iY*RrmJgFd$-(k5g%+_Pi?fp39OoEdC)_8sdUc^%-6|QJqWRf+i08#_@ zLC{JycmoaAjBkhjT3e7&%UsBXGpN+eQ63>eBc@BZMCJ`ekF`@}~%=+=#&pt~8 zMNsmj3MGQcaI-%VcUB>beO&*LLeC^{cLJ=5=-y0xqkotzgqqg=(s1){eK`36H+US< z?_JHZ6&ryA-7F7H2&(|Kfvpg2jPjp z$1bNu9iWfsh@W(l(DIj{`{h5QLx*ip(5rRH?8ch#3=k6KsgObS7IgPMKS3@_UIp^W z)QZOPUl5DUg8yF-PD}c-r>KetDhPfz1WT2#;)M!=-zPXLC!sYbgJ|Kaw`<@(qdcZf zR>@=aSBmhj&qcTc2#E^$N1d96yy%R{@}p;S9t_5gGR4_M=kJusvy@51&et#fIr@XT zeJn^}Pin)`8v#JW2}+H~-qVO+J6-XW!Qa7$<`(ZL#M6>)Vr}9%V3jvU6#p6&O)Fk^ zVO#7a`;sMWUp+pLZXLfhyN)-6D-=w??MHA^4u!89$MV9Fa53k@QkK#es#_bX{6?q- zOF*s_&kZE<*%s_{T+y0D3zC!;qy^W=vpHy~TYmJk7rlT@fo;&)AO0s~^fG1iJY^KM z{B8A#w(4DArw!JSHEQ6mP=-izy z5)k4VE5x4GM3n*9;C(H`S)c4X)+_CfoJzxxsF0ONCmLx}3?}W3qAfyuvB4`{#+cIa z^!ytzAY61k6ssZM?v-A)G_f=<4<{>@X%?jYnl%bqlEbXFS&T$V6&BcdDVb|2Zs3*vYq8hKBOap2PfnpEIYEOdb4ju#xuP|l zZo$*NSh??kbwHnp_kOHw!EtuJ`>T|v{lThHdSz=oSz(PqU7;$g%}6*Wpgdne*{_CS zQ*)-)jvLgyT#!VQkf*6~$u({SC|wl;Ac%yD@W)S&Wo{0y=Z0(vc>EvS~|k@y*8U6uA7J#pt% z@T(QqzZGbaN}XAHD=T%W`35`2l;++*+btB0JyuoF<-GwT8I1d-%HrU)#KX;98b9nK zdr7IR=&&W_uqrWlE;>^E(rwaK3t5#I!J@+mo@I%fGlbGg|9+%9NS1INKTO!V&n&&X%oSpXejKf?9kwDt(vXqj?>d za*p>Ow4>~xWjNQvv^cJA=a`yj-N|DE6mL_gI&SztYR{6zC!;K)-SV6xKohJKFKy{yqa zqhbCgsP38kRHI3qMw763NPVFQ4~Ga1R(+`qkr{m`U4~890Z*x8zKNUXy`YL;q*>=| z0R1>l?2t(Nf1hU@-QOM&yCk7g!hIWhrEAtxUWzSu*jY12V=zg}c`S>0zEuy|aOFo|ipZ@}% zq20i9lVUeu&-1^qtyfzw_tI#?ypFgVB#)_p*=x)P5e?#?O>$&<%D8EUoq4ptY0ao` z!~s6)08q*BdQc@FA!P?7m> zj8`v#oh)=Fd>|+Im=C&wnbliTBX326BNI-T3qBCN!$(l9%UdF!<*o2D$g-94jysrU zciv__U-Sqf*5-zB8wqaGp*3)^&gwsu@YN>UCBKK6h=HpC(rVX` z>L|9P#>_e&kQ91YN6PwOq#|LgU^`hKhxtuQDVX}wq}aL)ncpK_qUcQ+7Wy$ia2*D= z{&wJq-8a^sd_nrCTi$F1m`L(my}vzh_%vw}?j7LPY$yjacf#P*E7h1l4~_~SsVV5e zVP;QzaN+>qZVM2{OkGvMHAjDCDZ={#zUbCHPp`^rK1A^!)~9d{FutgbH7ilN01OA` zL38VqSt&Gs2b5f&^>y|2<5aw!2203D3roY#fwKQNOko2?IC20B^trbCAAJ8S`ci8v zzog%!25`OIu5|ynNU32j^%|s$LrY12HPe3ndq~Z+jr{`}+J{m2#Vmqzkt2;98MGS! z!;*fMG}dgtW@4jPI_>bGQ84_#g5GKPP5Z4ds7t)kOEs#@+widi_6{_I9qbS}?mB1U zWXSfwb&R82W7~Umq!1SG2}E2Y5UKIKrT$xNzeHquJg5#v`yc4Gnf4{!KQ*GL6!yIe%Pni5jiVE=M1TVc3Ky-^SYp2)&=bvf^euq$j9q~uMqe#^?UCS*cR+YXpG73YN5gI zVf2u@JqUWAk!xsshOi@SCib#1d*VSei7p6^{i#OLA};05#G#Z}Sb3+B@kA$%_h zBaq)KC!AyhfTaYi9ju9jj`exkbwl_{pB?JhzC6;lOu7d=k5 zs3op2ry^+{zXf_9N**O^3&5MI4kkw;StdL<20xl*2AV8O$gv2iWtlpIEEDN}%`$PN zuDj0G&PK=D{Kg#iA8?`>WkCKGlQcFQYB?-Ks+e>Uk1FbM^^mU+3!nKG}z-?9X=!FzZq=9A-;{$CM#jyo$%{>Ovg-zO& zLThX^S8;klNLYd<_f()`BgHW)m>oi1YT^9RxSf$m}!C}I4T_fdK*62kZ`@2@a)<^{&DDxkagNdx0o_1o17vOu%t z1)ET8=Rr`gGZd5;X{{cCpC(4WsPg;<=K~in8$Zmjj`C07TT+yA7!;6ILvq35J(2WR zFb=ej9xu3nzU@rVh42JFT?cXzA&|X9ugO024pl6Q)!5T+l)_rpnMMDSzJ$LNX(j@y zlFjC$WSx7FdN8N;ndlQiGttF$j7rguTk9F=VlsFMe(Lk>$>35rFe%IMln7Z=O1G@^ zL8WSMle+=#h3CpO_{hxsCD_6e{?`HO>5ETl%hv@P!|hMSC_}D{!8yq955f~i1AXrPEDiXe4k0|?03(3!ZC)(zLW+}YtxrwQCTY$0fe zpho1HMK9u81&Sr7sQu zp0)sS0Pu_jh=VpYA$PAJ6D{2R36?VDYe24iEq>}k)+cJxJ$w{WBCd5ic}&GZ&SU;^V;`vRo{QDFLx_Vp;IC9-$xQOGU^e%dl# zeSS1{p&)@=e>1oH)3|ZFKl^LYFa-3}_dTDO!7W^g;5tAPq8ttR6GpnC8(266G?)xj z32Dr4jp<&|8m^U6MM~#~TC*WQHASK(7TSnL7(P^?;0DkG3DKULp*>zydyuLGoQeQ9 z8o)e@uI%mXc7^JPi(Q4^{EfQV<{ybnaIOmXLL;5RG%vzRimZ&(kQ%>znBo)U;6^Zo zWg1hr`f`cVpO7h~;Qt(f{$-FahKJ0F0CbI`3l*GwS5KrYcS*N^jqUMQhd*xVnT5Zf zo4+!?n6VT8cOr0Xj&LrH_96u9ExTRG1Wylz3-+D_^0Ki?5{twBTf;I-I zx3mX;{|5>-a&PIdbxGCDUWfWoLcJuvE9Lik`Tae9RS?Ubpo-3e&~+U^#vTii9~XM* zi8d7u(XVJ#CO;E9o2gaxNiDTWw^>Wnom4HW$)G7In&jUE{Dw7S5L0yKF6a#2eXp4! z91;>6gZTp&+o-nRPj!X!DJ>{B54@Cr0U8Mz|2Fz~1oL(}xG{`) zx&D!E3#NwH7xm9YVy&sXmutoS1bvu8v?06!loletBjW#x@zYIl+^2|*4ZN*acVlK- z(K%rpoCGJix~#-$$zZAv2lh>Z)1KG8E#T-5Ak93K+aa59tUY^HXuWIlI>1@w#>5U& zUVp^-_&DT+-FaXp)N|_k9T27cI}B+2qyI|$u@2mXjcWW_IKwR7M1&3C+8W2)b^0R^ z$G%_@M*&NN=fPhX9T9GJYCTc2zF^jgaf(N+(>`Bdon{$Jqzx0T6Snbju{Muc(OS($ zbEu}OHGzf^8~>sf>yqIX3#HNIxj4&2eUUQ3OgYV^e+7Q}wumsF>z|^&$N*$C?zJBR z6dTE@zk$;rv`Fl}$%Za0eZDY0zUUQ*Eyz#Yu zG(q$ur}|-b!x#aI@;*uN=0vs=Sz31yko+Z3PiI7$wLghRP;YaRRFs-dM?U5(-3 zi8K;55Rjyes8#V8s1KK-O-N=zhVQ2$fW@VHD@&2o3`b&ZH>L zvIq_X42~bgxiEsmfGEeMI}xaLcerV`XXY+(4vX9R?m9a__i&XA=45CUjg1~_Y_t@g zs})At_;|LyW`_SV+zjV>lV%>I!ReiD+v|k0Dby(;?ZIPkaKm$3Z>{fyg}k-~K6|DU zqjA~sk6Y+gb1H^9)S7=;A8u&zHQ)R%dNiM@<%n*p$~*vH9gcDv@ykg{Gi4U4H@;h zA=%Fj$wflqT1Q7W#dSFZ*S0po*fg<)yA*h^0i`z~J+m4_JKuymZWyBCZSQX)4A46N zB7#lqI*};lk#Z=HBy;;;*a@INotrg3ZXsDXdL@AGu21HqlCTko;$Rovi z+!T*DC6N8gnEg6a#OO%f4UMYLAAyY?_rS%YzQ4oQzZXA^)HTRFj$ndA6%tIWzC$Jwjs<#HMzPPDzH5NOXw5uQ*laT5Lh%{_Xb<$?S zdq1=E0DfpDq|eytl+U*IDlYFiq#?^Xkq%B2gtev~f)&}|`ek6eJ_()q8go#@s-nL-LQC2UuXOeus9(A$$!28u z@*(6r24nP_@U54!qcUgQy11~Fr=|&v>gyX zG`xEm>f!=t#${F)>ztjDAO7>=rB5LMu^w`zg{YdSn78;HBwX-4H7&hJ2OF>BrPe!v ze?I38*d?psW8OUO45CBc06CQ(homts%0dDZYgc;Kkq9!L`dRzdJegU$gr2dpwhY~! zvv{YCiP1a@$1#j&^sEiw9zfG?0FCL6Vq1F5EF98z(p`)!9<;_p&R*2o`dwLysYbsIN2nE=Zl99e9!A!+*t(}x72P@zu%tIlWs~=ba ze%29<7L9D>m+nSOB!NrCWSRs!rY}QgjCk`?a`pKF{(SsR z#O-$7`1?Zo$-XAsb!K*M`~$bw=sx8Sz;q*Y5zQuN9Hi3BxCcOP@@i`s_yL?zeo)1v z`>$P_PWaf-S0Ao3E3r$jzCwPsQIAOcOn%FCfyl|az=k{q8i$LxsGm|`R#NQLVc&sP zn#MW%V~ib7;JiUQ)UB}&Cm`{i)Qet>>S-kXpaVfT4T-i=k+|;-cGqcw3^dDajRQ1f zkw~lnC5|#o#^B?4LVf-4apa)BnecIppuR2hd##%>IqWRm(nu2Z>yt~v`sC91zsqHY zkxM!l&0Mo5V{*-Q(UW~}3C`tdTdU1$ANpLE35?D-*Z09hN48L+ZUH5_hX zetxoFX-1hRtn^29M}}F^>U+86xOW)m8{b3oDPy(o6gO`t$7un~siIr{K_|(w(^oP85yl zU)}7?ez(@9Z4Eg8c``rK5u{;&3RAoQ=Y=z4`qOdgr{QXPZ;WiG>YCY)^JLho$?y$y z!yH26ypCSx8@B>2j$u7BeBHnfUu*LbI(p4TMz7BfAHCwjiLeb$IvY(i;227iQBhn_#tvlV)~HvB1-3v`_mi#>nsLaWYM9?Wv-^=mGIkyYwM>~rX7tX!-vW3NVHSzx){_O#e{;?j= zk5l)~z*ca0i(rLatay^QWUvMa1y6#hWbhK44f(xN!Bg;JVTlOoU@Z~IPVh9qZaVmc z?lAp3urt;5Z<-fF}gan%vcE z8d{P#JD#+gTZV9krr&K%oAlC>bxr3jsHw;f>O8N7?6MK>%$u%?!u z2!S>e-e$uwL~&b3xhYP#hKg(Ae7K=yT{{IP9JJkHr;f!JyJMYg z@V5|uTj6gz<3AqX8;AX2(q3S1;5%>)0*#&OXi&q{nBO=phN(54V;2csez8PiN9S3H z7#vzwKvH-Jror4LaqpT;?UEvn0?~i_E6`Hb@FY4~lc*vo^mxV6r1P6#Jw_}I7F+a) zsSD#lo8sRj3BX*qcrHm(!@*Qq6rN6<0)hA41B;S|MMmOi2 zs(ih%2x3-S8(QjH8n_v{LCOYI|3wr|@Gr*3Ftc6_LVfTy0RAuVqlD{~uv{Sn!mMyT zk;>B8Gp40+`O(;d&KSZ2-$Yp?b*3o`6M>r?nxx{Gj2Q?kLkMYV8KJ2)DT)87Lg-rW zvCf=pZGCvw*=nrThiTdJOUT_Ib(XE`%lvZHUL5z>%i*`+b&b3n-dlb&p2BG^rGJBp zNN5==D0r|OZw`V_QozZ4r63Lf{%rx`0N_6sAP&qtX50O{8C#wA(21!5Y@Wff&#jS= zxt6~CcW_#L1F_xm%XH%C4xjHMUAL|()E>0)U>R(@FNw0Ni#SNLisS#-Rq`m4m%8=? zREUwNYi{Ljgw!XuO#^`X=hR33+Tb4km&f%U_k&C(-|zZ=5J#`;|6Uy9+|usM5}QjU zyzE3=DWv0z@(o^rq&T1JIgf(X)-XRAv}W6~U&Fr+{Gm~BPQo8Ja|SNKkK0kIlGV3K zd`y)>;0<<9A|H77Ded}?!KI-agrUC%awjI2J4&b9xQL{$8@po#ZFKpsID}u1d#4@* z0qou&#p;7NFi!FmTo2yFHlse=r`jp8@Dx}h$0rFlYZBA@@O18v25>G-qrBCN`#y@} z6QkwLp9KTAYhGlwLGsdWxs`%#?{6NO8*m{3qp_&m)q1C7du95u<+t?-M8$w&1nrV>$F~Sh)&bM?N;%O^f)Y@NlIt`kE}h7F3x? z`Qd#Lx5A3#Ka4<1@*Q|^xdJbnt4JBoZ%9@iLSd&S_a!S2z|jGL`M(1?Z`O>)?NG3& z7#6-XR{xH!{}7O|zpnIOs+fx2e*iE|4I!G8{|sQ7#%SDo--LVb8`06lq%-x1WjXt| zmVhb~uSbDQ#$KUh#gAov2*cHXP z6n`AA&jIX0eA%x5#{3OD0*CAW38^9<2V!i#4_{%%!{_@Qt3-{=7nt=NQFj4 zjMjZyxwTfevV~N|z%8tyV%T@hJ5+nv$5te~+z~;-{PZK>sv+5d`?<@V==d(10G{%( z6dvAdNgHNRAz6OlLu)3Ku?tg%CRCKee-m; zdJB#1#io3&1@DS%%kFkEKLSG<>3JvfnCooCb8yWqNjVN|xu`c>NQ;3{k$%&qO*s9S z(ofodkQX6kATo4VRC>l1=B!m)pD^7H6FOGqvq0`?HUt1;HX@+X^@_NGuY}#d#7unxX8f4bA_-ie*~;e zX0cO^`6jpWPiTC)2a_=^@e9-4gP=bdEhU?tfJ)rc8qZGob2>G@wJwS7V7)=vG|{)Q z|4-__5WsOexAGR^WP`U@VhI;LK2skA+>$8ofxPs(>D+w(aj?*u91g2=b1pf^zbjxpM>e@y4?K96R{N~IX^caTSb`-_7M#~DZd8=HZU4fYKG(HkR@|f zGp;H62s1BgdnXQ+D`Y2?8HW!2)!;TFkV#k*01J?3j&(YGcPb)SFF9WXnVLVP4(@!? z_+W;m*CWj0dWE+sD$LO0n!m?T=H++bUxM4d=G9{#l^jU)`tw7?gwq%iDO;Jh)EVJo zI@?GWkImq2VUgVs0ysQ5ghVowY|=;;EdeAujw=HZ$x1xRIIEJyrK1f=Z}v#Y*N9W) zI302cwc0h6Mm4VVl=x9J+5217s+JRHRtUsHBuGAl4 zjDx>HKy>g&R#iBC8;H;(EciD{1(oT{mteuFls-;!bw+LdyFdV}BMSSE!iM1eS7Afi ziT4OYgTjWTM;bo1P|B)aHj>7=l+oi(*aRBh11&HG&w}QL6;$;WtkbAsr z`QIq#;8XnI9NTAfe*m`QZty(Z*pV#A!H0k?!>rC2B;a$-3@7)>9|2e;EgUH&2txS) zKAaRsfLEhHVDJekTwo}0xJe41k^+Mb1AHX-(gz7_|#&E0~lj0#(xaPT8kkLMET4D#PJ==oXX69U+5dphosTe zRnL?hJP{zwi35O`1&CvsTgd?saGnVpz{TSQoJ8$i?)qQncE}-PueA_T`5FXQ8LfAT z#hHbc$Bxfx!It{9q<0ZC^7|m@`pqb9*FO;MKC~4iS7#W5j?s@0FP83iFc|HT@73lT%$1lf8WPsx& z5yW+5fl)@1Nv}GZQRc!D(Gfg{PzB*l_;{J6Du}kPb~==w{}jEjg?<-v!ne?+9+~}h zD`dqB{ssc*HVR)R_(R}&!7F3~6a4s$F6PzIQ5^4>wRt-^V< ztGdf!ygSyvPeih69Ly3oI=qNGud?O;h8cncZU+Wt%6;yGbn)b@-$Ds*;re{<({0;8 z{bvA^8w$NX98R%Fu9uU#tistBC_iExPws)o%>_c~daoPy|CH%?8DQ|9u)u-)W5vac zT+HH<1n)Wl30@e|HBw3Z+8YNF{3m2){Vq!8e8tDaR*1hh$nfD#ka->8oKhilg+kf) zjX*C@C~RA-Q*p`2g$jL{giT%u{;7g7uNZS86s3B@S&OB9SL?+{GB`G_fUGag{W_YVQ(+o0&&9f6NO88gAnG2rkLo33;% z8+=z3;O+>R6n`n;s4g4_=;efh^M8Zsj)T<-S_=; zgHzeHXmgXY;FUO}8#|_A`=U#M9p|ph)lPc}hXUQorl>w{Wk7ys;MYgLLe7YP1``Oo zn#3gg4cInJ+|2}QbNStZxCapz0l3QvMCQovmJB$Y0kFcm!Nc!f{Icy32LNBS0C51Y zw*`m;fPE}L901I-0C51Y2Lbr*X}-Jji?+W`_Uu3$820@Z<%nb%grbXX;S3z{A6+Z{~i@z3M_>|ZB& z{>T3XqQF$rw{-PT>MxUeTzFxKe>1c5_)wfzh*Kvx4DoLvxng;HBsw^sf&=YGK^u2M z_jY>0!*KQ%Q4tb|!bfSx!<~ei0$)IUe2?K5jYyRMh*$hj2YLfOJF6(-JOqbT7uRD( zM_#7&R?+G2!7N{-5j=_J-;Dy}as_F5@+%;8Od$`>Rm^c6XS9qda&BJ+17`i#Yh8oA zU2`%X>^+Xt;om{n9@5o)XmbqD3(Yrhh6ub_;LSC-19;l&B)BsIeVfn@LOUYR-xAtR zXnO=YNNA2wblv0G$tT4RZ+7F|2V*ES?ejQ}ca1m**Q}3AEd4sNoy^TYH#Z+7mzLG{ zV>DcQK~&ALc*oc9KE)4^x5Uy#Lr_l`j+#Gq-9+C$#fs_e&w80CPTF^AqIl@y+<8c{ z1UhgJNm8+xp2b=`9LwuQ$IDr85H42hM$gSz;C0m>mRoSpym^gjZ{v~a++k88V0`f4 zMhufOX$Ytrojzw?CXt;oCDHY8|445f8gKp^+!X7k&9VG808dF|>73yu4)1E1*ERc~ z!{Ey&x<5-oppAy=+ou4SO)Tiz_)sQnTFVj6K?kErz^0m7;>|J7Pf?HAX6=u(I%qSy zx(~~^3#loGHFyhgtKYt@@pQN7NdYH366xdiMGyv?$r>3kpQ@L$)6GyjgZqh~dS-EsdpsQMra9ALKIJ*y{$U=~9N?hL_Hh^|qF z$Oa*pMFX%B*(3zBltS>h5KL9+J&+Pf zR}A@yIU|slF_fEM4>lL-coX5+ zv^SX}AQvD^%-LG+6=y-Q%N$kM74!6@8hVbuw6mlrY^H!KD% zK=y)>_~i^4VU_P7439J8*9%$^(0c@)SQglF`9%*AA#Dr+Hu`D6MkfxiQ3i&-5n$*z z0hTos&`ALd9T@zgFM^O9L-ueh48a@f1hxh32K_ogyjFg%CqgjVg#1EaI1~j!H%mx| z2|*VYF!Vm~`zr|g{0Z07*p@8lQVW27*aAxm+Mg1{b---qP)VF~Xv zF`p3FyHCsn>GL)rM~;j06+r6iy|{ia-#kIciC`Vj_B=L8*-yBQW)0l;{Nv#nj0i_ z=xah=rWp&pD~HZT55`%aaF-t~SGeQJRy^`ndSdB+Mf-Sp@wRvT58T3b-o{GKKEZ;AN!Fn2(3mQ1|A2FRhq|z{OG)khyyN zWN>F=k-`_mVi87TmBN19RR}>x<7$5Ds@LE{8*nYY!TBgvYW#KZc#%ud*+0FWFl*@y z=}A!AbErf&kP5myg@RYGbLi=)cvMkkwviGtp7NuZ;mQF%^>1S>T$J&IC-||L;4KjqMk@BdXy>MHO z?aMU9avsn@#_Qb!R;`Q@#%B>e#ZR4o4L+=bzh+k14HpLhzp(&u z0PtH25XW2`k|%}A-2ltRK?vpsKnCw2-f1vp5KJk6Lg}_b?D>8Hs=EB>9Au?)iMv4e zyP1Cpq4gUYWm*E*{e?t!Meq`$>K%n+tyixq46B6g3x2= zlRY1Uz(kwh4xS3*)E6Nvq2kxacCx)|Eybt6r>aV?W#wst5d#x|TJo0sf-Ods1&&;CKW@gKq;oIX@H>VfVt6T6}EI-2nc!34b z>-iWg@|K0(Gs>95&GdL((}NsrjK4j~M0}&H4{c0bZ2WlYo_{VP;x*G|T!h`h_tU)9 z*f6ZG9A$&~pv57Om-8{wP4rDFeV4Td+YpdDDUeqHR&mK~cja%Pv%kdiF@#O5-p-nM ztR3zI0ACfvB5WqRLch5c4Yk%v&po!KR^MimR|pmgO5G3s4~fq8RyW$HIpJK|vzTn4 z7|nUM;MqFl75zW%GV60k^}@*=W~SXk@5}in=Y%S6La3Ej@#D$s7PyuQb?hJT_w|(C zwY(U#*8o;sJ{4IsMRH)61GW>qrI-vwqugc1)y(ecz6ql zLwUeaDXhH!Jj~KAs)wPboxnY{;J62wr0?yT4~@z@^hFvPy?B2vHW3IK9}!W|30QI@ z$R-kBHWkIF-G)iM-@z6khK4!NP{{_()ui667Z(%Y&!(2n^(r3$A2a3nT^pl@7R&Eb zaj|5M`HwLeZ~P8nsLu}daR0HmM6Hy${6(;?WB^4bb5 zs5U*QM)y*7Z!akg;WIhcFIKi8S&jM`q^OqcsSCPKH}3e&|twK$N7 zxg39g#~%-eXEVH=4GS%JTa=Shi!~rf?Bb2ZJn@%#) zDX8v2l**p?or%e8ta=b2kA)Vd0-L@?cLDC-j%rlhi`Y4#m&-i=0wY-Rm(!yWf?ZKm zJT$u;BZlf%8K>(LiIgv5dKCTulOfn1pZ0$hQf;?X&k(ALZ?HKa?z>N=iM19|$Zx7? zDev;0teht7=60qU)zOCPnoTXEh_87TL6GvySFi~{%Lsu4XESTChhlHIo?}!sV-ogRjdV0043ykUAgU(C$xc4M%Q%FWw#Aixbx)`V zU2FT>-3rxH6ty3l3ME%=CZEif_W_){Bj({-WzoYupKg{Zd&d60aG-wdhtJ^tbZ=*> z8jES!03P7&$@wBU>O{7xA~0TZSL4C|!@Ox{_(Kl+jK&N8hLV6h1yTWm~@#m28KHtAz- z3K|=R`PFix6l>)sRHfVw1Ds`bIKEZpSjy@MI3lGn6;{iXMn4T0=+jQr_An5E=Dz6*dvJ4K_lioi9Zx4?|XvCgxku-KrM`eDZtEsygCg(C>jRAV!Q`@i>L^}?rhEG zqqbBBh>D^k?tn2Tgo&}JZpu)s>ENS8+bz*cNz}wsgvB=kf|=d@@C+SW2c&~FWqk{oSFuG!t<87xtuM_iu*gbE3zHf5msfRkJN9?se?Q zW{?^GqIN_D$e7eQAzZT~8pxy>D9l@hq>x#j9Ot0B<6y*L%1m{Tx>M6ZA(Y9tX3Lv{ zGwPs}6o25}1fMF)Q1lTyP_cl_yWeqSB@;XdVd69y=Y6}8P7dcN>K5MyVWZQVtSh(S zIuO2~Jqx&r;2|LAdaw5awz*5621%J3cnXfSiMK(xd?d8JXOJQO9cTz>td3#@D3*6d z@Zd}Yu$S=>;zw>v+>GF1c8RcIc4>EzSg&339NMK`krCsqYnKRxu5E!&WjAcv2=Fp; zraGHY=ov%vv#>IVujtPrEK0esNWq6-G$rhouVIYM86zhVtX&e)8da3)HrFSkP#BU^ zh4~6Or^2kyF4YK74TJ})22752iQi?=tuY)8z5`+y4gQ5;kndOFmG0pj0>&d2Rtb9$<4RfFCY5O( zAAwO+T%~PSFt-F5pl^jw#P)4XsCLb;yFJwJZ=me7Z$<>%)ruWu#VxU0c~n(mxRvby z=heYG;2Ug=HZBjfrl-0ie)4@NSvsoQ;0L9{SlB@vMrW8r6LiJxdk7h4fE-+8MAQMT zYkAQl64AOwUTbwtSdzMSI0VnSCXDb0?(OlZl3l55$FOK>E%98yP5yU=)7Ec}J2n4A zF!`S&`Ii`#T>uvTWi=8V2l_XI7^=I%CE2H=x)XkoeMXY(OKi8ouo}AhCHoAJ>@y*77ezCI1Ue{>e_2Ka%J2&^&(yaFgfV;k0=!hj}J~$@6r{v&2AG z5OB$KurqVIC%lqVI;y+j2RS9Gg?M!|b(C{Ijw5{*pTa=a;OmT<)#aBX6s>d>g3V#bnqu;m?jy$IA6inX=w3EA}7DKJZ$lPCJS~^yR zoSUv5$H=)V6B5B`ii{=426FR+o?9VAX<}tyC77#mRU=%V6vD!0Qc1TDB`wlsnzSwa zN(2bS>e}Q`CMtW%tR{QmPGlbd&bmffRQV&aKOT-q{n{60Vr0KRoL2TYnc+aS(S8yk zB762(|88Y3kt+uP!>sDm%g*icJ?IB4aVrNQAX+G)Ukl}61iKaf77jt790EsvI|ZPt z3Ev8|N!z+YKN-A=rUb>2tnSBXxhm6^;!q}tkH!auL6^o?S}2UGSr}w9!jlj*+7dFR z#M_4wmjYp`rVQA(m>SAP%Yd@0m4UD%W$i`LNOm>M z-!=mhP4MhWQQ*4_Uk;qzgQOT~}S+4^p*)@CC zi^S#RLb7YiS?p3LySAN0BFU~DXWhrZm+-?|S!ckwX^s`lqCdpn`}o6HhzE1gnGlvSx&xk$K8}Hly+;NNOdt~M6GP{5?6ZKOl_Tlj z9&+L238$S4yI=#61Rb?5!mF$yWned^XFP<&VX(hOtem8Q(bmfZ+9a={M~E%H9xir} zNO>_P8QsF6V1_EYUxs3gf*&d8Mbw>US7Sek8-kPNOKkx3dB6aop>zVg{DIrf#Kb2Pm3h<_{^ z{^NLF3PdE%ezVYRN6I=!qk&|Ufs$Vd#2gJps&+%?1vd`MU+o_ivS$B;kl4Soz!=*g zmT8qga34W8RRZp#>841;7M>66NZYg!aHH@6oJ^lO-_NhCIS_$5kAsnBGRBVfbKz+J zB8tZKf69;5?eUH~(du^A8I`Z;_D7(NtEtfLkv7_&reto`*#JVPU%&?<6t3LL@d#H% zIRP#z7y|~*A(C4mOm(`1k=AKNyzZfAn!Xq&%ivUR( z#V&NP8^S0#iGg9%-Zr+0djjJ2{nGWBT?MTjbq_b(v{jX!a3nf(fDF(n5CjseI&=Xg z6diB9^Nz}edLx;ZTv0WImZ-)8n{kt7mTAgKbr`S;S=K%y=aO;!%*a)BhGkmQ8A(BO zW(63b&QN4k{=ofpx+!wF7t>Agh|a78c0^~s0l3kbC2(4ufxZ}>A;PdR@|Dc_`sVKH zoNHj)HWj`Z&*;N}=!8Na&PEtSBPmuY2oCn7(aQ2}L|UbEQC=W3HmttnJc6@LTCv^A z$;6ilpYOm$DU!~>DAL3}C5F=0RKLwoY+1rbELL?X0Tuqvz(yh>*OE5&l6Nd54HMNt z!55sbL~Lpwwqh|TI|b+ENKM|;&dtwf_-dMF0EW&`-#r?0w2kSF!v5o0%XqY9Qq^oT$C8ja z4ce=Lu->b^qCKhEE1@Fx>T;w@d&N3d?8J{ubRV5V2R+06Su@z6-dqSEs{i z?NzN`M}+_1e%;S05!b(wAKUhQUcWBx+y}**A$ew+k$&BeAPhV%OPhBYm2*^8xOOXN z08fqB*>F*588EOnk=zPlYQ)ZBs9WJ@F}BgW)gKU0;qQ#Uh`ug^GnmJ!a-_oDN(hqq zR*cWbyQ%8;7%?ZwpsI{wLN?VWgwUC!`3E>l57u-nBo$r8)^viGFk4yuA<3dSCj0rx zZiW6JU@dS_4KNv;(UjY5$`>#(6TzTMfA3z`r_iC7B$40Jt&pL@j8f;LVKof7;f=Ub z0aY}STEHg(O;gdP!fLCE5LKvB3sy*1kY$V1C~K_+*R!zMj1Q>?cS2J9i`D}vL?Os} zAf+YsK-TLtkeOhh$ir3=mI3K=K7#dRW~eh-PpHSWdLo3Ro?HjcSWlS$Du3YqKHXF! zxR=vSaY;S71=yGZzYU+ka{%n!u5>VDh?nar$;(hSky`X4AedTo9&v~D6B+zv{ls5W zZa72FkF6`8*H28yBL=f1-=uB&1(*P59l4ZRIjSl=xs~$~u65)RxTviR7}$$QZiO(d zBNsE&t?;9DsIKt zRcI`#(2p6GlUS%i{~>8Z1pAs1Ru~hlI*c8yHEl{;(>jTr&hOx!4hT(?Upwk|=m6%A zF{Hj$I?U>QsocSPM#4NSJr|T^DTJlFHgP*>nA126@$bY^h>z9aynhy2W);lm)esR? zTUA7;B9$6)q0|tTC~62Ltu^Eh7V)rl;wBUa|DyFn3Q)+g3P?#w6_7r!1d0^aW|`%% z&r9*v`n;QkI-+%h+F7d`LPYAuufP-Q2E|k558OYYo9YAiPw8gqNZq&x*b(ht3AoYz z%i*+bNNt=%gfG+o`zaM%@59fR>A&ajNHy;BK!2XJjsBme`Y%0@QB~o}t*k=0>i^Yn zQU4i`uecTZMfbUABwgWa1mhFMnC({R7Yq#3ucZ51P=2@aGdR=1iEJ%6FuIJfauNvx zqq)>(Nn4|fS-u(f@E~JQ14%-Y79CkEgCXV`f#gVa*R-l$W{pCq!8@mZTP@G3TJNR2H7_5DBLs7&;HezIqcw zD?g|I`zZN7UaCM?^*RRRBo^%1evD^`Sd3ptR3f7nv0*BhiTOjEVovEQ2}AS80+$Y5 z^3n+WElg6lrd7lalv^qi)jD)Nr;<&QM)MxD<#J&AardNU|EH0hI2w)QT?ZW*7RSf zi2gr{gsJ~5`zn9nzL9RKj_CZ8z~FqttpLcft~j>vD!&B4t=x%UF6nxe+r)ntesvdh z?Wx=c07G}R4WPA(tF=xV_i%LfycO;iyou37s^Rq{>@Aj*EI=kU?bTeQR zw*Tsm+u(aJ{1>8|Hest{gF}gof36dY?Q`+1`E(aNAI18etlH88!NM8%1LMwn*na&k z{_X_|B<_%Fa8dQQ%G z{DG@86$6vWPW2eaIq~;&r59RP={W0Jel#xEM8nF)Nr!ZOZ5H#*J%kWj)|b%w=T;ak_shQB7K@pKEzg}fYtd?@9wwqS4EA4z2&P@!w2 zv(I+8=WID$xBgRIS!c{Ej`Qj&G?&grfYFt3&P3c3meEzd)YALf$>~^ z8`^Z8d~5Yjs#bo~rGtA;HLUA*v5dA=GoL#dnw4OZA3-NyKSLiB*F^VDV{?K(;=vp4)O@W4KYS;c4 zbKEHDPG?%^IyH>Z5W>7aYm9``e5B29>P_qFHhSObR7{M7lbqu?2fjh6ZCSc#thK&0M*ldk))X%N!GQc$SlhqdXEL?}z4VpQ5~#${8W-{E(L=6K&}3->|N~hUtE6TnXoQC{?zw3FogUE!B;UAvJY9 z5xSmiR#>MKJ6QF(!#N68h1RFTxe#$TL4Tsd+3p|KwKF;d3VR-MrYqrm^+C1hP0j(I zg5EQf#_g!Tbd7W}|FkVm;e6}*@KEdO+26XRp=8)HWu1SVXWOH@fu}9gPd~7(twB#= zAD|S}bsi+HuE)2vuG67)3j52O>Kf@ZLqbd=;kY4Ti1@J~oED)&N@ds3mi!P>Q&`utwuXK;jC<01Hgu6G%Y?IbjD=0=ahzX5 zUg#Nx^kR^t();0e)Ya*H1$w1c>Os`4`Q41s2$YDgX>)LLFpb)_IwCC8oX%h_x&)n ztx(TZy7!E;uKSS>rF_cWmX~uDSX!RF9{G&y@2E0u5-hOSXrYoE`9gw*c7dYg5lwh*-v2WU{XrOdKiV?IyW-DQ26usb>Q$3-@qRXMIcPiW zX~H?%lzEfW^0*D{4P7UNynFyWQW+8Z8*<5iXkCme;XGl|=x|;EWwmv?A8uWb0Z(Cj z8ds;Y>1*0k80maBv~}-%VC~w$prSqQUv6n#{|a5({?x(_ec!r13S-P!rLe5CWtX*P z(|5Km2UKX`Mml%EQfnGlgs#2bv#^WqP*=jaAJWx6`gza|mOlSI)uCUG-|#=?IImz- z`pKmZPH=`TJOm_waXWuaO>7WwpZg#G}L~-r{ z&Nn62%A*u=2q52+SlgriDu)BknF2X#p+W|bkL5C;u0KQ}yW=gYA2})TlZXB?)&tIL zK*-@)CiO#{ZJY}w7jIpyI18P
      t+cN%_nbH3($Cb6Cm`8mRAjFIPaLYyP8<&rtQ z=}t@M2xk;k!#QxZg?!sNmg?c0xt~IIcYftuFR`XvqmW}U*PsyRR)w7JJnsB6MnaFC zV`Dvw6I@K|7{l|i&Rc+-inJcOMR687|8@3t$)S6xLUwc9*!?c)y!8`H$BR8KkRKo_ z<+Hn!G?3FmeXci_`Y_6jw8l!0`FbUF+qJITiCG>~%#Eo6d$+!NM< zNe1$#lPpfJfm{P?r#w#q1am{qhu6c7|ACr0U?4BivI}I3*pu!c%Kef*S;$tgXI&JY zbLk3&a1#6tp>q}Lj>g(5_9mu@9Ov$B6tX)`ns?;O+YMMqaSj(B3AIo;b-Vyk{|TTW4lP|7liq` zEVipas%UAH=PP5F2t(?#3}jX8%2-u!KE$?h;v5^hI(D9LI6X}3n%I>}`DaS!%-A)t zp9$n91Nmv}+St_snTvLTbp9K=E_SWZ`Fcp_`q&M?ahzZ5VEMT|c9X<9!_ZlXmAu;p z;=E>YZi)R?=o}f+`DN@u!Pzn_i`!y<63FK0$!RWr6?tM>{x*;+uB0jj(tPY`rv7s_jhAU1+sfc`P~@qctGkqg&Ori>@2|<8A|Nq z*f|0j3}by9TP2Y9Q99?rnk;laj$IMI6y<*VbqYb+I3ZWhWP9%(6m7Q0PiHNy64S~2%_ zfgBZ5Zg6p71XAD3P+o}FQr{JvwT9<^;LXYp1v26mOJ{`Zp!PL8o!44Ovs)*STR*gr zRyQS(d5^wO{&(|F*kgE+pgml%NinId5^Flzn1?RP2 z*;w7KFOU~+u0aX{c_XCU?G`2VNB^!k|A}?GQv|ZTfi&P2$gS%fXyzsuFOr|#v1j}% zb!;8BIb9)l#WpvPgCmeV1?L>Y4{`SSKhEAezUS-x|3BwBUS3fnMvPjCT}1`8YStcA zp+?PE8DxoUrHK&KC_>Dls;FI?re?&b)mBT@-b#zo8ZCa0>zwQL%1hqw&-eHJeDg=H z+x@!EdY*Be@fikeX+FE+(hM+gKONV86>ACI zf`g5vD$E^sm>^?|(o}I@MX<45X~wy)G}zdoG>xw6bn+Q7#`j9|HGY&(ryOVeq%>ae z8>Fcx<`_PXWaM6Ns4Mq*MkxoCCmAy=g{f;SGJKV0DEAH0bWs`;cOodvN8)oM4nEdf zOyu0F8q16w4)Qk3_PSDDX6#g9D!cpG2IH86YQ74*1f}z>+-Up=jkh?7brfj^ijBr; z6)Tfl8D7*lqck1eeQc9~pPxhSx4Fz=VzYtYQiCR&^O`HR8IK&aimQ&%{Xtn8xjT(g z@I2lk3*^$2%R{mLMao)p(TK`JS25>;OLNT_n@9S3i_utFQJ5~mHd9qPZ{kXIET=h5 zrPFhYOOxNk?K-6V21c9?Q_=iMX->CxX{wkPl;+rct!XN1n)g-8KcSE5ST)T*^H7bI z!a9mH0pcz5Zx!o%j0+v6Av6@`X@V=vJLYqhPAiO43NzGbMjC`^^tIM}E1R3rNt!#! z`1cC@A?G_E=%O}JiJJj=dkE(u2!*%+;GL}Vs28JPA9b{Ty!%ZD$Nf3 zr*!rh-OVRTGe1j**<$oGy}hXBH=|Z5Oq}Rxmcoee7NO6y=8^HC`IZ-zhkgiEU)P6b z9Tnzh?AEm=#5|%jpP`SDCQO8w$GoV=L_X%=BqGi?pW*0B}x z6$bC8Q(kATQem3I8@n`XlxDeGv(en7H1*smZ!>o&&3I0^i@D9*t2Fc7ns3Y_O7qN} z&Nt>UrTNaC&MxyurK#=?v&THAG=1HgedcvlKOdlHQVA!T`^?))``V)55JeV9M91=55x5i)=H`YfCVexBRYSVZ~tG%fimwwvFXt(7L2HJQ-#P?|a(nm$UCcW*giPI`?-LD3=j9jMP~ zRQ_V(XB`lx6#6P@!o_81DAqhbm*%>;RcS7)(wZ=F!`$&&GQwn~yTbfs;&%w3sepX} zrE|`FY~q&-pjqV-#ktC=LyUx%fId2>!xFDGNU@ z4Uc^Qs~4@QZ`DwmmhjMZXGj?XmnNuVzf0(Y4C6jYm%)nrO7GJSSvzlsMhE& zT#U1#lqS|)&l9YXO7pi{^NAI!G_)txv8Gz_N`sHEvu3)Ls5JTAC7fxEQW`wc#9?Mz zqm?GFyUg>fk8{<=LMuguiFWsdMb@}{<57oKFyiPhTr9TIRGWUrmk}<$vL>roIVD_U zO;MUM`CYNrTGN!~w<0dhI%|5a+}B$(m1coE_f6IumDfnDk?1d6Y_aC6bgH| z?Nyqb);VGA&sD;c)&Ujfg1fi;WPPVJ_-L*A3l~3IC)8;ABv@+##2M>*73PGygy*55 z`kCRbv5VHJTzOrxPODh>x-6%B)4HfM&)w~Q+q$GQjofYVyLClrYPw5!&$^~G+uc3$ zzI8)s7Q0h^VBJ!h9FO#;^_$YxTUc47am!ZdJ?W!wHYSC~BZ3l#?M`*F%%w#-i{ zUv_Kq+NRPRa@WRdww<4R<{Yf|=?}YpJ5R1K1?+tILcOOKEoc`|VeqIo$0}?W&K0JJ z?V~i4+&#+2E}=9t-J0TdDW%C7gC*^ z4clLZdDE?V)2^#DZ@7K9zuiP#`#r3k=r2MvvfJj$tC8JN#cJiA(Hh&GRjjR#RV36{ zbGy6Jw4LYDw6KS$SkvA9r=>kqX+{-uh3R02D@|W_dEU2Um1eE`+CQ*ID@_r1?!E2t zDlb~^(O-rbWKUIL%9U`XJjkA&OA~I-SDI&qU11XJWx2vku-E3g_H=t&t}wIhow+ni z?W|myHTH2#4Bn#LY*$`e?9)oKd#FpZ%|5GQ<;-81_OD8lGk<++pN9s&^X>K%MG)q*l3H_E9JMbgjjkP<&0U)FeC;`!Os=sU%>Ho@MlGD#`&|189!qEa+@17|Zh)9mu5mJ@4h`Ed>rU+Ad=Po4=`p5+sqdh7>pOBCWL(!DZR$NT0S#VaKKZh$Au`_&U?qbXfT zi~*7jQBIOeaNQ*P<2-`oyDU$ZA-$hS8K~2n!sU2cRhRoBOJlwe7m)uWq;oab_1?wx z(letZ>4`#;kI=4n`}vESzY1|5@#yK&yO4bsQ~R4@cQ4A<6jT1Cd`uCFvxP^nAAx)h zS!;~G-nzJM8(*EjuC6<$UaGCfy>#fyp`NcI{Qp!>x$E};*Y{bz&TiGI98%mIfICNc zVKx# z2e|u?|qgaW*iE!r{>v|o;@-F&8f9!pRv7A#&*9%>5UF5$h8E>0HMt+QYR8$_+ zOH0VPknJF;e%^zm`s)fw^|u=NKZAV^pU3EzMP4O6%v->yrS#ZdSy|u9U0=84F6z3vC9hN0)h)T0y54Td z@2UFemV8lNXSd{Is=m41N8Ef$*V8RI4%e}%U$^8Ph_@KBjcUJc z$#qcfFTg7y7eE%r^{j{d2KH>ko2u%+j<|#VTNzv)($t|r%y$@OD${pfy> zf%??-qx-{hu&y8USJjV9q3Z)*s#g8T6uO>F?l-2;^`ra2cZlyAAJiXCfnDRqHBP8s zoQK{ueyBZffT=&+gLI7}>KBjEPG#N^LJYuDwr^9vkmB9C)E}hST1N;k=!bxZf-i$3 zA*&1R4*1qSI=8F%tQwoF)GuMGK5`8Yj1Y(eeSy%&#>6iuB0OPJmx1jd%-N3gHJi z1OBh_08>3@Qe%LhsJ<0nbAmn(!qta7s`8bh`aGSE9`{m|?5flI`~<$diEv#Ip30%q zlVYeUS57^U-}mX?Bl+uFT7C&XNPKUffiouD|BEUh+GwQ2tWo@EIz|)wl=H4e}S1w-+Rx zxc3|2FPc6UVi05y(hVC>M|2A&iTXi&@>?$dNB(dm^yC+4etXhb*Aw}N#bB3Tq<)@_ zc+~&bL+|o~F2A7tTu%MH`Gn?|9?4^H-6YQ+Aem#Q^+Hcv|912@k~B~E^yr7g?Vu+= z(#}Iq^Lkef-_=9^)|ccrdn5;<-bkKpPBJGyYR{(7_qd?tyo*}iL;W@N2uJy~v6#0&JR3Xt!$rFqRy)MA+h{U_djV%mHmQoN-o zi+oml=Ug}4TS-IyR6dgQ3@gcl?X{%wLA;!qo;oF-$V|_-68kaJQ?A6m%=9EIvB^x& zuM$sUre|S^4d%?^nhP`2bFpME#7s}e5{EF;I+plDW?G*T$1~G9mG~tyt#^qtnCYDv z;!e!;<_z&xW_r(t_-AH%pN5$H2TAe+B&(wb=BV1?nACg1= z(Q*{>pA3Ic7yV~C>KQGPk~2ZsopsAVPi z7vk@-wA_t$BR-1$Lh^0&2a*Tb{ter!qnw*?9YvmMKP**ve>`g@#CDXcEKarid-;nN zWhuVD*iuHzO3Xi%*IbbKacRxvm`Baf+<-aH1w)86|XihoV1jhkxFPd&eO~{KQ=x1k-pK2M)(p zQ;!EfQ5^ZsF6t-lV7x3U>MwSk6yh{qkh%S?5c?26W*y#ggPmk)pE{!7T^dLJ;#?+` zM~a6%5zrN^aq#s;E_lIV03vmqkk05`BY=-&$i?UKQZ-mozl=rJZA$~(X zXM5@KOY7s_rTxX9$p0DiBv)e`&qsfJiST)m{%UW0*&Y37QPD!;68eubu#i}SbmGet z5`ImwUjeW4r|^YDBpQ%p1*|VfzQ^)1%0YY|{q`87WLfMj&8_Q`9pfW_$_2m4vS}CH z9yQ=lGi+;^6L689avAC`%Z{X zz7+&L|J=o@Ag-u%rEsD>XuUFYF|{}Lcj%AguPZ;-Tt}tXBe_lmiU&Ure@ilQDeZfD zBnLoG^4oGG{e+KdSL~05;1>-l_=)zru|KHbFZRNp|5Kr|u+jhg0{z7Ffz-}^qRk+Z z4pFup)?b165(s1s^bhJUf&KkO2l$aXf&Stt{1)}sh+y0+LHtoH7a?6*&wYpf5msJ` z578fqJ5|%tuBoL&f7*uYeEE>BtBx8MO_0uN#D6zXie*^8b_ORe!@38Yxl{M|EJ*6_ z0dMGZXkFV2_H9@Xuf}|Iso&o<>Hm;!LxiL9)+it{L zgz;KVjR&m1ReedZewQA1A3+X6Ic}+Nu%rAG|8I4@m{0c#v7ww4|9q>%H{^J|P<{$` z<0|eaA^wjnUm|`4_%iB^_FZAMXkRVGy0_>Y;njH{I#AEIBxyZBQjWwkYmhXrkX!-( zL^8lv^Yac`7J;9O4m8E>_EZj2Y=@rY5X@U7*Y~IEH^ulqwB9#GL-Y>{pB$s@^)Qc6 zxQFN`bR9o`kMJmWGx*sQ$S=So^D;+3P6l5>dNi+<)gxNeU9Y{)DP8bQEo>G zo(*2g@z(JCn1FT*MZ5k_?Nb^3p3>3nlG7fpc5tW6G z$eob1&-npz^L6-j$oId({Z@oeLHWoJx2{d=V4NGE+*cu8>CHlVml3Wf znTK>cciE@=$y%1V%UArIE?4D#y8iUKz+ZHMzrKU?T<0o#M(A|^fTVE|!F;qA`3+Ni z)LYx5;1{SJW~=&>;(M-72kM{BM=oRCLFX)U;NKsk+%b^fcgqL_9eVwkA5hp|4FR z(qBA+->W^)Ur3CjmIDik6F1@ikWbTt@P89sZiim5g+zAzW9Khss+F*Kzh8tj!RP@(Dygr*Kyhj`lU7ewsgr{~>)5Nb>Wv ze@;aG4M#iAg{*!+=Z{xCRQ?4aKO5L1+10+?dQ$uz$#+<;XW5k7y%Y1BEQhg7<$kh+ zWfIFdEWhJ$*I3?XeLa??S#D;zO^xp!$-_C{Gpv8k@qO7|m*uA{4{*37=HeXQ)t~1u zU*dEJsqpp0ZzssE6q{zT_0)bB{T`k|{|HLXgE9_4)ssC=({y_KVSJPjMaLMmeJM~CT?L^W~EQ24(J18d{ zozoN?)Fb&Y#!JCm`l75aI>=8rPT<$=ab2!`hh|fhsEG4~L8dtM48Jx+66@3&2&eZ; z@XvUDV^Pt1LOq+=z)$qXI;3$uKT+if{361oAbx$wUJ1}cHbTE^0omXqJS&QPKYl1g zM@XHozo@<$;}Le+r}Y|yeF}Im*!)9?5XkV0+ArjPs%7RG@~i$L_B-6;9^@~Uv)stC zBg+yj$Fl6nayrZMEWcM0_5PPme}9_xFO)y|qtHJ|=F~6k=SQL*sU1mDJCdYx9g=je zLz2!RNmBchr2e4n=pQ7hKaiyMCrRgzB`!Ox)yn>j{AxP4B#Yogo)GS?3 zuKJ?=V*>QL+-R?UIvnX~eeq8+^$RKDM&rpgkNz?AGPP5WWV+i+@@#W0=VHEV;SrAd zR~y(#-v;S~!GF{IvatcqvA_r5$BFC1Ka<>5Tg%`#b-fltxbbNJZ5f&^`1z@b_wZku z$6u}IImqV`#w*ERShhfaAU=)jC;1KQzhhp({2As+vX@v+Qi_B1w7ie;yAVwK4$5~_ zO_;$8Dc*`+TI%^HAX%?33JF&_D^c$>pAEtI$wa=pnDsd>&g)ga0m-$y>U{PD z!cPtYchl+4QW9t3Xb1AE(@?)OFYZJCJBE601o;ExJ9DxAh4jL@=^P~azstz)^@H$d zkjIZ|SrzSdpTqs-w&UDEh4T|jZ{l3S9X=pAlgrnJWoP&$y6zuX9%Nab%lmMmzTPU; zwd{fVr*i*|ez2&hZvU5Pw>bDiV=&IC7vc*>kZaKYNiJi#nC12oS|5b*V+{6JZ|~-d!BX^Fug^_`-on$VU~2ENI9JMurT*qGW)>#)7qyCM`J81Vq&s$i-aiyWdNdD~ zLi`9$?*Sz3|JM$}x)b_a!T1#`$iLyI-hzyVU!dzMiG4rG)`>d*4j3PGVV{X|(7D0n zSvZeI`XpOI>T#;q#gy(R2v6rpYtdgRo!d3&I`#VQJ;?l+H%U@|B}vy;cd)LzJ)67@=w{1Zv?Md01Thu(wh$SG)-0g&`7c|#zB zi(uUd`PJ*#*FeUU)ZxB_eI&SAK8$O~y$DC~KZ2gPODXs%$Sp{Z;{Ss5DZOg2kA=Kg zT!;yf@kp2S$2s0lh&Kg{ZMI711?-gG4&*xnas})ekli@^1%z7wt^z&DD+ov7$AGDP z;ncqdJ49AA`DKTgG@kDFIK-BdSl?J$-vu%^r^5fzxleBW=eKn_tam>LLiZQS;GAhl zh?X=z5ieyu^#|g0%+xQ4>HY=DhA1D&DQu^Cj+pLqkla|2q%Ln_e?N7ff8-!P(d7WG z(|I^Iz415)Y=@zvmZ;s@00y1~T+eke$6f~;OZ%g~}) zUY0`af_^^Q_ZatcdftVub0p3y)%*)d*GH`8X-K+0Vl`hw()AFlc^i_hmzb_=B+6ZQ z0M#?ji!r`Y-|qUPbNqAYzdq>iBpdhDvdL_c{sL}BpO-^k1~+-8Wf!zRouj`4N%{b# zcZfby>73P13~Y{b+cx_89XNlccd#B7afmE;B zZ}DQH4BG!W?Ej9S{@x?`_Yd@ZGqH=76ED*gNE3 zD~PQq51sRd!>`eEG*g}kaUJ6{PZpg^x!TJmb-8{+e_UqZ{y!wXlP{h@{;H(5zfr1~ zXk}vlz^itYzCFYtertzyJ7guKk9kkH#Rfu=cg>)f9aJ?j3Apbs) z_#UldDhHLX585XT>21aQcWeN@u!niF8`_uNq5K&<7n0gL3HeYv>?n+KB7D(})E@Y5 z9_A0?F$T`G;kRA#jj1|(4ftb9cR%XOiF8=H{Rr(NKEid zJ)iXY6YbefinshU&p`f->p8>}C9%K2dV}ii4<)7OT|n>ezAB9Vfp~3EWl`;PdET#A z3~$9ze*gFByVCJ25A7dabtDpxt4;W{gzpT5j>o%x1pKl>Tl zh4PJRXR3YR*>@_4uhEbDdsPtMFVgk!zbOxucOsYPzsJ-0QaD$+|6juOF72w9ob)1) zFFl{R2>q7UyPoONzSUKauKqh_i1Hh1zM=B`pW=JA!$kCx;;6r&EU6v*hDy;nO}9^b zC2>CaU)$x?a{d3MTN&xP(#f5^Za3ZU-b6Uh>&;15*H0bTUoE#39Zt%bgze1L}v%(QcmU(s+7zs2)#UhwAZ4 z_k;d7`SnD8uJm)~I|2F8zWD<3$(?Us#QWdmGX&vlVBWzwkEp6-PW@=V@V`qh6zO&4 z{xkEHdU1$yN3mal-B}0w0rbPJ@CWofhRg5Mb6KOIzlU*5c3Pj3+{ED?1<-Y4e!%)T zb!g7I^y^P(|B2_bQGSwHaay*5KO`Q&`nm9j#9J}{kUV)q%deY~tgN0Ru7r8I`b1qW z{XDU5$7yKCuE=+GU@=hy*Ow0Ng6pGoI?eYB!6V@R*W&s->;GnZ-G6>*tLybpd!61c zgeO10KUa8a2O5_h2MP6;ZGV0jyXSJqf;oPv5GBfC%3#jFOyGOXNJ?}5MX0?@+&yz~ zCcGhW7hlq(IdA@?!}nr-2KGVxftpK9+Kanb!V;k#>;q2lV7yB!Qao4+?BX;#??XBa ze0PlbF{C%_^IhDL?0LjeX4#4CdBkew37?bQDK;_B0ej;M%$dyH2jcFU=_Rt5hl9@u zFL8`{%ddD(eP~|s6Z7}rAHf%xHxH)xuZbJX-+|AF*TmnluQ4Js>qJh)*{IZ@Grn+ExcIv(6I$PX*wocLia%L{s{1m_WA_+&h# z8B{?8df49&swg5oIH6@FF-dW{%Kw9)%3>|YzkeBbVS}oP-#x;QZuypQRHXEE_~4*g zqN?H<;$U;ELW1gw5Dzx}>xr?7GgSIHHQ2H5b(t>-b*=wGfRw?52N9(aM9@2DK8MJ$O@4 z8xiBdnL+JEw<M0(1@ZUkbMTx4E{|xaH+Sdr~FA@}Ih}pjQt&HG-Vyp-I1P>BZJlHRIh&aOB z=cW*~f`i2=4}Lp1L|pLTCc(qREe~!L93~zxmmUP~9E^7!J@|v*NMXF8>xa@042~AB zd+@N}7*W@QV}j#Epa+i$P855XSK)dl27e@udho2^(Za-C1!`Zie-Zq#@b=)f!O5aC zb7SP68JsG5dGNmA@nSo33gUkkJW>43{7xJA!(deEn@Aq%6Q2*BA}V_Djo@kGedbQE z-w&Q4dU^2U;F)5G2fqxSC6+O7YmHrC$Q-fOgA0bt727?yM96$`l{p*X%ZGd>?t1VW zA&bNl5B3jPf*&=e^3Evn>0W%FpzId}_{+9^mSWc(lEeAHtwNS-GwcKY#_4ClRbsM= zpDnMI72^Gn)nb}vuQl+KZAA{pg=n6k>@NShTFg_N=4?5T=9AUpbLR1C{#h-)Qk>%a zOwB*5#YSyc{`rhpBYyJW?jdW%bq~ffTVkLu6*-Ol`TAV*?|Sk3E8#bYzdYDmY!ELz zINkbMIBVpjx4_yY3M)<*H-g~rLbiyC+U|@gN7uVuRA(Lw_5r`m+*{dqh$hUz%DzLi z(ah!DDN=lM^24*DqA!QvG7r;F$WAeY`4~719L4+t{LaXbZ$t+3Rd6DB;4A56ie=ia z@(T;e%vC?%icKE&(k)%L-vYUbi4`wAKF%kWg+`T!&=0y{+BHR6sI}$`XpO?$gI~V*rjs-$x(e zv?Js@@h9_a@Gh|M*Y=5O{c%)OW?rh+A4f%9=1T~l6>?1UX8s3!1RTQLN3Bnei)qYJ zYJGBCEM(T}qZ48uvtA#a5GR?7t*7=mDgI{m1>54Juxjh_ty2Btdr^&fo9Z9miw4a3 zyVLsd2hp6lEZAH8AUZMY_0^9enpv-}eiX^fdVO_DEN9m1t5ae#vtGabB+fGH_1jOm z`uoq~mbR<@=`DU1j}?z|mV-a}KIF7`$?NL&<-x>TNQuPc4Yzg`r+%wdS1XVdyuPM%! z^!A#=xGL5(Q1K20>Up;tw_ceFhk=`{vtD$bVQ&ct_& zL$8VHjkUcd(ti*9ui|V;Z^`uty)HI1(e{^!9|-ovt{3H(^!D8F&>P~E;#83edklC= zGi|50>c)iL6b+gar;38(us#8wVXlbz6!(C|ZRXvm-}KO1;tBJO8`?gu1)_^IF$wia z;jeDIyI0MT&dkK64hX zV{Yg@(XJ(hA17L1yhw3htXG^O)>qVgn0b6UPWeOc3$qo4zbyY8O7;h$u;MIf2T^_x zL^Z|P@~*P~DOxB_71h-B|0#Mh4|_=c;ZG69Jc4{o2e<*ITUHAV-;y&A#qyKt~N8+ir^L+f5kge(Z^m@V@ zUk=Xe!RglDqNoQiu%3vric?km?V-;^GsSwnus`&rXz#(_g-RLd!9RyuGQ~G1Kb-l< zSIdLX?Wypt@;K$I1CBtj$~o`~lcyZ<~x${$b_Z_F>?G;LaSr;Kw+PALc82FxLb}fTNl9dcaR6 zG3)h!pUhxxJ4T4uVddo_=7Hc*;GN8RJyJpLW7g}D3i1N8UXN6iH<Fd|) zjY={vvtDmhl9id)Bfqi3D$AP82f-7-9hf_(U_CdiitNff9Gni0V6J{1cZr5om6Mn= z(f*6UGnl^ze+mAAx#Ux$_+sUqn%`PaAQeZ{W*(c3Zt^CazG zX+Lvw*xNF}gYSapGH<#=_IfhYgYSaRDV`x>PvYtSVfE$7&Xiu7=n#y%?!y|&iymwb ze@EU`yx;uy6ZqrdP2}kJb$FjR{I=cjW^#fD7arbRW_WO^;qS_I9$aB~OSxU~ezWIf zAu0@SEn9V=^issrRaid^Z!1H(YOc5%ZygWsEdNxTCJw}6zcjqNl-+dx#G{7yl=(b( z{P5ngv@l!<=^!NP32FY&B2e;wr!Qq4C5XI?&c+v2| zav|Hhe~a-je5lM+oaWU2B1m3g*8U<$(o^BI9@G9JSQhK4S^JA%S&>Io zl1rGie;+NgnYDi(El)9P|2{@OW7htCjCA(V<-p)j*#NSq zh~ee1e`!2jcJkmNVKd|pf!f|0@k@rK%lpjlD4s1F3?zHD(EGhPvi=~=dcQYEwr1A* zsX4M6v)=E`kwcjEes7M<8ba|?#LY;&U=lV*28L+9xCHylu(>i>akkL=yLmEpxVBe7 z`K6dAS2FL6qWJUV19;mR8g} zgL%*jns4XJea!yrwf!#hL2!~eUv?R(<8J|14_hF|F@J`2?dgz3@(lAi6@QVehobnhTO^w^*Nvw97Rf_#+Ftag=FRaO9(Vf5{%?Zj`6yqVutlWu%&Vj*opp^AM20z!j{RCZ14FyrN3OJPSD{yfxCyTkV}}0q5TdQT_wv- z)b_5siC4=&=4f!8ur<<}r0qvgKX@iu)?l8j+HbAw!u(MsZ6C>ec&O%u%=Iyz%7v|! zC9rOx@^@3bPR?T9U55J8dg+aI0re-n-`ybf`S=Z~?>BFdk;;CLqTpDbPuce$qv{ZIm^b*P%b04%sB%X8snOWNwn3nV$zxf7mR0Fu#U%ln*#iv+`Gi!nVjYinGO( zG^)R?GLu=?$5xpa^-lG(=9aemF)u-A3g3YFxBavq-zvitXNfaS>3m|F{GRQZ-O0XP zKJwu7k~`$kX_Wqcqqpj>-^g&qDWc{H%I_OFQE`@7epmAo=1tgNl0DC-6hBMcYp%JN z;uKLE^%@%XjjX6RTWpQQ{VaUNcQEr>lmqW#$Ry?ksz2?LGnnI^QF(XCFPSO6x7aNY zDNYfc$6|j~a*zDS!)}XxGT(G6kIt`Xq5ZOq2Nx`qC2M$a$wCKY6Av~EWy?Sh9uam> z&hudZ{D)+w2PcIcmVbG$k2vy5c~Zl^d!;-R!;Z@QGjht8WFC9P-nP~8SK`0h>V&N1 z5#Cwoq-^ZLe>=XH-ZOL3D_iIX8Ro%L!+wM!Ycs_)aX6Y~oAD{pZ|4pf{Xny#nz`$Z-*ABnkIv zeIE9!jA5>$_?-Moakf*R$DWs4nf3YWdAXlipFf?KCzNo6~e55!Jr-RrXA0!q&{-(Q#Y znf3bNy6nKL*B94iKW07OUzbtLdVO+T&Q+Wu-bTAiaa|r=tjoI+{puOYTN?8o)z`us zbUim@CUe~v#5ZNi7ur4>{@`}lEjgcg9QyI?u-kGo^Hz-a+hM=SN6U2h>Klmf$b9g- zl)iHW<$qURVotn5_Pdgv)}-~?>2(mkzsuds50K7h<~?~zaf(>noxz& z-hVum7nt?_(q{SuwtBJ)aBXV`X=p=L=&3v!2g|F@t#>#)rfsC-fB}#FtAz#LJjl zqdyR@W!Ce(Ft#y=?jyT2_Au-DUK)ozIK8A{{J>1>13Z6cTvD7SXuO^dvy9(7xJI~b z;FdoAw0&`C9;51}9G)BMWz-9%b!9yrtd5E zwypeL;dfh=ep$f)OkNp02RD6Y}hE;kc{aIm^U*QE|Rg6fF_*Q6DW10uI4u8W~ z>%pDFs~JZz)pt@@4dV?D4h*kpwDaK5@VAU$4~`D6Wu$rV zsBnMdOAj6wUfam>;HlwtjH@1;5nk6YcI4#$dHCCgp9ilFuV*y(;H}~HjR79KH@tx{ z#)HciYG};#;H6=Wj5QwIQM_Z&Z}L$8)a$Rt#uaA0{%T^}QS7>Z*wlEY*meJ~sZn$% z#ZOo3?W5t%j8(gcXNb3!U_6GuYaCKMPOQXyusF1pu>ku%8XqU&50XRL7|WP9V?M+$ z3G(<#6%o&9Jhd}+us!lG%yQxFj1$c3&^~iRI~W(37q_7J9gQc<(Z5stPKMk=`MKts zPKKA_6sNwQ*vWYH{@r_qY^}np{gStM&v^CzU1#If`*&T8!YVy|Kk>Klu0{pL`hMcW z@a{%!4;B%`2p<~pu`z}D>p1k9h_S{s=ATaE{61ow z;hU|)k7_Bz%7_U@FU2#&Z?JETm}D$tuKp6c&WOoI-GdZhBSvwCXaxJ2 zi0KAdF&^^!VV&7eq#Ik6UDx-uh;-w+2j7X9WxQ0JEx#|1uUE*~M%6r zEHa88q5Lj;-9Y|r#S)`|W_9k>5&S;eozw9a1Aav?ikbGYEyPk|DTkkg>+Ozr!oFsE zld6>7a$_^|pO2`%mm5DTo*^Ro;a4T|EH~`$DE}Ga+Z*`WjrR(pzTz8Rx_wp}ofW4! zfA3At)2uXlF#iocBUTy%m{+vI^F0w?8Ntk(!T*Bw^N+6aw91H5_6%_ob~AF7G0}rx zi(G9ON2xp+;^#S7|3y289XNYa^o0TFr7~2)6i+))5 z)Qhrh1E z?>3?o&k*H0;CaNzea2n3M@Qjn)R6~_**{YFbdiYiTzV_p_)KvIo-N1ME(;wrRx%Gm zd6s$~Hu9a)>6d{$F7k+Rm-$Wb*vR9?p`Wz9A$VHk55`FJGpe77Xy5sfKO5tiC*Q^M zy^&{(?TTlJG2qpazZ%Xn6yCMpIA=tif0gMgz2pzOBK-}K=Zsm3Q$!GWd*nr<^+mF$ zh$#5~?U9#^zRdS~VLu&t*;sf<+pC~IY>&KRtVBPj@OAINA4Fa?>R!=YRq=HrjkyZO z?~%xx#v;Y8^4&JhDb5hqZ`glF-ZpMCf6*HKE%G;`^i@hPT@?QiqbBl>5un#`N&w{!6ND} zV>8FUkMMb-9vfL~AA$VyMLjXjF+W*`uL?#zHKK0l^5**z{Wa=eqsvX5e|?01BkF~b zr8r$w2Kz_7G-ln>;fY&BS!VKW&E-%Z??-u=?I7v;iTg+8H>sZKdN!lIhDQ}L_b^An zUO39ftc!j?_G8y6y%J^=^Cz&EjVfavVtxR7|EO~26Xrs&e-u^0oQQdz^2->D`yWx2 z&2t_+C+bb}+8^2;h5Xk<`J0FD5zi1c;GMTb)irM^P8ao%-ma(y<_Gt6_^RX3{!xw1 z&5H5<1;*vss1_z!X@2N{uN(Cft<9+qh_(N?5!KpU;lUd#v@!R3@b6J=&0iJYQ1eAt z{&r@GKPmnVIT~-Vj+7ltdg~SJMg8`;>}alJyY~Mb@wrE3mv4-q`MZ-DrrE0z%6A68 zsGZ5&emb5<^zLkW!LL$!XTf3l-#6Q7R{1}R3NYs|>-nmyd5D?jt2`sRnkBIAqVmyv zRdhr*bF*fiuezJJne}|t-7E?}MB%Btc}8?Mmod|P)uLz*Gyh|p++ z9_9y{y{e(S$)cCJn)w@WlK9ZP#o>QJdgDbOvoY2&l-}0UG{5yRCu#O77)$d@Uvm}n z=u7zeCHS^tUA~TB-=`|RS1HurWYNzYpjqnqs-HQB?Rvf%VA9tNX+G5R)d2IP;u~JN zKMXMGYcaH*zH$W5E0q{vzF@vL7tcS82sG_y+D`ubtr0`q_SWxWy)+`&)bnGuEb%YO zKVrC>lU8E=HzL9v{#)4ljEHil_Z0S!5ixH2sCHN{jEHx0E7+4qjB=-U6Y-~x_}I;r zzY=2J2>iAwm+xzo_lpr}=BxALB=a?8*X!L{4JVm36{o24)H`CT`Hp5$Je}_MOf`Gy z^u#a7|9H`9=5}TW@~iCgsaf|QRUhI5*h770n6sE0pnfL#%rqY{mxX?x82=LX8R9D9)%ICt`g-vGVqcoQnCHSz%`Cpc z9H%%%R0jW1bfuZe><9kIXRUb#Prv9N&08MfL!(cbR(_rSP4uVEZGJMF zDc0#lMV~hNvb`w!XYV#=%ms?G#KliAAC&ynJmC=@-)S&UD|Y37&b+EPUGzr(kB>fQ zzI5>{;`8R~1t|Y?u}Rr4nB5h-;$JieDt2ApMRS~H(G>MHCi*f)~Y0fi&v|he#{=j?_d`8?h ze`R*;#9P79znNE=3xOAd?=lYruZq57K4K07Zw9~WFYcPp**^1Ie9b-ju4xxi<#R3q z9|9LpjOVM);(43s-_2rdp9Q`EE~o9h-~Gd^tyxsZ{C6k%53?il+u#S$_syZq;e&Ah zy6i(UL9u>*?n(3`bDReoBmXut=|{>io;MD_{iKmk&1Ae`PwUs8Fdvi}`OMtlqq#M> z>d1f0EDx>^K2%KGufg7a^E3_op z@%|s|Q6p_@lxBYa%W0)6PIETyMCa#DYXLLezq%uw))$&p{md=pw00;?cNTzu95XVn zwMTKb(BnU^RrPhs&o%yEvz92v{S5enaU=6tv+yN{obm5%HK)(>AiN&$g{)H^TsXS0 z)upVq>+xK~Dy`n>*5kWXbW!WR;uO(31N~{F4}Q6l!n^u+32TQhv8(@=uns8J_RmL_ zuzuAn#=yU?F8jK5PjQBGKK$g`k)^D^b$sX7;7#BcY|lR%UyB}D+Oqvr`p%NzEO36s z8BTeW>}9N?Y%c=N0+(ic#Z_c4YgJ%-3vd?rO}4L6_HtHjwr44OIja%d@9d-azE%si z=Y>Db0=H*-vHm!J80lwqVS5AcFW_EmZ;$?QVq|%10NV$Fe*p)xy>dL+D_9Y1Zwmee z9LM%$2PprF)@Zix24{gMYP+~!1@qm=N>+&qs(!@eNw^<4va;2Q`Qa4Y{~P&+wNf$m zyIGFNGi{YOlF>wV_X9TEwi!V?XPl2N#a+Z{26s<8gph@+}>oxK(suuJJd}dRN(9?KRNq zqBuhopNREB%s{JKEnWTvm{0b54YER**I_=}8#CCN%RC46y)i?rLmvENOtAHY`47xL z*JDC0TnxU-pvQM!YdACBAHw*qQa0Spk>EQq`Zst@tfw1;pT>;L6+gxup5osTac-vg zGB$@P{%f%bR%3sCJ=0O1^F3{n%Q< zyy-cv!#~B^&Kw2*ZTgS3PBOoF5nrW>O|^>Fq4d(l<%g7Bn$=u!n)0VLVkcO$n5lgl z$4*q`M|<14{U^D3|6W?Zed1=lKAY@j-5;jB!iA%!x>@&!X|Hgr=ufRz-~XL%-B9Im z^@r)!BgGk_4*WsK*y&cQy1ITUF2a5!c7`>Xxx6pgXIh7tKNy7lNo=}xhB;pV-p`1g zWm)(F6U}!OJL9}Gc8=AGInODozj@X%#TjDtew;VO&bJ;g?*)&JU1dV}vFYyv$R>cP`ums<(-b^42x z{VQv_2TzM#ZCz75Lwq_J=U=hwtXk@afHOoe))U9PzqT@&YhgVwFLtBVuAxrvF#P?O zv0JP?%q6joUK_jBy6?dqW4Bq(Mmqe|D6Fqyw_6*S7lSincUl$k0J8f*nL*jCKP^#uvcQ29-Cz?P>k;lgu~y*W?RcV_;Kt(>nQUc%#SZ) z4_j7Kogc9??mMeuGtEuWo`vI%TN4%I{1*GEl5r=jOKe|=`Y0cF(i+%Yhd+A&?-RxS zU`Q8uUKUiXNzI2QGeDos}(bSmAJ9EX7yEkLlTdRyKars z@tyCXzh_!EtSQXB!M3Rr$2mOtt1`Y1t@E0l zvoW6y&-<5kote&qdV}vV`(u4QJn!GuV`llBuJ3Q_CA0Sg&3W);LRbBDMfkFcUHLz? z8Ys>Xbbn?|+*2!zxz$A6e~Ei;Wir2`_@z~SDNE|*e+&YWbV2}h(F_s+mD!6wGrY;TnW2XJDqq!q*?9fEbq$peZ?taa3r1ARk7!G)cLi>^^}UQYA<2F6NvdF{tbI2bE{v; zzg4q0Ft0@TY7uYR+nMA05LdVNFh7LiM`pdSb z2IBr@#T;(h4d=@hTiOj(c-=m}!`j&G6yK0Kd|SIGvku?h4)zG&DZZ0E+Jo^eHG90` zEb*i}?aw>s3jcnt@B#MJSHcI_vtLQCtG&&GyT*654=Q%~uMg}?%-Vl_U_Vi;{a5e! z?zV4dsxN(gQuMIvDAw!Gf$=@;M%wOdhx4(vu(x17iuG+U?CqI<1BZjVGB1JuXe)Z! zy_vJYKH$O3Lz~*S@4UTXwmM^JDPz_o+Nt@-E6dHol*o5I~$F z>U@Rs!1(@lmf|cKc@48_`~chPrtP~2;{CArKs!+J3{eU5-}3l@cGd3M{^LIQpZLM{ zCFU!8iHF$UJ;ApJt zV}viC5N8ijoF&U+{MJl}x9JyYsJuII{q+(O>?!>$xX*58Q<6YM>Tvt+YFLVTPs(cUmbmuK)Av~R*E z_8I0-theSSOtzDUl08NAM|&{ebcJolphtCMHCt;TTP;r*j<9m*s zZBU^|CX z`ZwgTmUP~=(5}kdycO1S35)C~=De^!h+bkRGe0Sh{fze)_N(V{U)l?m-Q^Fyv@;c_ zh_eExnF(Lom%{Y*K71eN0SU|PHQ|~Me1PvaB&@V|D$W+#KYnE&X4d|3wS7sk>w4GO zcNO388nac1-xJo^j})glr-2`WpDRwmm+tZWZo+!IdW61S=ewAX6F1~4|0essvg`5} zNZe%Si`3!i{4Ystwv(CZd@vc`0)C`e->>jV+-8@IqVTECE2y8g;v3tK`FF4nxSHZL zC%unXE-}-ttvJO=@8eYhzr*(MoAkWGw{}amCxh|6f!&Gi_g0X7m;C|TpMg7q`>|a= z|GL{A%69!c(r!C~?aeAt`S#dx%pJi#;E$PG-=g&Q+7mc_PjE-@bhZz}eW&V)`|P=F z9|f)r{#@IY|7@7J-`?iI1riU~rxf3ix<0e*b|ZBC>iRrnqw?^VZPWU{MdIOCxKrX0 zH*0@;)Xr4#)0|&kqU$+kXEE;v`+$!z&&GPctvGJ~#JmCQ1HPa*TYC2r;={xf_9NyK zYP@~V`DNL9JpRD_#r1sckM8p5@sq=P{QTs$>+y2h&3Zij;^O?e|DJQPt@~#V>-xIr zw(I)3Z0Cul`b%>*#Qx`J^NL+iaf-7G_>8z>mtcF>mvsGCZC|!WfPKJkC{A@w#Q1D0 zuG#)C z)0~BNY5s({68I48^O^S}d|PqLUdntC>;qn{IMw+z_QP$(ZTqOUtNw=j3-;9bo0{iK&r`9L_HImIIy5<9y9#*7-k(&f{i^eQDW>xTBfk6z4+l8ByHPj_rG}Kl#}#;poDA5{$1wIi@kw_q1Av zmULt=)AzIj!%I3AGnd{*?ftrA1#>lUJa~iRROdNmFXh>Ag!w%czpUeT=Kd;vS;uRmbpEqc{Bn+(%*(;GlFB(cG1tfV3-I-IL^8Jo*Glqr zOlAHaFxPJ-` zNUG&{U2&QdpUM-xll&d!nNz?+z;80w&m?@DOlg=H$WD-|9G8DNb=_fX|3J zj`!F;rXShsI=Z{;;4`AGqrc)*r*WP9(c6w7=EC5M@ozgKnYI6|=ZNR{+W*#bB(q)n z*ZPj-ie3J-zGEG;_OJCF+nBX~ZQ$6=to>^P$05Zo|Ju-TOWWDMHgr@>(e+LKH8QD@ zV-53M2Yw+e=^aPqv1CtkPC1C@r@%E8r#KgY$Aas#UDtPGM>A$!-;EvZ6weTycH;Sr zq$Z9~<`v+DNlhJ7ba*aLGsi8(sp9EM?1z$?JF2JZ^3n4qJCj;ELKW-v-2S9Cj)jWx zyfe-(PbRf@oK$>6(({m~lR7v`jidOQFC=wxv}fKllg{rtJGwG^;XLI=()*4+%;_tz zeopG*7{WZ^L!5Ue1vtW)XMcj{LzB8X;+RKZ|M5Jjo8x2VIwkQk%%~3>6Pddeq3372 zJ7zHNERN@$M)h#aXTBDJ=j}%IbbP`51JWxrs+VI8Go9DyNVdwPj~MY$q5|WTMzFZl8=D; z*(9ciH=j5gxCQWW;?lrvV|see5Z3^14}6vQbO+Ht^zwQFn16=sA9{JKNlxH>)`|YJ zx3_e%lvDoq_C75+fh84)`FbC3G&0BY$bGy+iSaygA8%Zk|GwT$lGS=D+PgYMgrC4i z$^IzXyMZ`M_D9j)ZIS~V?~Cl`{h1i=i|psUPP||Ccm2JQshFPAGClphcMyyFDzEh# z;4MKc?yHRGJ-~Y(ah=xUJi(Xqu4-iHR3BD!~33?LEc)#Cak}E0yiKY0rLJa zgT2oYX95oeZcY3`H<8~%yzPnK0N%}pct;ZB_&?MeM~vhDP;V;nSUDdY<{eM`rkoEB z^S(p;U}aHW!@aYJ9|tZD{4w!&FrR6{MtHv<-U?hCcscRl=Y@QvHHigE5_S{cnR<* z;Gx7gUmD{bLyYsKG2SF%alcSZOsqGPSllm^1U#8o+%J?9GuAtuSllo4Ht<|xasN^5 zsBzxUh{gR!$-qmA#r;O_$HaM85{vtdJ^@}&EbbS2bCln^g;?A#G!6JC;<>OsSsD}X zJxKgD@G9Wnh<}vw1n*hmU!^?3drj$A6#f&v5$RZ;e*j(uY!T-Je>6DBTb%eD@FL){ zlGXc+fVVQqaXk_6K1z)1iGa5zF|H?)z4eH3J(28fN{s7;6mKhHTrZ?}UnR!%Myj_n zF|IdKy?rDnF!4R*#+Wp3`2J10Hw*Qte@XX#BRQ8<8xQBFVluqzP|hxL*guWQ^lr|O z`N71wy#p~>-m{YZOq?G+5|izX%0&4cI@~51Gv3=>GOnMm#7yv}OHSY%_M_OCiQZ+B z{cQSWxL+Um9O|(vu^%|oyGU|?iTlPXjhW?LFdpU8mc#z!m^t1}#1$vN_n*K6-$c0u{cF83bG;=e zAeT*t_BUppcgjS;@cjjxZ|X4SGw)H!32g36SZ|J5=&e5q^~LuP{l*1MyL=YPKOW53pJNKV+uuhn1MkP9Vo!K`%|RCX z6OY7R@WK@=GXFjp0q;*@FMB!h9Ps~i>{ag+;&~8%quA@-rE^h#pcj78B$oMR%tJ04 zfc1E+$HzZJ{`vvIUf)3C3ZUORR`Ye6kMiIDg#IV?4&RJVk@vm_^TF7=e5Z*=L42cP z@Al1Jfbw6Uf1DUw+Sh8K-~{G^`Z_bVoNu0FKYOwq%nxHL`XUyi{_8)(dN{U7U*i=5w)+`xZzJu#HDyKQXqJZ`w+fi~Hlvv2}fi z*B~E*{^Opp&-yy#BDZ=O-mi^q>{~>f1M8oM#y0hp{to5Oz zcRCN{uQX)rm9ek*+O0({w*ua;j&1K7D_Pb5j=qV=@_xIRzOVZlu0wsS-<^G(h(&uC zGPbiXj`%2)=jgFrd`F4bf<0Mdd-tUeKFk{1-*=k$CEzc|4)&#NMEOXtckS2_ zz7xcsfc(d?qkJR3NBL{O*?q_P&Jm0Ku|s41zUDs&`2^NC0p`zR6MV}h``P|@xKD6w zz;}-Ln5iqiJL+G>*KP0Ia^SE3d*nSxJkY$+mPQqFVZv3 zH;;Hfcd^IE&GHr7j`HWg{(9r)_`>V^+%RrB?!z!{J?>-QMDm{j^{2zQPka-1V0Zzj zp998y;e#tjWc{&jz<4A3HF?e-v_h45C7+vuD36LM3i zzq`k6@eSRJyaw#A!*=;{iN!r&r^fB}@%<=&0@{-+ZlCYcFUVql^X|AqzWf8oqW)Bj zJK{6*k-vrd`f%JaUn22U7{4BlJK?)5IgjIgu)q6!2Zeqf$NOMU`-&6e{da%($`j-L zcYpY*5&sVFqiXay<9k~92YwQ`88P0kch=XA81L6R>+3;`_l=(O4I#$+3eWlClz*5H zeADZkFN+xO^E>aGO1$N3aUbb<--pC_pW+4Im&ACV;sswWG2WMW(YJ*d?@PSs`-K?q zTfF2uL5%k;Uh-Wb#`_#E`+SEmzwkcC%f8~ocwgcbUwLA@FY$`68nKwqob7(q_cSry zmw46JjQ9n=xS#c!uN`q;;0eGzi1EI}>%JkxcwgdmpP#r%oVefiPhS>sAK=cw(}?lD z#2da3iSfR~8@?sV|0m*pU&eEZ@jgPvw-V!hgf9LIG2Tb$;wOpmzCky?LX7tfx;a0L z`PB~E`&WHDyf`u5*Wuw6i1EIT2wsgC@9T)*b&2u5j!52&81L(d4j<1Z#`^*}pGJ)L1#A~ABe`kBTk3@&g<6sR^l1J zQB3Cth}U!z_puxNB=L{HrGT#z<9&-J=f7fp;eCrHFF}m=4O+YcvG1%{A6UG)Q??WxdBMXE*7#{4$^5T*w z!*3mk^Is)-IpUUZo}yV?Dc*|sK3KoBiMxldBmVVm=uhMB#Oc@Wq4iU zZqLB@7gv_QOuPelXk0nopBTQhXJg~a^LdiTvpm?p2*g$3=SlwM67hX%MSh*+&%u1@ z`>0CXJSyTF&+7FRT$!g3i}N27;vV4FY&#?ZfkJ5AsXM^1MTpDph&haVh6Z zE5mtY;9TOLy4^**yIzeBQmpIMdPjV$NqF7^4#kFn|BF{(D7LUMe+^&~$*jPJMV@P;Qt;qQum zn$JOI#hZxsQ??b<9(8K`P;;JpHyAGj2Q2es>^>y=6K&%U4E1p-^bSF=ZW#Yue#j*yRb*y_f?li zNzUVV-&Z|eh8XV?tH-Mnd9KeR0{?@N3b z#*aq5`|u&ee*kyt*N2ZGKJ}*X-B{OvAA#ISX_U;lDO$C;eP;MN8A=TiVfgfh_jQ${^~%! zhj=D%MDKz8An__GAH*9XB!Tc)mb>Pv_gE?IJCi8y-tgmbI9>PuH zoxr1`hw$RWCgewr-a~mA;*!9lqlfa!#0NpYQSV{=QR0iho%#*qHHj(`0+$MN072Z8rRkK_5o)7K0Car_wZBH+7$&k#Qb z+=Ti072+1a#eqGSuzZhf6!j~f8^q^;qgXsIM*ISlM@4@EFHQUk@MFN0i2Gj^^*50} zLL38pEH05hK|J+0_`b@Y#Oo5z1#SS`gjn3eb1p8xTN0lJz5(2hI67b0m&`j6j{uHh z$-KAZ1Re+F<#ng>HN5jTlq8i9hXJ^PL}tLyynm1rET2BpUrzo4#?kE z+ZZ#R54Ul&|4lwkvYO9L+q_$^12BeyXgf zKa+Vk$qCZlSpQ@`iS(a^^yhfq;>(FY%!B<4{}i5h9m7ip|5^UGd9Oc_KZ5%Cmj4}I z%j=f$U4!y!;GfEu6Ay;^(ZD~AxAmd?E~sw}{O|Ha;^|QT8~CU5MZ`aYe7gTVK9r+= zG_>Ca{u#WXh8)!e_W%7ec|%?B1U97;yzlkT;v;Rm%KtuJAX&|?XY+>)p|5^FXg2?+ zWIz3W&}?3Z@?Ju_>H_|F_f2t^nF{ zkvB({@4uR`A9-71F&`)n+>uy}$L-@c^X|lAJnjVCpBTs6EqpjJj<;L*IAR=cxAJ6S z9B;Ss9AX@AxA7^&INomKGl_A$-OfKG#_@JLUr3DO?GC<-7{}Wkd=0S}Z=0~4d?T?K zZ;JzOCl=!^{GJ})ODx7)_&q)TD>06@yZK3C9B+5?3&c3y?%{tD<9NG=`%1|C=0EI# z_p|Xo@gl@O0}li)Ni4?W712NQa>S1UUjcrQSd53G41>=dt7e;75tCLVjP0KgX{Vr$hc; ziod{%l@{Uo8T@oEb0=Klxn*SdWbb8u5Sixtm-%tYetxl>7@sfmvn1b@3-g_XEBq?S z4*{0|jwma`ljo7jCtT&GWIRvuC~$F-i~3VO;TkVPa#4RC1+GkTQ9qwbxXvFXxu~Cw zfoqan)UVbFfAV_7qJFglZb~fbSL=iuycMyiU+sW9Aj|abi)PwV$@o3rrFfUtT>fT# zK$g!N2_CJTO`@S&=KCN-NPJc95#EQ!Cz#p^ z;#!d2ebGgrF|wD$G^?dCA9UD1AG9y|C^g|x3+~C z$KSiP{lupmi}~B#8dN40Iv=YT_qRStC`EGI-&&k-Z;V4X8GQ7#`*gp6kJ)xXd zzKXDKGTS#?@cr7W#OeD5m)CNLPf2+NZ7p%>4RF3Bp`!LD@eOz%bu6KhWp`DeSC+|xfpZJ7!L9!ZepU||2MEJ;WfxL{3w{@?nRkm?6R!gfdd5wG8 zHmDzowY5&fqv3t|Q~oElUXmxX_0S&XBtEGPwecs3PiaSq#r=Lu6Q9=3+4$SUx>~D; zF}ua5Cyg9LfHd}I@oR9BGd{!$!<|6%v5*umd9})iZxVZo9cw%Gi4ao(X zke^9xs`Vlk^2>?OX@e!NaaV-#*Ok;vizB`Wa-P&&TZH;9@x7}n=>=^CaTzGD%ZV+u zb;K?6#rMH4YTJn~t%UwCskQbyvADmdfxoqOi5Tx+YooD8g}ntXasS%%#5S5nEbd>s zH>s_L_k$H^CnLo7055BIkzCxjHa+oWt+eDdZVTqE%OhUVDoR%6|BCi7$uWJeXmyA& zeeJY?lGS}P?X{7_jbOeQ#oB9r$*TUmrX`}B`m@)xw`^Q7={0SMjUP(tpsliT`-flG zw%9m|b<&DGCep9!Q)jISG1jLpS}Vz_yt`ZNUzT%aAP0Q(C~u7&M!pw?N+u|IXOfm*bU+b0dwHY2ky<$mHI?Y!hQo+qb@ z_B=?tCOOx&4&v{eG)OD`4`ENPORosyPtstm1Mysle?Za@ZJOjfz83nUCTyrSUvdJw zAIA6LNkcXMPvJig_ANyF9i~+yJ`43*aC>AX`mfleVOmdO(Z8ht50xBXqW_%$97`&%2`mNV(}CY5-gicv-yN=fM|>xQ|54Hi%C9v(tgoZAYf`?(^BT0zMMJKO4ec|ukpMC{ojhDRBfSTydSt3OV`#) zPGH+oMf=at_DT-0gOK0NSf+NAnUgY#Z~W$=U+R3G7`+@2^Qyv~o|1 z_!HR2lHbuf)j=*J`aT`;Y^oznn?^bH27JTa?!<>Ywwq*0O(opZd>ySBvr@|K?D7^Ih{k5b6DZ z`pcUFtM2=v|C~$xXTIi_{pW|&f9AU~hlu*}p|)Mx?`Lnp`;SA3A8FSp zJ(D25n(X6Xd}m~Q^R>I47Wt9y!uyryYvqaYe&tWJ>cn`T@~6T0@jm4RLEbLyS)e^b z`n$oNW^6$)f1Z%_`}1J_;C;&rwbrPw;eE?r1k;Q6S1#7NNO=L>*SRDZ-_un@`(L6B zApdxu@)Ot&91y z6#9=8SBT5kgY%%SWkGvVDhvJP!T2AzCgNWn^q&U)U2H{Azr!@RU)Z%mOMe)$AMWFP zPj|5yz{^kV{JYCa@gne@-Q>&@R;z_Tu~}(pagP^#vEW#Q6Q7 zYnAq-WOaY(D(xAR%lSlK_bRO)>5K32@2|C5i<1oZNdnh_8B_c4|$DH$eH{ z3p{}MB8*3|NxQTelJjVOuuD5kjPrxt+QW@7KgE2oeBdXo9kGx<82DM6AQ|Ti)dTyq zX*RAM*stB&Sop{N;)a0(T16W-3*>8Y#A5#XQs9u5W8)5i!`g1iYCcn--P1&b7m)WG zmJb}&D%!Yv;Fva#Se)M-5co~|N;2Lj{9xdewoY=s>mip5?q5Bv?L^kfAAs}Ufj_jv zq%Y=+>x=!N@uo8U@;>3jz!~jP$@$th-^2N(z&Y)4WY-Tcf1d)}iueK9|DD&`5wC&q zb57vAmO{LI7Tk9hxDafw7d>LWdP!^eoQN;qWkCNnCveFzU%jk#l5%Wss{)s`0g`iF zy`a9peu9=lTo>v~6uY9$r0`C{c=Lzrsy5%o7lHZn7~jNA5Uu-~>MvX~+KBaNh+D(> zCAbLbxA+S7Lv8XoXCXct-y{2*kbg55_A@|Ug8ZL{`Auo}^)RmF{xcZ=vd`gsDR3F7 zpUa{P;QK}Q4eepc@cp?T-meCjUW2#-@NVE%#O^UL{s&xoJK{3HzXFG!7kBGJrCjwV zZhZ{t<9(8DJ&{uh-M;x*SK*$6{&Y6 z#`%{o$T&aadIHIDKBwv9iLw9C_07aM-?H?*#Mpn_5eyIKYf*a1<`_S&KcnzDhFOclC_u4@&EF-!rQV?YRysqpz3pJlX!^SXmv%<2=>? zag_JDqv z{9}1m(Tlbe_W9YJaJ~vc)E^=i-!J%*AJl6}&Sj!LTu!X2w~`F^X~_QSVLgN7qJBlP zNAzXn|2l*g#U9nSlN{^gWBOCAM0^3+|CbL`*SjOj?;jEa|Iqy;pLRg>k2Um(#Ns~n zOyIesFMeOdl~hAtPCULF{2p8KoZ;XU6Mu)a&Kt+$mN;5$#k{U^X3Bq#8E;Py$i^)0_`@%W@SoNfQ2gV78vuVr z@;1K+d0l-K$vXiz0NzA$+z+fr{gYbn*3%Q)$ns%DVE)pK)zfo{U6SkTH;Bc4--M(F zI&X{mV!uytQOOCc0OZqwtC0Lo@IN8x8NC*91aVWzd2+sXDDfG+8!^rYp4H=!U1C3P z^XNvp(#Q31;~?XDxUoKu^l?4hSpQ6NK(3FgB?t9gxIS*I=aF30XBTU%A0_^&zR0h} zsyrg6&Vu_~6PxJzOCr7Mee!d9X~_Y3|Jzf^&*=jtkC*F}hRMzJX~g}y!1s;G&Gmi6 zVm{V3xrJ`NEW(@2zdR1_ACgQ6T@=eLF={Yvu zmfS&S9YgY;k~``HZJeL{x_-dMN0Z;sN4_4?Kbzc1k9s4-e7v)~6p|N9 z>8kIx@qH=X^yZyI@&{77>xXUpkCYzzm@Xmt(hW$Q`;7r;gP%&dX$aJq{iuGY+N&Of@x;^&J;lcFrDp1rZ2VDbmOjhIi&L}p zk8Hd=HAi1)<29+{!_v1Q^-X=5O}-^{g1*|uyHh9X8*F?ab&|f-#>Y}8>p$7}OzKNP^Y5g0sDE7J!}-@c`h6(ZMrDil9q;H> zBnQ~l55@1>PSvYPp1@AR`Gw+XQ}q0o2@ssah?v%DrKTP~3tnYfIEz(cfcxc*U{ZGlcE?mDX z(XAoEo_yCcay_$DFF{-#<{KT^S9)2=0rnj5Q~s~?D#W$ndxB;lUrF2&xNO=o{o$b^ zyZ{qi!o5s?hj_tmvETf){*jISXxyJw&)2X%tk;`L&ZFPwU9Yc@tkSz) z|Bko`*!Prwy}lP&roVmCdi}bMU2H>e{etIUM3 zIltYYw<5j(>|z`BnWR4hNbn+JJWst*UoSbAevf{WzMbTFp89*;h{gO7_pQ!L`#~=) zIYHjPx*%<{o+erSe*9MbV`4ndzD-|FjOX3A>E9FM`RZ-@A!0lazFogejKANyLpR1^ z`UOX_o%;PYE>?7xUem@!itg51*tk^DJ$hFgdy4*~kFs%f>t{XN#>LrQ{R0~(MDNp= z+c+h9zrNkZqdmXqY+T5`CJhhhC2agm!+iZ=8}p(E^=E8+!Fx#WY2(c3!}?eomo56M zo@3*w(FOWk8&8ZrqJLxKSx6bLsZR{y}Uax553*HNQ4I5`hU(_4g zxH!9{x3w|sU+J&gcw+Pwy}ylTMPJneHl7-NO`l@pX6(AYT(a7a{WG|}$MxF{{jije zXLT09`aA80J}_RS2i{M?dKKrvfk zDtR*N2JP>+G~IZS_`7()hS8pQRwlf!Ni&UZ#Oalg2TC5#I(LNgL?9oUhVj=0_NL!q zd?Z=z&lE8hN)E{1lj_Kd7|V&pepEByV(G%a+AobVPG_RMI3KvvsF;P}Z`uam=cV6i zyet{}_cH0ljBb+EetdBwn;7@wOBf#zi~D)J?h?i-$++Ii@su!rlw9Bv@~=F18+&a$ z$y3s}CtJj?_VeyB9+sT%8aqq8Kf2fGDY?Kk9=Kw9X(NT?+hG6YJ$D)7OXBz5g#A(A zZ-~duh5NPLWsN-I&Hdr`JKXmfKMUgj=m>?FRg6x@H|zTenS>;_)vE^ibN*Sib8 z|8`d}P7xOY-s!GrTp<47Za5F*u4Md4JRJD2yRzZU5$Vf!ebWre-~E75gt!^-8Fv+< zB(XmY_HWz|8s&&vzY5#0o~lL_;=!F@f7SDlQC)I?Z;ONd(DX-)+QdhIs{_A8+&mV} zkETCrbR_N!To*Wezw1QZ9y9#J3xOkgKW3y!&STxbg!lXD)r@&4m*ba< z{nJ=L`gi;Y-#4cJ(^yJ;4{&$jRbl>XIQ-W%ej)uj@P6}JubRdY;>N%cy=xk$iD$z2 zeXUn5;}Y?Qz!AM`8Lsgne*?S^jQ7`i)iyNZA;1y6Ya4e;R`x$>RFmwN-|GxWf7)SB zeWNb<$Nk>=Mq^?;&r#oK85UjxhyR8~KhpPafcZvxLt_|mI`BB)v0?rjIs7*@rjh<1 zd*ObF^rpsa$$owvcp~s8D3|#k#hx>Eqns^-`HYJ_Z!CIK?Fn(r?)cpPD6el`j?KZ zl~HFpa_4x_{#zN*?-4`%>x;EA))9AI#n{*BFB-jOp!`dCpZY0qtC`5{lg0aq)<(4C z1om7nXpiY_j4_fYNZywIvH^*Mzr0ASkL``!Qa+Krd=1WLrgxLw;R=-$yLsH@=aq_UGe`btK35 z;*A@`7+#X`)Q1>8`cHNEPcvGO9Q~&m9f;9?X0SdL^nmjnb;ldC!@_&hp!XMiIMnYZ zYyyR^>gxn!X;}CZjCLQ{(>vL?NR0NqBeEn<5^qi-=EBw zWyF0dEwab|xg-9C#$+j1^>3k(OZu4Jg~oS_h5zyFRe0anHe<2D zzO;wG#F!@;?1TFBTE^GLR+3|SmpkHHVW{^>82$?5m$2|w8b>9=?~OovHT&iootB9B z{OpB`g1YER!MW_ZT0MzL>2cz$+fCfskHam1KUEcDYdju}-}+T%ZAL`(LwRf(d!P8$)c z(EqQne>FMd595Gj)xVr|*mur2Bjo}9?IqE^&ly*Uw*VIh_N*4+1^6g7^e8O6*x#8*$i{34@-+0w?FGwwFK62I0* z=$A5MZTxA*z2+2TtuolZJEN@mm1Ioce&9`{f1wea56HOByh!{6*qh@iXGZ2p`!xLh zqWjG|C8Pfn8TXszNnRcLJFmOE2|pPx(xdGdfn109AaE2bZ$3}l2KM*7?h58B#9e@+ zSOv4YWDNgoMn!WN$#J}`WX2Qsh5b{nyONnryyZURX~gr6A%7@2k9TQ}yg)LBe9nf%H~?)k{w|Gr9owLJNnnqe`WJ9$*<{1^{d+jbSRWq=GScB$ zP0Z(rv3#1CuMlJTG&Q>sWBD{S2TR8IDrP=s#*-Y&>v=Pq7|ZKvpg}jr{?Bk#Mqu% zgygb4y%1zt^XmD!9K+fy5}12MLzSIj=d*q&ZB$JlstMtgH2F}9};=3E

      g*X`_q>vg+(k2HSA*oX6SEhH)DP|07B78%||hCAY2?XQ5m2Yd_X z>+aO;?!9;PeESwC+vi!N>|Y4bY(e=Dl-{S4@K`7E8G%Tvyyr@{UZ{L6Zg z<#IN3X)hudf%baFc4w~x+Pk;UzlQaSEGPM$P+7m;pEZwR-6+FbWBvR3=xyruI>}z& zv|qQp`lSx{@GqLjS7;WpUI$g-+6>_@jW)!kpkTXQjP@YY^Vu5B|4zPF!T&>_;I1z? z8SAJU!QZh?km2;hb;ljhQ!&m~Np~ziyIf>Hm-)8KXC&u2yBzItUrf{M7MUIypIqZiqKmL2Tb~#tDoQsiO8LwT>c0IPQhwZ2bS?}$~pNX(Z|LyH| zc=q`V>CTSd&Zj-TeTDH=euMWs%sV^5DZlA)r6<;5&p>|y`H=JCPm?s)JfLZppBv-F zUbr(p!gs^L%j(gl!E4{gxB|-bNV|;hFu3gwyk8Ww{oB{|HqStRIfnC(HS2b7uixK6 zxykyhWP2Tma{dMG?Dgj8+qL`8FV{SOo~9koQuvkQQ+kT#wj-J=PS^Yr^()8w{)K3Z z2+Ov|y^Qe!`d+M)B}=B`yDp&2j|}f;tYanZ^!!iLVdvw28o!MAEUy*pa9GCV^<~F10{P2^J3Bl(UG3f5_2Vee_5JM<-5zho^@MDf!?0eP z!T3%A+pyk{_H%gMV4s)$?{s+{@y-F4m+EoFw%e5HknPddCmqx7CSe|w;dVth^Wk5v zBZ|T2Ft174?q$1|x(r9gW5<6!?6SRH&hTEudP9b{f#YJ;len)1_j3M{^P_?F^D^l2 z`d-dAE>K>dtX!aZ5At~>&VMO))?l~OJ?nd&{x4_g`0hSca}jl!P8p7UUtsjNSZ^bo zqo53@y?z1ga=f$8$9#ipiGOi#&qMaOEyq(if3^4bpL7fH$m?u7o+p?dTmMh~|KC1e z@G#a`$mh+-@16gW-+zzCBRUx-?)G26K$vCcsG{wUr8^>EA zO|cC-ECwFapNiv0vD`4kV~{5HhVWe{u>;Z+kBeL!KLKfqo!E^r#FLOFc4SV$@zao| z+L^&Ov9Uj6svQ~wdo=kteooAWd|sRZmtja#)Qhul`~svY_F^XpUyy+`v7d7`j$eW_ z#mj00dj-uhBy!MO>qGvzQP6hmbeJ=ZR`!1 zqERe`%Xc76@dtK_3=A;KacmeXaBM=F!ZI$!u>;Z+U5v|d+!fLkNybVXcY`#sTeJ$t z$&jY#VO)jdo{*;KWn6>f6i5>f9G2s_H>4@jjMX?!hcrbW<2oGog)~J!>_XuQ0!R}N z9InIhKuA*z!j2T4D1bD@VC+m8VhE%uh8nlvco?K9h8yc~JOa|hFT-!c@hC`Bj5cn^ z@fb)`j5Y3r9A|8TB@@!b{?^?%o&afzEaM&=PlPnZBhMX9j|$CpBy;xg=| z8RBwC^flvo9Iu2l@$^PLj#ojV#~FKZd=;dLr#4>1@imYpp4fO9$K{YFp4Mo<@oGpD zPink|d5|V{ zHwWSP0!R}(oP%+^7}CT}=TID%K$>ESIUL6qLz>w69Esy)kfwOW9F5}!NR*N}7V>*D z6Y>Xh0%V&x5%PBvuTvL)Kw>I6DUtZ_2V}L(aF(fLv&u1$!~1DK4<)LN2n-hP==^2eQOE7jlVJ1bMNw z5b|p4JjmVF1@QF@q$&1Ti*Z~BX^Lm9i*WoLq$$GI5**hmjdj+y=SQaXaLdjyoY&IW|G=cH9m5jN=~2J&ya}w+<3{cU0r}IY`V$j?Fj@Lt;L1 zJb>dDATb{~9>Ouc1CC?iti`bbX^JT4Rvbq|nj*&e2#&pwrtmo*!*ML6`G4{DCh%<) z*Z%mGY*~&Kleh^>VjzSyPzcs)yM%zO#StVp#11dI zk8X6QEu}yy?W3g&rF4DWOBY(Yudj5Wz~lct=giE#SGscP@BjJz@`;YmoO5RG+*!_? znK?7pS`qjN@RfkbdEj>7&jR#Ys{(fbUk&KD4i4N2{18BlGJ(5+9|j1!B5)7z^?E0nuv$p9LNT^y9wD&jF7E`mIFZ3&4i~q4@(30LNFAfIlbj zAmC|%hd|i`=(kP}d=>a+K)-cH;Ol^?z&Alj1NyB@;9G#%z;{3y2ZWvvd=GdI5PClF z1K?)^LeB>t2EGjt{W0)k;FklUKL&mZd>0^EZ{TOZOMrf>9C#G?G$2}X;FrL61NyB> z;Magx1bz#+C-8f~YT%E6vw=SY)&g|rZygY$Ljd~5+6#!$A@FzLO+btefyaR_0Ah3q zJOO+^AX-S^Dd3BMXd!{8fj<`z+CJd(L)!yF+XuRUUjqnj9|!<{IUuxsAPD>wfYA1V zWx!tv2yGt-0lxtd+CI<^cw=A%D6awZTdxfa0Dm2z-+Fyu72ul#2ZQn!K)-cU;85WI z0qD2x2&@7AaX_@#z##BX0HVbPjsX5iK(yGvI^drIM2iiq2mG(VF@X04jsyKOfM~IS z6M)|j2n#B3BJj@x!h#As8}N&PQ$TqD&~JSya4PTz0sXiaGz|P9K)>~sKos!nfjB7N z07Typ3=m{nqyarvd*ypx^pI;B??W1oT@E2hITgBS63P<3JMlPXPV+ zK1~YvBY=MEXMqgxp94al1jd2?0ucHnkOTfJK51GS^?-idYf{czYY+sy63gP-vH>h z-q`bc;BNv%JMVcT@V5Y>o%g&M_4(PYu z(Q^y%cLMsYclEpj_`3o9)~!A70{$LAzxCdpTY#9|rW}8y2?#|0p145Ir9O{8G>DfDiWE0r*hQo#1{25UsA~ZouF4+ynUAo_j(6 z9Uxj=&!++Z&~qQ)AA3Fv_&+_L1N=+R7Xa4hXX!sZWt z75MRhu=#^u2fhIiHd64Lz)u2%jTHPA@RI>y^9R2Jd?O%iq~P~}4*|mF5B>mn1Q7O8 z@L}LFK-m1j9|KPS!h#C^6!-`rEU4hmfIkNinm_m`@J)cw{J~!W-wX)NAN)1&GXecp zGWc8IV}KY7g1-lz2E_*dZgqAu`l!M_7P z2heX#1Rn>!9nf!`8+-!z4nWvE!KZ*v0s5_-!KZb< zt&4*J;FkcxE(!*LUj~Q~C%6pw<$xG*f+66$05ReO`vFVA6`+&>VF3mQfX@K>t!8i) z;ERI?gYptU^q1hFz+VQ4{t{dR{8~Wh`QRY%8vvo_gGT_r5fD~=a2?<~gX=+g7a;8I z;4#2&1%$mFJP!DK0by?kPXPXYK+Lj(Cj$Q{5We4NH?*@d06C4J951`-rWN;Mty?~f;2Tue3X+Vq@!P9}? z2M8N4cn0v#0{X4{gGu0@1N2*;52k>B0TAOwFa!JnK=ha3IPeDnF(g)fT#5~LEi+39?`o1nC;yU$~Yj}YVRW8g}u)Oytwx& zz)N~x0QlnG7eVGFfY7DAF9y7^_oaZZ>AeQ<^}R0#_YHuU)Ahar@Xfui1bj>H4S+ZI z-U#^C-q!-Yt@rhSZ|{90;JbR?4EXNen*eX^y&3R5y>A12Z|^ODAL@Mv;O)Kd0=&QX zR=_Xzz86n<01&m)`+ndL0{U@(^#=ie(0d!;PkKKB_?O<>!F>!6)^+b4!2bq_(XjVU zz{h*<2K;C5J)l1Uh*50Wy?}=<`!wKT%kBeQv+T2gYnOcvaKo}M0G_n$0l;T3dk`?X z>>yTL7WK`h4)l+6oA* z)z<}lJ0My@UjXiXy3jtw~_8kiRrGOZn`_=%z9uRG&ZxHa)eMbP^*S8Mz z&j7;e>st@}en41#ea8U*JRr)X?>OKO1EN3nodEpDfUt=AP6YgC-?IUq>^lYUslHRe z{a--zslG69D-;Iq4@CjHLUF+E&@f;iGz!=gIt{QlbUNU&&>4Vzp(J1^lmhGzWdIKf zjRUR-<&fG+K&;1x&IVi;+6H)3XaaD3=v;7*21HGTCV?Ldh_N!X6Y%)Z`G6;cE(F{V zx)|`;p-TZz4&?z)2^9c0hKhivhRT3Lp&7t%sDgANfM}DUJ%I7hEMOv32Ynb2Ei<$i z@HwF-;Ax=+&^G}>1BCVi-wcSB8N!#etz_uAfMcPn08^nC0H#AP0?dS73^*QoDd1G- z8o={HF9*CJ^a`YKA)w#7DD+Cei$ga6UK+X)^veJ-T7_N0#G2rh)KLz}K=x2a` z2t5j!KLTQHD)dX>e+Goc3;i1SV}NMwq2B`kJ0LV(==Z=M2lQJ{g#HNlWa!VJJOzj` zCG;2IPXl80X8B)%`vGB1E&n_45kRz@<&Oh@4j@|2@+W|A0z}JM{uJ=dfUu^PKMnj$ zK(wFbz5v?K@-D#Ca!e+zZOemz=PX|ac;WI8;6=;(0WV&@0`QXM1Ay;dz6w4(w*q1m zSbi|@_X5I-Sbiw*_XGN^VE-E6y@2S0{e!^!0MR@8j{w}*zYcJue?8!H`i}t|>pu=K z-G2h$j{Xw?r~01_cuD^$fS2~43Rvh5Bb{AEs@W1;DfZypaB5&UXgk|1e2K;^h4B%t^6~Mps z?+FZIeKL%lmJf9I0Dh>u7x2T~eb|pV5D4Qe$?pPDz&`}yfPV@M1O8876!5XYX@GwV zoDTSpz!`x53?u=c45R@6H;@6edd30$JvqScp0ll_^_iY1;Qc)lfS>O<7x0TclYn39 z*$MdNp7Q~}(sLo;*Lp4n{O_Ji0l$rOlGb;TPSW~5(s`5hNPiFD&--yBzx9j$KJ2wT zxpD#Ue^>4Yv<4Od{R7Vh>>juZuxH=}fV~4R0_+=jG2rrnmjWI%a1G$fftLe5Yv2`t zs|Q{Qc-TN3aP7bifQJtZ10Fdr3V77O>3~NMoB??3z>R>%49Y~XEx>494Svjgt{ z+%oVkz_SK!1>8FDUchq(-VeBa;DdlW25!R+(?tVO>@a<3;10kK58Mg(@qxPm?;5xV z@Dl^~0)BGf(}15ExDW8Z20jb;nSsv%etF;vfL|GS0Pt%A4+4H;;32^O9{4KYw+Frs z_}zhT0)BtsTYx_t_zvKY2EGUQlYt)qJ~Hqy_O7z4qJUdg-43{Q)z1KHt9k(ER^fXp zR%2Bk;PY2K3i!fRzr_C5hr#`X^-*v?VSNnTd#%e?{~55f`Y(XftN#kPd-dM|uUP#! zV0HBqfVI_60nV*{8nCh2haHUh)m?!5RtEqNtPTQRxq2Dk^HzrdpTD{v@P(^a0A9U% z!1oX9i-$(7$E|Mwp6>g=nke>QezIm3@R2ojoLkzyHVn99Z2|CtwR-_Cf+Nc%zDw55 z0A9AX33&P1sCAj|3P@h&t3vWJ-y9?_^EDuOnQtDFm-+TV@-p86NalUdgJjZe?oGX@11LZ4ESzH?()3{l11MKAXD~z z88T(xS0GdNeGRFVecymg+4tX&Df_;S)XKi^LUP*oLr6~hegw&B-%lVp?Rx~0)4rcW za@zL`NKX5H1xb8u8Im);KR|NE_a{is`2GiyGrq?lIpg~qBxij8faGr9laSo)`(H@z z#zyb20sVtz!0y2rz@EY10`?9@t%`5?U>NYA!2;mQ!QTTu3z8MzYDiXmhYbD^@Gwa3 z@f{7xJ-%ZhxyN_X;70&YhU6aKMo8}Q4GrE77=dKfmw;r|Hv-A3Z!;vTzB3_N^^HNY z>Pthi>dQiM)^`>pXMI~CIqTaF$ywhHNY47EAUW$h50bOK3m{qZT>{CP?=nc%d?iTM zeAAGu`F2CH=DPxtHD48ybH06$obw%kma$;_XbGr^}Pv_dwp+#WW)DXNH%=`3CV`&%g z_}&M}hVKKAyw>+MNM7sv1|+ZbeS5G7_+3a|>-#<=uk-yJ-0OV50QWlIuaM4lzTbd* zo$q(x9)*+Es0HlW-e}!~o$I@?bNrz7BkNDNQfGy4jc>g#>f7YY_}=Zi&3C8oe%~X$ zh(GB+%YUJNm;Z(SYyCI)-{4=>b$HitT^qZGyS8*)&~-&uclSx%Te>gkE_dJ7{aE*t z-Ti@hAR9P8fK}=y~}%7_a5GR zZ12gv(caT~hnDT@yQc4sz9;)uhSr3R4m~@xIkYWwNoY^#y3lt+r!T){`Q6KZzdY3c zto~B}d-^}x|C|0l_5ZE^$$tMqy$2n1(CUNM9`xFSZae6{gC02O@q^Z^h_4t~aoUQ^ ziVIg1R@}Pc!z(_!;=3!JSP@!z{K`{SF0QG_^($B3vikPbzgWHc;7bmE-ofua`11$<{ouhv&NyV(Ay*&r?n8cX$X^dR{LmL3 z`tn0p9rm)rZaD0%hfS`jta;IzC)f0>UAgu}Yu~!|v9;FV^1)Sun+6vKuO58);HwAU zHu&+uuMU2D@E3!B96a*y)Zsf0|Jva{J^ZL6PCO!V#A!#=kGSuMbw^%v{-W69(UOB zM;*W6`0();9sjxGcb)Kp6JB$|%_mH4xOBtxhWdsVZ@7NLe{T5LhI==BYs14E{<$G^ z;`$SZPdw+u11G-i#N$so^`y-wRZqI+q?=A!d-7jT?m6X6AxK z`R6Hb*jPLDC8yqW>V2nv{nTHbdgjpfp^JuII`r0|&kcQL=(|Hd9s2E1DclTS9lj&{ zi*PoQk32W>(#Q>ww?_J+Yof_6L@lu|adYBl!~Z*c)5r;< zxzWkd_l>^wv|CU6#%Yh8cGRX@HvMVS)0Vk6$;mbY*D+LkA_Y|FhO_ubsd;a+R7I}Lbv_kRE$(ft9y zBfF1{^jhn>PX;`yI}NzL`*(mxcdw52TE}#s40vq!6yR~)uLC^3dwC2#LfwZ0Zs^_w zcw%=I@TBhN0Y1C?oq#8Ie+=-H?jHhf?Cy^DTBmj&4mi|(GGMrS3NX@rJz%u^e!y7w z?*QZ7uS@h=iSBNAmM()cCH=#k)_Oem5!X#DLl~RpPNpeoL=1#D|yRb`DRV0zw}0@T}PPTw*o#ZE8wxR!V2Km;~TVszN4&O-*Fbc z+L-9Kdzcu)+#cvS5 z!|^);za#Nmhu=}ST7JDRV;$`~%Q^p(Q+>QS|HB>Y$=;l(luAC~jr!Ezq_SI&d?%6afzIS-yI=fQ8~Jb0~K0-u#j;IVQE z{8b9@Rw=;NnT4myEc{ev;iWQbCGi`>FNI$kzYKm^c-f5Ow*?+EIp3?`k@70|qr3{< zD6fJq%4^_>@*4P|yaiq;Z-EcWe^@)<^D>Fwl<)1?`0e$586)FYtR{R$=J8v=Zy$d9eSd>T%irM7;`8Ay5+8Qg zeYk_fcNKoPd&Gxbb>9o|dl7zDz78*YB3@y={R}2qbB230Jg>0t1@hI_33cJV#Bg7xu*2YwrqlZ{V-y2( z7MwSse;+m6+YNSy!R|EJ-3GhIVD}m9vj)50n@*ZHK|mGw*Spd5;SW?E*t9nHbXs+ikEb z3|2K*&0q)oFG*AR-~=3(B(;bu{kkMSWaK_^)-dzYua5@tCZf#E}fS<1G*hx$6Y<+K7)PMV4n-(8Ejl(hgokl*qaS@Q*iMzWF7x*H!kK*?k{Py_hx2JoJe^>D1fxidW_;2g$>UuI1z^@;_6$c^C zU5_jebgl0WbluVq-;?h9@q4su&&nsdZeBUvy9e}}fnUEWfZx}=dUAtr3GNu| z>iWsxF~N@?G1q%scLTpFWXr*?9a#?k^2o*Dh3l%I)$n_uXYWye4<5h%so>>n16`M| zeHwp14*FgA_2c(M7v+)uet7+(_ziZQcJ!lNsiQxLJUoGCJb^fO1ukFv#lS;H_jmpB z$ZfqBuIqyQQ^?B)dyeaVb^pyPyCC!G{{KAo)&1|n?|sMK75L1t^Zj2u_MYD0argFK zzV>6i(c_*D?meojYwuA3{O0>_Kklx;&+z;8ajypc>)ziSAL#lF;*Op0>i#Hb!w(^u`E&I%|4=(%EDUWvjJ@}=-p6>bn_ntc6|H)IY??0~lRrsCV_t?-= z!8+>ig789LJ#u#6t&xxQ-Vy2Vx-~N2zdHJs;3Fq~9`*cRf%V;s!N-OIU5^b7cHJHO zX5S;R2YMbGdPDH+I6g}q$H$W6_w;@WzrMuDD_13sTDb_KlGAM848%Z8OD{I1+G*!6w<9*Hf3=lCI30Y3ge@vp%zf^ZUl$M8#8|K(5P zmjOPGUk<;^z^B`UF2`>_;vK+m5x?i*cNKom$L|IBy%4f5!tZLte=&a70Dn1tufXqm z{9c9MtMPjcey_(5>LZ_@oG;8*ipfT!u$Ze==BF0t%9E8V%cqBjtZfU``SS|ZL~MI~ zf4QLunFDh+VTtIGAuAP2MZ=LyB%6wlrL$x4(NsJ&6dM^!jl~lq=|md;W3dPXJ14Uw zGqzOB#E_LvN0XUsCYc@!r_zaVJR2Pf4-Y4z*)X0T9v;nRGKtvG*pRhpb1|P!SDJIx z!eXjgXg0$`d7_Ty^AX0z%k#;`Omp)tO=yiEViX~&BkU;eU8pq5rR|OST)8n{DRXqg z&Q{9RQZrfe(@W~+snChB3qK~9&O z#d57wsLf0B(m4r73FE45lxzGxOli%7$hA@aZtuRH#%blo3ZZ9YyRJ(~}sE z@r$(-d_<`95XMk~ljR22abZ`rEX64O#xs7*lR9itWh8T;Ttx55R;u%5={S@XcenIR zCmiQIBX<$TRFp+W4T?nTTbXzX#!`(k8k75h!r|UY55bGusd^^rNem~vN;NK2ySEn_=rX7!sd9NhOW{f?t?fN-GQ-IEjmmskKi4xEBOe`6&5c@7OOO~bW=QVpd!$&T|;O3K&Y%^NEqG?L#pr!nVSkt}-MnaTH4eI>#_r>a|p%THRGB?&&O%X*BAM z7P0YijaqOyS3@hS6{@b-*~#67#$0xxR-{-i*0%Ee?s~~V&NYQJv9H`{R7xeOOXQng zYiF&{Se(G9&pA~I5d%LD&W>`SbXK#@N**b2^KgXif|4fcNH1NkqPw(_(O27OlPxqU zQq&ra(Rc}^8}a;Rc|O0RJYB}HQ!MW&H|tff^+Ok6YM`PxwwNJ^f#ir%oi* zd)v1M5YQ|<%4A^YI+zOD&LFhd6vIN(*yG_HeqeNPU9++AxY1l2mysEgZ zrHCj!4JHmEp-^;vwVOCP`FN+~y;~5>6BQGqqdddaHAES>hhmD*@_rcAbOuHVa}HpN zfnf<)+W-byVRIa|xV5RM{?7CGCbYVu6>7CQO*g3{3TIx&T4+Gs=n$2W8N`t0(t`{H zr2kOmnt)qlgY2b7jr3Bg$_RO@DzK@ccT`p2FR7|b^3TL3l7~4Au@b$q^i=R#Ym_Dj zmwV7*?s}17V|tNcA9|5tLV1xBFoV449mp_Vw6sCOniA1Sl#ryO`Ote0CqSj)8h_4N zs8*>z0nMfAvvaT{RY(<<3Z3N+PBcmw=Sps3X72**SBbD4+)5GJ2MN>gKMBJU=(!8! z1^P=7*>DGrm6YNh{GBQ^=}(ST!S;H+N^%G08s#RL#>7e0t5rw z#pq8@p@~YJ(^e%SA!(UNK`%c*R?T!VEFV}zUn__VWecqxf3_5wy9LW_tu%>}(=V#R z&J@5dgsl<^vAlOjp*B-SxG@7)r?9oJP^A_;oX_vatA{P*0XdyKcGKpOd>$iJq1p^v z^N=H{*?b* zn5fWaqJu=fH9ZU-Dm_ehfH?;b#lYYJtZncB4T~ma8VP`+x)(HFQ8XSGz_Zmn0!u1g z;oFUv$`Z8JOw$6+<)CvHZjw+qOkt9XM>H0W5~l4h5{iMqiYH=CEzCjd;O}m9p3-Dt zx;%+aLzLWjqrNbQsS$8{G(tdZQ6OiR7s)U--9Ezl1k(mIJbR?qJ)Y$`r`rpa2BO;{ z_KSj?v*`$pRZ3We6eG3j;^2jfGVHp@rklE`g@{!`2T{E;P3=cwRhUFIl17MI+e+~z-aMSJMw8)KW+XC}$)r=s;n?U{IvI^c&{RfJiJ@pT8W~Au zM$-`VE?ZLh9ht&w-5eQPL<7W{3qvWAz)No0h(hOK|7XT(RA zh!IYVSjqVCNO~xmNyoy8SZp|wKtIP=6^@Rgu_n{$;mF8XG(I+B&0r~F=TvsYil#HM zXet~|4Tqyc$?WJ*I2I1a$5QE3Bt8;LXET_O4#kH@p=9veRxd47%bRJDmp4Unv(VAA zFsOL$k%qNWsWvxT=nrG5R3;urOBhNFL&HSlLnHC{5K1dP6hq?C;j!#c(#niR#-gL? zkw`Q;ln9SThSQ_TR5}xnB@*#WVg#K!8c(2|ThK$O(Xn_YmBdaLCdp&Tcq|=>W+Ip$ zBjY1bQ?X$P)^}ZzMBPLq@v%rEl^H^>Oh?k_3F(n+Iug$&6C|%EOcxl zo=qi_@sZIie$hxQ9Ue}NW>eWjaww6u(kPEaJUKd&7>Z;^65#}O!Qqkk7)lGfZ|UqP zGBh-nwnm0xW9fJ#GZw`o#)il6b|a~gcw#u6&Sa=$quEp<63bX|lT4GJ)n0CS`pY*d~JK>HUQ^9v)l(r6E9B7reGYj_|4FU;;L6|8g0`{yxJs87#tq(#h)GLz@x zR%jEwTA|5ONnyMSqi|XVR_MHqnl;IZ2HTKIf*zt!U4vr98lqZE;4GxX;!(W3GJtfj zQLk&^e3MroEEGI;KV{brldIW+E@0Z@ur5gPAJS8d(5o2=%@_>T1W1snr#;AjcR3=)!ao^E5G9Qggn zZ!SddEeWgHC|X--4w%70_Qdqgc@;b#E1?oB%3Kc9IPmz5N*29-uH+~z1m?KZ6jim7 zZG~E4rd$%!9;{89tNDCIcA*W?G)oAex~T1{RA4CZCIf#ddA-i>EX@hacujp)bE^zln2)F~ZaLg>h}Cn_xB)M8v}Qw?Z%sda_snx@u}@7CL{l5(+4{b+2V(-OH@f1*&!WL(@m-I)^%# zovYVCf>BGOC) z-qn!$s1mxQOt%us7|IRoNKaQ<-y-GqvVI1DoI4kBSE-JK!-gI0g=?E{xB+8}%A( z=z8gUr?jdtXN-vobpS40v=cO3gwLx3U?)v2uZ=Gth#`Xi?xX;Li7HgG?41MSo^$R( z9Tm@(I5t>hw`fm3KZZ4UG%rOb?Ln5)<~EM8x!PIipzONVVi>gxV#Bd5T^V57>EkXX z)XsNnq;|g2CG8B|S=%`|M?d%AN)K*lw0DPg8EnP26LXxRZvV7~$%=CtgKxVqW?rZ! zjFH${nStl2at&!KPgDjREXpO5tM;TEgSiJ2g|MUm*=s4NruL}Rc<3$KIn;Q(Ia8H+ zuLv~HY)?j1eu;A6Ex>c4GCNRt3!u}W1dD8RdP~p<(x@(?tiAbYmpf~;Jyd9-x~A*i zQVu1u15>1otfqL&>fzIyt1RoKg{VZ@i_13ipg|VIz00G$6srX?SiRF|ecg0in(GoJO zTzUI*2_de;_VlsIT4d+j61kzb^VP_vN7+sSjuzW4f@#!}{MJ@7RhVf{#Movs_~c5g zqEQj;q8Nh8Q&OHt)er|B%A8`;uQv=z>U+c_aM#Qh5?nSipEf`;gvn$gW$ z>-D+LVlo~nzp|x8w-@Gjw-;lsR;(_R%3I5|887xWSnIP3vmM!m152_ccKcH^2k_J; zoEla7?GoE0<#vW0wW9?52ioIp5r@Jy<(6x*u5OQDyBD@4c46`Ff_y&`+T zw7BzTmrvInREb`sfI-dC<@ENlV1XK!KLo9?`Xk+eru}|G$phNyuqH=~mF54`iL~!_E@6Q3dm&vly>uc%(0L zq;>|Z1kBPfnBfiC`?r%IyoK!Z9^BO6Roqs~?kQP2Uwo~-Vz%^N6bL*N3~=6R2z{#ODlAZ;%+{0)n2Ab zl=>FzHLr)zc-S5f1Hj&eG7pyROuO_u3ApR1gOsu|I&sC2=)jfyvEki8!Zs8mN6fKpc3@skdGSBhg zq5IIbpi6yvh{1DtwlLpbJW#esopp0NQ+3THBqkb_8FF(J3%xxBHL7-EPs~>4X&&E+ zulh%Ox){oF!Uv1F?JShACw+2ZZVrpQ%U-$<=gh zv7N~lKXeZFX)iXHYYB5pK6h8Bb`k&G;qwl-nFRQkUViQY>4> znad{0wg%>?m06fcRg&6K#$kSvZl1rpG7po50^BTeyg?;|3)q5T9zDhmVKBD?J9uB# z4x<2IR!&zAOibHEENJXmn6tx_p35lRwT1-%t*`y%X$;SXo8$yrb{Ey}MD^bCgc z?GU_Rw(1CF3iFPTBr;izB0j;=GkbGoT}vEo9of zA@d&V$FhoVZC_~aHUZ(0mkxBM95l3f@Y*l|iY2y-PDj;=V;ncaO{p#~mOK!J?!|;7 zhRP(V1T&GgP~mn!)t!6efg37nw1v8}hNTN^@!PRw+RSxk6V=qpCQvg(1F{L?FJOoB zn5f_lY(i>xxwr>9LT2O&+Bxk1gK}yK^0CIQt5IT3z#abOqHe~cx;a< zJ-IR0x(uSdXOxKr?zX$OOF7@p|Z%dT7vQGq1GKj=4p8Ud@nc8pt$FDPM37 zi8$7>gwJUcIYO9QlvC-VR;Ijgcj zN{1YRVAk-dEvy&s=J2+11JryIuZ#mCbXv>GbHinn$wH-OZR%1;C?VR;qd1I`hzw3b z(^H7P)8tb!}Ye=5mj({Z+v3~RnDgg7{m)WjJMjzN`0Ln8;MvP{5q zMr9_jgrg%m$+@O8R1~{HawI)X(ier|T4Kc5q;#E|O!EIBlYbPE2EUL-Y&%ovhGF2V;JFFi-at!6FHYos!qePjz!@+=FQ*(twu~{7aW5!NC?}= zOz|{onS-u`0fJE(F&L#3SetN&TA>}n8ssDrXO6i7f{**Ev7Rcy&BgjdaZhJ1ySPo# zya{)YREq8K$uL-oPrh;;BeTWakt_ak_9|6J!OkLR80=SPs?EH>B*wx{Ja)cok76p- zBtmr|{nR+ZaEofC6&p0guw^{!#!LxK@%Uu^pS(f^Y=epUDgPEqRjNOgD#HlQLV3ICXF+ za5e)C5rc-CfPyhhyO4F~ZD*-oYZy`*=*Na)Qla)@s3PYg8A0yMM$-1#Y0)>FDZ6=@ z2qqm5-n>>@MJ#NZ%3?1{4pAZ5q5NKQuVe-W0J(mUL%c0xqTBvaCXE&nRR|x@U;&h| z9e_u5fekx8y`b*@q6_{^^3;lTyi}F_;0#Ii3lqkiqA<(Cuq+jm?{#1rCZBYTkxk&q z1z9f=1xtepl@?T8n5{9#;rPH|wH3lRHNYwMnB(ycFQ;s8+m()6zb9kXToGt-)@i4d zQ&qb#jGGy!d-YLncA#p9eZ+nf^#;u_`R+=NhyeecLGe3ms21lv&fOC1lI>F58WWc- zkv`yu(6K0u|GPQH#D~4ZmwH`#(GqnSdPn-p!aPqT`vXLh7+Ykr>NIukN=$)L6`TPoE9dNjOUFgX;g(Il%u^E7uD32Ca-&IM2;wc}BI#~{nXrrQ-usrEu+?o2eQ>i-8}+WJ_V%tKW4GQV;7+@h ztM|lRQMiqA?YNVI8o}ZiEycO%b{^V!&V6IoLzH(~dknGeU9xDruCQ9bcG0j7AbWr= zDs>(Y-(K!RUUa=p=1Rn|73QL&2fM;Fd7=#`7coEQ?3?)-sfNk@mHFasKKn) z80A+_e_4Cuc%TWZ{RFjLL#GpXxG;RNO-&FNHQ2c4T@8k<=8duUdu zpQYx7I#|+(eiI%(`3>+^H7tBKa6E;>vXe$mZnDq8n4HgHl-?KzD;S@sX$-o17e&F@ zP*pq)N{u!rta**_+cU{bIrYNIMqXmU5+rWeAR3n?Y;D|V%Rw?LoI#tDZ{l={vj#J~ zj&8|vI?u9Gn7hetpC!IIyy@4v3CP50|mE9M#eE@+Ut+< z2+gq9P?@6I3onn+hy%}WmG@0c}#sa8JhxUBm)>5AT8Gnu3{SPrNKUdAOi zjN)vRb0v*w_A(O(r5{01FD*H!j8gu`FzRst7j5B?vI*|ebQ~Mwiyc|WvAM!wY%A1a;DkgL+JN(k@8Xi@Y$!63Q-fl4!ruL#CCQ zFF7OOeYBUbUidOOr`-?OIW@_m+P>7;wfD#*$Fxnv7~Rav2$=(Bm4{6dThqhLWf^KJ z?NsOn=297<6F`$<@WDtwV@L8JlO5bDN-5ZDORTgULF&_vAgn`NZp=@{*>!V)F%wGe zAf>AfI`bkfg0az=%{%_{q-bgTi%UiJmSDl|#-v ze4JT2K!$>?HJJqxyZ#upz*KDS*U%(r>d&ttFK2={nL&P@4(e1r1?|J`iL$@TvTUJa z^HrxZEqHQazD`9-w}i9$&_(LllG`Y|bEpKfZOEyST^fz(xetXBF%y!FD-(oe!$XRi zC_yjNAVXVa3xJ#)y}nFLR88cXJnIn}3Ptxg7UZQ2!W;~2mr)w}q1!6OMxCx1Vk)W| ztx@>65ta}bRO}e2oZN7#e1^zMNhqVzqD%Vq)!}@98&YY)5kzcG7*$&;GrK1-OQ>_~ zToaCTjvza(!Hr8_WCQO;JVbhU8Dkmg7R|`S+2Bo;wdXSPHC%cv&>*x=5cl5C;IZ)EX8vvq;7;hAfPsIR%kIGY9Q%nl&W z?3UmlQB=J|XA4qyaQUO#Ea$}xHWfyv*)w*e?!KqN7AH3VJ49D~m@ z9f6f(bE%{ylQvDdnH`=$6C^ccQ&by7H-&$*-ej=sO2Dw?B-{3giy?(Z4ZS=E&!76j z%x*iDd7B3M!fc_j$7YEIk|k4af8EJ|XU_t9-Xb{+rGP*mRPAUm9P9uZotgDxd@%kq zw5w)I=^V;BrA;@@+9v7z(x$!AsqIXt#Ocb+0_p=+d^_8*_GvTqxTHNCrs@tJH<2_( zEU_PL4&Kj;Of!#GQEI1Ho@gag^YkFAs&AF1c7(SR8{E!Dv7MwOG0Kp4f}`=U*Og6B za(ZmB8N6+12SqDziS8&@3kMi$+I)Bg)c0c?qwOhk>kL`f80Ks#RbKQ8WE|TJ%7z%l zHci(x45Shcq}dE=RpyPfRH{C=h(jN{9jw&WNgmtDg0Uk|MX+Y&G03JPwXpnrWmkpnEVsE7OB;+fwO~qvUJeW0 zIE!o1a->3Oq?;rY(pWdB0csj*b}2lPT0)3fX>v+kC}X-Qf6rp&WKGE*db(g#n1WHN zrXy2lvB`p=+yvP>E(bkk@ zA#ee)H?f3alx37trx3J@r-Zf@uxKtQGD%Hd0%+23-4R@su&goEp%sOUw#y_5p?(A* zdql9Qy8Kl)*@*@a65=|8keGB+W_in0gz1&e;hQfd%w<9aq>m0-Q>3P3)DjV@KIkF| zP#?uqUxm=-%q5T3S%n!axN<{BmP8yzr@@gcl?L6$ho)dB?;O(9VjJHjBog`E1zGq- zJ1DtCk+w3y+UPDhJj@lQ6tRQ@m(+@zLGPNuJlZW?lADbrH$^hJp*mFV>+ticsmYHL zkfm`6z-L=Ya)UJXrqd>Nak+ zrbI$kL#>5n;?N@+lKc<^}uoHGiAF+O7U zOpTqca*^4&n?wf-WGio?k*yq1g2snHFGe;uO73&brG@N9guBX?7G-w=%H+QibfnoT zUXlAq_~mFapNP@s8V5y#GipkKL!?j(IE91qz`Be>RxY4q0(uL1^wNmbWCA@{_X5?B zxinj8wwz-Ka7a3-B|v`-m)KpYe2ZXyy((v$ilQ}b&F97zX9Y zlc65!$x}z?T9VRl%?6C?0hDt$)%m_|j^kzB41QBLiJq9P)(i7)GQE=rSwGW*r5@_R z$xpYZPmiU2OSY3-FWOEeSw3yl&Z2B~VC7+0&+vg2_cK&J+tbR|+VaEI;V?*D8C3~+ zrtZnhm%NgqXUM#pm!q&=;(AI4mU=)3ZobZ2T5So^vuOOM?ONAU+K9MaxkZfPnsLl| zH5zLSZw|#F?cmL&%InNkcL00b#fCwWXDr^S;zD4rIFyxbwEkS1kr|xp{k=KrIo`}X zuV%NUM$f^-O|Ry-p5jGU&+uZ=o@HA)l>T;@JLSec`#dksf8r}_G#*izF2Pn$TS5Zc zUmX*tXOkYnRxHlkxSr`jR?qU_uo`Mfgwkf+(Ly(hsD-Xl_lhF=rbV98*Tarpuxb&Z zNBs*C_0)eMWk$0O52Czab%~r!T!q+5Lj!ONQAAdEJo9(O^&pD|bc;#~vJ9*(pq6wx zFx9K;HRQI)cv^>;Sc0tYKcB9za9B)gk!_<|LM9Hatl183@UNf`lfiaY-?Woq)S`uJ znaL=^RNWQShuzWc3QEFWTau*!8FWhyE}trJ5@hqxAwkWU3@An7wVW0jkD!W=QGqx1 zR8V#roN*OyX8kHmSrvC?2LX;vbZdm7P!;OSb#y9wHIw42vzUrU>sne2+XdLnWg7-t zUHY;EL&6FY^boB|8WN?K#FsG0>|uM+?#_xxy{3%_CBi$~ZHzXhpi*(D1Vx!K$zWF6l=8#^6waJFIt48`v*QLGp>Mf}-b^8IvgR2^p_bAbO)sNzWr_mi zt5=(nmkMEFZh~gZk>n}5Yg-IcGWu@1n}(LCR=M~M%mwgHs-$gC@a@#y zG@ZVi>bzr~Vs5PyD8YS4Cd;@Pquzk$M(vzBFCk-lJtEAHk)?pV2(n!=oRH#_cf zSl^gOMo17*X^@hCvJ*b4N@^=0Z0YR5>RWHR(EJK!0{NYncLUY@?+c-tQtA^ zRH4ejU!_5X<))|*^&L4Zq?XBPjR{No<%Wtmj>9#4wJy#06$T$rIzUTjZ4@P66&V~Z zZc^6C;h`}vs5E(|(ns%dxUB-;@UvzaQdZODIfT`wf&|nXNI+#?02Ww;cNw(N!~xQYU=qMLwT;&Gm~#}{|i zn9So5ynbYa=FmB$Gpn2`E!<*Jl5yoGrSH+uLGo^(3qbS@np8M?HOqW@$`G`ljv+|> z@*LFA?7cTb(h3$cKXfL_lC3svnjZCy5U0eOWrmci!R-yV1aM9&MT`^NRp4BqQ>NmC z>O|F|)#7Q;A0^Ia-T0x|n;kNNHF3$fYa!W2iIJiwz{#nC#PKH7M$m|we7%h-_VX$Y z+6SbM!O>8Lxhx;=g6eMU5zIC=d91ZqZ_{}K37U01dwpN>)xvg;*Jw^OY{UBt7kTlG z!1y{1yekE*(iOpIAbjT+wjo@OM--MNS;C}Ja zYpF(0Rn>_-U_7BPM}I{LZc=0-pvLu`?Bz;1Nf{&pQO4rfg57ZBNS}=~Y!MU1o(^WHT`s}qqJr7fA zE|o~KsYByX6Bx6mb{A^aRy=_bR;s+R0PiHujX2?P4i$ zHI~a~0f(@-emG&l(Aor{w^ryl-#9AdvL^CjNuhyH<``O)eZs?(iip^@0`g{j7KBG@ z5Q5RLD;O0G-ijR(mBPn?WZ_{e6rY3FxI)lfgd+16lp98Up->$vzYrnl@ySKROQ_Z< zLf9atd4U9K<^6)lK_vPfElPPmd7klwuXq>^kdUk=P`6 zgz+?O%{r*IrQ#yehk+dgOw?`5(Lt93ILM9Iln#zssc=y6e9SXy^p$h{UeaW648ci+ z<>L@Rh{t#bX(t^kafGQ0$gvX#QFZQf$r;E&#(_-pbZk_#ZKm@H;bf5%jlGo)yBKpW zxEnf2qF|oM(hzTPmw9`e&KXc+FoTrSP<4OdklKr0CGtpt*fb&HOo~?GjaK7Y8rYua%k#`;mk>3%w2b-iPzAa=-SXw9)SK3W`^VjEge)l9~#^b5PSO_Mdb|!p;I|2{(~jIhL#S{7hPIDOu!#fzP}kP>fh_Nfn z2iO=+GUdmcBT0Dk(3HFxbDj@DuYvYp#ZJpB3Nu$i*o!`xLUdRTvhP4|Un+u$!q*J) zf(~7n?nsc{&pe0<&A~%4s)<@VgZ2O&qUs5J+mwrJ4_U4e%7WFaN2|7(Z;qOtR-hXR zd4{6&GA?l*Kb`Tbt^n*4Hlt1Q4IK0!?_fjNhAE#3s6}cM<{qL3WHDW*>V}EJGq^sc zY!l{mG|Dn&O<1Rp z-+>3UfE2UzZ2&uhq^4Jc@No>>PEL1^v`XM>+44;fxrD@K>!`FiWK)r;iD{VKSjDl4 zv|ETxTr*_b94-~L&c>smo8=DCJcmqNU8I#7+P)oZEg!SvVT;h?xLG)&$u@>9qu z$l)<#G4ppzY_57av50lnXhsQNEm*~xQZ^X13$4(pWr#s0+MmK`Ua)?-ik)I0JA=Ia zHi;92P>vL<)rz2rqO1Wj*23lm1}Y5^VXRTu&wur#N#F5c!FOU#u6wYqpeXbL*igeD zCYjeb_ScxE^kWLEdlejcl&c}M{R|U;QloW`je=q$U2=iHbnuDIU&0;R>N>VPTK&Is z*rz-pJ7$E_c9M4vS_+zUob9mRIVp!_gks?b@^w9A)?2t2w~DO{V6@ImyHhd+WYR3J zXE5s0u5B&C#odT~1=6P+Z;~$BQ#h$nCelI*xp7L$v$G3)%d%YoG;lCa9iCSyiN`wk zWu}OY%BZqF88^L&L)0Mf9%XE6;3aw1DW7fQaM5<&;xOAwjG?8$qMygz;)sR;*bY>P zl51X6Zq&^gau`hPc!IO&Z8ULnAP#9645xM8Rj}wSX_5mU8htZ4U#m}Hk|aLiqI?LO z#gBRj9Z}`J&4`Q&`>-DlD(%-<;sR5couj=ejxmM5=;h@3PTK~gzb5BF(~1qs726t$N`lwM!gz`Re`naelm-fmU1-Vq^q(UOruB2jFf}) zOh-`7Pno5*?bVt$`NEk5r1x<%RH#|)EZ39;s2DW07EcgG(35f(5tC|Hm}1fO3G?Na zSS})Bxx)68P{lf@&ISxxKP6ahxXI8@E;1B?xOFHoVj^lw4r~e@ZwE*i3APB^6bRda zmNPdQzIRzgRqCv*Pr3ChDb{oN=;FT+oIwRUgq!Xldl9R2pgVD?ucS$Lu+fy>s>vTp zMeHPt#}9>z3Q+-)F(0<&wqb{ex4pwRa9Ok?Q#!bM1Q`M-E#aq&QS8-W)P>ln_tADGMr$`dpY(I64ljMjdFH>?jH*mUKGP5OqAa*6 z^msQ#xpcURFhteDubXaX$4ytmpnY`LSh(m12enYjbU|~&a49>TxjC`XjkK(E znqW?49Y#?>*1imDPL}|+2AO`T+sWa{M4p&B#EvRDU<q4n@}~l2eB((zw>7Dm>W|mhPtG%j&RQPl^tMkGv1G6b~mk8kQ9W4{-+Z z3}=uX*HM+*u?>X2N}EJfO}pd|*A^ew;K$&(n&XVf)^ zRuSVEwjg0WU}pq#a!q$#wP%R#+x0Y=axI3EC_znUO~kHLZn}N_la_RDSQ(mY2g*?K zZtZKink)K3hwOqi6d4{&FeCTcoA7M4m4bFp2DOpUw+kAAT_lD?HiHgGM^(M2VYPiZ zjz^Q$&&jbS@*tu?l-kJRmC!~uqbYO5r4QSoCMWz^(Y9FmGJmthAy?$(8Z;a|duHpi zVU^TmS_N5+>Gf&T-Eq|)@?i(19q8sst}JNnP>1}9c3W&ts|#5dLhoC^igcAOZ$L&$ z2D8U$){-b*?qn)JS#pM{IXc5>EKb#Mvs$Itbdp6gIVt&hazj+9>ZZ(Dk$}{(;&Yyi zRjD<*BTLGWf>yZ{l`_^&m3mboWZWv0b4E{5;VW!Z23tipgL=84C=^NBCTBiB&+U|P zN*|pEwug?rpZql%GKr9HW?Q_eKZ)x{@a?LqVd`%^D_Z6NHr{ctO(d{1h`VoCn5u*Q zH&vM4+8LfK7HWz`pPx`DKT|(~M|~&5Nnp1D#l$=fdG|1NlBL2NvBvd`QWGe5Xp3Zq zfXy{xLR2`SICA8arDRM8vq?0d@@Ax#p)ESK7pY0=B1BsKu_M|iU34$AdC00PLg^Gh zz_|&!lx@bAqWtT|W>e`s+Nmsy=GP+UqDY&jalw{?J1Dj&aU=mr21OK~=r^fRAZa*%k4ru_w*#;2g{ zpmbe3Jf}?|(^`uLqk2H)=w_}^qPpDO93ozH(R}3lOj8<1B6u~Ov_jjGc8Iu=R&;mL zib(F)lrFRy|0N@sHd!3|YI;&>&aOw>zP9K}hC|Qy=Acw$ zhL3r{R{9pXtg5oU)&W-Snu0>tib|_(UAbm3<=rO-*D=Duw_ZNCi#^OzeHI5LFmzSx z^#)&l!e?>xjVBVI@)V3-LNJ+N2)?6G!L@00#EmVqiJC2}ahcrf5GD>R&Fh%dIh33TG+jY-v-8g-%uP82({ z(MrqLTZE|e>_rJo8=SE{8QR;&!yQG(Kt%af=YjSG0aGj!jXan`c<1m}2bdC#_8E!blP2FWGZK_B3#oD-< zWD#9AVzW)=H1fkoRQ?BF;`4{wm$${QkFab!oxa-mIQM;OyRWsMGXNiEI<&}o}x6JnFpgvg<8 zAIINF*HBv4$u*fFeYMG*QR7rSTk9BzOPWH}?xv88ntDqn zwW#?-geEv7H7Vc3N7Zre)k^Ma>RofJ!NOiCny_P$fhL`N07BiD&iivseK=Ny=rNF! z*%j8Q$+JPRDEA#$AUoo-QC*V4&^U}iK8Zu$HUdkvaI)WRcakRM5R3El@eo4UAS0*3 zCZF9$=fg^vSuv)Zm#`LKUR8THb2NOK3-{`Hv1x`wSF#(vnXeg&%AGN`@qB%Ar%Z)Q zca>1MK~-DQ z&>UhrU`x{O2^QZ94l)*;9U)3u--PcVBa0qX80vc$;B@Ou0Fu(0aJ1Z!fG8^m0dmgv z?BGxqpu+U?Ch*M#`(|8+93A@qmqOY%Q|7d~@U&NLL4Rpd7o#TwL{B>MLfyiXM=!w| z+>=W+)|uNuy;AEn-!{!*!NpM)^f={7=b&=K!2T|L?Hp8D3ULsC(t9{49dht5whX8c z^=DgjN%I1hv{=15HA!EFmsZOwUtWvjuV3l!})ILP1QA@|c*}?d0F^ciYHC=qLj_VaFt82`S~kwb3E{?>v46 z&Ec74!6Av_;0}bbLB)l3vOgKFXpo}5q(T&(btRbw`pR}`d>&*q`YTuxj8B*tFyZf9j(dzN?C#V##f0#`(|5 znnaVYmOWW?H$rPlD56#p@7Ft%r2R~!Dv#df3{a7(K~{qtc;+|ZjIQ=UID|svzf1WIut2NR026h~Ks^{QgLVdrh36~GK_eo+2)*UcG+x=W zMaW#RxBpq9Ksn#EIhN1Q@2*JGn=lu6;aFQi%y5joSa#55hZtGd(-Wl+)71(Pi(bt-HLi4`O`mO^(6M$0CG@nRO8 z@0Xz6cO;0}a^7mXHc4j3huM9t*4}stR02FI1ADY#3)| zRe507Y(O-QamV5q_l%h~J2;l!g&ng)PvB@fmfo;uAhtW&j=-@Z){d}e=~#P%-nC<` z=>5L`KmR@FX5OraRCsX2NLlxB?s@#@KmYrjd#=v;B=~JgWEZFD z3v*o{ALF->5}4EM_~pNwpsTT#3`3*u50f)~5lAfcaUpt;E2!^=XxCPAHS zfFVkJFSt~`Vhw<0yu#_)%BH889sBtbxf-M_>F_I9W@0_5FLl{MHO2a?c6>mWY! zbIOurw%=}!`+OX4A1}}fk{dB2@j@#0_M@A_omqH?rXj!OJ)a%hxARq>KjY}1*)*G!72(W9Wn^}S=f5Vp> zEf>jb@mzq%GI3d>6^>W*>JZQ{p<7vFzfsc1g9zhrmF zy>2mw912u)iK_TReAnE2Eu0yQviVAAxnTW!D9&!7@}_j=rxeY4#xkv*jkl=FLlw1b zvzbwn2NH~vUYTdT1TY!TZir@|L${}|BfUHPs4$meyPR3e?LrX_bIaQ7Dc$AV_o&(MsH}ofR$-?6a zS(4qiCBbi&fl3amX`+OKvgT#lNz8fL9RbPeemD5s4dWAl!-hldlW*Y&$#Skl!y;

      71lIBD+fI z8eQqS=Sz59n22HRNz`U(OQ*$+lbUYDu9sY^KEZGY2o810XY{5W_H=+LeHuF$`!K%l z(Cvfx{)W5%%f{W32Okzbe)KqIkYSff0ygdd$|fc#kab}tPDdW$T>^0k2c2i22R2V; zwXq%1D$jW~O-a(K>bUtNA1}P|7?i8jKmn2cA+#Os z0Rx@2H6)QRye3z4M59(5^A<5FYlI56QjbN#P z;u}pvDPgA`ACVb;6jo}otwH+E^5`Z9`b@iela7VE)1P%kgTG0p((JWLlZE~P<{fOZ z&2pea@*XVbYQk%NqPTsfcmS_o!+uIOP zjLE^L(saN)!*N|UC=+}B$=I>u$7YT~15=XuG{K?2HW>VEOuxzg;r^K!aaK(Tj9LoE z+`cX13z6Cyl8)mm&*WgAg_EFcVi z;si-k>Dvs`##TpS6&9i`EW?VGZe6oy0T7sw{KHZQw zF^xT>9$?GI_0(8lVxuHtDqTZ(4hx$bWAQ`Bw6+md(rbtVu0%6A)HrMGr^{&EZIjUG zQZo}(p@7JQPl(T=%hs>ZYiyJ+ju@7+(2>EY>RDnn22)_NZTuuNmjH-1zu;odRf?)s^d@$D$+0_zO1M*%-{ z;cuj~{#vvrC4nO1%?*!zH`SnIS+DM=z|3et+WV zsvO=Y5L7>G@%_`gPh(@Dv$>@@4tJ~}qREk;L=8%W~H@hLPKzUT4< zULHtxNy7VMl9EW~rNt{f#9CHEFv5wrM8E|iNRxUx;}s9d8v ziCBdD8*~wzX1zZt#LBtWB2=ihjzl2XCTnd-LRE+ib6Q19rI+4m+C(yW>GON zh%DU^Z=iUP=FJlFvA!hlVKItW>e^3Vepo&?Bp-_tCq#*oGigeLas^XQ@u^uNcT^sy zl)q*f#WHrwoP_K(K}-Y{R+=Da)5~e8FQJT#xbWifOzcdA@Ixl%#9sE#X*B8fSXg(* z5FyIYtOgNtF2vcUaCR@oj6MqcbxJVLa=;6)OPY-^cp@m$L>}AkYPN89=m2x;+`7t) znSEOaPI5j&hK)8cm$!JUR(IEtM0hNcV-!=w=FiD~C5d}4PbA#y^aD)t#s?85JT4a_ z^uJ|Qw{5N>$!ZD8B{q1(?Dwfjxk>8Q!cm{$az`bh0^}}vH%9I-rHi&lFu#b?s2KRt z1-*jRrx!33kDaoy@=4Q^lEfqr3Zydmdp_R}TVG1c1;wIVc#5Vc;O>+oGs}gpg5)j(`s z7JRhQ9%4}KlIJ8EY8C3@x2V=sf-IFurQCpp*L*qHDm9IoN}P;y2;p%i?c~%6xcyep zl$dYY>aoYiCb4C__D@KZiXsFZ3B4*RT##S{5f6RAQM*F3{P7jH@OADT+wt~uQ`&Vi zJN}sIH{CY&2=+6Nd>7>X6_7>*me=)-HSO9*Ziv(|eyUD$Oi4ab*b-@UjGF4zNi1(i zUYiQXPL&T#J?a{E5%sC#w&IfCM|u#8L^QK*@9S^SeShU65dQ9juQ&-(Vjm;6blves z-JxUmS9f&8$M-plK8NS6)oaF!*rSc8QLY3%JZ<8G3^CsTKbcW8oi zJGp~IkZt1hnZ%EP%2ShiPh)~Mq~2kNxa68oBo%}oC8N6`4|{-J%Vf2s)~ab;U18EXuJX`ZQ6)*^jwsi5C4$W7uIGN;5l`f|&hGfz5t)l&(q>NF*Z# zZWL?XL2mp;%BejEVJe@n1r2;3)IUQ5t)8jv(V`%`rQdm{5pE4OrVs%ll|m-=mIFuA zTAYmC(^{Hc&3pitBO|+FEfmGK@T9jwTEdBXKPIW-s@*mTZwZ0GaS$qk4MN>KLlN+F zgYJ>Uo>91PdYj3oqH7gdOht#V+Mlznyu%V#o<>8|i?@jk%&@h?1fRvnbTW6ry{(gV znyejxQQ7{KdYFsL1OUK_dm7oiJvR9WPtXlffzUD&(dl%;MEtUvdNB_nAJLs&Sf!?z zST+D1?D`;jd<+YGXh$_T-lS(zYU zW+Xo_O^!(Av_%L~6G`#Fu_G$;lADEwG{m%QNJGjBEFB)fORgTIB|-sXqIGa^;p%j8 z%EEapZWlSt?@Pxy$jgUh!OkyUr6QmqA2ydes2e*AWlZ`RCArb8R3&oDEYeSW?-Sg3OMipFLf>vJEqRKWPz)=gRo$*--vwEQm-h{ePXoONr*JCuI<6eSM&Ml zKun5_MNa|UaEnKfyR9DCE;dm`_I0f&NoSU$1k;&OQlcoMG-51#C@Xq^uX!gz$lJyk z%_vPY0?{0$skR!m4^>4^4o`&IV5Uvu?K*rL(Bbt990|nrke=8_*0a4$X49JGJFE88 zFH=Cg#?N*)X1E!dujBV|T4xC>+gs=1i$c~Wp&N#H7agS+hDm*WOrC|lY8DXQA763v z@#$&k{`*hkI6ih_46~p!G7akY=H&Iru}QmQOI)9_fAZAjS1Pq(eo2-}aJK;!g9~Oj z{P~573*z;y!kNq&ogUR^SYnQ?4Weh<1lVWuQqR`ql1_<{+;Gs6 z8!WB^RM_T1R%0c}bkRi#Cn-?NSRMd-q;FIFi zZb`T>No`Rn-8^)I(X4F@?=2@kNj+8Ogmv&HF-QYVJPHp+qp9gMVAR-9wx35n?stIG z&0n0sKb#JK@r%y6w!Qef&AGyMx6N&Lu0xJ@>~)jwh?{cw#IZww#GQ0QxIXQsaW~}d zN6L^J!yk4>arjaa@-pSP!b!>BP^+Z#>uKMaBRDl;E-3k0>6>M+< z)tz!PNSSn>#Pyc|+~WXo$Q?pnHg?K=PR=*s{y1tlh&z1d1Yi;HFUsAJ8^_%ka!gB! z<2XKuC+vikKMqhokF;^5Y?ORAp{@gNKk}SJ`UyF*O?<@{bzxzHw71RWdcGj7oyId) z{n~B-J%NXofq<}?N%ts@L+$|-JB>=%HDYbZg@%Y%0#95Lvkyo)V*LS0odRH=OP&*p z1SsyVm5sXtjCZkK0kG!*0hZ-l*D<6W!GE_}A)55<5b>@&0ywN)4uV^~)itK&3j0yt ze&;?sF6j7zz@xM>>IcqsC08AH1G%}5jqYBTYXe+uL(Z+a1vPLOhVV=W7 zA*quHjrfndhj4u?MgH#K9-*QmsBs9-$XO(EGJuT$xiY3EtSv&Gbh|N2xw{sEH?C{h z(B837&G&;!*xTvlV_`TOXT%oq@`#KtN5@9kuphVS4rbRvd@1IaR@2gP8B4}xHWaMaquBI^-R{!iCHIYk%8vrxBfm#@)9t3o;58A$=$OawW?9zK70^Y zlunZv^KI@rFHP=-hH-uCAq`0fqWPxGL>P@YTlEd)BIUVBQY|$lQiS@N5}YQ4Y97_j zp*DrY^bp{y{?#22JyXIq6vIRU)s+@Bi^GHx6@UtBB?YRLF*NrOQdMY=qXSeWL=pvk ztlViPP{f_au~~gI1Bv-2=_>1@!eBWfkF`%kL*;hw$5XaO120C1A%bc))NjHv47MA- z4Rt=?>t<^#!FFh=9r22ah-D89^=ed_VM1g+zbBQ!47Y<)aWM3PNp_u}njA^QvO+dN ztCavKx<;A|#a87FVQK(=0d*5;crOu@W`hebM_R)}7&!O_(IOq*H-nn_f1}%qzkT?x zSF|fPx>5Yyi2oZgSQ|m}NBtFz+imXp)c?=ATptl`){X0<>5APYk#-7}*XLy@@L5!( znT7AF|Mg-fY&Pw*Hdxh^F+hwDjG@hNAr+Dq0|f!CTeHOl8D6<1mAhZ z?w!}6Hr5pIM~)&<(R5Ujq`Rg4X@IQl9vHsaIAMM>n_BhvH1bTLt>Z$>966f8F&;5y zk7U>1ocG*tPT6o&*!pA|>(zg{8{)=>vvH_`7*h{nA+ebSs>y+DGD!{59V0+fEHWuO z@X1yT3Ef)C4eA!wM72O4OJ!AayQzAsf6`cSbAdD$HX@-J5YpyRG*1JhnHE*ZP=K8V zsPvkt6JnrpQ`w`vRB8%=0n*+=@VTRny}t>t6U_%fhZJCR*0Sn2CuA3>Pakou+=Hd` zk9@+IhC1JrG&Ci^AuVv0HJWr{T5)4`{qg9yec7X$Kiyh zh*+M*4t%3Y71&SBs+f!6EFW5lI;Vu8f>WJ?$!9T~^fL=67?d0ty2p$Xsd}_9)-zCOVj`?*gV$`DA((^Yk~k!nZa24JyNi~-s#UuSx9UE%P;VD0 zyR}uD8dgmA&+S;KrOXn-L8fYhi67V794vegltQD~ObL2y%JU45yXrUCsaU^fE26Y$ z42mw>Y#MU6i=a{QxNvUzsuWZ-_cqG4nr2u)uH9Y zaKAEJtWW@1RL)`mLE*U_L+)m%OZL^6f1#K$+P))AfU1Hia99J)YECau1*DZ^7=0xw ziwUT@LA{q*PYe!IHH-mc*BMbM$1x%l0LXs>-R)ywaf*j2rv|)^GR)uELzWb0km~| z>8)rSi1ALFEHc(tM{Y^&-Ek0*hk2YZt3fO;+zYl$9O`^Xx*xf**7YtO?sIK{W`vHq z@is@`lyHcKb;vWMMXFZ@ye5GIQWpEqk=Tf_P?Ltwn49sLrH-$1oYHj~FRuF3h!9Iw zr6glATNcT*s*((*0#%2L0Ynlvr&gK?Pf>3ZY#_ILTS2q*L23mVYF~P1$&Gn<3_$45`8MtSVWGsvzDLQZJ1{%|_6o zt!Yu-Ow2(b6CqhsxEdfk3ZO9x2d+m~jtil$3<*D(UEzNM^1Ukyl9eIdC3P}QaPJe@ z9&Fvob0^uqXtayc4zbM|TLX+tt8MiD6K^`OqWYW8AVrm;SnW=;skVU^hrxQZ(86rA z$?9}CDB{|WG}cEOnA$+Ykgg}#Z>>VRAqS^FbZ!L<*JbloPJ*ix3u)MhNef>pR?TrD zLD4F)xi+;GG6OT!rxrImTTd%5-ar;oiLxL-WAD{f|J&a`IKzU+JrHiq7)k-xV)os} zOzmYIiATg53R7S@R<61y58;HAy@JB0~ zc1W143JZ$dT=Yt_mTS*d7Lq zQ@c^pLa;1HGlli0t?xi`jgyIKzNQ8ZwFUUm(j5ozM76Jm6iIUIBds-^nrjX}5*n^J z3Vqh;Ih{)rzopN{me!o>qh#RBuiW(zkE+65Pq5G3t$UH{1fbzmf=UPWoe-&ab3|}J zHOwB7*NGXtREayIh+tJij;&%#x+aK$Z{BR$ATl%i-qx*8&+aqkmXuN`oSRu{O z7vsb$=k5sQ5v0@SHg8O)QR#hf{3$(YYmu^P)v$bH8Nk`aKC>rojNUn?Y$(Mjw?-U! zj)6v%xLU`xnD6^Eo;DjS>7{ZkZ@A{%J4SqbrCXp^coZ*$ zIFYtB_i=U1N1>!QMBuS9X)%7s)ik%x}ehwwcrEx~vScdgcxX>Fr=X1Pfg; zZetndB-E`8qpC|j_}p4$Yh+xT>r`c3dgPK3aL-e$RX07Yn1Bh%U!wnNBjaT&SAe1a()^f}tPH=F0uwV6apyYPmMbly~e6OdC1 z(vZz+pH{*`<}Il<1mk1-0+5e{x&wTsIhu7F4XI$WJb-q`fIEp_m1%Pj%0yS~u&dVE zl8_k$kUq6sP$_ZD->S|UlGA9Ggnbgg%=p2K6}3fn`I<+zA*I1NRVAt{vqVeW_Cji2 zSM_Vm(PrS(7_jv|Y$LriK$X-dsO0(r((um0rJRdv9ENx}IfP`=U}UM6nLSs~SQ8a% zm@&%rkqAlZT#V(q)ck;=xunr2WQ!zRS0?kMMVhWXqDV+`?c0Ywa6t`MyK+2eiC>R} z6lCC&5N_KXJpqza?5U*l7+&0}5!6D4Q^D^(tl}f2&_p7k0`dbZ(Q=?kw}T>TQv50! z&0NAX8Noth@j>YeX-d@2#}_WaekXaaTsW^Pphkh}4xVctn=zJ*Sl50)MQU&b?UVa3 z)q=kCWVDrx$Z8#d>oFo!p%Y8QJp0q=ol=zCEEG>AO**7{0USN_K`GK7cJ9{2d)%t- znCkYSk0;!HSZ?F`*z+%-Jt_eE2F{c`@^IzU5 zwyt}nF>+Aohl}@D9wQBPuP8=B-RDQs%`~EhonT{pCCBg}_}^X^P-+cmi zpTNC7)4OXVKi@~b$9)t5nsv^7e78`CE*Xh~E%YbItL7ZR{b@s)-PA*kE;VgubGp-x zZkWAD-03CMFpb)5JxxXpIoAe^TuFyIgpp|>sdLTuy&1lsMHrTjdTacy;21Z1E(&|7 zlQ|k|<;+BLz3_9krs3HG`;7R*M;J5myIYqBhg!C}LaRmlpE7&bMl7p;;~2e0n-(KG znB`GgeQrrLXVrk3#b--`T-ATJ56G}vGv}Mvqc+Yt1k>HhaAKD3Nc@sX{A^evFC08e znyoA7BA(IZ<+)cDd=r>q@)6i}&Ap z(+UT<(~GxB>_f?HVFTQsD!=7^t7 z@lz}}m*J#kdJMpl7sXCyWQe8GBj>aFN_OQzGRI62h>Gl?;ZKHMb(LfzYZyT_hdT9@ zg_w~v%t^8$%ju*bg$dEBGv$OMS$A2TC3h=5=~AC&irj{(t^;ryMUA^*tLZ|O%I9(D zj?WkrV-PHKmZ_IZDwKk*U5tTX^oJ7IUU?=6WK|PM8UWP_7H^V7!IwFf(gA|=C$|H2 zbRtaQH#f~dBzx2-gJMjKqZ5tuz2xGP5}?pUNfw)qv6M9exf#+RdK6`del_3tIz5-YG)r@)Fl^lTem~*1 z1xV>dL`t`69dO2kJ)QwQx}6lXjmEXEx+PDkIjOzXg-zrwrFY=E>jFTpHPx9 zLcbJ?G1sG~x5l;6>~2+Cn89D9#!F(Im%rIOTD{6Lqk@ zdGEH~E+ei}E@`Weymb@ir)+s1D5Co3L?IUyaE%$8AbC>XQJ+$59z_cM0u`7vYbZ3y z1S&=q#grSmWd@N>(Hz9B&Md_U3Z%k%!pc0d*8@VJTpPwtsR2n*`jg#AipM_7S~>Um zL4s%W*m^ItMr(MtP)2Nn8ijEgASVpS@mz981gRP&Qo~Fpy0%6oPmD0wu6MA%bb4&@ zpAAb)&E#zz3SHP|9s|`iWy=U^h^ZZ|O}DC7^I8p!HHW3uDkZqOiHjJxvM}6e zb0+<=8)svK>N5(ae?zj1pDF!jVL|!W$cGY=@{Z7i@}Tc8Wyvf$yCh$ZL&$A*G3y~D zB=q40;8fTe@x(b`%3HL(F)mGyq;Z^8KDkTdd@b@|`#>!1-MU|-S6KWSaHlNGkx+Sp z_8VTrO8V3+57)bt--@Ed>2W+HN_>@@VtY&}LjuY=XFlvT3^!-%7s=VSC|T z3I3};Y2;B#OqDT;2HrRBC>3NYr{;r|nH7Q~0+cDTo>Hc&elivg789)zk~)`#vzrX7 zlHjQWRIVusLxe(?iO{kH+ckD=9K|^bLkQ0_Z(15SpHe|V`rvl$d+AY2cP-Wy#9mf+ z=;so9|H($@bh-ywWK0dzJP=AtG({f;O;D)O^yIFyY7I3`HN`aHYJ*E_*36^EZQug; zrlo!?AHKAxyrRT17mUtEmKxQNC~{xk(0KK$uerDnwi-Ov1A~sbX`xR z?q9C{KaL`q_8PIPO{x_$DVY`blX$AYP}QYh-!~uwqEuGIfN3q+<+8y|D@6Lb3LEVd zB2tf3jV3ebmXO_tAPM%vN*k3D7SM=?%akcgW(mxIZt@Hjo(-M7`%E5+YawbWXyT<> zgx6XR^{7)6D=fv0`G5K<3W z&~i$!3nB1CMQj0~bVpmE1|2(a8&Da-OC07HCKb_*sE%!I9b}bCP|K_09YQhT(zF+@ zwPhMPkWuV1YmlrNhoNP(b?<1xbjvGCOIfGZjIlX31{sMRwO`eYnE-2mgN#77NHB2v z+@VroY%r0wI153+5Z>w!Q#6FZLKZo^2-F|uR-sCft<(=kI#6;@J=t?!%uPycR(a%L zn)N5ebXUP24`}xLmsF=C$r@KGzo0PFijh#Rlv)f#7c0fxfL+5LA8eHvL+`5pTbdK8 z@0RM*g^J8;W7)Kq$Kgo(4wmu(_2yd9`3I$IKT3}mC01}$o4vUYcz34Ky=i6LH6vf` zt8CBCC@kg8VYZ66Fm;#?<#w-O`cz4ZAk2nNmCX$NIARbdnc5(!q z(L9$IBH+!oXRNOXgBc1m-8ipA*j2;n=R}}t#Uvw7F2xjUjPM6o5`*NkF(zzW3e9Nh`Q&1H@hBRS2sOLNs~5KuG`1l2c<6Tvq8L&fodi$K43rLN*J)Y*IwBcZldWVBB1$jaf$dH$oG_jX!u@jPt1(>arJ!^(2 z=1=h7T`Ltlj_Z|Bv1~i0q)8`NRHanOS}m6KMFd+^V*5R1$&)OuP^42D z7=IYaEYu3~a=>B>y_M6{7z@>%R5*}?k#bGdmr7Gp$~IfCY-IEG3ayd?t^I=nLzv(W z5>fllX;{v{@%=~=9*+tS?BQk0Z?48zC!pp8|qx9%LB znCu8=E3~N`GPGq6F{J@TV~|K}M_cpic$K^B_wqU7XsE;q~Fi*ry#i`Nvw9V4>hfXaHZB|(kID5eQsp%0SQ>?}7) zSooCEm^L}*8H~MD{cuT3V7Y|}nRKMGJHDXyI(9fp@OBGB|dwd~4(#p)1 zVJ)_KfHuHsef9RUxY6N%QJowvmpest^e7H3bCF|Il*DCRnm+X$F$cfm3v%NUfo2hXpb*vz2_ zY+m`Q5mYeM;%2m>vysP5vY51MZK`W{KYrCFO>pU%w{!@f8Y9TfR!mBLK?G8Vw1PH} z9|`M043cR-vVb{5t;@Gshi$scbO{HpS&WcLGu|1<+(~7*klE^Xs*yu;j94*q%8Z-fw`U1(h@C^!vSB)yOtdh} zf$7MI>TpsRh6yGLv*p$rFUnH4I-V)xyk-1d8?wGGVnSQvE72Bv#T6q~Z`?ZC*hw{U zMA)3;98X-CX6Jh6Y_G;`45P3RZgZE$Vz9+{-OWJrL8vdjcXJ}KD@Y|-_6F0l;Z|ch zP!rU`h}OLVHQmka26a-CYLfgPmd0gI{;7Srgt${G0{6(W+cC}z$^qkhS))R1g-;(o z*wL)y7AaAEW)DPEi18TU6dh{FDnZADw=}Zhpxq+kLRVIka1_OXt(#d2ov!}N4+2Pw zaNeQiQ_>P>Xm?|+f!l1!VA>Tos!0q8`E)>RLM=T0F=wj=(wI*F4TA(>pX}<}kJ+>AOdo_aI=rOASqWMY>ZF6{v7QRe1hMf)eW3MnB)$k&h>-s!KnOJlk{{)L4TpPA^#MO3O{S*9M>axE| zp00;pYiKE3Wd|t&Z33gUakYC|>Bp!_8~wm{gF6^m;9m7K zHMn%nT||e5wbA_GX9m?Ec5Bjx7uNw{6%qEmrs2#_MYzox5L2Ut*kkA>tyg`ik7VT> z2{m1+Yil$@dMvvR8MUCF(Tj!@K(tDu42%NPnc{u?B^|epMl;<$4JJ{c>_dO4Jba1F z9H}~1Yn?ZvEDbd}TMlWgC6!jzd{Hlv!dy`baNqc~5Ps#^m6;xYNy)8ByPd9&TP*8> zKu~S+aafK5*O#wQ~}bYm8x zQ)@T2(xzoObQ6t!xw*vyDI<8PZKio6i;gpSWGqd)v9gz4A3sKFHnIzAj< z)!)2IO9Z$J_cr&C29e=ZU4D~r>C$P3AQS#^*3Q}3z{NpcHr5u*Hw~i@Ub-Ct$C+(R zpHC0YvCU770Jb~&d^8nbzGj3`8=7+>JRNHr^H+Hy4w*(Pj|!)NBOg?=i$ zF;o__B0l3DPQWY+N|ohqL_6`!W^?ofs&&D=#lw6_nBR#=<`7|+Y*NhudU_*-F&?iN z`|%3NWLfBHZB-*q6dBy=iLE$9N*EW?&p5FQJbj^s=I84;Vq?%r5UGo~<7qt7OR zo0pcSOWUUoIsNMHqBJnB4}0(^YnY5-3lz0#k@qUMjsHLIAX ztE!vgu`U(%^2Op?oAc`Ij0t&aKUGkzzkN)iAzae>nxI5N-R{b)R8vANp?hSZQp<(t0xjjhpTWhVJsB@o}kLxNLL+Ii>rus2Hohu#hxt)DMeQcm4)ZBS}Su&{Vo>3MOdP0p4n_0JZOyypO)~Plb*g3`?>|0)W-A{KCh5;v7CSgc&iceuiZJ%0R zZ6ko;l>1|M1tHnJyt0jupoV4QVlUulT$k}q*;UMsM9{el<8m)B$xp5ln`r%-<-xxP z)IkgXT(QQO&AFD{0i2`kGW&bTM~i&vW%ifTVC325!+a3?{3d0W3G+dWFL~9E(K1V0 zk3Fu>v9zb}WtKh&Y?(g~oM9EG`p9PXFHD>FdyK^EnSdU`o^aktIvnGc)ljr8r#TQE{|^>uE`c3sx!bF;xhZ$sToEX!nxQFxmW8*F{o~}xt(bPu+c4Sbc~H( z?#2dpsPUTRm5%u2s^yhTsC@VG%4P7^>R@9SZrqjGcnmp7$%@B_5+<{_AH#Y4L zhB|d3CLUX}M@TX1p3%4so8Y<@+c0X>k`A)IC&@Y&TBJa!Lt199T-(Q5zAKbfFDH*^ z8S?Xmsy)<>BnG&1+DWZ-I2*SX3R((uz`~~j*J(-Rx8SMkeoM3%2}^(hW$^(R3$w*f zGiPk%b?HWjSglN2AT%j>plarJ4rLK-ZKrS?f%BBYexVtpPMN$ASBll;uJ0GxFq z#gU_1$NS?cKw#?b^RJKnX`Z}8-B)GRZ5EMAH9{PGEdR0>*0#qVFp*@o(eA>Puv0>?%ukxH@4G}dz}LQv+)q88%dIM869 zc!^a-h?Xu9Z7p8^jC&mFG#2L|>rkjmF)gA+opEo@9G$a5#Dm!4XL6Qf(j!Lb3tR8uIF~-?6Dn4kF?1m;V02<=Tl7)={OVg)~>2XLkQ?EXp4QY&$MoqskWU-ddY%xPG zT8)h=C*X_f=ASMOsu~rcSZqHn)QwTlipC$pC=&R<1)5F^P&aaFR(t1;vJv40TWFk# zv}$ef&M(x#W)>y`>cmB}ahwUlAq}~ift;pVO7PZ(r80Ox<}ILYE`i3VwoTy=?_#u_ z#vhiuuHrL_C7LG3aDM;-%fuJv(MJ}?L*T4NZFL)J<>KQ<+42%x?rfcxs^zX>z-h0R zw>GMVA!wud{JFqy$Y=$vl zu923A39c&uTp8-%b{Q@D0;;ysR(W7YwoBJBr(p8^YyhF>81L$E1!BD>kbI-D##lNv{GE8k=w_T_lo83F6T&zF zhvG8)e?*zTfBGxN9>&f%Sa;fSyr8PnpJ zu}&aEhGjZBSEn%wGsa1Hu4lI}In8NT-i4(|6i!B{ZuKtQa{)Hj{VP7*MZ54^7iJSv zWJu!O_3XmgFDqWP3)t2R*V%qw=)JnJ zP`GIX?vYMt=M^ZDtvQ=~50<7SiBrGAxsWux6B|q&N2hhI5{KU`m^;Bl@%lqB!}R+J z2T7z67O?JTTL~Fk{T5^;2R`iHqXb}#E#y<3U%Ug#1u;U?)p7ydK}eeYKolKDDh_%K zRA_86y$niaOM^@)uR}*uva0&bQUNpV(i*7X*J9k;4fw=0Q zWD`@f?-bBt66G{drOdXR7!DDtgiYD3Z<&!|R6z?-)(!`PqW!`p;%POcs}M<8%@cNM z(AA+;)v2M~RyBsHv#@@N%gZTDZE8J>Uiefc1f_~j0+DXwpcJXZs6hj_rd;U?#}fnMiD32XAv%4>EDhGU0$1g$ljEj#4(9-HEXr1bAlGDr!f_3>;{S7k^-j@s;5 zk5SP+xxV$lG4B{NZiTy0ON_HdE8lvT^;)Iiu7wXlmSc}~IyV-c8k!;WMqdn!V2tme zFTk~ZYReNoPUgh*knZRqFqKbLg2vO!A&s7iykyW~s{1=Gi=tXs z-|(aAVn%8p#1?l=y^ng(mF%skm`xXp8@*|~(jR$J+3&a+$rP(LV zsLd~e$*PU9Pp%pduryW8$bBO|iDKxArFuGG?l2YHjTn9{f zGl}V3IvkvMB`+M2Jr!=jJ!e?xZfHyg7^%oh&n{y?XaL4U$);Xa@?Fc&iKx_Yk{s1H6^RW@7;Zx0$1y}2IBJ^MlmZEbnnJAujg^@GQ9Z4_ zK=+RBM~$jwPC?BvqNuK%hMP6)pdPh;uaxzwQLd|9JM7ZPBq!)&KF>Mh(uc^(mG2a*`@*)7LU&TuLRW;Dk?uF|#TxCI}YsGSH8=Gpe*?+^>;Rq(kitbMWha(g4(*=YR7XKXH-->lq=6| zVZi~(k2+B2lpL?@!t+b=tKI5cNlLCM*E*8haxS^`_0&$;#f!btf@By#mAPDHib**w z!=~J7hwAI|`BJ66r4!Eva|3{t)jJd@MvtE$yt&-!oQFHtHRLpfJ*fURSE-+2%j@i- z%!|TMt~6MwztS~?yH|PDN%TnV=sJOtYqUrl4I-_RfU*QoR)3{j{{bEpaYdxyj!3D$ z!j_or44|pMj5^q{L+Duj`?yh*p-*QNNTNHriqXg{QsJvb58#;G{t^RK;#F-#?*ATu z4pgQj)2|0Bn(5bobO5k$So}D!K7v*RXm2pxyM-5e5Jkvr#3yc>#0Leoq8(h3CLs4E+Q2`h5=fu~9PU6$zOU1@mGBP_ipY)! zrS<}j=pwUpxqQA-{ThDcr&6h-fL4D7Qm;(mvQn+K#C4OFUM6)LO#2<7;2uE^$R zf6%d}ayp0c2R~liza3*(ss34REy(>ej&0qL2i>^HuXP0no+{7&b+OP^d8|@>Vt~D? z%=O|a#!=4s&Qg0Pn#Dk}v^3K%4Gf^BfldJOSmlT$UqB+LK3|!Ai?_3H6xfxi$`m=H zRH^=@0{gvk^#=(OU-L+O4ZSMg2dXUsb>;g2d#*Ux29#8)KO$yu@^{5bp|gnFVtHas zx%#)c@n{yn4e5qW25(uU&E6=`@K=Go7;>DsLZjdcU zThJlH{*uq}k|&R%kVmmt$TMTH*jC6DOL{}NP)HX^>@V@4zX+5vd!FX1SL43Ksa&;cr`aBqY@;HW|Pm4*{@*G4I=;qm%&yp=!-HSOdL)>7}unHdd3ytXQ=MP6Lwx+qnTyC#nF`6^kDd9KJ(62>hkaJq{x3 zO8xcr=i1h~{?)|-S_K#zujM~_ZQp!1$uvh-S_H!uiX#n z{ZK-u-}l}9zOdfQ#Lb0-|o8n1P-%05PwP*tR+sW0-$spUt>+=yhT3xM9~2hAg2JLPmd7>45gU%Qvb>NDtD z34c8hFO~YY^w$Bpt$z#Jw|W-iGPJYMRj$9QWL&R;jB|Kg)t}snH3-t$rv>E%=L=Co3HEjY_yOKuH_0>5xN4v2~b-#t0 z8eK7xt3RtKs6QJ?$ojKa7htQ*Vc@K6ILCcOr42sSw7opv=KETwO;@sXlc^sAngH; z-x)kY`wh@QZR6RFRZxqST3^0|6Go@hhr2aUA@Bl9`Ft0Isa~eiOCRdD_H`hWPOi;$ zcU$R_D!md^QK>Xof<93tE4_n7B>>3@K2TqwV}M-OM|IXmO78_jvaDr_bmC;iNb~QOhgb5?L3GskSxN&QUvt=aITw&9v(yis5n>ET=lxv>-VRa z34E@n`AYQ{uv{xs@E9e1z9^Ct;CH)@;$VjeQJ`|JgYFI9)YL1Vk|TotMjXX5&#i>ed!yx{kFE*eDkPo%Zl_~g-Of1*ebV6t%iIfGg zBo~?qVmFU0_$da~x?WFKY(39r$#6&{KPgOo&<4p(k(a`$;5^?8kQgC_={6v>p(y~i zm2Mdx6^Wg7FkcHC3=E7Y)j>*nq(Ms8wiaQ%l5wTnjy{N%!GzIa{}%x@6eD^ME22_8 z1KjyaS39^3wXH0HMu@md?HX7qNQXuoXoGc{?;I$&wt@bEfdQz6JbW6Vmu}?m18Q*t zwL}L(G}1HFNHCi#b5~bt!|)|=gm2D=yu^yWUy_(hovmuW$pp57TOsr*1R7)?qD@i1BF&$u_z(t(95+n;wEziK^>L%RX)Y1?! zwR-_scUxz92Eq<9s62CF0pjL2u*l2R_oN69)n__k6#%GG0qzH$B83@>s7h|25>dKq zsFRuS4~RzDC=Btxb}wXjl1d2ChZ@eT z8=18q)n~*csfqETw$3vu-w8H;U<8;mURJFF=_9RM6bCMfkSt=&fl6u2<&m}9OI>gX zg-E-I3{v-)h?k>s&nNy$0!s{yk=%Wp3Ad1F7Wx8Ln0fkIS^or?@;aBi10T_GD|*lQ0b4G=K@w1g;)wTmp}ro5%@RMCDP7fT93 z;?G^%&gS`7R+0i;Nu~MKZQX-ORwCt9kU9k03%HV4VXw)AA};csBFK12L#Z-%Gp;D_ zcoxaQ?5yS~@N2$gVWp=!Iw3V*u-oTZWG`}lc&GzmCott-@Uc(yCvD&s-vH07_ZvJs z-$U_%aMd?(?1n>)!uWgsf}wUC8>-WKMtwazvx<3xWnQ1(>7Vn==QH+vW;Mn5+&xJ5 zfT0P(&lKkTn)L1YUJugO2ne6wi071I$Z=7sn|SVP(x&f2Mi$_i6+UiNJk9w~~fp zfTv7gNBrYg2(onXRn)nF4ulisr{6{DcB{OX+8ZEX~|C>4&zqD;ZL9%=I)}H$4LV1I1`^ZA&(#d#uuzD zNrEXw{=pMA&o+_=KNUqacUP1&ERb)gPz2CWtIXYts$iRsnO()e5ynVIigIkOs&*jb z5Z2_+nfsUQV$tgX3B;BZF$tGHkKR8o0CPy$yV*-h82f0P?dfk3y@WXizrR?Sdje(| zPsP=R!XVFbzy+_VgW#7`YFl`9iCh6pfHN?#0gh*Fd!=@yGWXTN62dsOv&dJjvqv0> z%G}eHxo0uv81%RB>mDK#o`vhN2GK9{6ZO!F6Cyr)0X#~Y=Wx3!wVz|?evUAHhZDvD#&`c}x1~^|sRtGXMIzVL@Hu!X4T}{cDNJ7r zvB=0WW0O5}lE~Na+NBV$Ejy(F@^hq~Lq&Zm9W*g7;^8?64cO+isF9JAFmO%fI$va% zkEt+od)A6a_uJfnzyz&qK(2L|p6Eb9Fui04aGFO?q5`i*<20?oKWt*1<%HozGpIBu z(H{8cwVw+ffpKJ@Y>*4dDOv_VXvhLj@GBRJ1eL=C_qbR> z@CW6d5UW#CLCS-r!8RCiJ{xnDm!*H(^}f|~L!vZvS}SMoaqWi)xrZst=Vn+;VcUl@D!vcm0DMP#ZV+x^ z#{kAc3Qu)91XcSvQw&Wea_*fHqz`OZW}z&Q{xGvhCt!ODggr1YIKbJD%G`_S!CH*d z1`w>j$*&cfB!AW~k;etF29*MuK|zR;%G`I+rMZ`JK+jk^ijxHAUKVkVa%VqOMOZ_07n$fjj+#_W-hq7UsLy4uEsw~!A_uFJJuEMp_04hfWa{sb`~ zdCGdqA-Ga#D;3*%8NF=-Z_#b&cC>wWFjkBZ@E|7Xz+F@ua~iXsdjl1cW_YF@^A-;q zAS9tf2L1Hg4}Bgxzv=V7!-9X~Z+_03ALE9CWwlJp&%KRXxCniSY!z@syYPU~f5v%X zP8T~62`EV*mqFk*1adL8kCA-`vO*<4uHMnBpChduMz_x54|jnMt3S#k9L!qlYy1G! zHt0xf02zrrAVM6n00lWmNfSW|U}g%4!IWDYR1ReJI!2XAH=Jvt5<+|LTp?No++I5i zq*IF5H&BV4<&ZLxf@C|3d_3!)Nf86-Y-ybZ52b>&z)BcOa@E=#wGWgVC7lqaHpAPf z)gI_Q$^;UDp0zn`nkkS&wX>9YKp|)soO~9&MuY?faITEuvJHQrQ}lT=^3==71EUEV z7vw)UkmtnB7)(TD#zSzdUWoa{%i7s|59*LBs5}ggWY}t{s47XVZMIaJQhAmF!s+Qk zs&~_Z&>O?~I~W~CTWB$(K!HfXnIKKA83JLxLzb`1-7DirQ>bqUm5NnBB7ivtNm9>1 zFJ$=NAu-MULTegEP5q2Q{ER^W1aO~1P=GOnCp#P$Js?6i*oL8OFY35pewF@zv0nt% zuL5z9p?KRxNw5ZPly*Tu>clB zJeW0TEE26l&K5dX=LR5flVk=1w2{?0AEePJB`v{vPLyexv+`sh1X-X}ksms7ie?Wk z%eds3NjyJGLx#;hK}kZ4B^L;Z(UAl*B1lT#e5$|HU%C`xxAsz{-dnD{h}?*Z*IvZk z0L>q}p)F%**o{U z$|w=%|Ib6|4p-{!m3dnFm3om)jjD#(pfik=H5-iVcp+rBfvUH@9i+NhY?%5MtU9`) z(1oK+iI=Odk=Ok7ixOdyDF-YY(QwmCdU}K7E25%uH4w=5ul|^yGpN*l=MmcCTvrqP zcY-FjiSw((tXG_>K5@*`d>;m!!y=b9gGe}HAQsKePH_Z(=P&9S?3O&0Dd}lHpaX*D z;bVw+0BYCJl%%}-6`p7^d9lv;DJBi)7@5oX7_WEvW%6UX&hrwm_VJ?cp{RL=E?4+OT z^xqXkGwkgFOojTZl1kWe?UV{zM0t660c>*^|7DI&y$mO!jEFR20rhf8$Q}vxGF__r zH-t8E1FD&O1yT*1d{Lo?f4<@&+%c{OXi6EK7bsAN=%pVKfI`)MFf$Qgiej)Jfr#+-)Z%@kx`rS|K7 zdw3eF$?$N1st5#Y$-WFzpJ+`_QMiwci2O{B1^U+CwOa&W+ak!Vde$% zGvw(rmHMxwieDki87`#2+9+8SSNjcX+Ev-Lu}}dc;PEejz1nXma_aDD>g!>1Z9={D zZ^rN|xOPY{xWedJ{SB!awTB=0@kr%Jp@7v@rP9D38A{(!%r=~ai2-DPp%Vh{S7-t@ z9Sr}iML1oY5rYGOj&EW|U_29^-u%ENvgAoC^vb~N2~Lwol1UcUVWMu3VH?DfD!X9d zKmk9EE^@6DYQ=9$VHFSye6c855sN4Y$JRWjh}pDXf(AXXHF>_a&|9g#%{rx+)EZ@l z*@J6uMP?NP! z)?%ZS7MP1qnwNCHo*L=6(y~~A;H{B{6UPR81%S|5VKC4Fh`0j;2G)UI7e3_LLZQa* zf(E_|KI4iaxR9lRD+_&yLt@l8G(ZJ=A`L^{Qk2*=VF4E-6X?DK{LB4^NIg2lYAglt zE-ZADD&a@VP)qF?a8RR6P5bsFW$%{ofvL66mWYf5O4v{4V-}Bl`R-Y!fJD`rwd9V1a8W zRG)=JyvDnR^_@tDf8&#Pa?!v&Vq3h0#X*(5NMC~}=>QGEy*d*tmaZhSlw45A&RX#;`oT(81^weFmHh1r1f575}St7Lf-5P)ruY%zp}HfYUGa z^!FmfzY!VQ(yC`Iv_re+&vFyb)b77|y#>e;k@gsn58T|YuJtOHIZNi++S#P&Es zR3Znepfo?yj&;`zxE~ldG6PUiD4$b zXp^)o1X%{TmK4R@G2~fttJA#9*Gp=rqT$Vl89p=yLBbg;aHfQ?IN5`V7c-akN^&Df zen;S3M+t_YGZ!*qETMk%MO8TpyouQzSw|?nRyrby znqWpXa_eO?Z#fwCC;T9@6|xRmWpmWn^(Q_~SGOvfhG1B|@db6b6iS#BHBvRPK#~>~ zO`>wq`}HSuftHw%evkm6Ob8ue?2gmrSq>kP{~@g{1mTJ~q%c#;J_W;sM>g+oMD6Xc~iJcZz&2G8mXUwGSD+4QS&DxD$3T-A4HOnbV`!Q9=N34 z!Nf-;5$YE~{`z|odcwOv3~86~<`VQE3G2IFn17ddwQI!r!&5X03eXG5_nNp-Lf()= z`XE|#NmwP{TL_OcX8b+5`;ouyh09sb-kK*(Qh0R|@i5uN5+dsz2ae+82*^WGK@YF56H)UQyzDX{>F; zJ9;h$i<-Cah_Of-sPxJ3MYzTiZ~O2mRz=28fJ?2}&Tv@>mmT49M-zVZ7rdtGL5Y#Wz?mXaJ%jnApJN&*(?NB<7P}h~2*hob9Rj z4B2J=X%6N5(@;DZD-eXp36cn3t|Si&{ek{r`4>5KxqeJg02>{+AK(-cCn|7BmGVu< zR?;m3AniyiV%iqw#=AleXxE>G>p>t`WG;^-Mp^#_irJI;yPCKDZjUT{w z4YN?V#ZT{L%CK(>f-8t6cgPE9Fw`s6ui>XFDUr1sl*4$0{@@`NyDi8c2m*Nq23TIq^GNHblP1 z+uCmBo60QWC+&Qt<^n90Rfb|KsGT$mOGFGNT#$&MHC_Y9qCKCy-ey&1*O#fVOlZD`EO|^n^Syz0E01#m ztOM97&kmvwgP5mPWr(*0NwY#bvx976_HQb4jx$!AqMqH0GsX-`V@g&byj+>RnF?uk z9V5zc?dI2sj@ZET*>%W@BUcUZ%s6!IWy!u-j$0YMky4oW#7nB{3%0dXj{6M3(+|S@n{bS4 z?;z4%ng1I?GleX8%v=m~iu*kOLkfDvir&;%(VIh1)$>2bJy1T#l?};rsE{-C;}I}N z9m(7&s|DMl1q2tSAdI;h+?Lz(l@BbA;PAkq;$2DB1o4Jp1mPaw0u02L#!wztc;yjC zTO-};5cCw;U7pU6vSQk^B8HFliLO`N4#1M`*0uvuS=V0M?q?=| zmfCh1{wp#31ZDObVWyY)svBNQy#|CzZOh9wa7&b8u3=aFr6;0msCQ;JD(GFunZ{TN%L0LQ{{3z99bL7Vnq$j zNVr9_&q-^ya_zeS*v=DPKSKBJC15;5Uhs|p@>Xg0VFB=)O02gg&d4mte5%{86T~Ip zqlc&$q-$AyG0&CxmD$%mROs|k)Y+qz*`u)H=z`5YhhM1UsMR4CtOFN5qX0TaKueYR zF&T0cKCOUH4cQE&)M#bwj7A`QqPzUwg8Hi(4Z(9T?{mqG8aIYF^&gWvk4-E_VTWKd z*%J^H9mwdG{;b_z0@W}(Qki|aG7ASh={&qaF;JhQT=U6!5lyEnvtI>J+QEnM_NBJQ zK`WK`w$AL=wL!GYhVW1N>9c{X35}0l;tYOe2IzU}CxpOqrEVaVZ&>oWmj}LD##cg^ zTEk=jIlOk4xbw4LPlf_5UtG}H7DT8dy3AbxL@Qx|fd>R_fd>sNOv;kyu*5j&``1Sb z7nWy#SDEz|#_Vsfmw{ALnf;kYIV!Vn%kLMJS^d4M7u4LCN0|K;b$ex2wn8Ae{05pk z*Um!+Nr_2scMWw=72=&Oc^MRM3w2=CM@I>(c(rxQ$>u=@KNDMDib~t>!oFe?GzyeY zX6I3aJT=cb9mJ#G&VwFtLIT!k;k8&?zz}#ECmivbO2I9cg?W)0gt)%qZcYcGBO{!BstJVAO6~jVL`N-BKZJMaqNK%mNoe}mViFH#)Ylge;zvadH&?x30&B{F3Yb1HLx`q zq2sE!0nC@lwcHP5I-U6AGF+a&g>yfpEf5ALH)WW1=@;wFkhyMJgKmUzC|Ja}3 z#+l2=Y{rLjs>Zb#SZSoobY!6sn|x22lo9hYDjtNdU^*G_Ngp*+Ni>EZwgIdflqGb) zD7b*G0n8pCdxOmNNY7!9bac}yLCX?^;yHwsq%VjjY2fFCGzWo2^HQTSw0q#QC^aEB zY5Tp^SO|%zkS5}>#*;8V#Q{V_Nx=7zYV;_MBk?H=1)Ba^;8E=*j0TulucJOHz4^zy zbyj~QWb`>#&k`R+w;RsQ{7{@efIU({}V z{NMk_|L+^K|J|Rg`b7U{{@vi_@^yFr;MA`C{{k=oV2%eu*N!D9fa>NMY{|v{8}Xrs zjo2x0pTC;GmSr2Uqwz*}BmQs1{?Hp`4`IFH7HZqv^{M}#b?t1U9g-j3G7kkFia6xY z{$u-NXu2JKC*I5Bp@)ZF9{PAF@vw@Aejds^+|0u@JXCmC&BFyetl{B89xmeHVjeEx z;X^!pn1=x#26U5*ppWGW4sT$ zx?UV7^Q)EI1&t3<`SoLA_hG;9|04YrFYW@{xMv?h8xcUc<*aQ%&9vs!xW#)`w(46Q zcjo3FyR*WTbFVyp+x8);{LYnyJdDom=TkAa-;PHh?5lTPgV?%S;(2r>AvWqbFZ?#b zYn2k(6~%8LxD~~3sCLC64ph9N5Ql0B@qf9J6mbyphI=}4w`gUP``_Q{*@G2D&W(^8 z)7Xntp zAS?bT_u91`nvda|YuumKc74^oRX1f-nU%4j@@ZE(igx(5T`JL|yd9HWV)b^2TgLKp zI{c*a6tFc3TP@C?nIW#BU+a&$r!9npQo4H;eSR~V;x5Mgwgi&cW}H;yQvxgCO9B=Bc!2J~%{ET47WSMb zBRAh>#r&#uFZWrd$;w>)%rh;tq+cQ|g*~A8k>qw}y^x3id*HG|2ggDzQ;YCbvvE+ayyreZ2S?uY2XB*Dg zZ?v;Kf##||Wv!Ue;2l=N^YA(kFZ1wS9=^@POFX>D!?&=>!Hop;Z61EXI`E2krS^3` z`~k0i<^jOkdI1E%emP(4&lmXfkU#etpxxVcku!^tNo01%@NpNT7K3hp4547t-*%J!pxGdZ&=Ujh?E%kfot` z3vh0W#^wi@`8|}v?y{Zv&TceP>t|N%=)%I>(oQb8jf*T-=JNO27Kso?n|ZL@wUUt= zJn(Lq@RkkUISg#2b|((iU&=;F_G&L*^WVj180t#xb%7Z0@hwGwR=<_0XIbnodG$l$ z?le9OfVx4>EQyua(g>#WYQMAQ!WG`@(|%x85DIO-kay8rb^gV?iyD&cH93~Kng?le z3$NOFC`PE|_}1R#;m4o|c|X%2!nZmM5J9gp+k>!_8yR)1D`tk3#gKaz|QRwuI|S(M6lpXT8WdyJw)?{k)C9=ydB z#99Os%fJ#xT4=BSRX=31;I?{o6deD9!M}89w+C z58QmB{t_Khr_JH?fh2>4p%>hCZs%w8?!W^QYNz^ zU+L%7uXuFyL5z54K@kFquL8RaK-D~YnBObh4cPQ za=#&;T%Iin;#q#P@ckShugv`>WXSt9?ZPN9(`#q#8CZ;Y|Nr*B1@_kz&P^)sblIoOotlYhHPQGA_<8J8%Ru}_>ZCDzsRoO9~ zPz>1Q&_C{_SLfmKY%$8nOLBMxI6p^s&Iw%}kNm zE3-=kL63(qf;2}Pj+%km)QFbo^{4NgxI1=bpfnGURDY^pe8sbH)c*}Si1$H#$xS6Z=csZ7W zLz^xpxX;FGV`n8F<$P4|!E>`Xz{11B&YDWR9UBNe1=~br&OuK47&V9?9zbv+r|p;QDy7b8<6@No zIe;wi#}oPRIXJG<5HHEdBWXgnwYBx60m8NQJZJ;tU&w;6Pp1Ok~s#tEd1U9R{ z<}&i+JO*&W2JD5~JY2vU&8Ma*Q)U=;bDeo8>r}yYVD(yIbv^-oy^3GY0F+i;8^9dL z3;g5h9U|T#^y0Hm)H<*NrwuSC<2w$Xjeti0-GC>wU4;^DxZoT;3(Z3|$%UhOQf`nH zG02W6u_8*;r;V8Hao|}Mf)8gFr5MfJ3LuL?oM~i$^NH{SnxNzAUyo+>cv(vT`PI9m5f_?$X+i(OsKn^ z_DRdL`-BYgu_qKj2C}PE$|?!$SAqSK?G*`RUO@obI0JAbutf#7NC0-ZnDU?m)~LW5 z(w67L9DJhqT`K-AlHm-*VEw=tIFh_wC2wc3dMQ>ixdUf&Q31Hh)ZiosEx8Q*H zmtdfP$(2X=H1l>{InQ3k$W7p5e87&;^fnH^cxcBEU-&Zu?0vG1QyeiDc*DAvLODZ} zGf~Rlw+)-FJ}Zi*I3M*TTB*k$5bFjPO|(N zd&J@ENn}xU%(1i_ze54KRVqmBTGM3BCd|~Q_yofo-vGt%l>i4LP3zlDsj@xQwx`DS zP&UY@FSk7vwnudaNK$6Ulu92W24Vxk!jcw+NJ+lv8)hhJ-tC*JU&8*!8uv2vhyMY(uN0J|Dr;vffb!1>zjlG@{O zdlFvt(GM)L1dJ2F@6-IcBy*tif+d<`uRY!h@fIbdst~>k<6TU40CtH5ST(?{Z~--| zrb>okeKt&Y^ZBnk7A?+jv8C*b2AW%;w2&4gH7brs# zK^(wb42O-|vb!z;`}iCJg>#}#44HzF^2!>WCfs4)8dncggZ%V&yXs)CU%XchD~iuT z=|Oie%ThbTwZ$2h7YeRmyq)PL2JD({fpG`S2?FM}e4V!oSGlu0M0ex}gdQQ5F<}?d ziOC906JyB;0#7vf8FzM9WsRhW@lbp_fM}fc+=cH(Q~{1Qa3sv^Vd9~|y791R8|2K-I{&!RcmqR+IvFR)o4cdmEUMhuFc*u$mxK4m3-2Yl#G9 zGL!LUjoD+dL!}~RQ%iLtz0|3M1R^HICm&hLPDpm7)!}Lb3^N++%5ZL~bBch3edFjb z5r_1FT*I7#F*koeW7;vc1QwKX`Sumk3q*#IU+dBwD+qZR#qvoqV-mN$fPp5}VPTGm zojNRTc^HJzg?wUT*Ci&9voU;AN~5djE+DZ1|7&!JRz$3Y^*$V_7W=;QfP5LWm|QJr zhbgXBR&HXP74@mU2az<&TawF)q!;51n|u6J2*#NyIi(cBf+$U^qOpuuUWhbTiA7e( z3G^k{1!IpMTxnp%z_1zd$nL5|uW>$b;lBa_`6@BRagZd#u#lqa0WZ*n54I6us?v%D z8z2jqVjEU{kbJ{RhHCiqG4rky0*}#B#066uSi2!kt^X=(VBB1^^1{Q4!O?cy-Xjkz zlxXFYWZp`@@4*!GfbYvJ zA4rdHVI-0RL*>NA2#9$V?Ab!^1@FmH9V4R1z7m$J0MC5}G!&K}1MrB=SrDEBPo{iy z6Yg8Ve9n$!0SFa-&QGNfLk7)Kty;%1tClXj%m)fb?pP|X+4W#RS}ch|MuCP_U$GE~ zDQWdw4yZ1aL6@tyQphqcU1>mWY>y$F^FU6}&)|qEg2bM?wPeUa*9K0k%!eCRP}r*Q zqkrsyoktr#v`O$HLlUpItZ;+n>XwUYCEpOsoeXMFB3Opw!AMg80^NYIFu1507$mEq z0b^qx?X;ScJ%Gr;L>eZfWE`z_K_sGiIoMQ0KAF+j=mRB~E0koF3+G_1m{{O$lr&n8 zK0?n?i_hV6Jodubs0x-1;UNe(&>0?O5o8Ryf?Z`rs{r0-NS;1+GZ5%gwPMfS zD8U^QYBU%aMqmbPk|47iR;r}ONAZ~($koVrS)a(FO|<+?GS4Zmy+X6Yw5{>zo*!fI7|tHVgOEKpri*3WC=YCp@&Bx<~(i< zc@D9W2=n*(DEs9Oc1$SZ{_J$2YUM){AqI1>3xp5$N0vjafjomwOoba{6AOu@x}%Ku zJPqI)A2+3;PAsh$Gl-9JKC1aBzjiS&}Z?Sk?Nc2;cf)XOo&z`QRuiNOCLwd{a^slmbH zs|jN-?QdZV4Wx&6hz{co*dw8k;b?pZPs&`*X0V^8a2hxmRg7nr@hZm`^(sKx4`~3@ ziVC{wT+S~r4ZAJ&t(CI{PZfT4IvD_oK}Yhpod%ng=o)DaEaV}eR4;<51MVO~ z9d0L5a-Jp%nT4@3eppQj+D;0o6aaIT;F=Z;8Y@bTGz3O+Frh1)yv4-^ggtWdgax)1 z9ij^2lO@_eEICFfC1~+&wnQrG;kW{MW?W#-3mV0AS;TKo3a+6JsX?>9xsNh30=ITs>kJm^pJt9UI?1y2?njc+570AH)U!Gd)!gf`Y) zTv0(crAu9a)09%%Q5S~MR)7FQ?8UnVsFk))CSOBLedV8ef5eg|UujJ^}VN;TKbNv{ttnC8^xz>TORQ zwy0$R1|0AomEZ}%n&JEiufk}hOjjTwq>4pAXA!wG#pKQiT{DA7y^P&AAR>b{iRcjx zahaTNh#d>G@`SQI%Ul?y`2acq9Z7~*1|b!bzMwfeMRNdLCf%$KNT_bM{bUPuTEfCp z1r%FAanCKY*h2h*{xa3W%cN&nOAWdSV6b+|#gGPUm<0hRvBaois^UFj$-xKeVd9lE zHQp9;AVQX`wzNR_sJdaV7R`iRH86!#fk7jh6Jux`iumGfKW-~|cW zwS|?{s!yh?J$c(|3I%o=#f{wyP$ftT{Ku;V+@(p6Vq(T&d|0X6->R(RDjw0oH#mC) z%mq;;5x2m~o;%m4a5*4Ok3)ra7Aoh98}N^)>@Z160)ftZD+svPYCc?>^u4Mtdh>nJ ztNNl>^#w{&>4d*KGT@6a$y%mj@Hw{~Q{=Tq3|@cOi7;1O@bg_pJ^`=w^MOGM zXt{DKl!HA^J9DLQ(O$kwv7@RB-hno@MG(si$rS}}Rl!@MDzR!Fs6tc((9SC5)Tmmy zcga|g&8}!gaXVJnvCE5Nmse6{f!tqG2B`#VogPudmSC_zJyY+|0aNKZvJQM7@&_fr z{O^mb83_+}!)Pr<64aiJ%tU*!zEM*QOQ>BNBmi}5O)T_a814JbUDz-J0 z4wZvRKPXR(v8Rf6DqwdF@8ckJ@Y*Q%1~(XyTQv@N+g`|N2srHQVLwxp z9{3=g@nSrmVyi>Ahfic5w*h;ww6e0pKL`Z`2>kLo9_|2&qMmx9(4*r}m0h7CTgeHq zH(+67m$Xux*h7Xf#-Lg+&M;hG-1hIy4$X7rhVNBnG={?j@vb z6bB{XEbWs`QKW#-kfKq+(kq1O@iGVBwGc8af8jrTxH$#Q31Dgv?YJi(lQ&`jeF+QV zgc2M#tVLnwqhp!A~68CQ2rF17^mi!o?Ee-Ae{m8Rb9+p6uuSVuH)396ftkbFttr+ zu}+tU^(Z=8{^*;}DBf!!{hqX(%l8ns7d!dVFLP0v!i54c!) zv-C>hQcmb#^N-M#!^&WLst+VbPzb+=0tCpR7V05jv!3@0UP*wAD`wu=3v?R8{NT2k7IaaJcMAKcluv38?&=;WQRfPo6C z2nsK3#No||43YWa42Q$}@+trd+wvn+?2Fc&-9=`FD2hd-@I?@EK^%^h%u5?&g#&p% z5+3aQzylV-&PYLLlXVP6c~mWZVD9b=saF<4khC#ELZ(4>CA4?j3uZ!EFJ2j|x9;M< zjk3`uU9VIPaki67Nn2M`TBXCm4Jr}i_PctDba{u*KFW?qrJx@j+Hx#li!MRH>IVd5 zmsU*YD5Q4|Xn>)h1{kqz(43_W*r&h)ZgJ(qhLSkEZg<`?L)W6w9{b{QO1Q)LDf(25o4guRbEwtJ;!KCx9K&y@n4 z+cQNaR8MB4oV61|5Y|qJ0teBZTPEPtb8$@rhNs$!U~fX^p?{%p)G0^!Ah%sgY*0~7 zsT)k;6p-*ByA=J1&mK*>R`?wskPze=c?yk0yHdzgg_0(U3MEDLLPR|xsKVh1HHL7# z;^)|bjmSbq5(LwcJQaUz5dYWZd9geVd7ARL zFGwa9rSNIAMk`sGHV6e~q!RJQSyS3IExW*>WrMTKMd?I5m58JpC24MGf!Se<)aP^s zW6{u=X7@Oc$LII(&)+Ien+kb6%^sgbSm^;@pvmuT@-nBy(}!Oq(CiIId@U`Z=8z}o zZ)*uR``SEBzM$Xh357!uUu&}&Xle<00{#}CKhhG37#?r4zsVnnH2Z>0X0zYt@wJ6p zj8;!5)D-Zxd0X28fhJ#T$Zv#0tp@OF^);E1Hc!wKiZr#FMoT#83Agy#LPo?FY;I}_ zH3f~J>1hpmfStFkHRScQdfVCpA#WQX2Sd#*fZEjJ_nSr#6`|%}tI^!z3$&UcZ%f$g z^@Yq}I2a823}36)-`WxmnWhmz-qt3=XlwFBntWbQQzU45!@f4J*Y67iLjk}8=|U}_ z^n6g-IGob$W-6WfH=+NfgpPvHp~DG1xjSxjL__~dQip=!)^MPS+!8j?|K5n#*U}nk zZfZ6|{$^h&(iZXs{B3Psu!Gs$YzBkg02sJ6(A?B&1iUS+tu5foU@Ler6bwZ?;Xo)5 ziL?aG)_~CrUTrg5ngd~v5o!sA!N1L|VFO%hwqP&>nmlH!&j*I{dOd9sZ@_N^y?&$3 z?+y9eP{JDsgu>piKN1QWo`?~|h{JFS`b`Y9KwDGL;|+w2Abc%hqsi-S@kPM7%`IV1 zn;8xpevd!c3g!prHbp$mKErJBhCM-_>GwCa23!20kk=ay!I0e~hjzLxOY~?;H}uX# zXIIQf>Iq-KZ(Sn~g*r8Pyx=hm= z9NI~f5}n;iz)9W+s< zn?x{`h?!}#Q9n0j>gffh-fpB8HcmA{=|r--accl2&X)EAF3c=6m`x^Gvt^>$7pq5lD?~KfQ=`wgT}- zj>z*FnCE{1@xy5UAe!*g&qouA2rqp9dBS?6p6>2652O9Fp#6?HGFPNOyP#B)PTJIs zIK(WauD&RmUZ4hmh&xP8pHg}rilpiYG|5QLH`9kUD%%LXqe135r9bPaIvO^pgzF28 zlpZwAxZaVt+!W~^O=C`26xTbA&_ZKAriJNgP7|p#B>enXx1KaZiH;649%l9hMq2Mq zbm`%Q9#5ooz(^*eVN;)Grd3@K`_VYFBn4bDoQ0fOibj_I1q}S@IEvmQ+FlgVbp=!&HQIi18*c#er#60K_pCK55UslR!%)8JH{Hj^bsV zBO@9&lc$XZ-$4e2z@0`sEmb!8HLcm9dHXM_<~1odCEnFxCJl5K>kL4JJ8I)*v?mst zaVa%{eTgzsmmg?)9ooqL>#_<>h=4=pnz0D0@k9UfIkZuqSYo1yt~c{VKCwY|C29 z*4r0AE^}5dOlx7Y6BCw^#tdW4856nSOLdx|XvC7NYUMLAN?b)in?@M2jSTylAfDS5 zWv!{Sf_H*L?6z|=Y|w;QEV0OD2MsAY)|&mN+zPYp{ikHGO6)&nVCm6PGFAPiQ~|f? zX|qGqjzw=+xKvG#FThd{wA0!gnjZuTo5>@mzC#$p&XjL;yF;7ZjxOQabV4d+b_8SH zQ)S6?B&7cHoq^di#@V_+%FI2OqVGP(jF?Fi0@$9M^-hanjs(qh?GgFGUzbB$Nfye< z>NYJC^YkOKkIAo*8jncJgBqu+m99OVL!bBwkiE+qFf%~_EaT^zMl!TuYRs6QIuzIT z1T?X5G}0|Nbg0~g6*u`w`UG1Ri4OfJqfqpXyb8poQy;Td?FPoCg@wJQFA(+;hjyXx ze1DV_uz7_sX=2MEq%=2HF*{zQ{f8$Ru~-lqB=w+J44N-Q0mjrkhxUzs0eo=7Q7X9D zp6hmICd$E7ZB zZ#RO;+wnr9f-g1dHC{~O(?l9Ow5N9O`s!_0y*&6!?#1slzcF>>2amVk;$HD;{E=g? zSax3P-N!AvylK;_zRhp#+J5lL{TE*P*bgqhxca|$H2q@vy7{lYI>od9D_?fFet7JR z`)91In_j*3+#SPaKehV9N2WU#&ic#J8`mHEyppe# zpZeOcn#Rek8_(K0?1>ZV!#6%|{>Hy>;uXuc-u`aIz`NJBpFDHSxSwubwEG9|E&2V+ z4_!ZIW9coY{BG>p(BEIWX~z@49sK^;GiRGW+3S1xq@fqS-ZSs?`iV~S^6W`#LVIh@ z_}!S5e|_lssb|kj{o;~}t@}To_N&E%J1?Di){H6bznw7iwX*XvrQsp*tK(1aUb^X& zmmj%fkMY>D+?)UNs5b20`kRKnBzt8T)(XQuDO>g+lT_^TkdC%x^mtNmA zVCu2^-uv}8Zu#Ja%E#N!yTawX_t_asUOyvy;fsCKzZ+@#;g8R`U~T-l-9JC}k>B0< z$Def9&%2>y^HUWkpLW&t_e?nc$)0I_f35t|&b!WCwc$U{N?i9q_1a@SCEZWd{l8aF zU-zqvuMLi$z45(o-*){Y3$7VD?N3*3Yr1=7?BKThQqx{{j`+@c^O`vyzq;$115Z!d z_t1*V=6z-MrUhSkclnjQy|EE9#A5D7u=I&dUp4)TB`6u7_aB5?6%kFIG zy&n#&yJy04%Qm)u=dAm-Klh<$->CGpGY4%?yUuN1al&+c@21(;WYeV;^WM5@){1L) zzyGVB{&dLDHyWq!?YjQUS3MOUlpJz5{$cpnq%{U8!xVtpuM>p8M)EC4T)|Z;!ub!DH*HU5(EmS(`NGqRHmvW-QT( zEraw$=a@0mNSUdNI9x6|UoFEgI!ybs<44Vn&X1eni{>UnM`XcviVX~DX@B7G9F3jf zAQAmP@b{5Ny$K~ML%s0p{UcS$wEW*ClM>0vvDi$kY_*P52rEFdF&v9Y`oZCV;c~*y z5;*6p@ot}T{P@?5-$MLWZQb@CZ;Zz7D|@u%n#U$y@yf21Kl}B;Um91}F6z7Imb)Kpo^VO$wU6)m^P|7~ z_|@N++*AKl&A~t2_w=$kiK@QM*B$SC@XU$FG`@Ju?u)7dd+HzDvu^#EzbzSdL!&kY zCdO5JdGk>*PDFIxi!--9w(_P|f4;J9%DpGv|FpUFoA=LM;(p|T*W2zs<&WQ5v*CoQ zg%8i$e)BzZyAJ%V??3LjzV6=j+b``2{_>6QUo^eu;ot7L?7G&r+_alFX$QV=%kr6%uXyQY_7{Ip z$>nEMk`8P)bFuA&#lPY_jK>g=pG`MAY`b=Rqo!-$&@Kk8Mi5M%&UX6ITnszO zOV{@Im-lFG_=gVVpX`0)?__PhW5?iH{7X7!NoZy$Qk z18?5yJL#4!_YPkAhwEO?JTdLz8(;m=vun0LRC3pv<6iyNX}1skuN!{${iQ4JXm~Pm z?kR1{|JJ#8ypd}O3~c;hqz&Bl+t<6Gs zI-XPE=ij5HZ+>i#&Ogo~2Ulryzb2`Qml<39HyHs3pc*jo&ucY!Cx~s{pZV%#1hga7 zfYJXH(s|X0y6i>4SzmeqaK-8m@w}acSDhRQ$uD_4Xt(<3$K@cPf%ZLMhs{u2A;DXP z)b#=>#Lqxoya%Nb?VEzT^mIT@;c4L4iIh%_x111bUE}p7^YI*IT_sbv6eW)9DNN*; z0qjUGU5iLdSkodvNkZ3P9DRDeF1D*#!$&C=UcA*M4#_hME=%%nmOw}gj>I&A*7I)+ zXzs|je=>3%d20*v9o|01wPF@1lsyk+lPF!FbsI4B;OCQ{2QGi)nIS00UbF8k;Wa!3 zZ2QBtu?T}Oa#J_ER67Z9csI>_v@|BI??k)VtE4Ym$eubhPS@57g%xesN5%Dx(#}L_ z@`Ntrx!XD`bhQ3y#cYiQKU&1wYdYlSoo>+MXyw_*92@`s``98i&c42`mXAxF|fG!d=6fco@NnE14WCLeq13@lExkaOxDryS55=9_! zvzm2WOlxgvtCp&5y%)7bz*|Bv34}|4svura+Ir$j8-!vI<$Rxa=Ik}QrttaW_s7qc zoHO_LdFP#X-g#%vY{`ucx(uC8XTU#I)#=vbN&h+c-yi>D(d%@xJ+pOq=ycZ_bjL5e zWA4I5>?2EE;S-IPqN91$Q=j%p$pN5&m#+;HiCi#8fxy6n53tv~aL=|5b3{^yTbHdVfQa^r^EGn;;#;@(qBi*>qN z9_*|87FZ&=yL9K-2KE^=NOxHuo$d_$!++U-!5<5~IqV!iy(7s;fAC-Asapfi;{T2| z15(P7l^2RWqAyxBm8I9xOEPqeHtTe69m&v@Qe=%mx3?c97<32D!xQ|r4ac*=psVb! z)0O|Lk8UP{$^SKe*+-Xy$VQ}#j?!|J_R$>>q$U^P;fuYuR(tXG>3C!!f(SbaN!))n zG<)&lTW<2+q|-g|GN7SO-79$JCsynL{EJ04-6L+Q02N(~$G=GOV*fcn=EYSaBgY7= zx@@EmO>7wX92YNMvbX|CoG0Lo&V)dIs(iODx*HjZN5m`L06ZN%@=ZkS|1bZO{a@$g zHOe7##d!vu95l`qk9p!TUpy9wM>!s<^{Z?8=#c+02!`z6oYUENwNAG!`kx$}n{B!t zwc3t3O?o+Gd~6Ex1@-JZneFo$mCT31{$s6ruX!U$mCV|erpM^nEVH@Uxv0^$pgCIG zwrxG?J92G8eQyPO)c3RhOMQ!C_1QG~Mx9c9GZN_=(X+l?zxXk{Y?Fs=aZ2ktWY*?Z zZ_0_|1-;6wNoHGRwcI8W)@OmrIEJk!(T)!jm*c~v4C2F2V7$hMGn3NMy9w!8N%?I_ z=|hvkG%n-o&q*p@30)DNz9uQXDkp(Z-m7Mie9LUQ1@e8cn9C!iTMq2@nw8-Xq2<;h zPQk`pPDZ=(X#*l5+H;z@Jj+3EwuKK8nH`teHybFQvYaxpy>g(@dojok7Mbubryh@x zaXD`#gGXBsorQn4)}qYWW}PmaL8XFAa%48cLPVHoR6X_}Y6~tS5}*4)RVlw5oRcL7 zRPR8UeMnhqmQ#b??EJK&F9qH_XCmHl)J`(qe?N-I-tdMfQyRS69n?xsyff3{eI|g~ z1m5-Er^efGKQ(xYct>Dj;Qp*~XMZT3g;?)@$`-nI9g23~&> z-Z|7xGTw6tN^kx9_9N7M>hU`=4c;bbuhe+=Jb>Cn|0>5*<88c`8a&1Roxw+zKB}+o zpmvh+UQAGW!@HeP^QrM3A|oNi_?-sro*M7LTGS@+c6X=7+fhvoo+937u1=KaWz5>j_A#bIpJnu<6evj0kHi6fa2JeBT)Zi)N9a5Nxmr*;(c&8GS-tZoR z>5>lb%M()f@4B?(HzS5O>)X`*+jY-r;4R{m#N_#RD^uW|Pf&Wp`$K(tyr0-p9b-tdm3OlkC0VH$besWc6yf>zuk7f`Z0&nFvsqs1%Q-i07cMlvXSPw_%-!K_1$#`EOqpLT( zC6p-*-aC0KJ?Epcw0J9s4uQA&aB94zKcfau5pPBk-V8r=ccoKM@`*&)*HFr^i zr`W%HaufS^9JP~-_upjf^oBP?nbP3Blef~dfBUD!`wSTq0`K}msqr@4Ne!MNUVqYj zWT$qL@t!1Or#HM$Ql>O`NAgyB;w?*SZ@f;%guvVOb!xn87Eyz}C zmf4OKne@VSqmbPYG7jdj=2$jb&On%aJ|N=bJE-zB&eBx=siGwPyNoJN?!T*v&KW+&5rQ_yTM(rfyok~!8!+VIk zi&Eo#`O?($&1^$DeUuTyoAp&{yj?#%4ZKB3`sjCLlqBPwPf&Wp`vZ3urN;ZoC8_b2 zrNujh=n(yz)0rBt?sV|Jeoz1sQL>;T=ht(&*oL>Et=B{gg*^2)y!_sqxxwqXtiL z{N^R~Z#x+!$#_?hQPmsXizrhXyxT8KEzf^T>%S->It1Rbf2GEoyO0_@MZ6hF<99z9 zCCPZ7BBQD|yoKC7mU{d?nP&Xb4r^+E+zg^a;H~^;YP^nHPXlk>xWw@rCZi-7?<-_f z^@g{EyT?-F-Tsr*{d-+nycI-;z+3%~)Obs8ISsr;V-xY7AfqH1?>l5v^@evIcNe9` z`$HZfs*tzR6R*Bcy7BuM8BYT5 zbDyWiTXPdNc#8V!^(4IGsGVfI|0ZLnH@qRrlm>4}8ob?U=c8xHm=Ji^A4rY2p`02# zMZ6WG6Z_Xr?IhzpNybiZc%P(9Y4HAVUh46CGA-WM$(Rs$+dfN;cg+H7@D%Yb$xg&O zh1yBRJLrGG`!ZQXY4DnPD?R1;Pgp>uo{yTzm=JjPewrHZ+WDt}cXU$!&Y^aa@t#9a zdh6e}xw|N}zIr=N|ISFOulA5JA@C}nq{iDg?=0AS?Ih!!N>F;kdx$KeG~@RWm!h8IH#aTbj2Pam{i*x6 z>&DZ-doT&_@5pFL#yg*&^oI8b?k-B*zsu8%Ut3zdLx>L1zd0YJ#;ZFWym?9T{301G z$$0M~D81n|{|Mgg=cXRN=cUCvn&=RC^Y^93YqBBDd!E&DJv-rVa?18>prM7;aSXi3KV6d7H;;VtCuq||sn;au&huZE|^JA>#D zcq>0hjn^^zH1IygIUkefFc~e$cwZr-t2ewQlqrpVz9>!q=B343L39Yb)$gaqTRMvx zJVkr*U{+%Po*<(o8Sgt}boGXJ9(O0D?%(CSm7e{3epD&D?7E5jQ1oNJH6q3lDm`AjNdePN2SI4IvEoJ zZ(B!dylYBN1Mllec&AW1$#@6-FL+<(?xfUsOVZ#SofdC18508U-kquOuAO!oc%Q)s zP4W9>bEutUyyp;<-um}#vWU{ib0Ke~r@qQgi+2wh69TWYBQ@T}snp;p%JZHfiFogz zc9QX4Oi+5myPYheGlYM(rfyy_%r( zhW8WhPD(A$Z>O1$t~aM!?;jy!Lf|!}!F#}S8hDfYmr*;(c&8GS-tZpc?xfUs)AjGH zw0JXOc(b;p?%%E{r-660HL-txM@CCB-uVQjH@rWPrIJRT-yTY>^pxj0`gHv}gy<0c zo70{eukLj4K4wY8`yv@F$$0M~D81n|{|MfTcq={emZt6B(L{&9o4++RUdy$}a;oFk zpP7jFO)^@N@vb1Ft2ewOx%(`&Jdfn9^u&8zTD*BghrlauNsZU$J`KFDC(TFgWV9sX zT}4J$Z+I`_?z7Z*OVZ3o3(iO<&qYLsz+2Xq8gH(A8h8(y6Z>~R87;|ppCY5HH@t=1 zos=5ya^6bM{=F$J-Wf!Pz+2gx8n0vWY2Y2wKM`-3jFx1)uaMEz8{QJ`PD+jUWfQg1 z6K{E1ycI-;z+2st8gJ>O)4*FaAQA5gGFp=HzC%V=Z+Pc%cT#G+pKz}B#OqEwewPp( z0&o3$sqvN8r=ccoO~lTytu?HASa^cTW=Danw#S z-hY#^(;MCpWlCdj+?fWiCvE>eL&k)_yM9w@ybTkn!Be!K4<_j=JGGOH_aqrRz2SY5 zyOUD)@A5R`cUoG!uahw$@U}Ij#=FLO8hD2cOqAy-)J`(qK{34e9y;Ot?2Kr6oS!`h zg`?+Z_mPFfnUs8fHud+=cXD@BYJT0xwQA4tP+~|o9{gmC2!5?@OwF$<$N#{u==}!K z^S^_Q0>hS#i()zA6iNJ?)@OkY!<6z)h0 zKbIITFHfqkCNX_YV`8|xDlva~Wny^EfyDf4x|71WSZ0YL9RC`+gdr|mp4@**Qu(f= zFkQkBSAI=?QrH#^JLqhDuFU#)*lzk}3H@Yqv#n}r^*545$4X7oI!ER=(%_8X3{ySM zw?kC@n{($xZ*<`D^>j_FebL_~tj)tViC!-)m)?kWxsb;ge|Y<)y#1}Q_O}R80R@sp zwxD$otfZ!+Hj3Xi_{~NCC+=W5> zp|>1*qoP8lM1E5=zX+Enh3S}5Jb!UIFA^5`i{tP&v>|sy>IJ{zY zO^EgzqwR_Ed!u2Iz9tHr?t4L8Li=)D`y#(1R$k_{qaNlGtG z3fCuv4r2J*Ebir>; zU&nJgo_;x+U+_OS8rI}b8~GU6(ViCN`H(}Q$f(PSmK5o{zVpO8{T1~$#^f9J2<|u0 zZ$vqrtVXVNi5B3>0EIMt5SzHP97*X7(Td~J9iqI0^5&zWd}xP=hV?MLTaDA-oW7f5 z^OK;L2C=9R;duQN8~9p#l%852HS#(V>AhJN?ZxIt(cXdh_AuXDwAv&5%ZhS2vA(A* z(S#U1Kx>Ldi}tb->$};O6pqc`8lH$&jiW>q5%rm( zpF?^=m6Q|H~hxNMQ_`+V2af(TP9eeTHgHPyp()Lt11(XCd5v!84)Gx^MNP)5Ws zIXJ}>9>Y`ZSw4Iw8I8o}lBiP4ft#+{Qn!y<*kGAWL{?BY(GqEr;?Z1iqG(d)O#)u< zT1)3fjt!~A4p35x!iau`qJ!f7*Ldg9&-pRv;iWRD9wf64ne7B}<=9ZcNh;KnS40!; z4r6`533{ZbwJ(S=h0ov+>?WTPWQD;;B6NTpoQ`^mOuX;vT#!6sD!)XJ-Jk7n2d|(W zaL((Uq*Hp{mw1A=6uE!#5wxe>zi8v)->x`OOCg&9mRVU*}lnZv?C2FU=sy?wop13{#s=BEp)0)d<;Q4WN0cVo3XINaFw5v zM>`iTMCLk>r_;F^hD4)>HBmP2VbVFWi5JP@^~rW8=>ocC(aqz%hbUm*_DeS{7^vXw94fU22B*LU)I+ky+Qu=bQ2v^ zP$>;lvP~kxG)jMBdp0cTm3z^e9I|da4nYOaShs3D|7*O5tnX@3!O2;w^$Zc$9F4Q7 z){|ip?#VgFCd+zne>pVGp}crG)pog;*b-b>y766_JcCQic;ZtR>U75@SBkvl%1Y$b zGOUDoHLV;Ot2Gr$Q!ILWLFer#6D42VM;i54VhQjKJFdKufi}Q?Kc-Rdoi&9Qv?0QG z3&J*?cV3I}EQIyJ>dT-Xp|P__0t!e($}wAzh^QTqkPDz$cyHNU(z=#l5jwP8c@n*b zB3x)Tvz-u{cUp@sL!_?7*wo6KP2_fLyw(){USuF;?H!_=!E?jyf(hV5x%;h?MHqfCbXI4jsxmQCJE*iU>a3F}!^<-P#P}vq8bs+y{+NDD(x{HBcaI zmp1;-M@~$k$S}gq+7>o&TL5H|-2%uW&D%*4ZYJk|IBA{J)S+bS9akwnSR8uCI%t~f zO=_vh!>Ck-$KEIfZXrXE*HV;E{oNm;@&TqbwS$I6uBT$MB@Yg@X(sA~e3>oEb_j7B zh+VIkxNUR6@Wf@GGl|J$Y0kc$8;kigJ9BFj6LObeHF%1-!p*k0VexRzUf^OA4Xy%5 zl(!s{;H`q$&fC{zcY?Pl0|U%L{3QATgD}+n6)cVN_s}N$`3vSJDqIJNZElpCB+fE3U%WFzcdN_{W6FSfBlHvalG(-# z0}71c%^A9tXTV*59bTyOWb|9^f@T;}9f(mR%zpmD&3ILPaF>o8$FsF7qcPv%e&rDe z=0P$FN8`m&UpNzwU?Hz7WW4(*sWW3f;-u>v7fLIQg*2D;FO2lUcSPi0=)tVjJY=not&*67OVm9@(wxb7iE`YIpblSZnjUz zXXP;8`5yR{A)ZULq0bi$I!AsbCVaPjpSQ2aUSwMW@!W@yR98+q1PY{*7EM)RJiA$6 zxu6K+|3a={rsP0O*v~Rmn8+2~a^R5f60#*|W%dI^Hi~gCJYT2Q$~Ho`LtGVbFlEVSU#@AzNJej$yvhGQ;@Y>&kZy^G%58 z7f9*8sQimH4c9Lb`=X577ki_+1@;93o2ceuT50jx&XQSw{xUvpG#w2?Hm?=d%GuJn z#9Cbnd&M0JQIhfp$gO58wkdOAr@8G7}|=V08A$dRkBcD%6=~KjjoNXJ&(|015@&>4qlfx}ZN- zw6NbgNZU;023!Y1Qe81BDrVC&T?N;n|E@&HQ*dpLcOF;QC1TMDy?hQg<#q{E?h01hozD3SEfllgcA-7rYCy|rcC#s1pl4|7^X&Errrj~hX1FixN8 z(O9%UOQ6!j=hJ#j^r<#qxRd7#iXa^5Sl{F*6dQV#w{cl~{gKL#hDS!bcSx#!g*~tx zb8)0k2~TI;6}-=)cA{oqEu#6tt4+#s=vC@>H|v%e7O7ux0o4$UmJ6zr#vj+*=rD{w z*}e?pkMh&_yM~5X!7_B#<#^*GqTr4kDX@%A?tno}Mh z5mvgQtfT?LE59^hfM7&w;xJ4bkE!hW9ZCQIB79UFFayJLL4H}3{IPN5Pb7hetRGH~ ze%XGG6lmh3j!Z7h_W3mQ#FQWJz7y+jOi8f`UR(}d4x^7$mMjPHbije(u#j&_uZI}q z$EpxkLgJjp_K7-1MC)Kf$iYE>$pUzWmeBw>;oYBPQpczz`;n9{_kW4HVKTsbfw{tW zW7Ll`&I3OH>ktFAC}DiM8RQ!Jppi>0U(Zd{#-_HOE9Ls2BVONjVAgQ66&NDu4Ka{w zR>IzdccMFt#ov7vxBUYt@C@Xd;@xb%iQHEUNacA7s!TrkWvWf#L7sv<^2ylAC$r1~ zJylYW>$@aU)t>MunMp9Vxtv<#<_9Pz%|3EdH=OAySZs+k=fz^HT@K!8>HIk#Sd)=u zC#O;(ezyUM@SYqYcUAaq>O`6bgMHlg*%lDQJ_?T_B4l=Bgzli-%_afwL|C!(q;8Kw zAr}*(O&(Amb1_j2`ORR+U1`18Y z@TgZ1Gd5rJO967T!wpz-UzXknGv5g|W$C^5M&5j9wM-=Hb_uuT4ux)`rqWPlSx{j0 z&MeS`4CIyDLB2a>J8JA?_`{umXA08yP%4O5B!Q9lFBH;rsC={x9i*p*eP@eyFc1D9 zvpFEX(j*1;Lkol_M6#TjMA1BsU|=#qph?j4Bu@vUTP72sQ-yyI14axn_#XPnDvWt@ z3wya~N*=$Md4~NA5&?7;e{iWHha$31G`UHyphN7XCSRrp0Z69@63|SEvfbhv=n3i~ zaY%=IS)?b_--p&-B#e{1Wj%G~U@o9*?m?>waSF7?>^`YJv49li>gtpLA1lUWOmHs6I}{WJso-JxuzJL==~ z;l~$~sGT5{=-tmpYn2$Zxgub3w@xylbD?Y?FW|h?`A_O=`)5+!KD@-{pFP|bC3EqH zs3H0jZbO>5#h9oc`CJc4(e%y#C-x}VVFf#)^KHjP0$AV@Od9Usxo*}<;tLrjzGE#{ z>cLwX`VFRNyzrvG>dn_ZoDuhfA$)1-m1J`Fe<3GHQ4x253cBci>@1Ah$M|I~k9jfuxc;+Lwu5n6kL zdTGx=OYhpR>)~yvDV+LO?(;kBsrb%&27bB5XI`t9Yd2G(a{)Gjf=^_x!MhxKB)gou zNngr-4q-T^f^TKlP_FgFZ%^>q>}rIRyIqvoeE&b;5hy}Jao#_$r1k`F$#ytHp6p4= z#7l{Kd@i7>;91USfWZ=*>{gp6WUNQIyxki*e?TU-SG8t+phuti3=3Vs(X=LaI5!OI z(+9OS@)G25WZPBi4exWuFjJIYk3}aRk^YvezPL zqa@a)ypCA3PoxY+5s+}`ALL;HIq`Hfpn)hI%mYOf67^8d91pm&9+iSDnhtCrOSQiL z_XtfHoF?BCCW;W;T}laSA+F@-?WRXAhfGuuHy0KMvnNptg5{t^wVuf-*nsu7PIAFT zvO{@^vzURt+mY0?S51<76RkH(d3AxZzscQWK*`4bRWSYRY zTng2%TJJ)f+E&;HkxQ@Rltl>O^pP*RG(sN`kN|)#PByB2HhVUtL$y|+7HOT3l|Z9Y za&4;@0S^-bA_tCnhm}B^hkhy00f_x>h*68{N)_aceCO2+&_-jFOk6FOl7%cS#V9Uy{kkDcv6ITc-ysPiY zOo*?{G_j6JItHTlU(8=UTk}#m(Uq=Z)~(N_7(vi4%$o z>HP}47w4%?wsWDs`#fKsQ+mVE#~GTYN2+%i+tonPUJIgKrF~>|liGv?AE<3wSX?l{ z;q9X~$rZbhY$&A?XHkAz>ikas1c%KHJ4XsMl3WOX56XwG>$A{*mCbuJQmZ>O!r|+; zR^Rzs<(k{32>NqW+;pRf#AQ^o*bXCRZylxF#AvAIAcad@aBwC{BK^ch2M@RQt7q z3-nkBhPxHtmZ+*Hc(2I=9a@D1H~StI+c#J;bNdjAF@M4(zHcGG>rpojb~MS~e(shW zn=w)qJvN)58;jYt&}2BC-XjGRW&T|1xq~>XrztDD2U>)hfJ(~SqFPrY3FC@&D|cms zi7G85wG6>Yro7#GTa-_*bH~lrfGP!cqxm|p`VAt3^>u}&&4r3Q`xWvNQ%8ra7k`Et zq1khlne-bq^aeN>qrgx=7(Uc6Y?8nIB7&iC9LGRPB^M}wr6-D!aVTgXq}>&oXi}~3 z?Boa_V#zM*-$U7^YN4K%c^S|8^by5%4&ZzK+ZLkoHtOVkgPn+Ko(aC$;d zWK)N@*_?bgyTjpT2f0IYE@nKwe_H!>Iq}S2_-kk*D71avfqYt|*g4Ifkh$`6P=T4H z1`#wFh0OOLr?hU5au*7~LB9Y&T3C>r+7Xp^Ob%ZD4I**uq0qxjuF#|b;GT>ar#d|= zXq<>Q$~*{}nKhR}yM5QnQ0mkMhDPmX(K>d%R4hKtKdjBrv5uh8h^+7{IN{G`)^0=w zjmPjeuv@BI3+bUcAH-8GxIBz#AC^JpO?bg7PDO!MUSJ=OFu#BYx_2~zLvpFi$-jn5 z(;j@A3cvPVst^}=YOvo$-n`wab=nRtbK_jBnYLnbfo&~S!zJSd`gI$=Q5-U_Lab`d zL3Y763R4AxL=u;U?l!@1@>U9dr*Lo2Erue!I$`ep|L`Yu2= zqDu^z0A)n^!N7a(@(g18YkK8+zPW2&Pa`>G4SovB(c=vk!IwWE8d5$0+R(*}e@2K| zpQNlL6*;KQd$tE20?f|5BUl?rAJ(KwIjo?F%*KrvjE{ePs@H|b;-wHTs`V01zB!*) zJuy_-mAwYRyxkFl_O0ya5Uw{~^gM6}jaLwjLF1L; zL3Atr0(gkYUeoGOo`x)}MXZUM8n4lJF* z1!oWpFDWob2+=?8gRn{KHbdGviAlk}Bse1>ZnvXGGVygN>f3@IKfVtUWO^3YsZ!m? zGz_(FVJC#WR}jyi4>6TQ`14J6YW`qm>A{_?TT*l9cEoGkxqf77?p(vOaPANTz#{Jm zXapTF#yGVJFqBX5Q!(MoJk0oydnrvwSIGJ=N^7FDEN~zn96**PWD%_WGyTAfVC_)e z6tU7b6ug;*tg2PT`PRI~&R=lWSodMWRke=h8R@GsUp~}QCL&RFNwm9W#OiEBaoX8| z_ph&N{fJkF4ha{NsxVW3s8~svUwwh-;r#M+-4A04ogE%FPAkIK<{+{Qd&|ZE`p^+Mq>NY^gUc;#+^9od< zOs9#-UwAK7C)GWPv<;ZqAgXZsD?=CI4O4i?`jd~*cY!l0Xr79^dHbnz&X=lYS^3!Yx1NXcs@2;{ePA}D0#JMGIS$HqE^7IP-h(5Lh{sWS#1|jU zi(f8^?^w!K zt=hYdnP0>!m#h|wLuX?bQsZFfKd)*_j{DvdZ%7m*Xy3qysx zm)futgA;$5@wGq2`%jtiPYGeiEKINs=o4w3u^grlogzmM6caCMH&enq?l-E(8wT3X zuukTtG6jLEnii0i%K4Z}uo{B>LSfkjQ)>-!V4*xoIp&(hx?4jE-M(Z2}t=TYZkax}+ zBZ9o1AmUwoH`0TMZ%{iXK_LO?j#6Si)f4Rw7rG(ln!74WO(mzsSHynF^8>KF>nrY> zgNuYaw}>IR5yuxCa}#EhS+R(E)6bjLTyod|+Mx{Nnhyl1)*X$cZU7BKF;7-oupGV^ zCf<&~u@&RwiWX^IW=_rVxn8N}I619$$SSQBS1L$y)lbL?_jA=39(e`|l+LZmL8!O`W9NJ{dnFPLQs~H-sxvAx){@sYYwBS5DSh#`)D$dpOQF`)hYHJ#AOB<%okOw%qt&dPk zq%DXA7NwDs`7}hUDOjE`K1W5HorY$~xeAAZ0g*1&5>WXd#OOpRTCqNYc%Vn`(17$p z2h5}ZM&M6)yIxx@`i>7j92wjBx?Z&&euvzn^!>AgHjT6axj!*Bk{ap2&T+V$G7`YE z^Nz$Yx2KrV{0Evi8@&ejc{-T6FM^mx`%_d#Mmp6oiysliCIHq;^ur$Ot1--! z_l5!SxC7A1?6@oV_SzB9UF=)f^L2Z$a4rr_wh=&*f_5kZtQSDF+UD;*XDN<4(&}LK zO|(vx0?#5lCi+XUe08#Kk$(?qm=z0&q1$o%zd{a zFQ8yrL7b!Bw?MI@a@Ga?tpqF33_ON~XlA316h-ja>?$C@l7YlSnSkHU(wuCr`oGZl zY%@N!LKS*cu^JXWRpQBL^HgBh_Cxr#15mC%r?T&!I2U^L8Utz>IS9*HalT_B9OOo7 zF68|EgkkqML(V-D#xLzFOV6|}#=*mh8FHZ>bNCXEv~J797Q=us*rIMy3~+L1O{{kf zz#!e!$N#xRPVb5Jh5=!4X`)^$gB+Oy;8b?2jV1Qx#lOVnH`TS+SX_T;*f6R7vH`^V z60qJvtZMoRAvC|z4up?`Z5t2qa=QItdsFqIy%2>1&nwHfXAjzW%0N)cRLt_Mh$wUD6|0NS}81=>` zfDk7?#4FNffY5ppXH3Nyur|Iub48StTR17cNi0My%c0_Oc~>V;ljg^Feb}bK43M`w zItRFd6Q+tCDk4L*-p?D4Oat(hD`%ianQ<~y>w6nPo9Y`zY=`LJd`?7o-lScQaDnn7 ztwLx@ZvjLeNqON(!+|E{9DH@fgAiq8PY}Lw7*6|Fz`st5jO}osQATAOE*l}iM{ZZX zuiU$oAi*aa=Wl@U!ZnrPZ-}^NpGHTMKbHF%z=~v6KS*$*b8Wj5T7WE*+Ys&VR=tDa zXgwJolP)GuwtLXfTsiBYtR-L*Hg8dN#T;m8Iu5P z<(O}OOoWtl5IHp&DX4(}d<+eP&!sp;po~ZwoIp~maxWMMQd&E!U|Ms3S^_0vlA-xz z{1$)Vi}aa>cWy(A@z&qrZ9ReRlA4S&5rVY-vXQI@W)2`*-frd0zB=8j`f$G%#wNOJZc&iq3$M@57k+ z9%Qz+d$Ywl?UuR3Z(6T!!qkJ|qwEGvtUWk#Dpk7QdnHVr6~6%#-$gZr|D~5m(Xr8@ ze?d{@wI}Y>A|^AzF@wd zVdf`A+A8t5M9VTswf=IQUY9@e6%l`dc;w*W9fn3OxJ^_AZ_^^=L*-VAVaEBCQEh|= zWTq%mNDtynWF6W$2bY0HdmHu+zJ!YpN7vU`{7aYGueqhq_CfO;=aNuDhQe3M%o`)} zFo0ai??E3r*Ixr6ZZUTMn#^Xl2VYnG2d|g{JMmCnE2R>3*xnTZlzk-NDt&%QP4t%rH~M<|0Cy(AyY3rj$JhRMB+R6SNP~N(GTM?aWRDgyC$wucxT9Y;lgKD81Yk3-EOKF_1K_8 zKEONakfBf>_+rC}JDX}ZQ-0i`RnG6Yz!^ETw-C-{> zLACEvHz*AmL-1kYD>T}b3>u%~X^r0D(TzzIcuW+)HwmN{tDx=c5u@{sL)y;A$Qfy_ zffE%>*o6?YQXFM%=%5CJ#yM1;8Rv?+eYq&MS`@oU6#FeNMsd7YE@ng&yHMoEQcK$; zwVCy8%E^|Y!mfxA8x}C{~S4@JVtn5LO6&|{ZgD~ z{7yU1xKG)LxtBhiCSw==PVzrtZ?5VdkV_7~r0?5$KhJj`>WiEobhqLTIs{<`*}yh% z;zO#ub!+O%AqW1#pOU)ebB|2g7TEiNEf6?)d}A~GjS~?Yg^TbN31M(^SYom2JQR!m zNA`-p(1?`%Pw`5-i(#SuMD`>gyto|iK@<0_?R3$S{1WCk{*Yuq`@#%FOHcBUasMIXz_Tm&dq}zd}Xr}*`GzCR~B=Z+sZD2gn z>XTW+6ofO{rkM|)A*`7XWH+F|tB7INX8h%b2kBAdMZHLe_A`_I432yTf2q?T;8C-{ zIC}wAKJso#3y!Sjk1P~9vq5AwDnt2i;Eps>1ibgQ2oE*IGzOV3)oLDwFO*>bEJ18(K*8pv?^u}@gI}kMffRQJ?@eu}lGu$w&6RSSH z;j{cv%38y2RRpN9E%ZsNTNH60A73 zDIxmX`6m61))6u;umuB>T#=LA;ewx61h3mIgF^ zP#8AK_BQX(yv8nBdexi-Oum2f(UsE-EZ=J5Mj0Z?_ERRI@$fL^1Qui1Rj=E@t2B(q zRUXPfoO059pVS_FqlJ7dOOMmM%D6gp=>lE}dCkn0U!bc&d#Cz$&~jHhuidD)@xmc#ILCrgp6ws-sEWSD z3M~VL16#0kgul$yTyH!Ab*A*iE}Y^-HjM*Al{FvmK!5NnfcWrN4@Y`U!#hi6U!x&M zO`#Vx=-56f@F&#iKdzS^dV%`-9`p$$CMU4pmkpxlP&*HUU~qy!R8aUn9`^neOuq{s z9!qmFbQ>Hf%r^NCTr&<|ZnUZLo;EpelN>BQfPac);m$@sl!D_1!C1 z7%ewIa^Z(TSPo@cY70t>VSFrDkK1mM&za?$=^3|4dc%oL{pne9Mh9N|B4dpwl(|(7 z4$XGkcX_kewV57!)8Ya6oF=0QpV%*keZDCt{22rS=fOzyhWhWz)-9*E0TA@Qc+$Z2 zZ_c7=L-gUp`;_6JHE%bVJFsrQub=#o^%&G2a$#hOJT-;G0aN$zKChu}w{OtH?TYDr z1lyGj7=~PMX+;(p@77=6fZ}W)+bZW-Uq@B`&##g9Y?b}rsq`6DyYdjm5b1>o1{gb+c4@Wf|5@b5j(tF-#cFqe{0a`A*@?%7G# zNaVF*zBx>qcTc;VhmAn%*9e5qg?)yZ$r+liCr3>KZ!c(Uq>N~390t{Tm;wz@-LU@6 z*(87O;=8a0+D?pq2t(Ff^9CFQ(kWN>$I)nED}>B$RHIs#{fSVU7x6mz!H=I&3^6>? zueg4|Jc4Jw8cF`qge;SXuMk;rnFn;drWHGe3*`IL(eUnGJ1Y#%;3^4jM>iGQlt>fz-0EQ?##q3r68oNSmYlWF zS^I^qt0eS09rh`lEm(~q+V>w1Lup7EbkAnXH>6i++`=*}@PDQE=Fp!r{oi5A<~~6# zP)Z*h8x9+lJ)lck*U01W)h#_cF@mwoYm^=*Es)chg^5L*53z<9=A3rB9d3U(49Q=N zy6C(dNuF~2TUC8{Z#~=xjyLrF!Z8etmICh~snuvjfTk(Mg=R5SrYTEJ2#u#dZu~(n z+(mL6GGBv-vIz@4%q?S;&rv6`+mL>aNbg7KKS6q{vGHMCmw`&*xQ04>0frL1(Y|Yx zp;RHXjXxiLL)ePS5l*HTlR?WyDgc9v-;H8^4ZVgtom8V4^l=`A`-pLyOY=4+Z=84l zFX+QdF?wq-!88z`sn7UY+41mkX50=^Z~%XX+7>i6;a&L}TLqjM`ToM;M5oWC=zv|B z1|^`Z!yo^c48-e{vk?pO!=N#5x8vcRiV;A7xnB}Jpdz9|PGAgy2pRiZ!7>{@v&`bx z$jK({Mi~d0EA)vYW+JJ;nu~T;_QRpHE?^H$RN>`aS`6`j7Fz)_*gSxiU(`F{p{n)w zkXp7EW@#?j!hc09xF$XdSn~r+(P+|d;*;o_bCKj%^}c*mii349j=*WGA`vQxUeu}oXcNf z#x%v|aX6Q#{=w<$?>>Xq?@n9)HL?1$)7Sqhge)cftEv8|bq`q!83Q~ob~T$!o&5nX zZVVvxHcG|0uAm+aMHb~>sNq<%-fQN|1=?SE_6YSoKiWh~cj43Xe=T#zmGT7`jA8!! z`}=@#@MI~2F-SVuG(*Iz03PkhBKG@Yya!?c`IG4 zYv5PT+HZb(*RAe>ozB{>yS%q9a^VxyP!Ws*XYJw1x8CKGo-Q8P5j12M58MUGGqA&0 z;F(xAd_b8#Sf}RyPQ%PGrt2D2Ds1el*Liaa%lr1xc}Epi(c^66+T-72WZITy%jhop zA38vKrfJDgEMFHth?&ygrgsI6x8XJ14{`JHf;(}B)qbgyx};iFH@IB4cp!2akjsh0 z^<-|i>|OU?khev88kD&hjR^zMMN~-}5B6U|1^S?X1qGyy{~EgFu2!Q1l#-fkHC}}` zaG6quFPVwIBbH1>W%>?$uWgeDc92I3g9OSVyYGa)zVXbMi4y)cQ>*dBRIG|oG-y1I zH|Mctn|Fx6&DLuC0ztCUgT@1RqhXd$Dt8e))|kX1-ea!((3g3Q1;&?t1==2OZ1#`2 z6W_+^gr8v+9g1+!9d)%|H=;gVjByrfRbG04wiUew*1mo01|mSA1ATlmz00}210!7V z!sLecyi2w2#z|7_ek#Z&haTUHL>Ql#(N$|BrJ$Y(vj3Lse58gB@Km1312cq{@7TOU zf(fP>$YF?Cp{w;@A zF2zo&1J9Wx4XV|SI-$JjI1K8;M2ijMF6ozG2oBRxqd%cW(V9cGo`qMa$xN&&Od&ag z+oW_HsRO)%bC_60=X^J5!EJ|B80R05AqF)r`> z?-RtdVhUMQ>t_hz0U!Xfo+tKf>ym#b|(ZlldluJ2%6Hz}GDmI3XeX zO$Oz5@zMuH;T?dQxB(s-AwOLG^FkR3D(M8)9 z=zd$znn;K4!onR@-5y^R|3!x+TAt_Cq?pGVLHd4O z4EQ3~X}ic~d~BG%yU)_AW#-JKZn|8qC^f*?mE;U^2D)>Ui!n^X=N!{nXlv7n#!ci7 zB}XM)v;w>Rchswp1?8m{&5l#Qh|THB#l(45S{Cjv7o3gHtl4#_V7KoZI=6%FpVOSz z7(TX5uIM9YH2Lo{=7}$ zG7ZlGwfTg~J0d(p*#yq|t8;ZLOv)R0Rpnd^GEUoblv19nQ~H5O&8AmQyeHnF!7XHp zXK4erT*@&%^D1DmkE9&)^Zf0&G`6@A@h>7IjVK`YUC5FHY}RI00tNczY8P!#&9Jd(aDrD?L<5Cdi476W@H5J2$@Mppp z^}5j@K2#2YgwTivcg6yf{SL#5f7LJIfs^&4kFfasTB&e2L-TG!(ZfFFu4nOP+8u0~~6ZL3f3x-XgP1+@QnH)0e?x zL7>VBLfj{hn$3?nqY{X!po6PzQ5U<7Eyh=(xX_6{%f+|r?EPZ)dES0y0_4es?*Z}k z&jAb&51f>h>;n&Nh&cTNRHxsBZ{~a^PsK`$D|D?oh3E+xR!y?c%{Q#*M-S5qlauWN z8sDdook3Vb$RR@wzEyt6o$)EWSI4|7XdA0y8hWS14-5SDc4?tqYun zm1n!`qwcr5>^B)!N=|>i>dSBjEf`qNU>_WV^EVB(f3Wy%O7M<%Vjly{cI z_(}wO2{;|prDQ?U*n&*f1-WZi&WDc%o&LL++<_9vT@}e)m1#v^I70VgxI+H>I{jPJ zu))P-1K+`WpO!oi(-F-W#YCsJD~>grCn)nZ8?Nd>AIkj3dGyyle|a0mn0x^1IYoJv z*07MSGTi9JRaZX<7%Tw?I#3tpoAiKR#m{2Iba`;Fat9T(mz6CUsFc$ylgqHC#oAO})BzkfpW%L$i+SPdGT-IOXkHkqFjEfQh-vUUFWiSiNOcSgA5x4w6{OK9 z3(CAJ7Bnlfn~3v#4n7F$le3Rcy&`U>h^qwU_C{3OA&S;T#j(5WT~$KpAl7#D0EIug9uhhgM*YJ2Wu$?Q|s$6(cEBMWp9S%|Ne)&iu-0Tc7ySElM(EO)bfBhKg`VgU&^R_8v)d<#ZCTauaAr`X|r zrtXI@CEnsrBQO5Hn7<31A+6huC9C$INBYZFx4+vWJ$MG}g@tbEuBL@jd850wn^?Rw zSK2tH`d%zWB>w{l!`z`AY;47}9eDw2&dr*eaT$2rec;G1Bfoy}-=)ENPX<(N6HJNE zyFBBX@EcX`rp|ue2?_bf>ZP$*jMp|%dw5-ge{0?97Caj9uLJ)MEX1EK-{0N-11m)( z2JaB<{sy!{O`w49DAFZw--*&-m%fWAJNd3ocLM(|Xw>Px#nXW2Q2firzoQ6Wh^Gnv z9Qc=ue>(iL;GYfux{xm8>1MmIM|r+ORf||%?IVcA;bk}e&zha;=Qy7loPIbs{rJM* z^dIV{tIZTX8l3(;?Az(zQUsnyg40jXt3>y!Bm7Np`gh2G5@{Ctw-DEb)t3&4r1LPv zLnd%l7|bvQhX8fTJ2(cZ?1EB@?yAvR34wk}2JI+CcGa}8PZtG2H%7MQs2(^AVFt!F z+9(bO3kNHoA+Pcdsz#27&`kXPTr<)lVaT=6<$Q0M?rVr#P3yqETnU#8Xm$_IlXat- z5_X%Zgk9-o3-U|G9X(cTSmx98$?~)#% zEiVL26!1TZfdBpz_;s?nUx?RCz4t66LoY(HxHC4p+52iops{-S3UBRl9k*I@aHPeE z?G2sx9N6gJ!*#4&;^XVmL2!J50=f(5pNM9j6BZ|5>$)?xp(4cu+TCoj!^7TVGf!CX zHK&V}=-e59=ZXR;Ib0v8)<+*jr2~*#ZRxxm_BY&nunyw}+k6Z2RNIilD;x_-C6 z^22#J)K`QE+Nt4_7gQqds>Qm*zo|b?m-Uy&bv$gkDif^4Axn&eZ*YKOcq4o~5g(vx z{c8xi9h73%K8vV)4wcf>4W1r~REmYw9}6)B295W4>1+;-D_Zm5q?>UOVrcK(sN6** z`J@}2bD4QL%K4A0-aM*skn#}}Ix|;NWo$3b37P^vd1*k6(JfBwP&s9g1tCpw4{s&)S(7y;)0PQb#jTe*=Y6#rKGVhNUV zIRQ6f128rm$KY(5F+VUYqH*CGPz zIjm%GAe27qY*!YHLP>mJSAq7qp`GCB<$4dp_Ek6}mCN8%3L39NRdi^6ELOQ^E}?a- zas&x5|IT6N%PA3j%v7c!&Tq~}n9ghyzxfFV>Jw%j6wQ{yv;AO4Hch(;K9*F-BT85Y zB+khUdVlvxT++yJ_u^LN0b+1m|M3qOagm`iin~-zaz)Vy@;o`1%Va=C(Kqgj(h;c4 z70m1dogUe*aEdDsp}ZW*7j#bm7Riy~_WMnS6^0=G3Smc07;hk=69i~`XlRxM>^e`y z4cJh*&NL-tfLYk+b-I{yC~cPFJr`?;_K9rhV0XrD+5XXDD2b+Gd)s1#7DPjwA-9SJ z1~RxT8nrka5dN=n)*D=KqB1I69OkFdOR4-MN68X|Um9M2IT+_BfnhFu?8|rx_pz7r zSK(t9`zDx8D#p*@#Z2w>SCbIl1R# zwv#z+&T)<8IKhFmi8<~9XO7R@nnBZ$$eAZ{Ug%_Q$1=4plb6JG+*kvU#^*YKHm7@0n|N)!*6*^9GML zOx;+0E5F8a4E_UbY2sdQ+(ES+aYfkdjD{6G<>0CIt`#_CzXN{7|0ri67VoiaXCNXx z02L@5Af9#kPpZ-*`(b<7ml&kbZoJf9L(Gx_^YQLqnPrdy!vK&?j=GqnhfIj@6x^08 z1x|u`)!l(IN#w0$Os#_Rs z%QuqR@tqad#?k@2{yHaBxDNH8{(PzKQEKkb6l7KT%2Rl8vkz#E8Z6IOehn)hM%V4d z?EB(^^QBcrl*QLM3d1mVS4=g?87;1YTl5C+aHTpHC0ESV8M7Rnn zGNlKnf^l#K(Wguwa?z%K;!6iQaZ=oleh~tmM_+A}w6j?s;v}*EEaG>l%Hk}zr%QS? z3??}3_Z*cT{hZkG5{6w##rd9$15P&S`(W`N(7URMQvQS#@E?wzMtI?-XUZ9Ly67`y zRU{s9EYlJ!*%{cf;!0&Hk1qMl!zSm-75ytVxSWrW4g&WDRz@rJcu@k&C5=TbZz?$D$z z3g;u@OM1zr>-k{4;iO+nahqPb2SNn&;DOrY2G@fn?cl@%-(l9l7;)v_+9n0Q0Z5iH z26oZ8g`+UEr3Vfm2AsBe2PuzZbjTG`Y=9wp71PnkV@25pscs{3L6x|%>Bext9{dXY z8Bshjuq9H(VC6ch0{AP6P)i5Z@^>IoE`eM@&X!_4ei<8Be?v_Vm)wob4`KioW2DQ_ zpVZA*B4Q5pV-p1TrQHJkRf?L!SCCBHlM5_&`{ojZz&y?qe7FrZfrrEww1@*lf-?%f z?}7Yd*Pn)i4?n&X{k{Ok;1U>v%j7s?a9*==5b9-{@(KOL=}{2Bt`nF-CEqIlg=9m@ zcico?X@r}w86bRt{7m*NuKOd4h^pEGfUe=|2rMGLpex?$=%-edvq6jtw>upGWpv9^ z2R;4O7M*uCZMj@fM>fP>l_x0x2Ud?^Kz*on=uh76_*QnJ6&7Z@W zjlr=9?E2>+(M!L=IPfpe#9{-x;TTANSTleep8pu zJ6b8|nFKXr>QZc!05w9#Brwrmt4KX_Mk+Z9P)YTRO7>HNsH6srlmfNX>+kiF}piFIQ~g5Gtk_;4N$*wq~?Nm`;4b2J+;i#Bv80 zKHAaC#pFvncEnENe>A}Yp1Rjv(NE6Ut29uER6pBOf@-b}8P)(jw?Uu|GS%%= zY2eVxws3}XonCFVUwwZ)*>H)m-A6nZD zU4hl48+#@iUhQ0v_N$jTC`;#p_B#u*mcw@cCfv_mQDu@d#w#J<_A7et1Z-dWZYx-j z<&~692rF6c6_atuaxa!*CO4a!qdbMv=(w)aiCu86#Ash&1vFqdR}_0Kb+Ow-F*2Y~ zz=;A4sTXX@t1n^eCz<|;9>^_Whsna_U53j+3#tuXsidOXpq!6(afN5Ua9^lC7sC{f z{#*(oi?LBKSn0>fYJ)1pGz@M-6*=ud2|h_&4Fuo-Av*>I0+EffpQ%$J}HzYXntdcoyftS!6%`!C+%ZdO8zJ*jSR zBn#Os*g^87;2INFH(BJ)l%Kl zoauwyq1h&7=s(dx!M>fV5a%pdfj)Cr%+FFTrA^gPW(E#+vz@py9lHXTxeJ!(NOixY z!qf`G3-S)7YKTZ>3r?;>crckz!$&ep6u2@_#~UA%&R)+sA_ez{79wjv_MJq_Go^kmD*1hhf} z49!E+y~PO)S7Q^w#!EX<+F$NK7D2aPz{Zgjnn-sjcYZs; z2~9P>zuQ%wt zBb04%al%;NNHMWlc0TTLjuA5k#3-xd%0%j^i;ENWERNNK&tpIqmR96RIHhWOBp zb>+{H#a@Iyuf&TBK2|JmXlu1uc?iqU&hd!-f9$;pcvR)t_&wRku%3WKgGe0(H5zQA zK~0!g<|H$6#!NI+u((v|i&d<)MKS{@Dv6V5W{y*Bt6gmE@@o6HZ#TOkxMn~}0A+Q- z9n|U>k5<$cf(!Hg?&qADNf4K|@AX~(>$^TL$(-|?XMgVJe(vX9=@IjLX1xxNNV`$4 z(m{U}Q|Ln)k1reLiOn2L`Y-aum-#%=gRGwlDs{+yH482& z7MqYCp?00n|ISSSy4bz%#=gb8lq|Zm;Y{D+iv%sjmwG+Xan^q+)O;os$SiL}E&(us zTM_eN3E4H}hZK*%n&2J-%`VvBW>R2>$OZwyZ6ZZxOHfQ0360!tvX$pug%>l_G@RU& zSNKbaekV8O-Qr272`*4B{r_74M{ybimCO@S_5#813v(7uZD`_JZ{6wACkKWhU){3~ z@Bm8<=Wu=-^RFniE@o~ywuZ^EwZVK>otw|nboEn%_M&?7CMRGiQtgJji@QQZHQHV7jZRUAJC8-t2|Sic zYH4(g-Zcypk@9GnG6*u)*k$>NWTo<^NbG2Xttl$a&~*;44Tg8B@~`ki&}Cqbe$2o1 z%Amu-C{nntW3y!s@;SQ(yQf9l;A)mzBbW=ttO3l5SOky{Xs@yE%m>GAd z$vW0adWNrX#4Njx&-Vrx9%7*Q z&KWgZlI!K#zioZEZga~Gx2P$#kEfn<$Y`(Rp^XP-R+-2+_FLOFh3npHx#51588C5( zugePp;6XQt99+RYMS}U%!#aw3G68$DEu*hZ0GR&LaGg7RvrEQXtjD8$2l!9c!&{Ho54ix<}&k41FuAmFhPw z%2f~Atd~g;*9q*itC63kPOUnRU6U$nkRLyM?XpWI^E7dtv1dzsXW6^PZv@ezM2$qM z;VjN$A8L+|o=X-~96&|L(~)%0OhB4Z!Yyu2X}Z-e?^u?A0Xgo;|zm7 z1Pt^s%(V4i?7Hk`%M=nw4t+lJMOOyFR!CCgO2b8ZTBr~Ghlsh=(Rf%$yFB?8pKjD_ zY1cSAQ5!^9r`>oOK;)`GXxCo~oTAon1tx1nTKqTQF@*mSiBlzd5Q-*z=iNJ@UBl-4 zYqW~uCaoe;j4@>qnh2312&gnV5_x}8W*WeH@^H~7xUut;9aL7bF1xdXhoAAUlYcky zZv+1}^KS?LcJZ%=f4-flDe&)Zo&)@P`Pat3h5Y*^X`1L4tkLcnadARIj9~}il{ehU zHWiZ;>J;@veDS`&RM0+H%jDi*H7*q}_8mHr*>uA3=Dqi_wJ&_8744H>@#7 zP=Tq+m#X5W7XrOdW?p?|ca}y~)jQJ@ha-<{^`OM?gI?8Qt#pzzsdJJ!& zeYfc~(jUq>MbL=gka6m{Csz;c8dQ{<&q3d5>`P;uk}6ZMr)>=DQ99ODLqY#tLvN(I zU-VHVT@*)jZS2T`Zi?3ReUH*Y*%k4RUUztjXYnDKt)vvzPt;MgW5cRE>pXUl=1K?Y zH)|Eau|Jm&t_}<8EaAH)u~!mBn+2_w@McNbAt}3JzmqCOwMDB=+lK;ZUM%8@wd+I} zlj~(TZXpO0^_kM>=Z5OrjMY_Na!N37DJ7WETz62kic|oG2LE(ma}CoO@MtykzlQ!- zb&d51U^5TWkNh}l^bWr7H;x+Aa%zT*gW>@xUc-25hK%QS?e_zjYWAOkM^t5Gth-Qg zt&madPHW0pDnTtQQO6)|xdr1)&Anu|@W12mdfR722`GRUOjL9Y$xS!&#$+ zOyoTI&?X-Oj?PdUi2+Hhl|&!KYf14*N`+Q2YHaNHQlmTFxhXw#(E5r#QHHFgV@0QE zmzqvuHdc%fNMTdUM1oP|4C2;=j@KNCAfEc|lnN0@b-u9+`49;3mPsIEr4zRUl&WLm z^bXpE;O#PN)ken_A~I#6V}M{?@{DU8fgXyojyRhHBZU&05bdx|ThYM`(HyMSY~?R5 z7iXz|Rct14G6{X7)L*|tx}0+-=gcKwUIx_5ep?uETbfN`;Rj4D<`6sM+n6 zz9+h!nw__Jua`m6kM6se^?aUC2WMF{TX{SM>(-eA*~&Vpg4&I2rH@A#pA|3}Mu}sC za&Bu6KPG6}G2lRD?xBt?C-eM49xaw9gB>{u8R9Qpwv#0|O8w8=p$dXu&K1>&a6 zob>!e6bmpto>WQ)pwh$+8Cvgd;d9J$>tYprPKDN&m=j<@e4N10_K8P1MPZ^xHN!c9 z#C^#DzjFd`LhV!xyN z!<<%|WxLN(ojxA2D0ZlI7sKrH98AxwOQCF6GC9i?5g_B-DNmUMX>z}k=OUSG_wM7; zeF3Gq4d-LCfU?h8uL$JbD8T^BhgdTU4S4x-pEO{%2yCEiwz6I-gy$jbosHJvd^ES) z#~U?!a9{jIQP`}u7E^(?LaD4*Bd@xIS9GHQ*i!%Y==PfJ9Z2y!5@v|TWwZZ`~YvUcWy=(C1P$4ugdOI z|6SW!vOXMtC)--Lg%iXZUgdH0LOWZ#w?wyzT>_5>?v6pngtT!78IhR)h zY{eWG-o-~3x+-2{>AKU~p*>y472fNxyt||-t*e{yyNxXEdZlN|*yv*S^-^aH%ywUA7IH9j+{5-qr#U%JbYG8BW0Wdz+{@;*?wMi+9;L?2Eb~`{DwM584-J^2)w2;&0*! z)!iLi2kj0JaQx?LcfetBjm5#`gYLomZIk`?2PWwbL{=w@U4VJH05A$FU$xPZT!YTm z{|-FL?Z^cc7an8o>mYdiFE`1B$FtnmLGT!GlU#T_!F?^j~UIG8ghxXUlV)Eo&G+eTPETlxQ zS73Efc@Kb}w%>J#quuG!Xvy70Yj&q$j>UHtN4-Q9hD*G}22Jy zhxI4&N6Z>=>^{eeB)(CvC$I5@Q=y_@>YGemN&G5rQ2^Jm*N(?guBDq#a7u2yO?KNH z%ZA6)4|*eJp`lNHg!(bzC&8;36$9?%}_i}!A}C#PoOGduVGYx|(o%!dl^>ySp9 z59_Pot_gQ>q{xJVq12Vd!Zj{QLU9^s-HuE(-F4TC(V2V=X~DfJ81~4nt+>}8y+t*I&GBL zMCZ%(lzc;a%Dd|6qq_gm=<&LLQ+su2CeQvdqJGDD^IFkSn@o)Q#G3o~S2 zXJpmPc4ecLf%^Jrg>?hBJ9otm>F(~e-q@s$YX&@#L=C|s6tgI_!$mC_n|D##-e}eE z#Hsal>oirtkqkh*G{?$x^B?y4JQhcfk!oZm^X2!0CxPk?d)B9B6DYTjQ*{>ac_Ej* zbw{2YKxoZ!A%Vu;#f!u3R9;V8bhP(V&G}dN#Mf@k&(P5lr|lzqBK@&@;-{i5Y1RP1 z`)`WS$8U-U0H9Cb6lzZda(kleleWZvvK>%>)$iMHJ1jfkb~w}74)5=`9gacx?!uRa z0-{q{m|faBA8pEq!Ml6VLg{yR#gRewDFp9k`->m5Egp8Z1uPep@z-{xvx9R9>ud;S zIxT9^(?kBg_LKCH@3#8iUZlma6@-0} zlMBC>ABT@|1cvUD*Y?{dPw|etn|<;HP&@l1YJE;sAp3-}?2}gZ$t64%N2lf>`s4OV z0sY%^KRvG;3jDX+o~mju34i*Q34i*YQ9diT$UQ;b0&W(!FzaB}>wg5n>m#i1iB?;j za8=yxhSE>U7F7A?G0WD4L>}-EM7+>yDJoxMdj)lfKJy>dgr1gDQCVT z2e97eYH39w^~BU;^c_Lz&8U&qdI(NB`90^ogg(?}E1y4?JFd6_h`(PI+d}pzpREhg z)Wyr#B|P)1nBJ0|3-ImahgMe4KT^-|Yuq?knBzfIR9aUud%5#p)G(O8S;(@`pif() z?<$H;w@jf!RTQL?RHrsrzvOz$S^mYJ%bH$UMs^#^kQUJZijJ^0p`~NQ=T}Q1YoBBt zeBD*JSn*u)9bxWJ9lEs__^7lpjK=NH|8S;De`-``M$wsa>-W@Wziv%r9k|79u#V$F zNSO`RczIGS!G_4o8eIOA;_p|%qauV!{Egb6C{^uc#+ibNT#FB}78RNmePHOG>w!#j z4Ju1NqGQn)%r$ZkkWNOoQsM=e-qx*v1HBOSm~WDsO+Pbiq7j0&j`IHv&&a3ycZ)ui zLI3ik_U2AXXIXo;}bt#}zzss(fD?qh?fholz zx&EpB0cUX6?*hId*^1F~TYLz2dGzMuF9GC0cKW4Z;ga#_ z>O#qNTt!&1DY=Z53`;V~Zjg-Zh>}t1-TJ9T(ec(9EUddUqH8H`1YN6<%=hRiFkRpW zs%b`k1d)k^V9*L5VwD%F=|`J_slJZMlPp`E`F*~wx4zh&>JEB0+Ik$VJ*Q<`@gxG) z=|2;7fXI{pCJ$uzv&v9KJ@y|QeiEW6rGdA}`raJ^ze@SY2hkwT2PtP=L=Dc79LrqQs<3l|mX zZ09}?4@*jseg_QyALV87yTWd{1$8$^JSk@%}*hc#DCdLZd` zvVgYK))C=srZ_q!o+*kR7T-HOdI+cM=;-*4*XQqE{g!r1x(-7z;xk}Xgn#1Pog<~s z<$@1eOxhCX>fP&tEWZ})hc6^)o*e#X2|A=31htQ(^ek!zt%)W>H=F8Fb1%bGFM4ve z9|}6rRIi(B_PpD%nk~D%)5%YBmLEm%=F?d7%v+=*uI`_*bjti znv8I^iDd-Qg%V9|gZf5~=w3tsQuUDT{p)>erEjO?`o=}iP@Ri>md@S((av$Ny7thJ2wERm8^W9amMM>!D|h?9b`( z;Y1?k5i-fh1}fyo^m6BwSJXEfvSNa{Cgk6K^?hpobM}MOEay6uI(N%N3-?k?1rjYB z0vs8MmfA#1{l$rvK%%9sr)9R0Fy{(nB+Pm8V-_2U_yY9=+uuk)_rqv}dEX35FNsiF z!d%E_>yHU3gx7r5L>+>IaS;LuRYh4z8Rx4AB)X>TP$>)s2WK4F*c#wsPMM@b?$ig8 zpssP&CZ!2_kVqi{oN&H~*;0kDP579#SXZ{1!$ojh8!>4Z)Zpk!iiE<~YI>{>1%Ff9 zJnO6?sr$w$y)+8T^S3wf8oyJ$dSG|9x$MsR{Qc&sKoY%2dL&HG8=cP9J!-uRdsRsc zsK;?<((XfIpw5FKXS?~H_TX?Uk`$Qu8teoNuUCw;rhxOnfNyILjc?I*o_W=e= zEzcOKHgC{8Ies*e*Fva`gyEyi!xFXTF)L0-#87T#MZEq>gMbph{^E zxB6gNFcdFjMdp8GP2$Ud?VF0@>!O z__At`cHp%Ltd7r`W`mszSraYO zy4PJfJl;}Uy60(LIAYFbl#RYrmd=NfCG;~S5Uj%cinHIv6{pDH=+Q}|m%?Jc!F zyN18T_EGWq)0nkd{xxEM9PlKT)vs-y?XltCY_R5X34mH^p?_7tT8qwU()|nBEllsw z#pu3xSF&G4X%GeG70`nn0{_h8YM_8Bt6a*fK=Rx3F)F2fI3ddmkn>Owo9_j)og-s zR$HO5u{4%fICSoDLc%?53HoGEkRPVh6lCY%{mW}K=oPWC9Rg=%RA*0#w^XC+%%hRT z>xYxsFvkXaK*Xw~k;R)hjXn!$>;m~u(9_H{>a?k<7EdO#^tJkI&ni!cfV%vDardaU zD5|w;fS+Z^CHoKA*_kk7*_<4!RcK+2w^|Fm8KZjRUI3JymE1?19&JGfMgK^bnz}~? zq6-W&sqpjuv(hB9a=Mz8CU;h@b26fd!y)awWEor&7(@DXI{j*L`t{e&{46a-L4VN2 zMD8T?E2-;^r^P1hF2cZM9@w-`pIXjRK`2yb9tRgSo)J4neQb6<3Rl9quu!W{)tWhm zukkAzJ+YS?!;VI7V?^uvHJKY{Yh6E--v!Y{jbD%cSL5Z;lN+PaqZ^k*4{p5bZjiXm z*FL>*7(ba8ooAu$Rm4crr8_Qe*Q+|}FOMC>7)b|;AZzrhjI_c#R}4=^gi$i9>4>Rw8+}VAa^UqE_ZC%L=Ti-8cdTwNr-tEV%Q+MH)VXIk z2b}wtmoq{~h<)davZDY0+&jziFU-B8n}e@8QPA<_c^}$?I!Nhh9l!O0<}OXFc4+OPuKc?PhYTv$3J)9N2Fg`Fh`mOlDxzW$X2fnIx-J#OwYu)mI zhl|4i;|yF+;xqub%C|;*;F4>X#|JKrUJ@VpX7s%Hz_+6H@qvZWiSdE@rI*31nY6a1>(L9m@h3Rfwj7c^1A7FBXlWx-6>y zUouxiu1WQum#1N>Au;Vd-ab_CdMa8j&o%ZKbM+QWzIo*x0z8{+L6(h(2yY*hQyna$ z-&bTPof{qAu~&~uWQGzw*~i7U7gGPLrHAy8 zg&b!4w3_y|nmxN$kBU`BQZ3cO)kvum;!i&7L1p^I%_DUg0mT2T(4|~GBIaYtGnP^b z@3ZzW8D@)`xf1DgRXS6wcWsJQkdONQgv!xIYY}zH8MeWyVgtvo@p!JDXg1fTEwc7S zb6FYcMr$Tn>8ucBaHTF6^{V|?Q#n4+|EsX~bAdPod+)KZ{|4;cB(U=D!ro#K`+l$| zKBIuWH|Wj(_h4@=Oj2lsPlLU7faz0V? zC13a9DPus?HR>>uM1HtCdK{i&8k4iYhr=x|yvVLzBhhYX_moFRZm|;0ZQNLj?1?HQ0i+|0_(NVm z3tHfip_W0I?E8BL1w4Jw(tg%MYdO;E;cIJ)uPi9dnZ}UBS`l|d-&84 zBK-UpxEbq>?D~%Bwb6lKeQ^vX$NFRunMD;u6{QKIqyG5VNG`N!oB$flG+J?EIH{lmIx4mYhL(WF`HFAfHk3yrfCp^2uy>;}WL`E` zU5JLP6pMru(~+7Dnd%>?#Ywfap^0t))mvqrtqUOskx(4Rjl0MuAcq131Q!tj1m~LH z;!DmN(0eL?WFQO>Q_D<86+0BK7%hx)kWq+p*Knk`0?pyZP_iEn^`TVr2l2gS%fA+_ zLhKU}R`FT#XQuo)m55ET^TT2pvf5Crj{langr{*0e~Y8%hW)+K8P@x;Je_wxRuY`g zVp@*0!gk_g*bm(+owQfRGsB{HOU=I##`Lf3+v>L3cK{BNqVs$l*>^F|cn*QrVV|>q zDr}DVq;vHfup2+}vE0xe;=^Q_MSIeLK0nBZQf-AX5acUcPBn-934D@~#-68zo3$7n4YinuWo2c+J4LnGW`QjDAO*X%9KKVcd$H0fI*0kt`L}Su zYIOL1hgfDbKi`qZ)qM9bz2=#X_X%*W;vrr;|lr6`_z46 zqB86wt`w`HNrn-!DrGjyO~?hiD0-awJCVP|V%PRetQ!MGn7za7N*o9BGe)~-X7$B9 zlqJus?isUoX21=f1zU9}F8vr>ZeCH3KczhWUOFJ!QOk|QmF$CEg3s&4czXVmY^h1$ ze8J?P@XO{SLDlf91C(3;jm*zJgpYhUZSaTVMS>~a0P{OLxK<|nLgl**j;HI>v<(66 zpZ<117Iz~vcX{b8m@B@}`t-ey7BdNv3 z*8ijwSM~&45>Baw2Om8KV6G5y&!zRGcAqM59mjTnufMD<_8a>c#YQ;7$sC3@Y;MDY z=mJ6gpea?z5|uL<0unEA()#BkMN3*R62n`_pcGol(QAXo^~{_9`M9> zdJ*K$3(vQVlGlUgjQBAg!~aAyhWtfO9$a9p6a+Hk6({LnOY~8Ni&Q$i#2)U-WMU`9 zXB-#ffIgro=U_xRt7g!o(g(-h`&XGIo}GJr^uL0@XSy~m0onL9a1u%8Agq8ss1UM{Erw~(=Ln& ztd;9T;icRt;{L$jg%$jCEQQ5YT2up<*Z)rf=n#jixTwzUw&LWUvVXVf3@Q|P_u1%0 z%yD7>&O?i=)<}eUBZ=0kNFoIGn8V&9q65arl~(#&c}#ZQCPz=;bkT!+)v*zo(@#-x z1K-a(H{dy&dEbE^BJN#?{g4P*c$P<&EY*f~q0U&#Ge>-Az&Z%l7Co9*@Db1T8T%Gz z0#m=8vJ3rRY+NefzZhoO-LJblrCTT?9A@Pt!=hp!(&;Lzve4HjF?)$`$Y$;Wex{`(k)ZGHD~h&)MPqf0CtrHq<@=W| z13`!tf_y9`>KHh276CU5Ewr;>+y&TOrL47ef6)Q7;Mh9BrSS&u1{?Q?hnQ zK7TKtdZOED_0ekGuWhj{HqlnS1~t|2v-3D(NcYF5lC3+{mA_Q6@tz;0!%FMv(R$k zr)x?rDN3o}89*a;ob^22a=BnXeN^VExeB5l;ct9dg(p_B)^&wwp8#zU#X~cvg!Lv% zBJST=d><+*8%Ikc$Xv;hFDJP2M%9{(=x4YK5tkMVq(7YxOSf{g>fnC%zxJ{HJgLyn z-5Wk*KSM+N`Nc7x+Rr@`KenIV!7kJsJ?DryqK<82L6Kk|C5tf3Xt=5h1DP8x%g?Go zZ&h%j%+=gH;Vpw;LUR?Z&tt5$#o@!s*Rsaw6Q zBzz~mr#RL0#9bd^DDkh=C4*xisiu4MKfkDVtHs^9wM00dMpI?Lpz)hZBJcu>wT*<1Xro&5(}iD5re(ak_ouY?x~| zGFA34{t&YcB6i?_qCP1M0fZXIsGe3Mxus)oZOm&w>`a>C=7lEq>hT@uX7>(HHHlKXS9@@E z+^V&YNHvM3xAXdCdt9nXRMMT-Q|uB%le)imNtm9r`k#po(|aHR)~HF!KK!pwl6{@{ zCCUr;r{g{(%Yq$XkU&;pkbt@@mODrR^-XG=5&sLZRvE0}&XkUF)X2(# zqwsX-zSSM?6)k3>^6-QbpModVgB%7KvJF1N%%Y6du{VU0)!w$~h>pEqlRpb%BY`A) zSg0$@P7az+=?}JzcX}%>ArHKSAB!Ah(|{V-)5-NZT3j8k*X&;Xv3TLrAR#FImHh%8 z{!zpN2o(Ckei5wc&VF>1>Va%FwO<6RQo0KQTjH^K-Q6F&%KliNjlVad z-DpmgewWsRsqsxA|C7tHOZy0}{Ka61zGWyx_t^%tf<5={r74;0Me|R7ea|S9so6z_(~~e3Vn#?3j0I+vjuXk=Q?LHXJU6bdPa z3NnHK>5$*J8#>-~YAH5@&$S|e78fA6vTd#kC(ha)PBe4WPP+B^ec5oLWd~|~D6oZa zo1ZM!r*~Ct?=1Gh5{yqFDDlRE^SNYknX* z@&mEdKoT-T|G_}YK5-x@wuMcDliDi-Sr<+i6=F)R*5o`~3!(aIy{AERLMwUfjFTXt zdL5qj2jEP5o2*wjah_M!Ot|3rHG>dS%f`i%C9B(tit-cB?#m|2o2GY-*rf(4PybK@ z?NEB%g#b)!gdS`(wA$j@JES zs#wV_jP8rKO%R2{>kz$1Wu-Ey`{{kzkT|1xT2Gd+{U>;@0}+gnr%^n`nhJXdBF-W0 zK?38@cLnN6%0rZ*>tsLni(P)t$Z&jbY3zUGq@!)Gp3LbyJME6%zuf@=XVtFfKW?{d z|8}vPc3tUangal-Nh+yUrle7=P*@iQfB2`=~7t!)X1y^C5JRBIfgV! zufhyoFtR;u&;&`3<%7eSuj6**&QRWncz{z<3@n^^lKrB1*ax%^#>y~f9c(n5$R=r6 zR24hc`V#KYT~@?F_ZP1CM5k=8;A+r=8bzj(%_;2byrnQAK*v(JhawSkcf`DmF!SH2 z7aL)uY20bsKkiN|cEE~U%&JTFKK%iqL0}15SQKwk7wR#tRk3yL1g#qpflpRVhnkWrpk$wEK_joKG0psrK`F z@=pF6fmC4oGTgJ8==^q4;toSfqi`#sDI4SE5IA* z+7&xB;=il{>IzO?u*XL@f`R?4r4@%y>-s%9yj0Fj{Z5|9n)wO8j(zE-hm?KkGV8&) zvL}y}s>Qx^SUA2hYkxzTfPUfQs*VnqYGWl-ImpKJg3pwl!OMTk?JwlbOmpQ1S!O%D z#(XnJe7dD6I-1Isz@Zl-rXDa-_+AiKi-uSGa<75Yjk@f++Souvpl7Mqx=p0zX3J7x zc%p%{+4?mJfqKj+IAR7srh)op)1zV?r5o{h2lGQ^>Q@BBB8MGkUH9cYK5M=Qb}-k| zc#q8FJw>pJ=O&7{joZcO+j8E|E6^IBp`WNzxcz)b8IK&WpV$BvMO*UyZ2s7OK67@y zpFdtfKM_#TJu&2R`fD7prw5Y%C<_g)N#=X_84K2*Gd&hE;+^j7sNaY=cL4jQ*df+M zg;tNERmAdN24U?kD#FkJZx=>FUT1-^O ztNKPUzxJOE^U^@8iIa@Ck$iBwf)7|4PF;}|Ys@zhcl)2$x&)(zaq)a z!*>l-=`dcSSDKp;05r?7`Gxr2^4O)AUaUTfi%G{d<=Ost|3J1k*{^g5dzA5MqqwVJw2b=v_t?MxeRm340LxBj~?U67jBsmSidlPZMFi$w! zApqx)l(h#o9CmG((4$jc!d>fC3Cbez<**L>N3i~@(__K?7E)yXBFZ_$`tj^M_?-V2 zwUFO+7ZOT5zmTX!*)XB8c%j=LvyM0uJlcw=>eM>^C1PF~keE`4rIrdMF^}cs?u8d_ z)P>H(3KqMku=z$S;~gIMzom7($Y=%efp1yVyPZYl;NqNbW>Ils-SsmPaWx@UKc~sk zp2*T_-E!+?6?;E!d3&AZ?V4SsRyUwl_si7ii_Qwx&z~Nv750B!P{>yiej)rsD+-cU zf|o6I9cfQEMO}tY6{AwF?T=)dS#KGR)+K_g%m=c9998ZJSbiCYEI+1pvivd%AXw}A z0XZ2#Yz(804&PnE@^_J>dQvGvL)1$6RVLKuZej-p76=S11lKsR10=jw!M-W4bl@W( zgs695I)%ZMH+rV_V3nFfOsViP*Q~9u1(c6Q#_Wh4kkvY3hsUfrbJ&1YO6>5Mh#lj(le;Nln%acvNB5uBJV zIZWTzt9M{;d{D%c{mZ4wliM0_Pjqh&CAdO`kriV<*nnRn*-bqacJZHzlB;vJnn09e z&m~SYo^H4TWC8~IIe;s5B(4~LapH=qK+hG28i^}>i7TpkoSL|zHc($18=lJHNP2=^r!&80PXl5T-y$d6nO&m(~7lj zw7fh+XN6V&E z*#rT9s`|Oe01Bh>(_Xy!B=rz+`V1IKAk%{n0h_lyBsGy*M1QJ4DNys3v|6%xZDvP-bla9Ws|_jRrXlEk&=G- z@Xif#6HZjAn_lKofHt{0d_QUQTodNfy3U;)P=oRGb;K%71(^mtRf=ZXu28BqyXS>q zNqNBtkg#XjBaBhK)5MPXpu4x_tIyEWZ& zqZ((3E(6&8!Q{)NM@vG<*8qw#E=SSxtkGAgt##C?9@>u{90YCpf?$lLr+R2FHXUP4 z`xF_|Exq<3^*>P+Mh~TIY*;#w)F}Emd$sEuWENPLnzva3y=G6QngnKDufG7cjx)DvwwdaY`Ke}-1t(-K zA#(`aop@cAchB>B{KLQ^;O>2;0mR)#XJ*x8slCLMY2WQqLn_P}N69BlScCQ4QZ-?R zITJR@nWiIy$q#KG{Xrbl$2>8A(J?YfqueQjQcu3Gn~!n+^)V%dX<%k@K&S|Lfa7rG zK6`S%niou^{CgK4Wo&sXxjMVng&IIIo?h;M``Xc&uj8-g+F{geYo98ME`EN zr*o$OGi;}k{UbLeM!A6{xoCa*7!@4;;XCln#Y6wXP2B9Z}2Q0hJIkF#F6L?HXO0IjMGCL<%PO- zoBb$qiU^Fp`-qW{c}^-dH|S}*ERQ$w<4rnqXou%oQ%Z&7E zzLIB*lD*U-6^P(LF6GVft8XK42WB26&jpX{#|l37hGMg3I;nc5dG)>2^1)2=^6N_V z8Ys7Q+g{UaJ_wmR^zf zt3u{l!qn;J7J|N-UANArVdK(%&-&Z^tUjyGMJREjN)ChhL;g*%Z9@Jnl?6RH{(y9} zz5NKYTONXmu5PIyXsUDqR0b33$v%iqyTh`}-Or)!SE37~dAf1Dj?W}SN#?_*)0k>` zr`xhyAe?@K4)n#gNy*Ra@oanh=Rh;T#GN10>WD(Cxfxqg+?*P9r=EQT*P6l96ho$^ zJEN#k$kId05I{Tz5vT9@n;0pTFp2eMKYs&all~Oj+`qw0Ycto>$=Wn#`%NsuR@@jr zae1+j-+zhM@qi&k`sHHc#H32mXiYuLq$j$2`D@+9`NSDsw0d9GNWY3>zphoa6fjcX z@hz4gl~=qFmk^6%{B_pSU!d#!fE0~qi?kbl1!S7tQXi^MT48XRN4=bD?V>3wId?946m%*&#Ed)Z}^DF_0+M}@V zHpM35;Z;wao-c`ne`HC2A|=J;St7`fzfQLE8bkZTlY|OwGP_h8JW2+nj7^DKoK{WM zs*$#Re(VLs3Akb3g8!B?q&>h$dP$p=w3+KER(wT?ZfOm?E6r>(yHYX)s!!aao>(9? ziRssU<};|G{z=rfgHDxlsa39vRr}ai2IJFBbnnN66srgsEJ?!+jW*Q=>L0LsKE)W;yrc393J%}4M5j7YQjCqt0t?^)&p zBF#f`NOMdMY2x^X-R7Wc^Mxqlsb?xm)|$WuXP$b3y9&)*4B7vz~ksSz!h z0Z+arc(Q;}g|Ja5l;d6NLg7|Wrfx>N3F74<&G!Wz9sp^+OnL!nu9aK`q`9DgG+PEE z&9Q@!=7c=b6qIT9gF5#|n-e|_ZGN|aHoO0q(58biPocH~vV2_YeudfoSCHiiKPrI4 zQA+`dyJqA;;?kexK_W=t$6yemw_eaDLB?esYyPHCKoEWUpw@k~gDx8d6)2Qh(~nLd z`LaayEjxA?JmDfPjPPe}u%6hq zrbkcqh?qZmSl7A&mqDB;htsdlh>UzYlBl)Ecde5YJ^kw8dMBy@9m|7>T8Go{v$6TD z%6<{+(v9}vI;`9v3^_x4pi2Qh%n&hFH`k_jmceLXvc#e@NRa2*TKoj65S~L<4G(h9 zSPCgG_9oE6uR?wJ93-Ryo!!L7fq4qOK20D>IH%vu&s&~mpF)WP(Cm`z(Cm*1$=r+S z;R8~+BG=_X$aTpSG=C?r5XHfSda`i@x{j{g?1gemb>G5|+p&9Hl1++PizesGsx6zO zYq|*y`DXN3bA5Jo$b1FLK(aK#)>Yn#l%()DRa}*bDwD|kHnBAWUI~gIw zU4j|hE)}x6MN1Z&w<}06H-*zXixnIt6gXNnM{u8kl&^sRccDX3^y_jU-zyL5SPl-Q z=s&spnMOs?f9T#S98$ikmu=}#uTb%5UZ@_1#s4DI`#d7Gy9E4)0v`bdALD7Ckl?zx z-kg@?Eb;~Yo1GgpVlp{V6wT{Ynt4`jf*k$+Aa8??qIp4o|7W4!b#rz%`!Owt(IDbo zol5&r@DAy2DtbJ28%I!B-4vRorB9^V*O(5iUZC2YN`!n=MEgBLvCzH;}cqEtDM z65Vn-S!aJsq0~Q6=)fpd@($vt9DTE(R4J-B6vE3k)d9yfuhCg2VYj#l3>+){&jGc% zd0u^(Oo$rS-9-<{d6*G|DA&Tbt#3mkq4ICRf)ke*bm$3K8a^MuU6?edPG+TlT{L77j< zrnbIKEvP$u^t6%o=toAb4sI6*@nIm~Kb8-pM*c}tp>?fgR&&$Ah3XThLkT^H9)_7i z=@enE!ThrPLomOru8aAdj^r`_!!G9kpn&-grXLY==YE*~A52*e^B0(VndeCkbXR(49 z_f#c#j{{%UmnP&v!$JSQp(Ypo3(pMnzXx+7Fn_&5EiU@+j|TKqSWy4dza517V=)Ex zu?|!kyAHH5U#`kGC+9-9!*qKxBVw;$!YQXZ>TDkYDv31YcJ`Nr(t@^I*)Dvwm&(4r zTlV#D{=I#zbuFN(&kW2>WLD_rql3-$^!-Dmzsacy^c9SBu z4Ww+@O=jPo%}`#7PozC?qq+?!;WGCr#1yM*(*9kLK-IeTgEa2Zf<2Kb)3hI~<}p_O z$09LULnD1-*H*3jX?i0*Q@8NzUjykF)S5Oc*|vyE8ij~c!N0hI;Z}QV5b~y8uaRw5 zjAh}X3%H)Nj|iGSQL};w$$TNz1e4{A+WwI=*QjPJm}Ce_qld`dW;&}Ft+En2B-~q!NN`Qad>!;;$UIW zJzv&>t0b$Qn#my6XrTe+_Fs>`e7Gz>D=P4z*R09Gz^mDf=Gp=bVC(yUb4|^I8!|6} zfRO(gfZ$;T1Q!hjf>-iD@URO6=mr1;TGMv)8X9%~(^^*tDZ=r<&;tl?R=$yyA6Rt0 zyYjc>SN_QZu6%Iv2Hkv=H4jcE_|FD?+e`U%U(dQfASN&5T=tNu!= zxkw9bPuwnRYft`^^?nVj0!}-H(^4rZqHM^54T_yWBpC(w+AV7$sBu(breLHqsBx^z z?<~>d7_ARZ!C}U1|Hj3itJ&D~Y;>HmC-`%bi1N|m>rP{ymwX}2&;jEhtPpkZtp!At zxQ9&uc?I0=gY(-xS5EWw*&6QpTSMk%#g5TJo5Sgsd>nKUW@KRmOq1*oEEeAOQiL_~ zwWLOk4JJ2ObDoEHRRhBWjFuMH^rFw2N{P79DJhxVvet7u1Z$^6+$vW4BC!@(dhbYn zJ0BLYtS&wX@^*7dcT6m>SdP=Z$|fdVw+`W~`JQf0Y)zd-aGYi|FVFI#uaez>q4Fep zipENnUa~#x-x{5!?|!qJWYgS1=W!Nq3 zsrLd-^6B+ZGA@&VP@G-iv*tc0;}IVwXuK)yGGvqPe{x@~I9r?~7>Wc# zW9~hi;4@RPQK%4fJ}k-T$C<@!@V^_0pG*mmpu?z3{B}w`kCDWkQ)<=kU#9rf@BLG% z_!U=F-NMrgnpc$~k(Q;5Rh#FOiY_r~l<88OjVpL0gp0yD)&f{r=9)|y*g@KF$Yl;D zP9URGB%j$&=DMxe@9o)xg!}ALIjX2J)5pN|`{nEioBP7%-=U17UqCFc9WGnd(_{v} zU5YAv`ft8a$)m=|M?}lO*z-10YV&n8J%o^cHrFlHRVsCn;u)pZBNYM*k0rjzYGizd z+1I@;aR%Xf;qzrx^M*9K{%u!B zWK`T(Zq{GgHY!)`- zwqVUOiCd;DBt0m*0VUG_cvW~M8@9b}-spTWw{F{EZrS#7aO7sU68JL3iw~yu56Nf- zZz$bnjoj{jlXXwc&GI&nYT?Yoq3L;%O~;OHN;TF9Q$wwlY}Q&)HmKMAdzTC|FMkka z65afJY9{ic>q}EJ_c4a+ONHL6M*cIE&f$oJ`#&zego>#SZ?o_+w{1scWG@&ro-J8) z2%mkanIFphY_sUET_)SUny6T2Z+OqU=6XcKVgJMEqbancK!)%b=EDfKVcfIJ9$gYt zs+n{%Xx^fxj3b`Uo5OpaapFZQUA7&*@W?fU3S2yfz=q+Htq9&Jy!d61hKw6AHR5n4 z8lRrR)|?w*HW%>0+!ki}b@TZ`yht5?N!lMoWrBMzFanfCQiokHgV6n}+wq;3)@xQ1 zBvc9}n$ab;i(>2Dh6sA;Pq&{TulHL9JPS<%+id8KMHQ=_g2F?|3t zhI;{`S^i?~mY7va+;5+%cnjlk>kf*hF-W8~yMd_?D9OTudkx&%8z~uZSD58Z_@V37 zyYcA_lceGOJ0olmDQfuLDngJMt9uFk?BxhIB`+<-C$h^vO!8c z+DNtdtk2sUsbQL4g_8`em`O?f-4l)tgVS$)tu6LQ>Uj{MR2*Rya36-W+6Zu^_@*M~(f zl9uPnpK6*{{(!^Gvv>CrN1O?#Gj@1_!?W|r4_A2xtJ1C;HvZb7L}HG7cyTUwX3 z?Mq0tEY`1N;@>_YM_7 zZ3TSJi?o~GXLhu%41ePTXDvTN>#7wJU!0>~tsa`AXX70G+Hvs#9HU>VlEPY-*hjG+ z`*c?)U$5%XQOVbR3B9^UpPJBXRrnbEr(++a>ON1bn3J$h`bz1DH5PjyIRx1RhyV@1*zL9BeU(6;Z`}gSp_)KiwJ9=Co4MMtBW1n zv9$O^RaXh^$&#r?I^H`uR>7xfn7hP#OC-%ctmE~$9q&o#h?RrFMr>{$DM73$EEAuz zdCJoxsVk=`J0P)5J4!Z~n4cZk0thQ1arGi6?Iz_qas1h`<;6tj0(7<4gt+a40DHw+ z#Yz5(vfPpPj+Pm|2u`Ql}l%wQ_uwso1j;WsIEMi^QxoHU9$_I@R*C)={q zw=5o(T%FvK?BAEhqac=sC?%BeLxB58)wH1oYr6KEbf|~qeXFN$iEXuy(N?U7l9ue0 z3{LoH_FhcZCQQTVJl9*T`x3UBbWDt$lzGl4m;ebcTZVj`k(%k_=rd}bGW-LEHuFhw zIyqkSR`+b*eFy<4!>LjAhJStR9ce3vsRt2FMlROZLS>`t(^lYy5(`euaUrgrUK=<8 z+Z$wjg(HyggX-+~=n)80^Blscac<0>GIu4)I_iwBl^_gw5-p0%4|uJI>ty=zSqAe; zqGn&5U{;mCaZUt6 z5T-ywrx2lvdOG_b?qT9nhl!AG#TdZEtts zmR8MCer8h(wu_fg01|!q$x4J zelkU-1lO6qu-RTstZr6axz8NzZ`HB?Q=U|JF->A$Tw2$Q8&Do9tw#{P+$Vq!so#Ai zl*byoQM9fh2)8Z5M?I#CPg+&&oca=5k=#VzZy#lKOZg)yZ$G$Fs`&_2 zU?fH#`&hAyi(EQ*ul0GAb-SDjD9rU|EC2a7DZ44Vjg)eADG>7#r#1x_&iO>JO@GMa zx!Eu$#cx4{UIiPjo79JCm$7XFU$5Y6K5pU4`R(7>0rgcP*TMdbAm@+R#yFJuJLX>N zzvw>{juZ4#FGIQ!}hvY1_7E}N*IJ}6fRb_ zEH)~V2zXO7KgbM|8bpMw0@WGjWdL@&moSU*eZ)`NELFydDV+L_5R$f6kT(fby*~DC zXMM`!={4K2m6UzeS&yi{H@c*={wDdoxU-%zz0o8y%Xa+qbGO0-vq?~qM0_-y55`L;1jz=F%XvgsUh@p5jD3hSsv zg-2P}+qqYk33DG{ja@xAzxN}Fg+5(@3xg22) z-dLS6-)MxZ(%H}k2*jqW9Ld>xaf4nJn-E_mgBr8AqT!DNJP=wFzoD|W!bI~}uQvfu z9jD&5o;R)gPbBF%)3h7PVx)rg48uHi+;;)Er{XWoNVNoN)&nTp`i;6iLPwuN9_${Y zhZ=Qzg-5kX&CTSO6*$#xrN4*|M_;y~n2>$C|3%!@r$)zkvvzPw-%RZU#jL!V?4-}( z$MTJq=gKRcq_0cTXp*!QWxLnW9gL-deLZEb^K1{Z?%~VL&Pbw+1jVD_GCtG~0QLfn zjxZq*Vdf1%_4PuclFl{v-GHWlrnD?DM)yx%`djda|8-}xBm+O5o1V|NES z_W7d2_&Ypyr&Kb0?aZvlhV{20aN_O`KX<0BbfUxWi$zK&}Np$wjZwYd0T>(}Ej_*Q3Qy>;m#92a~6*s!*>P)TZ1bSCn@leJrzUr;J6%~)#!{Yfnwm8eIb=4SxH8L83%@joX{lQCn;Rcn<|l^)+$ z6dP}b0^&_!(hT~NC_9P2HqHm<)YB|zc!O0EWWViVV{!<$)?4!`WC*xCzoy=r&9k`= zW|&EKd{e-NZN%|$NrHR{qjZzi=>F!5|z*JVoe%U#aO8V1bM!4`{G1f zzW~x?5WZlh8cscdsf^018rI^|nc=^lA>B}eE`ynAgEjiCX=+>c!UiH`jFBiih*JFg z1M5l7{a@lcQATt-zfPMjN6h7q>>szFwhk9sZ<|lrhc=!XW#sR#h2o`e5Ob8qx0oK_p=6Ec=A&da)Wtf>)B%m~N(ywGieY!_!%*NFH`*nNPM&}a)?+kG%7q%2Hnm+-=21o!*BwkEw;Bz2~i za~%MavGt|t3*2_x$&)>zVo~BtX7qnQ%rcc(xX_2Dez;oJG5_sa=bO3TH_kIYSh9&Z z+h)mgzdV~x`uWbYPP){XiSV9z(ZT1c+bXV+>bnyOz#L&U`W5-N$-0NFXATe{{#sIo zEP0N`2|{O>dB zrlVOY=eoKCm@gQ0=XxPGrHei;giOc4huRJAv1}3ZHOW*RVY~CSUVk7!su-Qu^t%+p zS_ChUI8xOA;-XPTLrJXIws~$pUAh2Sjqew>{x(io@X1dSP#tUO2v%p*1G3n*-l%(0 zb)0I(<{oC@|AVoRG^@g1WNwV_oMF_}8QV4*31Dbrw(@(=K%+V3DyTO|z3vbrAdk8c z3^BY7G}+`e>efQrv?3@i3;WkbeH@Z9k6bYJ%5QDN+$H!6w6I;_vCLs=9q*qaWGY^f zG|O&aNg(GC*$cETWpx92k@}~c%Z6DbdvmX0R>^%+XvfU;EK9^JySWFPd%w)6Vb;)J z?!I0br+HpQxXx;=V~rjQ*KL7u)s}aD3f5#%Z;}w&B={;W%Vjsjj^Dx_J)D=Q-BNqjk+<9_VJ~ zhGI`^YSarz&cdm~_OW*8f7DR-ld^W^ns7}zT(_AkL^Ixv#;R9TdkQoxph=o;|#BSe*mp zeB!AMPT-JEjlQ}AB3e_;7FrWNfT=Bki}uiiiRKwL%YQH;Yzs)a5C=TitkH=s=1?ESD|z$fcq7W z%(6L545!Tt4;ABPimo}hFE#pB60F$*|EbZxkY|Hu#ZLi2N>0I%)>|---NYQ9wQ@~& zegt*Ts`bcC^#-d20!q;FL%W>c4IGQ|{E$`&&G8=|AEb`Bv(gV~a9j($RLGZE$Gc?-|D5KBzzmBbb& z@dI_-PWr1P)jLUVJ4r9`V;w~jJxWY^P7=9dNXH=bPc2vOXinoIocXmOR}z_zJ@8-w zb?w$(!TWf!A#EgS?i^9B%qcfU%9Vw4<$esaHkaoBw7u(>4Od6+88sjfWNm%rC>a>( zx7hjX!`jS!LX|QdbwZh8;S63}hH7*6Nh7`nx(24kTd|!28t-aqFP$i&&S+C3v`R9F{E6!Zs-nk~YQ`ud)K?-vxGG$GW=9<5AAzt z+q+mhBQ>hR*t7ZnVeL)eqpHpZ?j$pl3?$(OB+4Q(NU&&JBGDQg&>5J4JCG<=skDNk zQEE$Vk<5rz)WMl(CfBLfYPGGc_U)p5ZQr(P+1xS-kg#tmAXVd1x#PG*)FgmpzW;OX zOcuoV{l5M_em^qzo_p@O=RD^*&w2I}7@r8#w*xAMtvb%RbZldOL^Y6a+L`1B;8u3@RpZn|N*QGKuo27m2Oslx-&s?0 z^jHnbP86ONnRO{%SkYJ@kQ4I@dCffU;J2N6-6|J#%)cY%e+8i3hW`bn?Xkn>pqaeK)t7KkvPXh3UNs;4-hpniz#y$2}l$Wk3L^0l^TFLOIBT!fxR5 zo+^BsLI%x7C~%SWkP#;!v2X^l2Lw2P>r8V$l$uj8Re`(sAMC2ZlbFyEVQUo>MsDM< zC5QRkOsd5mx8B!%E*5*+iHRa^fg`T+Xk;td?#-id!@Z%b0r2goqPfiC-2%eK(dB+b4)|_CaZW5 zk{5~MayaX<*vFfaAa$>LYda+AJ<|zbsB*e|6Uu+0knZ=k%Ij(a;h0ca;!?VeQuBPc zfMfR$^jkbKivP{ZuI$WqZS?WG)}b~E)nn<}Kj?1iG^6;>yenOs+OKOj!9`K!r)p|2 zbW0}!d?{5ZR~M^JV)sz}R1#&C)!8gxbCmbZ_aM13$1IvxC+K16DK)1EuLH=W1EL2^ zB{Lhcz?*&CC>|yCfpC%eCGSUy2XUX}eynwMfm&Cvc0yE&H@(F3(l58j<`p{0tQ2S( zd()*4Qo<5h%tsJmvU8f{pV-?EwJ)0j-YIJVZ2Vq&_d2^GQ!_y@s__81LzQZy_$3VpiGdL)qaT94zOUB^wF(&susg z?)@mzJ#<SA7MS&@*Wgv#y_IW)wp&1h=z8oq>m;5xyyP$1YTKw~l3?m!EJTVGRI ztjhdYmR5XBYB@7Vr|=Y==R)>dMzbQe^=dsW*qSd(^-Md@^N!UHUC;1PkN122NcOqQ zdfvBgYY)j@4;Pe|O>5a~Y`1h}OqI(2EvIcy$Z>nBS6b0H`GtuMpXe+mwhh|tRNKZqkL@B=;77X3sAI2f1 z=0Sk1mU3&(88p?fpk#x8C|{T>Tt9L_tFKJNd<@@y7sml}+2B9bm2>l(3e)d7P``h`~sG z##MOKi<$0Sr2~_-;<)Eo$s7|bgpxf?w>dVt&^qg3nJtoVA^XVG_VV?PYp5dn9f02#&u`(GW2m+Gaj>;vAC>FiL_A25Go9qy1W_((^-t`&B zJ};e)FY#WB0M_r%(7@NGtEDkfXy82@z{xN<8ls_6Cp#g72?X6^ z$zXP$>eHKE;k9h>a71XxtK(Cz3-xd+Aodfp+W26$abK5fik&Z%ejqu@(9+_G958n2 zl{*n`8&S<{(n)9)oxl8~mbv4Ed zT}?le%^rm~>(z;9RQk>Jf)9Iz7P``FTN=ala^& zkgi$-_eRw>DsBx+5 zQgt~I9Tm;zp}d^69)^KlO7t%~8&UO;bx`y(v+sRK0Vj19?QEuEYBd+lTmU1b#mLD2 z+XIz{XW#pRs%(jib1X%#Qu(r=`jluHyoeVc7%V0>(!jpX1q|qZe$0y$J0$SIbyO^C z4+EmC=|fMqTPTy=QwQ*LY=3{J2_-4g>SI=`A7R}vP1#-))H$UC`ck;3AJ}{u&Zymqg{<8h+^!j;PRJP1BXmd@z^_kyNXzmkD6}nLR%|1oH zD+C{i6WgACEd>>ji_*_qvQS|TGfb9(cfYfgMauB9jN-+&$jA7q;|3Xr`t0U6_$+3G z9P|5q-z!z$Yhna=;Huo1@=5EW^mom@pX}9PC}Mm(d#LD4=6K}@;|}8kdhn%_Ls?~g zJ3inFd`j_SsT`7`5VNKqa~b3HCOt#!JtTf#GK;=y)R6<{&jbg@@LBE@bYM!>gd8 zkkdlF7qY#RspO31=!A^Yj+>!;@u}bci>O%p)-@}6ciS2lU(zd^KhvLYwGF zV>r%3lB?VgDiO|*i!(%OKAoM37EC!;(8Wrn5i329AM+a7PnC=koXAYT+Et`Wp8*=O zIRM@Co=EpkLd9|Y-oNMGTfC3{q>7b_^IpdmZYDJe)Uq5uvb*BPiHSW2UbOIO2El=Y z>@_9u*cgb@rQc|x?~(ERN0$|MG)NVksP-z>U#a@~)_R3XORais-aigT;dvV)r;BCo zF$I5yiTIITdxX8*#!GwnArRJ*hzl%E)#2~O)z5kRvEIMS4L}?{y;q7T39GKzQ zYCY%{x0!V5NiWNM6tB+KejKkUDm^9lk+SX_?B@4aJ^2njfzO}`(O+XXlQ6ks@B_3k zyu-_EQ}RNyxOl25INg|Bew$OBLTucO*6-Z<^quFJpE@k`Y!%TCpme%WQIJ0St?7FN%9+N?KG)$l3F)BCjyjIP9(kb?SZReA~u_Up*d8v&Q!fM zNzc(YnIziPe6*BV+p?@P2Bd5H{FIrYgel$lhPuk<3Qx%ZXPSJPPIs)R9sV+VAYc*) z)tF6=NKydng;77BkZQXRa>T=excIng*Kd1z*7VUGyoepw92!Oq~GoJ&+I`f^v zi4>+wFL)`-s%?cJd07$4oJGuHcRtae`MRwLzE3=UCpP9ccsW`L=MxNwtis4AxuHJ_ z+bA7JwkQc0i$%V0!9I$NF_8W#hT5z2C|iAf_dMe)=f)<%<1Zb@AAQu6S$jB zL_9?~ix^lw(aNKk3r>Kuz>rvkwdo7>0CNf>m+Iafw=cHocbJVyB8M?9PX@>wEyeGClE5KI3fa^p#ZQ z1_zm2fx59bHN5nGdoDv6Ctzn_jy!a<~W2&dr}dIbAvC zyZl-&r-JnxZ=L5Z-S^*lIdyZ0THw=L|CGTw4tB9{&gy}a9&ipLqB4th4*%y_u|VQ! ztae}V@j@i7F4Ijp1}`<*{BGuhOM5?PR$i)N+<=Oh^ZLOR(Tx=|e2##!JB>r?ejzZ9 zi|LJ$<|USRkSDr&HDeA9b{`6j>Ga$RF)`m}ktvb~BVxY7jqYv?FYJVMR?JP+7*G>cw)Nb&69l#+vCZL+vS`^W6zq0gYrojab&4b78EEmTs3{+YG&n9=yGKbvJx=}Med z3d|2uved-~C0HRN5Vt5pTl<8@;MwKPZIBth-LYc!a7A%x?|af->=aRdokq760Z>{@ zk7c$~t1vTXEHpK3`#Ws~_6MU3z5f{Ghu>0EJxUhR^ zaA?@QOskg&oYsO|n4;9saa!w4aUp{}Yb}7|&*4_Ka$c2G^pp1cC++f2YI-JDIscVW zL3^n%a_DmH{$El{i$?exAwxs7OI;LNhaXOfBu4}%M3RGpCvn!MRxg<}I8Q;VUoW+^ zlGK&j+H(q$3GR%7r#xEyU!}awlaybA_L9HhmuLsA{vlPx`)ux0oRo5})N1dEwB^ML zjG6XG`}>$f0~IJ*83b z=bR>1wOd8wpWI@8=CHqHi=7@1$}Np!vuWwSVwa<%yi}^*>rK;6Rwm^ zx9Uq-W1G!~-WAp>a~@2j#U}2U+4-9qx-)y@Rkj`8vuECW0TKWQ3m4bo0Ib7OfsB_( zyfk^lYWkObRp|9OLsO@D)$z5ovMp2P7OTohw89Y2De3!q(gXgPr*JG=hUUB#kmUgH z*~iEZE()$o|bkj{0#z)uk5^zK{JQ*yCilEn%`?C@*fH`RyW>?&BVN>L@?#_ zvrx9X1^P^t3a)mG*&iWNLhK~C}y{LxmDf&U7EWkTm*>X%|Zc$sq9 zCeG67b8o)$9IrdM{0t*dq*9~c)r10V1B+Cocwt4+*}Z`EO1;D4(ezs49^B^A3w>3$ zTp5^(aK&mitZUR^8fk9uEvs2V{Nn=TE~4owU(kGv02-^?lzrN6HVPj@k~ zvgu~jtt1|iQviT%k}QC1AJ{QP*E0eDF;_y`7vc+^ap=IC!2+bfFmK#YQf}N&yK-lX z3`z%9bh9k)y5$5j%4f5l622KQLf_Yohph8#Kmm`rmofn=9we&;s5znAIL|?;HP)oL zT|_RCS>lZ{On^oss_pYR%o7zQ$itA9k=>nMQnN%TLnx>T#Fp2Ogrh)F@IOn zJ2HY=1seJTMlDU|#cY-PlajJ5UHSo4P&a7xDjC{WNAmg@MzY}FjO0``5_60nH_tPr zC7i;nQ>-let+0vM)rBL8{}Apn^6z%TVJsBA^~OlIL%Z)j8o+G0+Ql!LD} zGkRC`_#Gt1sn(|L3dHS$Q_k>Y!aT%_m)uyN1X9<1J&eh zu_e}jc;&8C$$E}VTz_;=0&IdMNVv$%6H3wC(62VPzI$2n_p~Oen){-1@wTQ8f7Qzq zde=Vu`3Cf9HhscLJy?94ZiTLfU|3z!uH2}4rCGg74PT`FII&0z<}T9qAUUaCaSmKt z=s;hu#$*SXB8cR8T@@(G~sj$Ym-GedfmSu#7J!F{vS%7m?yPX%n|RU&Ec&2iC@le2(FOf8Cp{>5g7t|Xs%5h&D&E{QOA@A=EJTK%@!CU~s zzmB`)q^EhlW2Rft#yR{Ar=_s# zNRBh3p_`WQDQd(eZ%B3hDcU`vqw;I3ngf~1)R1lOJezjC_yptRM(exHMP6I;qDc4T zTWpJL%?$YVZ+eWpq{1%4%F)Lrup_s*c}lJ#H)SlNsxWp5ep{%s?!3RugBZ@ z)~KekcKZ?njEo_~ai6!sIv}ll>#c(~%*-uEbj(W?a&?wmL12Lt8>PPDkO_E}SL&;` zcU}JOAAh}$L|;igahPTV;V+h~M{)Zw6}O~+zj=h%PbBSAcL=A&L)R}qTVGwc=l4sd z4&L*7dC^8Tro;Kidv|g3WBpznyu4gr{k=ujKkJKm$A7Dnx4e0q8Z=+S_j0|)zkF5K zm)&S>;&U>ac%OFw8~9=b^|}f)cvYgolN@yOWql#?2Vz&@JH5Chz!8T{SuI)-eL~@u4EIhDw)P0l+ zYI%)NH3!;eltAz`^g<1)vWe_zV4lAb*D~DJ4{4XSM4ATakFwt^JKG%bMjsQgcZ%{# zMG9JYJhm222s$IZv3T3drjn%Q1=W8B@SFlz5OY)HqO-Jzn&FRad&q6|xF{%34xk$d zq?@LNNopTLRocdlZrfxI{U#jdMQA6Ub&gaum0S;pYJSSIr;4VhNzaVv~?1&mT<(Z5wQU-Izhr zg^J*nK4XU6i?i%)1>UZ`8>Z);#gPx!FCV>nY<=o7Z9 z7)%90RaF6UovC13+}ue8U(R%U@pUevl4^OUu6^~z*YYE5ZIMl1Kow{N>ndDxd zhGe}k(8|uk9;A%!2sgiQi=yOsdx6L)9?1=StFpZ5dm;H=quYFeH@wCr_Vh+Rvm_@t zQjU;fE^0S=)w}@pmPM`h+zObzi_Qw=Z?HjMQPOTByzNeV&Ru1Q2G&H`m?)X0_-qh- zxA{FhayHm1sGKSY)XuP@9Kdq3T#ql#{mLt1G~H^R&l@shg_??`qos{)MhkYDe z>h91UgG>B!x!-Lyb;lHPAQd%=ngkU~SHtw4EUg&uMLwly0~;`e!j)_8M-`EpmaWU< zKDt6Wsfz@Xkly6okek!F z;4VF0I`IQ#G@ihZ9-E6L#WBRXB>2n!GXGmCN+;#1pP(^6j#7>o+=aM2r{ zf^6BzsI*6#SdvjWle5WZOGt2$O+0Zfk=mw{ykElF6vByoWeM-TpikG?&p)AG{M^DC z(JP6%K|-{Ul1G?#@9C3(r_lg{_M33?qK0@^a&Ej?O?p4!!D>j4y)(lOMvi!c#qsIS zN4oQFarh^7k_>VsOZNrE#(6qhouM<#sTh`MWL&^tx8Dlec`=JO{7$Z~0mm?$$A&_M zl68EF_zrvIKyG9^Sya7R^mK|MDZ3Uuz(+}+NcuPaoD@lo(xS!LXPf2O5sa9Ei94is zd;&ZZ-jR|fO4#U-gxQL>%NIpqHc_}sm$?u|B6*k^3`Q!7=4wvB&`6I(MpmvfZOyZ) z7yD%?az>{zp;RITyviz^!^V^F*;=woP?n!$Nchy2bHAD-tnCRg) z)4&%Xwd6k-#hf?=gBfGk~CL%mdFoEah|cR>gvwM=597WqnfS6E?Fme1s8fNnw#{4E@rU{%=y267#A3YOxGWJ5I$}F5MD2QoM9G9Tq?BGWt&MBGSBG zOEQz9Fa+n|Pa%x)qBcD};bk=b%$a2~HO90HU;%?;J5`VjtPf#Zdy;zT;slS8Lf-22 z{^)D-w|#BaS#1&;Ri~o&=rBr{M^K|AUe$9!< zeyK@{tUSTu)vj#PV;Aa^Cx52hkSyd#L^un-5&Ig48TbI!OJ|IKfir!0`E#>mzb zDv@{w#iN)H@P4X@*oJm-mw%8c^-1)*C{{4#PIjlBt2S?jL2E` zkUQq+%Ww(zXENT3j!X)KdZX=LB$W55Sy=l5j$`F)V-vlf!DO@F(eF8$rF` ztVaAuH&r7{zf~Qpnd4PbHwsvZ^&kAQprG>ETQ(~`oU9a_b2oRdNEWfV^JqW#ZQ&Wq z@s_IDQDYR;7#|1H>!(*unF#+;zJqJsHdm1zR!-n5wQ}m~)j0g{7r3e#bN9}Q*(V2V z>m}%%jcHzu`^(UC_^awZWXsqHaAiLGL%{f#e4ISRm?JnjC^NXXMDsTsI%i%$CFI2# zi5_ftG1fs@{3vB0c#0P9IGVI z7BACxWY0;rhNn!11&+_4tZq1dF+0P= zM9Y>?QiFp9V0k{*38Y=rAhG_bjd^FDGv%yhgLUntCJtC{Sz01}eU1T%BdU8t=*`B# z;X@aOPSJ%^b?*q4qApR>A@%T(O{?>@!^v|h)8RvBEi0xWj+Xj;3y#%G^ANYoUsJLa zqKv-QML8{GN)vqL8| z`pOny`a5;X*`WdtxwEbgp2X**&-0lF{XmP>3WrqwDrg{{ndiZBT9!R?%@tTe&|zn72*=pcZwBs%^vO4q>l3R%BQpfm zo;)%%31dinw%t5qS9a6s*dkb{vM&@UE;MzG9-E09N0W=+k`(g!x!L34(|75K9y->s z3@)AB@62z)1Y|nY00%3i&JmwiBzoYY4(#eWc4+B4za^k!ly7ByMi4lvMBwnqmcVYE zTr81E8M@rxZv{=Zq)KQzgxi;BZ%$w^68=}H{0|5EyY%;)g_GMyP`Pg0EkcJe#~v$v zK*bsJps&;!E4}mBQp7LWYV}z0?dp+DV%LpKV!5WG;7MY`#DM9j<}tR+m}52SdY*mz?oscV-)m7hin|>xw-6!EYIRXjmJXtCi>_ z+R#9WR^oAKL%lBUE4Z)V-ow3z`#Idt;hyAg-i7dN6fMzh8z}8iv9K!}bI^T_soVv5 z2Vu>9b_^i%`#Lnn>QKLt#f$$f9dV4Lda(NcpN`-kw$kcEj&$M*>BOGRy-<0yT%b}s zw;G3-zDV&A6iuUuz5j$+{9v?jm;sgTwf{`S9Al&so@u?aLsV(T5#ty?M~|^DYw+E| zHzN~%17im3-4hzt>i8+w^bU{yD`0k0rI8~?L&IAg%X*8y_yzd0H+53v$d@6Ua$&(+ z9pA}3HRctu@-3+v3tq2P46McooW#=(T5w%rKi#~fArqYfsSTFBsw2y5Nkynp=luM4s_)lfZ*2)+f?UNgF#Tp~w z&<8WH7`V`c@4<3TYzso_U&_KPE9BI0f%L@jte+2voLavmUkb3@<9THS?D$y&gy-cO z!V7NzOq9raw zSrkppXWtbv?bN$t<`aM zZ0^cYG(If-LG?VcGY{{>@SqZJqtAIDRot1E7c2=6a&bH8K*I`wQmSBs`o)b#m@XU{ zNul4Cx>(Tg(vc($d)yoMxFX#nmpN&NOpc^wle-}_Luk!0jiA^A#JiWWfyC9!uq~~+ zRr>f?nM|D(*LAxK0Z7GlF&ZcPcP8P4r|}@-Ox=2Bnm8g;TybC--W5$WVZV}kOwl&4 z+hbQL2UoKg)=Xrm<_WD*N7z9viai3z`OQr3dF*3hA*>8#`F}<%0=71xS^-;AAJrPz zl5Tj|guFx}j>E-wx4BMw-Yw306U+zbnnhg2YnbtTV}tNIg7XVy@yYfqDa0J+e{YmQ zsGvXTa6d|eBS&vB)aH+Z{fgS`2UeEBnwF&!yJt*=c*{*^SfbwYLa|QAKOj)Kp|BNy zEonSzs^Zff63!g+OW+}~*6l=SRhScGof(dUzPucIrE7l2H8c5I%+XGXI{s5=1#xQO zsl`!1A3EWg+%<3tY4aR7lnstQ3dTCqek20LSZeGkDPed|ot~e`iHvh(baw_1dj!(FNFC%>z>#R(PctA%hzz?tO z6E@R|$Wh1A599Za$b(~Yw`%u@&P7{AEX<8Rvq%`OQ!Hhiz$HMYHdDA?70w>fyKVm0 z(VledcDo*XR_KgxGHxT@FE;Nfvvu)H#KR_wwI{C%1!+rKkPO)2G1A#?iJ%2s(|00?Tpnb9@ zka*W#!;vGTR6TLVp3kKDxc)6E*%bBA?iUCr3Uh4i4d%_7Foq{|~QP zLqGrLa>3BgzgsRC`uR6=QC-gJR1<{Oq-ZTWSI+GCl=0dspVqx7mP-<&Jehz`1cQ#^ zGsDh>PfnHa_Dkzzba=5rLHWN}&#I8-a~x4tN05o#@oK(@pu52Ia(l{@R-+hLl|4C-w=)iNK0+%-M z0Yw2f=gq+06hCi<9@&t`?Kea3Nf2z6UjCWoKUg319Oo-4qsu5mMjqo{7X}qvIJM8wEshOvVUF)EtCA?h9nC(@b|lHWefpxSNz$ zbSQ((zg5fkx|v1{lz)2zIaRizS5>KsyE_r}L)}ol936a76(fU}TYLy>rsyG*SMWdv zEJNqhr9)&O^-auRHQ~|XJ{nOm^b@9V%Z&Eo-+=ySoa{)>E1B-+D&fRTilv1 zJ(ot)uOfkpK8YN@Z<0LF{bukL31r1`-GZoldv}hc!B^>rpsJ)F`V!zXeXqf!lt7%& zr?iIlWL1gB2x=LaX5-lekR%>DO^<)KJCl5fHX*4`S#9p=YZKvL0R&t{?(4r749IPB z2w`u3O6^l)#=D{Mnf%HZ-@)Fndo!A!p&trbp@8lc{(vdAD%n1jOD)O0N-#?~Wg8*4 z*9d++{vkV@G_PKYE2akxV=pTiwESV$rqP9?hTi`$V_M{@C=TrlHf zQgTti#U?KF$RCu^S{RjJp_Q#^7QVj^$o)yWQ5v7jtVn`4z48Qti>r;pDO=9d9Y4SD`Y$eV+_@k?#yTpF^P-2N0>^9v=oR7TQ;%RFA~_g~gs7%=>3 zuq+e4Z~+y8$PGjzq@AH}o6oF;!Sj^xRG1qcy3EHZYW0+WYO2m8_QHv41(5CbfXxqR zi^r*3&a}g?fLA7p^U=9_WT9xgn@Y%eXq3KG#c(7W-5L+=^yWxJ<7rFfTRoKi54O7f zP*NH3h5fM-hF&YZJH;GMSD>sYQEBpN93RuW$VyGLIB}cANl@x|SW0)OA{lav8uE)` z{CJec0x>@UMb6M)%#CXpsAa4tiCpT}V62YDNgV}f$&^OvAn7zo7)z^2jUZD&XnVc* zpj$F$@i>YH*fYlLxqzuP4#Ce>jPb9Dc;)sZIYow1^w zUV^$oo8t9WbPT*T2i}Sh)LS|3t@5sxeHqI^7ucgup3@;Y3MA{LG>3R}tEnv0bBM*v z7B#s7l9vkxJm#XcG9$-F6JXl^-a1FY0q@*+DKJS2!d%? z9p4x{F@g?vsQEGArc_!mzpLb6!x~F(jV=9Z_?+?~LmD-o>sS7ix{hRrJySl0h1npe z7p-AZ*gZ39)i0sw}fh{|l)Nq*HBt&H|N72{nQi_Cs zfC0zbu#(%T3BBaillkI89J)jvC{g?j+5J|`r%#+cMy>Q+>{-;Su#8T`3rl5Yh59EM zs-kf6<~jxC&1O*b!7@0>d!uNdLnl=GLo8v$YP~JnI{kpiQ&)@r0*H9Yz}(@>4fMxO zI|Z;2z37>}&*EqHK08y^eSZv{D=S4Xv?zn2Qib3OK~Xk03q>g^~ZJ z9VJx#`0sr}RmRw-_GR@w$vns!LZsUm#CvX}?tY!j+eUM0vSjo$HkoIM4qeo17c8uS_m0iw zd`I}VL-;)5d$=3F0(1LxIW9LoFL!yKvDasWZuJxTi)c{bGnN!}{f176Rte=h8R>C# zyuNHAr2l#h*O7Oe>E?9lsuhR;we6zfVDrlf7_S6YcYw?M({zqmjL(9N+9}!iI7)VD zzgs+6r{*9Y!9kWRy8vT`K6;}*zD+~lmj8*?V3cdTQj;;Pbm>8c zDI<8CS~5Bha8kw{65+##QiA`I@hZu^MIknkQEs<@VEzzxLa#-_)}q((G8!_5f1_-)F7pH$7RgGw;2f;?&5A&E#QqFaMH0YmF8T*1y47|pR4;o@5K|d6d!gDQP*qt}>i!p4i5*D> z#5#7FGtgqNwM>%wRg&Rg9L5_-4uOskzfxlxbZrr36XgMsB|pGsq|_D*_4w?L6_aH; zA-a)gkv>^_og94_zof5xG3BDWsv+<3R`ZSP1yrmBL(Y6)EyQmq$(k`2v?wmd$Ur&u zP`~z{G{@6U>WSlwATp4;S_!V*vRvnwt;6|Vw5$n`Nx?kY#OGu)MWXxT&~pl~ z&b&s!-zng(LfDk2q`rKg>nE&omsts!V42^T2@DzFQ<@128G%$Sf~}(4LU*nGLHZOJ zL00dFAh_uGZ+J%LYPO4#Myup(J7f{l^ptq`qqt3TKn~0D`Kh8eA{3zk|X1a6?=H83jeFxD-7`JmfH5 z<9>-LaXWh4*g;K2*1S}@VHgseVNSQM=g9R1ave7oa!unS ztp*;o?g}%F%iU`xIy|Xa0d?o@6YCED5%sBdxiyR@xHaGVo4S5VuJ>Bkf0yem*0p3W zF`Lx2f`rKR!1rq6g^u0JFhVR?$X*65yo2@U`0kn6z0Bn^KJY6wQjNi$P?KX`IF!Zs zPeC7RyE!~rGFy(mbi`-RHl;>SA^n3w=vR7L6k$84J*{|wr|6l zS+eXxIXi5?hIK53UHNJ+g{=^F;kG{Nnt9Xw?0*DcUq@YaoKzr{uo739Jsi8fU8##0 zkfNz-^OC*mn+ycnI;z@;hZ%*BZBx#JMwt=4of)$(1TriNLtQ?}p)00(xgxd4t{n806+@E@%f0qtTkK19M zdw%)+TyDyncXn6THU*3}IVt@Tqv+f~`JrjVeroYqFE5H58oA8ADAMfmYO4m3M33MG zRggfEkxaw501jRRZ{}Epv&2SiRYF^}sk|*X0{7m0KWA8{?4m^VyLaE&2>Y8N;{>iH zP2_WgPiOU&h?_2!LtGEVO?RTouVL}S!BfpMKzafuM&hYH^*y>;2m8WqTKrNIP_!o$ z9~a5!KHyFJ+t@R?A%+(nKR3jgH&_`92IPh)GxrS<7~_&v%?wK3AjIH(e^nTfE}eH9 z`-aU-a^F8~#KU}Ifa>O$oDs$5s@^wJKeTd1{Po7ZToJ#!-V%3lNcxX+MF>4eonT(l z`yo>+Rtj-eb6<{#W8A{9kpfee^8HxGEMMLZz4jnX^ANg(tCHV%8+WYy$ou5bct0QS z7`$WmLIi7U?Xx7skm0MC2rs)MU3wOvA;8hkK79gfHg>tQ#{Ib#xgKieYdi-Ge4#dv z%#d@NW*ftM8mlKw?M&E%r!@K|T@-%%NCWp?p+xN5bK4vI?Y@Sa-cI?=5zr-VrM5PQ zZZ4`Ht_M#KxWCjQpHMMdy`~8U%)ATR7A7<;`nj}`ZcUB0JivrGi`O)n*JPi+BF`1S zqs&{1hs3hgWYlc2;xq}=p6H+wYaFJ)MO*38n{ScD169iAYmofLHEkBNNsmpIH|KKQ zDsQpq7jt?-dCgwi_SkH@Z*r(@>2==l(ZQkfV1;(Xrxi=`e3zWC#GC6#ez;EBBERjj z%R9DxM zI;`1i5dT9SlX&sx*OFb2q$&ZMiEAZMGLc&H3bGc(+mgeA@-H!hB@?UN>+623#|e(n z-Cxv|HRj{dKV@)e5Tn{qPz+QX3e+|nExTAg9d+IWFTe6NCxzVnEJjBP)# z!Dk>{`bR*}3!a&FTo)908U#GQ3j!XbN0{+G@Kk^2>%lVsHp-T{dI?Z8Zza9ANPULm z>at$=EaVBm0ad^gKdN&JPqq*OD|k|4>kzEqY#0>;ZckidTwgM=vPt}MW7F+5?hRT* zB1ZMN_dw+uX%ddc#xponwAKPn37SoSBQ9J3=f1LT^hF4yOSfegGZKJYRxstX zL(r@&}6Y&{sYm!H0t))vJT?*kg0b8K5lfRW&NI#_BkfWc7@WPV? z1$MyL;w#^fE}aT2sXD@jmlx=_6%o9=m2uGXWF?yw=T%{T%Ph$I$^+ujAL+hLXZp zv9AQ(W9AZYS@%N@H{zt6K%$2%NM}vEn(f7+;Ij?i7vveJuBeK2Op2|kTic)`P`(EAY20-59h`_blFtB$#gU#man&-1Ol zhy8t?6@dd!*-M2K4N|_C*+FJqlx3u~ZzJ0gtESvGe$A$U;wLoLyn@zA?0l2@$cc2q zJlpz6av61MjL+G%<}DDMd!Kle4+Dv#`2qH<>ex*kvy38hTI2k4C&#C!r{pf<7{Aso zQs@Mqp4RC*x5_1{Upd1ClALGeod>l<%MiPx-ON8jrdo?CkEXce$o#w^n7?y6~x#ah1&BHUft}wMWU1}@=PyIWpjhi}>|KJUH zS@ufqH+YR#%&i15sI(@xI#sk1-9LPl002-5)WX3U?WN6hd6J}}8Hp(-blbodetj5@ zb7ym zUb^Ssfy<&Fg2exX>7vGsT(UmTBJMsk+PwG=y(l?cUCP$3PBtWswE2(U<9V?bhZF`k zMhz}AyPn{n@I?f*+|D!e2(?;sPUb~(2bZk8I!OJ0fBS)Hj_B%mICCp*0Rp+c^ggRx17a4t4hQRk4 zJmddRJrL!^A)S!pVanV&^d@>0X=U5$34JUg&!c@!_e#utO(_RFWmv2*KIOQomKBF` zTzIHF*u=b)n$NOSp2spKC*s!O!orET*RK(w+DvRymeC{9l*@2D$SQVsEO(P%_}=g2 z5Pi>MoE^28hqxDbv44VNpGu-bi*c2kcEEIa}T z^iIoVmyomF(COE1#Bg&OACTk$7@IPzw@M9|p5XYQ*kz6QnDL|p}33PW8P&| z*VPKeji0|~o<(Yn6zLQ3WzO^NE4C#PAuOWEF|FO$+57!EnM>fKKd%q94>iA0*CK9578%BT( zkJoh0Bxhb;YJ|ecn|^?QycD3$!6LtiTZN*c*-Y)gkyJ-s;d2~7R=WqofTW}AO98lL zgDV>KtTZ(GA{#G6o0V)OH}ES&g8Kb#nS z9Gnn-WiJyZZRn9|URF4<;PGCZn8f7(oRBq2_dQv3P3uzQ2_u-~ zE*>r;ID>45@cK?hfRRPPPm&nELlD0`VWm+lK=><}m^#^f{RsVOmIr-C??>xPaLfF@!Amz&KW zDNWei63LQ0&7~XPa+=1ukSwyCN+WYhNNLYrw`_FR>!UYD-ge^g)iFp17yTuXg(W%3 zX=w&IthL7bm10Scr2dlKd zq}8M1>Etr4GaM(5ed5R)bCNJV-Xr$VZ-I?xKCs#!F-(yY%yL>>e@R_#|O< zh2)Ex=u_e`3)kQPR@iUzS>ZFg5ypKIVx1E_lNZP7wTwxT5s3J;m$T4>f|J+OL7A(-4okA#!3d}zs>md*P>&IdBP#_C+zoW2#+wd`9p#%tb&ks`XV0`h5^ za5Ir$gk}*lMSQ(Vp*9puPV zE217ar7w`NiSRi` zPQ$+E92w)C`Qj$yJ0ghgmwd%nM!Lx&doS;-V9WjF`ImD-KKh>&RDi7$etVnwi;03y zO~Ie2SScxqN{P5a7n$|HVj<-uSMq{UV^1Wyx|lLp(1&FiRQc}u5uOiiP* z4~?XyfU!rKnw)7W_)me5b%24CkIR<-2GsbD_RHX&1!#NIgk60N5rZ`*=1q_-}58ys#f z_+=Id<|#CUU+r14z?xF0bu}xLcsSA7>}1WJ+Sa*mbkhW$g@p}$WpNr(rB>8h%^TuM^eufB+=yJ;iEb5q_edosLJul zS9qY@`z#Jrv{071pa5&Tw# zj|fKdnQ{f4lNLd5D@KvI#Mnbya^9V+@AV3ADcDnHE!N<(7P4n{YgkW9&KSr$tKCG8 zEHvrRK^<*kd=AMr+HgKLC7p+`^z8bn=~!VOpoi+z1I4$$CWcz<(L8A2fo^Qg7;D4a ziHg?zwkqCC-jnW!7*vMT196NbR*G{W`mCrbuc6dJGNV4Dx@@7^-CobAg_^tun$FE; zx?3bJr8Mv5|8M0SSI>w(i&*@|HJL;hXvk5E`;3}p2n0UE|6^7y@-vcj+B_XAvIKvW zv@O!=_Bj^?v^%#45}&xLV|RRl*!m;_tfxc-*zNLXl{b=3hfXpVKg=q3kxw>lhPi|Y z&IIetD?Ug6Q6Mup!qoe!Ea0*=X9OdH`^_l8YW5g4f0ILOjk!;X5FNSUExZV1)UX|^ z5~hS6ySjE1E?C78R8YT(?7J=$iDZIswfgr+V=?~$tbORdZ@N}s6?%FNg-yufFN>=u zz0m6KrUX`5Z9_A>o$GRgFq)PI&gy`+wsWj67J6FA@pGTdeh5bB8u?PXbSQ22Ycf=+ z*J=oT4@yk#0GSM)w^i-x_=jTyBb>PN=ZNn3pb*83O-)~@FzB*$=}PsO6xOd&L9acD z=BBIWHmL>Eo0@ui`1+w$J?iDkt9hB6yg#Kia|jsJnj;F7m?>iFEXC%U#bNh)k4GW%>UN_8lR#EG#!$IVkoCDPI&}eIB zA(-M5O=PGNeay=!Hl9Qm^0=XaA~mRG=3;4Fr=9LkZ}2}ZQJOWHS%rdz&2t#9(ZFFe z6JBF|@?>V2VK@38NA@{p$PK=slX*6fp(jl@PDJYxW=UBtFqzup^bMWb*`kMBbj}GQ zdA!bttDRLYg%KG9(CU9D*Z>k}QDFiVU|*jv2v71qMvLSiIa?WX%nG>kK)<0 ztjOH?GhR5ADyglKpXH^1aTy^i-rNnj6{(TF#$lv$CiErUOiq?(DtrwklEfh0MpJja z(=g)J;o%FjuCp`JwP`)?qwWme}ppOBvXI0J5&CMibx-8dx z^@ASax1qYq|19g?{cZFx@xPQ!M7IW^+RFxy(*DmyAgYRlY!dZ3(61t4lx&F$#c)cB zgYIf5>JsCi`75MSc-DpZhez7SP8lnVCImI5soLfN9up9GBcj!OgiJvN`4?t$s);Rg zlKAjt7xyIF3%np)%Q4CMkerHb+r2ToJNJgp4AlQC^bOs3m<<~3y<^X-fXTDOAZL1C-><4It}Y{nnmf`-$!*L)KInM3(=P&=~?^p1L!Ye0Mj>oZKU@2_x-{x@x>qs2oD!TTL-qrQG*S0G*Hw;l~_;VhXil)~3iNg4x8Hv@GaTQ;Z7yGA+ z3-@bU{k1gdH`a4Jmf?#>Cr9H_L#v-9#kOW2`3c_h#jncqVd|8JN43@eBe8+_Wd4!`@0;C#Qa!O!`|@hMKP`_R&v zK6i6n!3^Vy`e@4LM;eHG(v;+@f;{fWzhZ3L{ej=M-ZvhviOt^K?|2J$;j`e3UGZWR zm3Po#%nhghZUGe>MceIX#c4*uYum&~>#4Lc^eLV6!qNCNe+NJglL)=?Bfs&5FLqP7 zwf+hKB&?;+0Pa@2oiFyHxZ&_4!1cxcDqv3r`NPImMOf%nxj-;JjWlT%2z>?{(Chy4 zBVLr}3XJ6Hf6-ST^%*H|*Q*MWxSE!CPa{*U1;};%07+u@_ks?fnaZ0)YPL-lB%h#D z0?9`Oh65pa@K{LJ{2!3)gWvd9>ErGXe1*G^umPfc&DJb1^}3rac>Z@EB#CTJCwc*S zkbZt0AY=a&Kq@2kiX(Z#@kGz0;Qv5cWyts{(jH{US)^46DM;H7AB}D99hf zH-n4>`JXH#YKnUY;*iml_~4X8dtT)Z!HTUhkj?AfYK^qT+X+jpR*HXgCkWT|rq9+{ z{+ZDuc#`{|^WyJ{ZgN=Nu0{F!>+Jg!8H6Egmo4 z*cSB4k5uk5x)L8dj5o6Yo8AJz4gjz_0oe8|z=q!Xr%eMeB>!j1PV8 zcAqxW6p;G7aX%g;_uW0|t~~6X&)r?gFFt(TxOZ6d8@FRaQHT($mql+zo6%jyi{G&E zlXyRmoZ@RLcu9}{%yo*37PAW3i(KAx!cQW{ zJunQx^CGIvy1G$Dy+yL3ilAjc=fwr4q3_d^nv&#?g3?(X33H9GL0|tWef^DKXANgI zGBbYTh%fdVX%QR_dR7m>-zKp)S-5-kJ4okvw>1$M_^kv}_$oVfW(t3SV_fD_;=_EH zxfZ}g2gzt<*rHuf!`}V>W!OnOY=qzaR%SW*jRV#3zpB0N!6v#TgNQa&Yrdpk^S{e~ zsVI+i&9@U!u+50)O%=1z0Xhj@MMv?@bR+mMa!fP!i*bGq(yTuOOs0){?%~g+7BSD6 z7m{yNUb)|oK1N2hjysk?*IVAmp}OGrWMW1mUV248{D*pZHwT)p+1g@p`J7z)jf64$ zZe|e)Ui%waVRuY3qN=J~Qh^xGX|ab?3GkEGL{Rf`5Kn<5`K(I)92>zU@+k8shkIx&gAcOTdVGlHzQ55 zNs!f&46D!f-iEl%j5+yzuJI}8+Sm0qT((b9u{+a8GgPdq9~FB9bUh9g)BnFyv6o&{ zRO}=^^Z$y9{q#-b8^!e~x*(d{UK&&RZ+b)OH<_E`*9h>+b!PbZ9{o z=Uau6Mpx{Puwdkc846VsB@ccdd3yPcK6HHc1<>)E(Oz`yQUp6B>~-{1NQ$COpUHBP zIF=9OLP)YjoBq!cB~Pabue%3@PtN;-x#PWCTSM+F+-@PqEj{?2)h|PXfmL73k z*h`Ou8ucSZkSE&?sW5;ZsgDXhLcOoZ(Y(|{edOp$0UO`^U&&F6VG*JJ6A}EN9aJ(PPe$D!TEe2ro%lpQ~EaOe-%k@@YEFx(5 z9*z>sA7+78$L%_6udg3!U4B!o%i?Sw(*AI2Jo_^QPI#N@xMFGK>uW8hpeAZ|EJD2y ze^>}0_#ZaSD_Bn5gSC25;ig+RBXF zBss0Po|OAI9aQu<(?`WnnE|?)DuElbr?;n^b{uT3&gBFbrgaH3TphdBUZ1{o@CtM# z>ARNY*|zIOz33v)!iYCatFBG!)@?mx8_=RA!|=W&UM%=T_z*(<1Sm&$9XmLI_4nIy zHvP&CxGhdD);sT;Li=Ri{{wi3Zx{&gTQ3*2;U3s9U-@pYI@?Y$&EBr|#0R#lvOg~o|gkfNV5PaiEGiz~$y{**sGo7)xZM6uQDR(SPQDjQ}se7{Q>DKM^m zmwjyuNHU<%f4stq;}woRUSYlzW_%jR__M^Nb4*}^o=vj5$vpjjrU}fds;+G_E*sw2 z45RXt8ZKoxMt!CmUZ*h`^&f}e>Lha!0%Pc|^hQGCu`-^nSTRhEuyM)-q5V~8QHQGL z?h=m$vXWJh3h#%apMm_`atcACFj4aeb;S@K$XLcR2c3%hK=FbjB-!@j?6^jZuN#%K zV{sus6fNr?Rc|{Yf#D_O-x%ptBCfIvQPsSTuM3TPs7bVa9-%wR!-%5*P@ge?tQ(m` z0Fi}clR5FHf|ndz*x~JL%14#DYPk?$SvDOJ>o{L41-hK*TeJr9krPb>i_HgAwNtrG z?csIGMn!5lT1~3ixNGJJRlaAF^M8A!r98Rn%G9wk5}#>KO2PXO@T;wXeaJD#TeqP? za2JP2*v1g<9-B>zhVDj2H7nR&gdM#GtoLXuTV9xOCn-yS@2f+S5ASN{xJyI=j)%EXJpkS=lAyl@|m|0u(@% z(F}vHj6rhKnA69S|9GqjM#?)!%1t+A=y|P@EnC)(wK;Q=qbTgnUA)gMWL_fe&6OKF zTgC>@YTWHZ+6cc>0%z0K+2X{_VxzsY#V)_j&Xzp+E%8S8%CD=iO?4x=cbv3n{UiQZ zyQf)onDv@t4LgAN~Ul2v%|Q;a>T%)MT@ktQC<>i@m9e2yxM(W*#vE@ zPf?F_X~9f}B{tG+-t=pvq0ugVQ@4GgySr{_C;hlkI#R}{%rd8u+eRDf$?0v611hzZ z!)*;kHWc%5Pi{ccG<=|!AH@f4*@M*xE_6dV5vnyHxp2kHPLifdIDr-WEe9TZWIhbX zlrM5EWqY(t)Qk*CMq|7!wuMn*Lnt+Wcbg!S@_M>%AG)9&%%3o|?~C=|Z9Q^0PrF+< zY(4f^S(UUJd#BdrU&>tS_l2?%@*Dq2x?20&(Q2FIb&(_A$-}iy?;_*w zl3WfWaV|T9ysZEN9|`=~&D%ix0QnZRhO_w!e)%7|E-_yCQ2bd^34Q0sViMH;_C>(< zdAjtkei;?Xnzty(-g&x$=WEsO_k*X@7+b2#w~;o>tF0^=>TR$OZGdWj%K{-*UZOXC z#Ou~q`(Ee1#(hA&UQ@pPe|`NN>-Frs-g!o55bmzv*lJ@NuRrkh@Bb@cq!&G)yFa^S zyl#7g%t3XdRi9q>sUblNtUkR%m1U<;CE$K**@>#ks;^WjKZ-Z(E!NXtW}lJ}1#G*E z297NCD8TFyMB^BZ&DG`GK`|<=4h1y6VP*dh#i&uV)YZRFF?~ zEj>kH=a-q@6dqeeMXs~AZx$qQCzhYaVyP>+B*rw)idoZ4ZfgdsMdaA#YUABxoA__K z->NH_6`Kz-^wr{3EwV$^N+Da8fr2zmQ)x?R_Zd z*tBJVh%aR(7D;(VBMns>uY>oYGi8DBXBYk@VYq>;17>zKqRx~dnbhejedR}~as3O6R6HXA zI%Ii0z`=nbo3DWb1owyTRSgW8(Qw7cv@d@7oMatS#rMpAg)&AzHF=88&SUvc{WP=u zQBaCFNfb}F3x!_YvJF1F3*Hi&UAJp_M`K=UthSQm$RF6Wm7JVcKy=1%m-cjm#O4iL zc^grbgx*MvWo;#t4T%fvXV~yf+wOOwSJ+*lv6uz@jZV=E?-O4PyygVlKbQcxBkSh1 z5OJAGnzi3h#23yeDfCnA-2!`$+O#=yVq<8yIfT(@`kW)}%4=LNC#_PhUcQfN$4i}o zxXFahp{FWQoZ63C31h6>$d>$20$!$fpOQX~G=C86?PEE8>~%C1M@7Prig%sMF3LOP z-(TfXW9}WRt8c8N7~fFo8wpWg`U=#j~uEbf{o;I?a|j!Sd&lpfSCVh4!RN1FEyZeHz}2 z9-yJ(aSg{0;PxcvO#h%PG%c3F<${Q$cmaArgZ~ zl*^AOT?AeZ&jue#HpIyKyrk$w0`3p%PNCtNoX{}B7Uk4i0u|SDKzK`DYWbqr2`M&sj)A69m+Y+&v~Wno^INJnXlcxvWJG`8Ap2MgkxmvSR!{gbABmFLrG_l2<%4N%P6ID#*#=q_wK9RK_ zB?S*X953WhdL|XG{1f|z@o3Hr4xj?#RWRo7<;B^dyxbwni__{hV^L0MAabm?MJLbc z#^Q;ls=5;}qat!^!7>foSyguLb@8bC2%^0%-t|XYmJfJ}7Z(1cR`F-p84RDAd9WL)k!f7S>ENU&NqepIC0>Kk*d z?dmonH6l0wQ}NrPY=#XwCAKeyAg;=3!P3z<8_0JK~|)gf~c+@dY323OvwrvYf>MwJza4J5~yg&Q3>LToyII z1K}QxW!+w2Q$@&bgtZ&~*U!8RrA?L)gb{(VHU?E7w}be;m{JXJpQ`BV7-2dxuwq$!}BpJY9h}`PwQM$}mm>c^P^{niLJ#we&~g+7Q!@Qt>fnrDBcDMDC zVUMwgZM(W3uh|cy`oTfikzXQ0{=j;PKWGjAHJsfu9HVW=ZSRUZ+uMNX;;Yp6zt#3f z2C0u@K5%Z1xOK;E9j)-7(KLEMINA37LA@fR1=8g(hGHUCv%Ye{NU;}v!fXIm9lCyA zd_5Zb)neu2gp$ByS++VlU`*JU{T2(2+~3- z*F<*1$?lpZ*j_I!H{pZ4kVlTGu?Dc^v1IvHvfNo(#@Q&2md7Fvwk|(Y_tt0SLx>vn zql~DdZ4nPzVoo|1ShA_lj}scPUcAXS;ttVV--Sk$lHJ)lQ%I>BP!5jN#rr*$ebGP; z*81L!p*K{Uo=v_Tu`LE2wh>5QKIJ}aK1%$)x<`;7)%;jT2RA!9tNnI(|&t)VYQwm!GqS0!X!9IO~>IlXu zj^W#qNC{*U-f`Aq8F+DH-8^cns8@+%whZ3|#EVKYI>gn&L1WCCPR1ClT$>fO#^}6* zdS($gBnKO@uXMAFCh)f28U=ahG<*WI15UqnO%H8-ydb~s+{(UY zj2F^-SQpzFOsnv_;%jhLP6Ju>9>s3Y;cSRiPHJpZynE5sQY@jz;Rez4nY7R?J)AKj zRui^^mf%I9EeXSRH_Yzg@DQ(K;b?T7g6~{C&uMh=i4|uH;O&Y(H6tE<(Lhkkm^Ba5 zcBwa;nyxolx`u^(WsNAqz*GrU@#v#mxu{7?mLV8wDm(<(!l&)R)rA2Sy0(P5w%P@=cY zv)F1S&&I-A&mruYKqdMWJ4*I!UtD{ic_iBu_({fPGP_7OJcv46+S#F zeb_`kv=_(6d}mtKM(p>Z_rp!eR43(|Io4~~-{g1`lYDQ*SiJolZ;rPfZ`hxpB4Yv{ zS{GliZM{hCXoGmK^RjJ5aM;nX0Tv)VB&H!AgAMV{b{hL;O(^o1(0+^_*Vt62qqc}v zF505eUdY&4b+-BNMz+Uwt6)(a5QIj&1by^k8zxRLW{dYfEF$)a*=Kv~6Ds~qmKdzl z7QQe4wwRu{Nw7^(-JL|=*s8!M$zbTj%J{5|Mb)Cw6dvxyt0&E@^1Ez&rL7VvR2b}L z^|YP9o!m5FJA_;KSsZN3gs*r<-nnEw{1(dCUZ*Vs&;-X6QAIpt%iKe@@j5#S(^+VH zAHwKMlWldgck#lz<4wM&U}2R@9hNfCd#PNfj+p{mKO1VWi)|D^ILgXeahxFAdk79qTF_`0t2c1O=x|qYaI!qtzlC4H$cYp1X)HSL zXp?P=;TZk(w&L+dUvt1DmXH)e+7nX`Hi`|}{8P52ZIIop8&X3owMHeHfts`pcIaA; zZ3$R5u9lJ;!?C134E;emWxU6M$|nzJV$|7J+S}xgZRpjTl%hySAU#V#3$-M~$fuPRX{rqR~We8nuBh zac=Q&Ek^t0IA5C2ay;A$L$}}wgC*B>_?zYva2&r{?D+Y7M4HLxfr>Prt37hy4yLv= zpBaI}#r@F0K|nlhrJI^dKIbo``ON+~&1Yzp&%+oQfc=xcvtj3=&piL{q?G7^G zkMq7?%3&t#RFmuxDI@#efPV^q0xzNRgL`k3_zU7!hro5Ncrf@ryj29&X*X>8Z<998 z!{r|QzQhlq<{-&YG~+7ecjDE25FGfH2?z7swhD}^fr?P$9t5xRe_N=c3)};Qc>`3q z01x-${s`{rcLu*7Vdig^Y6lhxw9AgNJ=oFtddV=phx$-ZcgIh7v4CI5{F6PT`+1e{ zs}^RJ_#I^b5wSUk@H+(=MQRs*kT*vPIdlPD!CPONVTad0Qb~v*?@^o(r@Svmr1|_A zxDX1U)cjs|0qs~?iS;&E_1?RlT3)v%$ZS92O{3oAkUrkkQu;kf50Z3X^L&~q#O+y# zQF%h#3h3sL$m6L%} z=>E#kz&n9HE5lHltB(BoGfYsn&!Y6gj_>_s=juFv7sL#bJBoq$@_>|jX9*up_OKG3 z&b#DPb^43_6jpWBiIe_2r5pdngpVjBipL?oH@Pi zAUyE?={4!NuW++}V{;kay@|_kReju-d(Q0N=GGwW#_g`UV$bIi1nk==%;&jj6heJm zP1V(V4#3=BW5xUg&bd%^DQ-W)JhJCZ-JAZOiva814E#~JnscP;dEmcckj` zIX_mNjQhUojVE#aJm1-bNAix2sH!{ZyZu#=D*?N!j{F&TiUfb6FdFfM66M1>1Tpa*2|Fl{ zIZ#8KL+{|PtiJa7SF#--ZAX&r!EMR+=JZ0byz&Z)Wq;h%(hZf*ws0VtI)u@YTwQL1 zQte6;yAE#od1;Gsp;v6%JizdZ%a!9S!&iU0CRSH)+Q}z!x177K#@sc{Wmmhd{F=b| za;2WoiKeu%<=2J*K6%!y&-RNQ>n5S(;d$({8J$9UoMCc&_c+TPt9N5^92@Gy-1u&u z6W=Z8$ir6F(44sQ<=y1*ey7X3g~xRri+72!aXA+t`+w>z7Od4RzOdpfX60RME1fAt ztFf$nbw$`m1yG=PA5KS&>|N;-xhw2r4dTd$4wBC9*lu^)Bab436R_RMyqe6N!?shu zD)ONN#GKFxN1cm&=#Y#b#&^)~Nw*~9gt*x^`72P(*^mm-PX1E(?5>%sqS;h z^H2y@)6u*5>Rmgaj#m7gvG-o2*hyLeaCsNL@)_p&jl6fYxch9c_mISy1jpq)4*Cf5 z{F?3&)sA@}r-&5q5+8WB^u-n=OP8>aJr*yqm)+Vi%=0@8wQjF(Ps-GLljRksNjXFi zU3|-}0-Y`G1!6=DwlFMMi2a|=G9Y7cXxMj7nq}n zb|;K~f`7xC)-2Y^Jdvp^Q?}kiTGs6!y?5%AsF7V%uS#eU?6VKym9J+Rkz}>%9+0?XRfa}OIcG`Z$!N6 zMXq=jUNu^8fiHgbUa-x%@@rSw)#pAg-fo&lm*#PQ2gMwh!}Fr>CwHIC-TM~1_C=L& zucRS4pUtQPm7+Fmt3ao&m)$JQXNcQ=Y}$LdCh`%A-qs z#9AktE84cgvwzgj7T-WHuDpVCfPJ=~X_x0=tAnqFXRp?e#pwY~md<4Ck>?|p_SrrY zvg`GF$egh?7c$Shj^daBk8MjuXyOBnEj$9 zU1-kKe*KxWdvum*P5OQ;V`+dZp8;m1i`%_Nc`iHh*W!!O#TP`9Z7b-BHUbk2Xi@2y z2inz*ZnKfnfD)QUN@z4pboNa)EWM@kZYivG!PatY zpO2?wAWh^^0F5&laY}0rKCnfJpFpO18!bMy9e$P;Y*|L&438i&R)xW55hf0W0^Xfd zJaax-4-%mV;4eCjw%^fFs_%|>$#PfZC&sdjA||#gpwhLeIObQHIvT0H&*B|ShqoPCLhH7=BR(y^#^i*hmp-qq za>e+RP7?<`_NhjCxnc;_E2P>wc=&!FC#(fHqc?fh(739eBB#g0Z6e(FZ8Nq_q)!C4 z<++7`0)heJy-J7g&(k#J8n@KigR0}ue^nfwj;)*_MIW)dF#PCFJZ36ZO?9Osj#kCGOYp)HL>+zNBvQBYamWiz zu1+v=W+Tj?laVuwoY)8}Q_08`My_o1m^5;Skvkiqtsq-E6dC+n@Fv+7UugQHW_Xx; zVXf}=Fa)mz?RM3=u)zHWfd|&Jv%vKRfu~Can>)jtJ_iiHuvC%_onUDD&Y9Af&ao6h z6-IgK%J85htGIVBbEkV8OJ(wMy}VmzC!*t_Bu>RH+vr)3H*bppU;fbJQPK}+1Y)hi zE-Pvmyl{7^?=Noj*CltZ$1wsB=rM~5G z`B}Ir4%3JAsX%9DRhV#$^Q_1ojuvxpj&r=mC$P2g!XHy{XROwZwVg+~!jhvkG5DGl zjovr;ru3lXjL}^VbH}MIXgi0u#jU%%ZHHS|dFz2&XL;+1TPJzzRqRw)>tYF_3e}VT z;2b5K^JiM&Ny%H^ll;SX-?tBHkMD@%zCGQ0Bh^;)X?hvsNR%LLi^F19wV{*@i^WhJ zwa{32U_m2@2Qr?Gd-UQvxEOz>qknwYgk47%i~VeOO{L){s(SUFwirRE)`};e8Y{BJ z&~Wzg!n5OScheo33)zho>rXImg!WM^#F7hSY`2l62DBi-)L&b%e|bSu6MAh|JrASB z3n~b``zy2q7XQn;j26Ak36|@->~%AdA)3{o!qYo#KVdoq$_L}z46swg#Na7nV_!eq zJdU*)awz9niQx>=tZowwsBH+aJxL-QhDHzaCjW=fv^Dwf#9!HG2#6^TLnH#}|B z%amg|WLLDok;Q(95w>gN1l|2%mo?Yu;v+bT3?Dd;Nse{><9M{o5mRz?be|(p$(0j} zJE81^<6JourEvGl5l${X7Ei3+b#lSSS)yI4qlY7y{d4PZnt)oy>d+qw@s9e`NxO(; z61#Tk(*D?m=bhF0A`a`>udC~bgn>SeS9EgNSX!9wvMajyD9&>=cEZ7~aaeg);fJpW zV~?Tbw&GZ?=#Zni9#F{TKr~kFx5s8SSO|y=`84;;aPe6*yO*Nx!C8pC&7s}*W9t{5 zb(kfgY4zUpEk{}zd)S5zF?5C|cFP<4?y~j#qXwtIh=cS|;DRXiMSq|?<}SQjjdrr) zu*jEupx1o;!z1oV0%4Y*;{>dBPi#mYBlcS5P+bZOdw_Vc+cAPwZYDb50uK)(?xSI}&#gC1DAav!-EjwxVAhZC#6!)rumT=>-$pL? zxjG?gTC;hv_oDsi`mBm})hk0ZO5PdD5Du?xg5tDB00}40*+-d`-8Fu8p(JuN17tKu z;US1R;%X7ko(SGXXC{#L0nok;$1{NA`84TQ?Di|cDz^k=!9KSM_$%XP#GQ=W zM7~q%QryPF3_Y&@;SFr|=S*!`n-SW(vGHJOi9H?JI0@UixoD z4<(LJ~KXE(-_wdSa{lmm6z2pv;GoOTphKm&c)i3 z#*}@e+)K)>7cl%)d22=C@utcWSaPNjm9lLTN2ShXT|Z4 zVSaS$XB~nWKYdiwe(PsZSaQ#SSe{qzvFK-)JBfdRxNUtQQTwmh%fsY@FWT(Kvss2t zZKNMk4$T`@F`B{(Ph%VL5mVur26~al?2*sx{b8S<4a*sHX=?seowVd%oWPMWjN8jPP|>GJLvY@~(PQScY16wE%l>$JNk#+S3P zw|4(UA9FRfX;M%X2r4bi$AYkqL2N#OA<>*lWr9=Hj)e8uZynMV4aI_d_tMu8`RNbcr?wajmV^!fEKODic0|&b957`}sjR;`{ zqctqtv<$)O*|5vIe5|LTJJhUzr(=?xjCtOee~iKKxTKct_=JhB{tONks(+`skT~2m zx9?504#v2ZOD&N4dT|`&OzN8$Z66HBXNcKbonz8UsoZ4WE^Q~x{r zvy}Z_H?=SHS>yKAAX)Rz#0I(|k`%YIbzX<< zswXfPYKp z4Yy4u(bsTHex#f9f#51JT-}!VJSDN-l#Znia72zwQ3dFf>aiXR9Ae1 z|9D!7BD5wKea_}IE_Nz*x4l1veC3o?aS1Iv~H<2d1hzQ@twUCHCjY`=22B8=R zlCIj_D4_RlDQLg~XGi5?(rs1mwUQ*F?;)Lha)Xm?7<6L4*54qYLag*U@S0;N+fW_Z z$-Or?DfpxS5`3phem{5ygnvsUG;dOkMRq@pD3sz=C$w-`gl0h*eTe)qCA*^qrt{n| z1Gp9&6~zWRhr@i?9YICRs`cUt^!|$uE24l)Fl!sh<5>%c`aKS zwjuhjK_(i#K;dlK>vmT?+(#FCp9RL?;Vy@xyuSdo?HqQ!iH@yAz4fjngUgAO6>EAt zfEN?fsveKS?6O-4{yO1<3WW zG>5>xB7;>TFtlBcog4V{?5}9QoBZ#h_n`lG{X+`uX~ZN3t`8W$U{uaV{2}GBjOmO8 zjO!RTFqShOV7!g-H%1TkzdPed##qKQ#-)t^V$`vFXU1B_hRagFN3Tg-%6Q8a$;U8G zV4T62$+(oUgmFFN4#uO5=NX;X`&hcQlOOlN$6aV_I!#yyP38GmGKWYk?{{~3cA zjf~NZcQK|j<}yCa_#9&y;||6Hj9)R3{=Yn1!?*4@`C{r^Fp@KfvVmH)Ljk*oAc__=lW6-xh` z$d!HxzqIb&9{x?_cK5%w?tZHZ|0Z&~{td0WH!Jrykq5Cn;X>=~mAv*Qa(nm}TX(PG zS9=qAf(rjq>+W?*|C`8F`X>C=y8Bq={w8v}{=c{G-md>Y$P+HN?q2y{dlR|xKjDwo z-79(RP2~3UYi!-UJ^Y)o64- zzlpp=<)2gQ?lqNuH<2s-5}aFiZ;$^!$P-*zcdz`fy@_1;pWylr?r$R3tN6RM?q2y{ zdlPwra^I$P_bPvC|3RM6wsrThD*bOF*QxN`TX(PY5Acw3eMi|JDEUC5(yx^JF}3WE zvZrJF%AS$S(>l-A{Zr`?%l^f-2v_;1>@~2x-WW8Y*@Bh6E@JF`Es%HxP|uwl>VLJg z*TDAtI{#;TCdkP@b1U}9U-vGuze+(7*MaMa;8NkXW-q|O9=+a^el%Ub)WJUrx75Mj z&HNMbZN(m$t8~%)WIO_ZdYIFt{ByLI!1juO^kz+0YxXMGo~?zwQm@wYSCuDy5|^JA zX{aY6(xw%uGs5UMO{!<`Z&LQ==2}9AwfQ*27|> z$i=kOJZq*!)3OrHL-SHCV`mujmYf`YW={5e;ZYv>pPZSInr#`9l9{PF@R1{gi40Ge z4{J6M+?ruGNXp2bC%thngj4BXPIg{SW~!ry^AodDa~7rMW+pDlP0db8%}vd96l;q! zvPX`XmuOAN$Pr=q=lLi5=izBu#@#^PDux;>6t4d9xBT7p2Y<*5-vJ zTQU}<#^&ZEr{*CJbj_U}j~u#NFD&3LJ}NuI5-?zle)^KU_~@L(l$e|pYi6oGEiofA zH3fNwEK5uoqxa9FZD9Y&Jt-zU%oBc3vu0;!WX}&6pijw2(P!sa;88M?N}s6Dl_Gsc zcAh0MJ2_RKlP2{U;&F5RNH-|d-#@Rve##`+l-Et;)55-9A21;!H_xKCA$fAEikiKP@#gH8C%BMmkD= zN;L8{GbS|)&RDMO2dnh`2Yr%rva?f@kvBQ|`I$LMiJ5w9UTQ8!3tNQ#yZDFblSO6J zn={O+087VkFXA!Nl98Dg6f|1+DF6Id>6M+MPc)mOBJ^oF*6fra9+4TAbm*6vXw6Pe z*W+GK&5AxPHz!LLXAQgGavmE(0MLWhBWW+qJJCF6@!3>qdLJ9$)oo5Ppw z=BUnT_%?-kOn_Lb)cd|KJ|_hUa8u;mHWAH`;?p zgclXjx<8Op*?{y$cS<#C?4?V3MpL|%J!J!r0ZVEY+4Im)R%N{jM`6v)$;?D)3PKw| zmsBGgWjrY8cH*4KNh%SuI6w75A$_Rc-%5!$AtyJP!u`8Fhg9dM4%rup*=##GH!&|= zpN`fR%8-0wVzxFRHA#y}%+$T3jNYvOUA|wncj;p90V}F`1sQTvF{3LFv>drKaWNrb>x=-0JhJ zu%C*@nX1(e^>}(}F1jb^ZpiRsy=DI|cD?MsQNNb@k1hMjrtZ!CQ0o7xD-rcDLkrZh zv^@M>jQeb0vX-OeqJ9R#bO}t7wRGHPYPaL>F#LkFAzBJJBFxu9*v^H`RG1BiotAPc zF&T-O8TX~4u%zHVCwo?6ZU#MPgb&j*Q&Y`<6NOJ#{?ATam>QOu`8OL%uCSWZ!@O0d z$8U@?vlnLPEY8-as(Qx`jO}ImwX~mvdX6eUT@t8@_nZG@FE=-Fi9S1Zu|6|3d%kQ4 zO+KyrTYVGr3VzR{NovZ!mX|9V(4=)snIj*dX$7sh$I4W3{gZn~zy4R=$Ld;74@zgp zJSkrw$5$E|gBMEvPvtZXB{xZwK`O_xq*7_6wui2Na(}aOE?sL{%kr(vZ}eA#2Kkx= z;mZ0XZPEMQgv>k?-<)LSj*!jiWl0z_$4e4A=~jMFHrqoJ+H6jFO!gh>6`nB}=xI$y zKLJHHGGF+q&yndD#2CzIVvJ)v@m9c`chVg4gcdHCn&uCT{)gBV#&a5#u_>7Z}SJ%Nf66v@td^y5~uM0~k$=X2x}l6^spx zI*W7{%$UGf!dSsr%h={OphRG3->8_1+%1Tp)fGuAil9UXsH+OLt)Shzqxlyn>psx z+(hU_ED-hv0tXGkeIR~xk6%9_8>msI-yc6ZvuP~+fOX9P91IM=gXaO@J@_rfuOA#O z#mzv-2jLfp-%$Mg@iV~DSa{G6_e=4^_jk2~MQIl54D^Rvx)K&8wcwO;{j~(k5_4)! znzE)P&?7n%uTOYRC+p{16LV99EP)a&dw#RMMU<~d6_{HoBUq9kvqdHsbv#?xNJvRd zOTE9xq9c{yY z%98BFEL07=ZgB@311A`LP~}3&G4z(7VR0z_j<(>BJ)ZwDIJ>?7N;!)6-_r3P{J){T zTf_j9L$%jbd#3N*TMzG>d2&vC;^IX0daLPYpdHaiq~;~(W|*6s15H1knu+ktM7*vw zOZABsy?i7%%EPGN&*{icOc|)!xyk8E92^T9dc3lmsYTXLNm@W7InnfLVQ+>=RdHeW zL>mpAJDujzMr-4&bB&CQbffEzAT5?`1n7ff*Gkvx+x3Hju`ecFuDK^(&!4a^OAt7P?7u zBRiN9~#xO4ry$_oRMdkA^T``1Re?K%2L+P|*&hGg>KgYHC0>e|8M zla4t>_I|EQzy4ERhFzocQ*C#xn$@@a8-G^K&#KP*CTmlDu6SYDbtt9(tH}ra*8l2% z|B=tkzkau{r{TvJ<6T4m=d!O?ezw5td9q)roKJ>)Z*t~)o-1CW#`_F{%a@2oORV!1Xf=Ct)}<1*Z`jo zFJ0_7yJM&E-z>X(^jFVzozvJo_+Q#ro!)(T+v3;nOT7N!EejGok*6JcteIaqOW$+t znBtM`o_EhMf3hQWk-mOUzvo}H&G*f2=lkNIi^J~iIMuY{(5v4^PFs#mN}BGY{I!2L zS6FU+RJ*%jt99?mH#==Rapt>RpVa6{0gF4=Ue4P6MEKOh`=9DRbK{w>`kya*VZ*=i zAV+FXtoiA;hN3>ptFk=ea$I+YSKb}iXmaoHOZPdYe+D%C_Sv}ChjcBy_p6T|iO5*y zlzm0_;;e2 z>L2mmv%iF`_@MHDbKHfg=_g+GU$kt^y^~RbQm&payz8RRrrB#dykDTDy+1&I_-NI! zWm)51?;i8vXQ#|BejOUt`NPQvYVKXv@!YYJF~%up#%;WkvpA;T`7It)%5=BS+}Q4D zoY#g=`z6kLq_F#fUB5kIU1W@9uoja;U~Hs21bKk@m-+0ShBxW3ux{tbgCW<0g?wgKJu?0f6z zm&X_F8+pWQ=GRY_ytwbVvQH=Z`z>nlZdX+Hheg+O%wHW$-*0*>d5-RfPoJ@69P4Mu zJ@?+jZH*0%RedZO;mz{OXxpZme+*?CXnzr1t}@fSN}R{D=GzOw(tCp`1E zENyaoC@_3$hILTj;FYsC=zi^4qZ#kp_kB{iZ9&m--S_K0tFD^4N;mU^IW=GGxEgo+ zgXJz=BcokL?~m#FwpP{iOhxpPR|@ur90~k)U1RU8d!AbreE;#TOAh5O+MECKw(plr zc3FE)G##4uO5GRpGIN%ld;W(LAy;0>Nm@L0MDbqRoI$7JPK`Yr*EFHG@6y?2bF4q~ zn?8SWm*fx6*T;KYJDV}uHvEoKx3WjJ-F`XTr)RH|;ddQ>`uAHmzS?zMI*qraTwk_h zsO$boTYvuj^w*PLc|7lAyK^u6GG)H^%f4@Z_5S;p+dmzg_r&g~`h(95ihpWcu+Qap zpU`(2m4D>B@ke%@>TU3y{oR(;@!$WxxcI;iug#q{)FpJv594V}Qqz6=+q8C(cb^{r z-sT}A-hD0Swa><7-xu)SAB%TQs;NFYzqYY#^Zbzgo8FyOo$2}Fi%)60Omjn5@0j@8 z$P?3IY$xxn>ec;9yA_cW7aV`<*wX0J?k~Llyj3e2dk&kxa2fygh3yj*w`}FF1 za`OkT4SA|1L#j{b4{h^L=<^Skeyu77^%Xo2&RQX1NIdj5sj3!A>#H+WNM@Ti!* zc{TI1er!|r{M5#aE_+@*J*{+1AKkGx^B#)We&UwHE`E=gpC9whG~2XyzMp)xOWUCv zVs@N9w$WqC&qbs?dqWqM)(!2n zEG_!C;X^KzUwX{jr(?$2=)5wYehJ2oPGdca?mgHm@byu@?*DrAd$)fyJ}mmmSD9|b zIMmGT%+jBqnYJgfGU=`3Uq5o{$KmCP=?!Z?dG27x1z+x36DSIduA^<_eS2RT(D^ry zaZ#5JZ+Lz2YkhXCe{k-r2Z!eB?pPl2;*Ro;yUQjIi{8I!_)8yezy9{3VZEY<4EwC3 z;k_rWn@66Q_t8VobQ*uH+rbHq-v*yQ`bgW1E=QcZUBB?YVe`gql{vq-ci$l&qQqoA8 z1|4kk;eq;p-}%j?b}t@q{-)}&spoGmm{s{$S=`VO<8N~mC1Ua`Rb|JpbCr zFVhyqp5B&(PJ@=Xb$&Mwr=u08-D*PeZaFz_$jh&tdGVdZGv6c+{MfbM+ULJCCqC_e zcK0@`XQy6+d-P0L(6Rj0kfW>emR(5r?%097gTBjXGwPA@zCX8lGOa#4s%y^4HBVX} zwA?fDx$LUjKP(wpH9nyFu_c@Po@!5-loGb%-YrUT{e^vYI;R9~R*01>_Q%gDf?l+TP&vq|+<)z5SE!8s~`)l@I%fT-y%g1LY zpO}4c?)!JtUGJEgICW3AliQzq|Ha7{UWxtT$~X5ePi{Nt<)Nou>`mcmx>cXtGj`Uf z#b<+G`!saQOGj4>e(8_(mVH+$pZTHtg5Y!UZ@*A{sqLRX6@B^kuDc9}4sLnKJg(=9 zpJxTyy!@7R$yu9m&*{OBrI<#)@>GXfpAm6myS%sdvZ?R_@^!Jbw4@-U;|C`L zOH7Be9&kO^_gT@=65-MxXJn-d`a!PkG$&VY&B^T+&8dx_=G^8s&AF|==IkD*xwzk< zxwJEAE*>V$)nl6G>Up>3>Xo6nd090#?*}!v_9dE|&&ygHpUqku-43lyhr?Ri4z*g_ zTP|vCJGwc!cl2{|_YHJ%?;P&buJatHc3sR)?fiD)baAy(jb1>351oHwnUh%M@+&bDEqm9wh z;64YwScI?hVbcswGY%N<&=v{*tq6&BZo$`pMX1^-tI{$vaOp7V|Vz2Ab1_Yr6#UlTO(u{BbT#@|(0PIZ`#3eU-n#CxuN z&CAOB<@$XUp_&$a{o_)eQX=tVmMe6BN1A6c##S+BRQ~o|D$ULK8aw6V+l;|aNp4|W zSt+^lKYgd<${&SFuJ~Z~Uzu01p6goZOJR4$j~-9-qjV#rJom$o-uJxmqen_R{OH}1 z(wOp`kjx0F{UI5Z9VH`w$t@wxH<7>S&UkL=#TJdAlbb83Rg%``Tr zi9oVH8$a@&$~c9ci65C~;it#Xj9+*Ba`7WwDIR3M06)@s1>=K2k{9Af@|F0JKPaEt z0Q_EJ{tA%vU5_7y_Xd7s??e1ZzeD(u{1|>D_d}vk`lu_YNRCI3U<_s)%V=bbU^FpC zGtOX4U`%JsXI#lx!q|`|!~2b~k?}7^ZN8MdGP*N*G3ppQG5RrfXDsD#${62c{FqVs zzlZrj#xEFa85gWdd3ZdMt!9z)8v3_?selI!q9Ev`iVm z>7pN`+@*j?f2I3oF8#@aAJT^OkJec*$-8it`oB_vK7PULtJQeK1s=L4t19ksnv@YJQOn2dB-1dM=rGEn+&6~2-`GMrqv zrf_83Va(yudJ}oc@H0eMWFo^C*)J?eJ(}H1eXK|aSskWFdZq?yp`&BDJi(4AJp z$&1#=1!^;qzW?u{6wv?eUjW9k<-fnn{%&GIkK{l7TZx`P%YQf8Ux7Y^`iJiPfA!DN zhX=Lhf6nMT{5SuUd;S0Qg`i-?gM}*}diar|RjZ31UGv!EB~Se8$+b^C{mi;&pL_m= z7hih0^p#g%TmSloH_G08YvbFSHgDPb?|0sP@BI%xEZ?^MqmMt?v9n^=?#ew?d-qlE zKk(_n&kh}~Idb&#FTVWh*zprzpZwmM*+;Gn^QLxwi*3m6kJHqqat+Lbo|N(e##+XpwbERzt1~m-%Gkgd^c1^itYtJlEzL_9YZ=x0yhi3X zu7^|WNy*fVXIl=Qe6&I|5YK$-FVRR)7ED@Ou_v3l*8Nj&_JQz^#*eD~Dr*(rg zx5&m_!M4q8KiPdJx*Eyt=3S}$mQZzbZXr{ za+?f4=-t4A9-&-!O=(L#&ooh2s9!D1){Qx(G?n>vAID#FGiT(5O`aYl#&SqTV>+!NIctv}ZG5z1PfoTa7JDDD z5{S2M&{!C`b7hPUk4eOy6!%ObEobD1o<+ zjE~9$X?&6{8*>`pqpN{AjY-ng$ei*+TyMzm+A(!!F6LulrejWH zcy#$OS7Uj4<}~(4R{(P=3v>lBr*TiZf|=_i)r`z(%#bb#N5a{mU$TS zIOgHZ6PQOZPiH=XxtaN$%=4K?F)v^~k$DmGNz6-_t9rhU`4pCyGFR**?IewUl$Q_Xxi%WIfBaRYFixifPca~I}~%w3tQ_REdA`9^mXCA=32lHU&w=p*{@5wxl zxt@7C^IpvJnfGR1#Jmslbv99?ZOy`Do@_nU7&!!90X{4RZtY zTIS=JH!wFc*WQ-#4P&lj9?o3PJc4;J^GN0<<`bC5F~5^}I`b&z`OGIWFJeB4`8wv& z%*&WhW?s&G3iE2_vCNM%pT^wAd=~RY=Chf*Z<6u9i@6{3ROSK97cviKp2^(AdS%+r~7W1i1Egn1Ej zC+^^_WA4hljCot;<;>eLuV(JS{5W$j<~HWtm^U&HVXoWC@#hYso_RawLCigv8<~4C zk7eGCc>?ng=K0K>xIZdUG@7byFKrTr3RpLwaW&wQ)0A0+Kp zDErK7lzry4%Kivxzd_k&uDv7U@4;Nh+$mVv*DE>mASE9w8a5pSh^98_Kc zF^jFi#VpK-Sshm-Kr?Gn~Z-HRSK9xJ-Dtsz`q>r*s<&e@(#h=P!AW~ELpNG^Yxk?Wz zpMlVpt2aU?|7O_zqw-4nDgUV4QvA4ifHoA~Oo#lU^cpYLbx{RBL4sfw2z1)pHgH>!6O52bgOh-ZvFo-}go zST3l3l74fz98f(Cgtn@jQ+*|_>IKzX;wpTqzmzX6(}C)bawyRNoyr z)%zQ{tRE^~)DAexvqb(k`%mqIqdc#Lf7D)3yp?~+BA$1mM9GWV5yyO#?MbtbvR$DP zCsR(gFXW>vVfP|FlrrNvXR<{)H|Hy@v!;Ad=`7o$C~Yc-FWZxFdwr4XI-2#P=MaS! z$M$7=GTxpq^xUELO4T>nJ~Yd-Mf@Gx2eKdQP);cQro-gM@-6Fib35i(55h%Tn<+Gs z<*d2>%W^i}p5Bh-#?hThw@BztmrR#Pd-;>kZIit|$#e>{>n+nM%-(LvbZTzLWjcl1 z>tCKICo-OndPx1780{ZwzuOQ z^vpsZqPgbE@FVQyM}{9`ZwFNP&FvwD-(22g_~G{UPKMvCFU=iN=?%kQ$M!7`PhQeP z<*d{r#;&JK|0sJol;OnMDMT&P)Hp9O6%@Gt*u#qb6d(y4&{Kto9yu1Cmw5$ ze{(-yKIy4kI9_VpShf3l9v2?Wmh`*idy(vIW3vIz6DdD}Sbm%hjLg4g9?SgS%oCWG zGB-1SoOuEB!^}&Vf62U*`BCOunZL=rg84S)HO%)guVwxX^9JT>o z>zP+GcjxpPz&wcM&oehMU&vg|+w@|d!181z=k#@AZf3da2Np12#_|&8A2L_-fNGww zjOD8SsChtFwqMS2)xW7`{s_y}JfR!&<1AP0w3;_m^NKc>zsmL-nLokYy;7#HYM1?( zzsvFf<{O!-c@EWI3}$&T%Qc>-YRlZjay3um&T@B_$Fcl1=IP8oW1i3aZRSPH_cLF| z{9nw=m~UrZ&b*3wHS_nFA7}m*a~ty-=8eo%f7yMHOs@)-`!WBVxsK!4j(Gsfk1!8r z{w;G8^JC28m>*!C&isAm`OJ4QFJk@$^L5PEGcRMliFrBm@0eFJf0Fre=C#ai%s*n@ z$ovp<_bQnlr?-j<~pw5YF;#*<(Vv3^QQfn z=d(PWxgY0`2lFD9M>7v%|A#PN$MQVpdUo&0yo}{*nU^zvoq09$&CHK8SI>7F^AA|w z$oymGTUj49@9Mr+rgss`^I1NMxgX2bJY)dt>&5Z_maF%SV0J&0<-shsFfU^Fe#}iQ z-@-hOx#}MTv3+lrr?Y$tbB)6bV4lzN1K7$zK-QQ3};`b;KTAV zmOsV3ocUDdCiYLqyqe|ey*q&Q4P^OomaC_>iRHJm+{W^J<|Qm2!@QB@4>FJC@H;Rs zXZz!ryYG|vy^6UX^XbYx+aJa}faOb=+t`19=D{qV&s?oT=*!&1ayg2oX>rUSW4RxP zH;8#U%d?p0GcROb#`Z&*7qR?d=IdAh3hyUu0g+T#nvh9S(CV%a1dk z$vo~2nVz>Wx3TR>%gl?Imnk{>-X0GQXR7T$xOd;mq9+NPZvl3YHt0`>}jA^8%I!GY?>S0rMi3k7gds@)gX>Sl{l< zO)S5Mc^va>=3Ci*59aACk5`<-yMuW?%a<}&>#p?7i&&n-yqx{Njrls3CooT7|3@${ zWBE(WE12KUypjFu&-^&cGnm_$=P3KkU6{LnD)ZwEb3f)K%mbLe!aSJyJIqbY-(nue zd;;@y=4R${e3n*n%S*oRCgQ!?ktbo4*O902tcQBvPUYDt#WQ$zNAU$btD^Wqo;^`K z6Qli({%2w&&XLoYha=CyD1;-ww}qTWOC9Aj+UdyEXtxS~i9>v8)KiWMCOeD=N)!1v z6LRGP%}WJBd*#2Jhf%Y2G;c-Y547G}UUFP22|mzT-e!N~d<~5b$V<-GB-_)ObO}T% zt8|j{Hz^qHmX{naBmW$E^S(kUr@xMJTE%}OSINGxx8(Ef`6qe0z1&Eig|+35 z{$<hUm>YNVX6R;wiBItjT;OvX>n_ciMy=X09tkL1nqk(~Z2_cRZxR$Hj~ zW!ib9QC`9S0P^h{DdsCg1cInA3m$|*&aMrvN6nbUka?TS(1sro~EZ)i<}l*oCG zzdsM9c^=ZeHT%-s@%bs|^;GB-Un;LkTjDhDOZ$S9KBNQLkS(B`uWe3mx#P@{)BL|$ zr9$gDDE7_eN3I8;zw(mv$7=NptrMaApxyuSlIsP`_UE@OJ@T((`Z$_9##heoFM<~G zlJoG*`p9_$YENVf)68WJQe3&0Jl(F31be8YH?|ACofKhLj85}%}?HKX7-M+se>D0JiT^!|P)#zX!w<_Ms zwASt(+v{7o5}M^g+H8NOxV~&5ud(yzo~3KQolE;wb}qbYe7r&hdabRxbHuGT+Sh(* z!7sGnI=f?;{!Po3!TA}a!TWamU+mou{Z`re%Tq73?Gu$`=M7DFSC1$dYv<$-`KkP) zD)D7mMYuwlVRj}ev@dOSf``~Lg?B8;69zm`y&-u7w2n#xVj5H_rz z_AH_P%J0t+nk%1qfv~hq@JobStG;?!aHs91g!xtI}KlnPKZrh{{gvP>7ZxB|j`$k~RpRbh({?>vw32WXAdW#Tx2-Ke2zL9vzng`w{ z)O{JYiLmru*Ug0Hl)VDCZhmA7@rr=HqC7P8TPd*Q=vje5gTwz#a^r|s1t!#M?-18b zix*g%{)xcYpj+Q1^V+g}fkB^tDX?_Qu=mKk#_+g6{fc^lL5uGcs0)tka6KMQ#%*SMIc7H;k?%a8SrOU>CLgocuJ|R&1 z>Ab+wT_HQjeCwQ&ySr8h|EGitO!y>IV1d`u0=3Yc z0(Dbt0vpD6*hThB{l*9^s7Vr7vY=R??uT~;22J=z@*>yWWWV<9!2)aEn<22_<)s1( zveygTsy`^O{`%JfgACUsX7v1& z+#8pN2{acZ3v9@INZ{6pHzaSnUtq-tKMD+*>UEIZ#U2Zk7&S$p@eQ-UpbJk(-v3>J z1yNrJ)W!WSP@CTQGjg9WW|YMCaRRl&`2x*LpA}fzdAq=x7rz$R(BZ1UpuAfTk$co5 zfw9--3QXv?RABAc7bF@#7FaOs8-X<){*vaWZaqxyYn}}eSUP^Lz=9L^2{hmHoWPPJ z+XOZYJ0Y<2!A60xwVpL1{6)74400VLP`7G~K%?74fwlQ_1U8&a7igZ4FR-BW5rMjk zPYVnR*&wjt{`UpOzPCqU!nx0--0Q5sia{3z>cX9lQ254aI*D_73Ji)HB2b$WDzGLr zT3~74xdP2D3k1e~oiEV%<|6_V%ufp}9s0UJv=0I+p585RtKo>ihEv}OG%x-|V1oNK zfu&D)9wmKZJ9ZOjUK1ctr;QRAv@lX&&7tW6wLwXeFEZd&~uyoa% z0&BN@DDg~{z^$%d2#oD{MqtIT27&r<*9Dp*yhML&>-cU0YexqN)D0Xd@P_^x^cL6S z`geMN?D0P%dFX7z$k%_o>$gzPou|j9hwlmP z@cQ0_&sJRteR)VveNNJ~(9b^ky1aNwU8rx+_+O6~X@*Tp25so*>TcNc`7ae+o^dlc zM}4tr@x)D`?Sn=&j9b*+PBrFeOWkhsysw>M zpL2zI)oT@@Q}uPx8?*2bKZth|D zVcWfnU;3`6A)$@O8$0{E8>Akc4Rh~Vpu0S(jbT#K(hD6I++rA$RB-4WLp#H%wZ3&n zf;t&)FMV96TiC-8c5%Ds3y*X*4ElJ(Jx=aTp_%jdeir({0K?#odp;iQJjf7{`t7os zE>}Wd8s#!O!RTv9xb?oZ#Yemh54^dwf9j?#hBxD1u8Jw@V0f^mO~RfIT?~!xw~rmt zZm40*=|N|!I(0ETHzn`d8z1#E6t1j&|MB0hg+ApOv+wz#eGDDFmY8gLS3wA0!!Ai=}*;$ z%JlIwjD0flr?RbW3~!$N{np02bOzrqXZHK^Oc%q>bDMYmG{@WU+PL(uhZgrRj2boO z+PCF>4X(FrPJH0Oj)s?g>Z0y{bg-evoM(I+ejH#JdH?O%8{X<_nAs+`-K^Xph8b_) z_t)_5{S4DyO*}j(ZGa)D|DF!j;eLjZpWfy9QHtKM-l_jeuMr-Gua-Ri{>;a^8J>Ib zo)>xr)`c#(w%q%C@;F1Mn3zx1zALwV_%h7i+eL%+DU zerf-0h++FE=Q-c*8Ex2ipuV>5Qa8if-u)k(e&`Ov_H6^FTc(UQ%y_uyss1C{8X6{@ z_0;b2;(Y9HXngeN_xv?~L+R0rhl-CNepU~!ApyM%2i}-7{F2$*;BPGJ_`vc(hTB&4 zs>}`=ZiuxO)8o^S(&N~pcWgBnENdU?UA<_G;q1ewrtNJXYS_SK(aG@sDqX-CyCq|4Yw+RU)NI8=LDhQWykVuj{FBc%#0$3s{ zMC^hZ8+MHajSZusf;HH&o`{O|cL}}e`+RqAlgZs)!T;wS^02!z&$mq3+1c6IJ?oBn zZ?@DwWVYUUVBTQ+7Za>!`ZiqM^_f`fkMGxR9#Uhq9=L75-lXp1tao+2fBv-t$58xz`t)s2G&bO|(wPTt!RlfK4Va=yn&DOiJvJxJ`t_G1R*mUwv3h^Vx}~Xm^Mp+o{NAO|bdojc z%duUTj~QnD_>ig3PU~M2uKw`cE2cSySO+~>oxOZsM{7~}GoPJu>L6?9{b%iba_gDa zW7U@wT-AGoH9z~ucMHz@eS+5hPP5i5y>HZvbI!D`oba3Xp*$ld#8S+bzgYFbEcf-#`zD;cD?ef2YQ_5WtDUyq-sjMS$6kEDU+D;|_2&4& z*$IUstn)|T|3=S*e-X!Vyfds& z{hB<^e;$pqPP4~ewW*V09h7&=?$=Y#u_jnDy7-<+vljOK;;M<6igldltOap}Tjo(f<&D#67!PkBMH`?iU zORidf!O7O^hmTn}0pJ!>3#4ef&kQG0Ue}r!M-sYQ8PYI_Se0zkl}VbnC01Usf>T@{_II zAA9xi{AbM8@0NaCXr6bPb?WfP_WrW^Wa}-z{kyMdx?=5m;hxK0-ZI(RuxaM;l8t9u zAAfM+>W3~KW!>>t*Q&QZ$h3NArEi_yc(V2GuPRrZTaj+<*2}xKLsnnwEmJ>w)A4q? z^}{oEX7qUXbnDEsm&{)OpnF2*w;6KW5wmsQ&Y$93>&93ot?6+6fxhQj=RA7khn&By z*4G@nS=^FI{{CTx)xPV@Ywj4Iz46DmFY}=f1ldSf^BhL8hiZiXByp(Qvwf9hK%m1n_ z{omSj>u+8n==#E9jel)Vx6m;Y)hl+?rN)=={`X751!`&aRG zI>xVT{8#CAgg@5rzJC?-p_Ky+#rSVVxT&EBIQU2gBuc&_NA7$~2zQ<3y=^tgc?e>TIc>Ym5KlAP5 z=l-Kq^!c{xrt$wM1Jr=6m*ejrWz98*e){6)%Qgh9ap|t`O;GRQ^%DxR}L7` zvi`V|I=Uh6g=NQ;XWf<6Ps~5A^#3daf5(+R^Nu|*diZh0(^$T4bLZpAJFjQWFK;=f zBy5ncoAcE%<=6N5ZDm`IDL4JNpyP879#bZ+IeOu+>yIh@-n|5W$CPWb6L;Kl{xQXO z=qtN0p9$Z~1ALS%;MGwmiGy_Hzy?bq}uM(?%j)4TqGN zWP3G_Ii#dt$&Yv3cTnj+>%#L++I3Lb*YWaJ9j0;RvlEHc{FwRw~G%dWtIHR_vRc_CilL`vt!ah<;H(9 z-u9&)R9^jl@|7co9#rBk+gP@|`$5IEGGV?~I;ixvxAd~N98lgpGjqwo9}g(`+g1+S zwBvx%yY!7-rEeTiCiHnAKKq#iO07G0$2s>MP#T+R#!tBk>BTF16|X#?^jXZu-FwLa zUPAxjHU-`9XQ^UMp_bU(W`tz;DU+q`snrbVms%rOZF?faxQ!M_QL&& zHb1&w`DfKDznnB>zw$@deN*Gk+OM43@sTAr#|fcd7mv zK4ltT`s9`O?^6~xJ^RyHx9(G_r}DuaYxXIZ_IPT_k1O^mi|iMqepI$kx$EQo@4j!} zr@XiH-Ca9#_bEqr7B~(~-lxp?`*F+g@%xl(2Y!CiqEq%M=UuR1*k=eALl?IeV4K-Mvp#P2Q_K`|8|zyT|WUj`Y9yulc9$ zRbDrZn)cI>y~+!J{C57byPB2Prj1#= z|Ep%D|H}KHjQO}(xxm}+*x8|_x0-w?$^~-~|pXXEFF6#9`cD7G3 zb;!UUcvDur_)eNn>9b(q=9?@&<+qcU9V;5)Q(`+vE7Q$B<;)f5jT@Q_z8ZW=H9oZ3 zA=XFp7zp|n&%K?CPow8qrmQUWcP#4tTb1Vj@8IYq>heB%4nfb$J}}AbgF|%0n4Z=d z`#pejl4N$y;r3~Xh_~Ybh7D;pe;T5+VE8;pPyFxOIP=hx|TYt94zYR=h|DXH` zvg40v>Y@FP`d9w#)HKcS^jytPjYc)31=YPhTKQ6pN!X|3`h*U&Q3E|AqMdYL&#!GV z6eniW3mH4~qy^|Ao*qbgxsYCq{RZJ!=aDX5w`iaAi^0gx86br7(~ggG#r`HSZ-6dQ zFIh2zqlYx?8~I7PjQk}1V$eAh=Y>oS((M5pkx$ZfLV5%CjqH;yUAI_Hq+bj=hvKU7 zF|yd-k^caW$R}wtIC@CKzL9;>rRx^$lYTMi9E$TorUvQu0FKBf={h030sBVwNtdo$ zv`_lQpmQiL9Uotd{R8lW>kelh4AimQf9 z4btra9Fb4bbwYXr_Kob5E?u{1pY)4C=TMxN^8Xj|AHWg$By9#q4{6vpvQN5n-J*Tc zF9w}MaV~t^uLkM%0FKBf={h030sBVwNtdo$v`_lQpmQj$2{N&NBmV&$kx$ZQaP*Ld zeIxs%OV=&hC;ej3ITUBc#|&$bZV%vye3Gsc(i^aEWS?~Dx<&h>Uko~j;_4t1`#*3_6G6Ecke14btra9Fb4bbwYXr_Kob5E?u{1pY)4C z=TKZDWMX~De*j11le8HeJ)~jZ$Uf=Pb&K{%zZi55#aZyN${M8G12`g|r0azA2J9Qz zCtbR3(LU)HgU+G2ddOfJjClh%BA=wq;OHR@`$qOjm#$m1Px{56b12S?k8{=_-5$UZ z`6OK@q&HyS$Uf=Pb&K{%zZi55#nnP4wgveQ;D~&ZHiM&wH0&GMCtbR3(LU)HgU+Ei zFXbQU_5hB^C+RvNy#f11_DPqnTeMI5#h`O2&W4Yn#_mP_12`g|q|M;yAr1RR_DPqn zTeMI5#h`O2t`RadNVf-YL_SH^3F!^kH?mK^{3G2Sz!CW*T_>bBVBg3->C$zJ_DR1O zbdDN_kNw6TK>hAFSxq+bj= zhvH25m~;)&?ExH-ujXG!Z@|8hebS}t7VVRMG3XqMtA$J~=8wDq9Fec)UzlS`!@iMy z(xvMb?UQ~n=o~c;AJ48qx;=m+^40tc=?&O7vd^GP*Dcy7{bJBL6laG_>=EQYfFttN z{DY&1H0&GMCtbR3(LU)HgU(Uo@Uie3q}u~HBA=w|g!BgN8`)>jrRx^$lYTMi9E!6; zCiW=uAHWg$By9#q4{6vpvQN5n-J*TcF9w}MaVC5my$0#_0FKBf={h030sBVwNtdo$ zv`_lQpmQj$8ZxoRkpBRV$R}wtIC@CKzL9;>rRx^$lYTMi95oIfgReolJ%A(fNxDu* zZ@|8heFj~+ZqYvJ7lY2BxLU}>9!LHII3k~<&EV)E4f{s+Ntdo$v`_lQpmWqXeEhx! z>GlAQ$S3JKA-w_nM)nzW>AFSxq+bj=hvICIiTwxp58#M=k~V{*hcxUP*(Y7PZqYvJ z7lY2BxF*U!((M5pkx$ZfLV5%CjqH;yUAJhT^ov2~P+Ynh`TrOB58#M=k~V{*hcxUP z*(Y7PZqYvJ7lY2BxO&LcAl)9o5&0xtC!{xE-^f1c(shgWNxv9$4#k=A;|j4%X5Ijf z$R}wtIC@CKzL9;>rRx^$lYTMi9Exj%ObycQ0UVL9=3hu}z`l`v(xvMb?UQ~n=p2f( z3`YJr@*ltv`D*^b(L);cjqH;yUAJhT^ov2~P+SvaYLIRZ;D~%R|3Z2L_Kob5E?u{1 zpY)4C=TMw&2=Xr>{{bA4ujU^dJ)~jZ$Uf=Pb&K{%zZi55#Wg~v2I=+yj>uQ@FQhkM z-^f1c(shgWNxv9$4#nB5X#YW{`v2J9QzCtbR3(LU)HgU+EiA7o-AFSxq+bj=hvMw`@tqo^+XFZvU(LUe-hh20`=m?PE!rpjV$eAh*94i^ zPRM@%N93#d2S*QS*f+9Ix^&&5ebO%mokMY!5y(H%?ExH-ujXG!Z@|8hebS}t7VVRM zG3XqMYlKW}EbGlAQ$XD|(q&HyS z$Uf=Pb&K{%zZi55#nnS5HV*j@;D~%${a^-14^y%40-69LKXe}H)}=&$$etKX_< zfwvqSn*mQ_Yrl(GE2KAI-wUKCgfDN>t$QuzlkBw%qm0Wt7W$0>#hQh*NWR#iU(d7X zN3ozov_s`xEu@9Yr>>J^$p-1WLy*&Tio9Cz_JGr9z|;9^t~Mz$c`99KkSfM4!t(Pj>x5b;@1l4b;3TSlMX$I?Thq^LA3h_lW>kelh4Aife+*9;7!0 za74Z;-L*}J8T+Ap&~+NsJJ}I~=m$Fm?G$>a3U)*;?W^ryNUy`bQ8|z^FsfQ8R59tF)q|>Mz$c`99KWva$4!t(Pj>x5b(pf8{KZ1Ru zav)v0Zm}FlzaDaOvvQpiXC7|ZTs`T&+n3MH%zShM$rO&CUr&a9uW%Ro3Hh#)`C3YjqtuaKp$j5@T{_iJ4n@W#vQhE6nMLYwD=WE@!5R z5+fU$uBsyJLOJHJP;g^Pit;`AL)A|^dUGT)%f?tNg^LzrtdC>*Y|EI;oV=muXJ(Mt zq4sgJDURi~<6THmvF+lrRaq0_%t+JpWoHu4(w?WvrnQTkuF9sjk5hS5+r`;bo(*wo z9#o%g>L*m~?Rn=DvABJls?XIfE>G3BynUR?t43VL>ARr^>8! zE8-j)=heMfXH9mrHZ&Hy>=5FhMvpt4;!OK69&2lBsTAisAhRc8T6yCrjz)6z_=xuy zO})B~xM`68c&M9I8()Vsa#lx?PWL*BI8ds1xg&itX407mt@%{MZ-^ zkMF?Z5r=&j$B$=72U*As>L{^}MKLUW5!Sc^X+33z?6*5k z8Pt&_7xeIUb0yhL7L?c)q|cXH?*sIHt<`tzpc>gD(3P%7V%vm1BF%sNOtH4J2V0U) z(fqgRx>LGw7FVFzDuyjRkX}NEUhQ>TCTO}J#zKA4mxp8GiF!#-N_Uh~PK<@@)EelW zAE4Ln*ZYTG?^OnRNe@rxz!Hk$Si;y&-a#&0M^WA#J+Z9X#n^hF7JAjPMqSYHG@P9q zDGojc9*Z(bL*m(x-3e@fC!VE1e~;8yY6m{@zX5hBuV1~$*j)by3RAjj?S#_3NPjXP z1`v2+3`@+3^L6reY?5t~We~L!PZ!jEBD3M6>-B)8x8{#{oP_mCJyPSyri*mOUZmOd zo#U?)e|ea&r5H1|6pH;Hr27V2y3!>Hep#U799$nLG-6A6(AskX+GRZJ>PCB}_CD6% z-rbT#the(auLr7QLXYJ3?SZaG)Yj(U1IeU+0gj0$wg=La(m#gvFY3&aQxjOcJ4Vf8 zwSj(5fPNSBO@+QY?f4I2t*AdI#ztjDdW`fxVxa%C0R44-{nPyQx5Yp|=~3Gq+L_w! zu(rAj`h<>Xd)3JI<3MbRR;S`I#~PqsIojFGJ4vh)znbv@v1|Z;T2@<#tAky(NVY+- zxW;aMN^ZId&vw@1@~!GZ*$2hp+!i=I7V{PE4ldb_`kR!%ChbdP>7K6a>>?8zotnhr zcsC~5n07ww?!rtrFt%_l`U}6W;xX?T$9m@VV?9&*u%5gZ>*DR~O0c8OXU4Oco+g%+ z_c=>V{fs5>9jt>-vTHtn%$o4|zo9EoF@2DK%E#`H)Z;CPOQtv^QM!06%4mIOJo--U zoa>Q;zB46(rR3GJl+<-Bh1aldK9jdgqu(FurwjafLisn=FxCRpsez^qqw*OZ!-ntc$$NWx@YvMuyzVN-z5ts1{)@*P^BQsd1}0e`NBJ$P zWxi_UbtSHaeJQ{2Aux{4ZO=_CHg7Fk2j1VS& z^(A@}>}vn!>CAliNO#98(Ee3jxbBL_biGOKz^d@|SK0E18$;xQl48U0;XHlU~r z8<3aC2BhNH-N%>g?bR4ZL!h$F9 zy;nd#_V-z~B;gvY%iadwX5b~i>`&PLTR4vE6T|wXc4d9sy}UhK-R*k*PI`*5#HShi z9CEbvj{|JHTP*8_>v%U@$GdgY&I;bMBYb`t=Sc&LLHp6lAdV%Djj?g~8<)sg;>5PH zJNyFr2V6T6tP&fAE${omnsRjlIUUwRX*R9C)xlRomqcR0{Y!})*t6rf9UByHpSQ5+p{rc zu*{P93u+y1Jwsx3xTnyr4V`gq!1V#w1}b~X5AWBR^+TW1FRv@>m)eE(b0_;ydQIIL zajvTMh`JQ&F$F&|Zu+FNFWwv56w|2nPkR0E&lnp9JP&_qOUL&BJ8`VqBmXCA{>K^U z*7JQ=6VA6Cnt#J+n}X{$+EWU~VJW!wr=U%xjP2>w;=3Zg3*r+I--sGlUjXiAet#>@@o!5=^PBpRK>%04syj>d;U7hW!Z>ham$|pU2 z-MvXoS}fXwTHYx0yabeYJnJ{Mt-RyZd?F7;=p&JqlB3D$<+~YW@%txQxeWc3v3P*C zRFCSG`UMYXJWgV9V>?>3>(U0Tp1~m=h1PK~_EW~7?G$ZA`+1A?=UcRE1M)@f#!Kx+ z^$Grz#4x&BqhhPWQ?n5Op%<^!`IDga_QVZ!OJ*^K11iK<9LjDQsY?H zoP<{1>O&Y?0I&LaYPmcs*;2+Put7zSvq7nkutEI(wrh|--;DB|91r^d@|=u3Cy&*9 z(8m74J%ieZ$D$*O{Mdh82 za!VPCzNiR3rQXN7@p~AZscKzxfKLPB(Wl3uPsca|=fMD+2Ls0T@pAQgz%f3ga@Fo- z^s;I}{*M8_`pY2Ylmyhv2-M4P)XOk7kPl{R&h)&a^7sW^*aiDC*?GIOSoYS*EF*6U z8<#qjb>Z2plPg9WAAB~6rC-R|qw_dRMt?I1zKh3d`Qe=K*Iko#jgR-YfAljrU;E*F z?U&Qm{!=XQEp<5`$jiCOhd!|>zA@I-$xi(+m4O}im|7Xe(*1{vn_`#=Wnn`9Z5rFz zf3KE^wuttKcB8gMwg2sc{x^}vYptUV-Wm6#u;1Ao>q;5e5!bmgmdJ})jK91s=q%K8 zo6c)@dvADWiR3IC??IW+=1uO-t|b3hTQB!sWt@!$q;#!cNul#-H_jgq&L8xr{yxk{ zd}6G2a`q#T489p>&|>Tl!}fH)ygF8Zzuj}xzE>?3F4VWyUeVrg9wx&l{hZ<5B-YK1 zekXymgaW#U2yP=imvJ@_nC`cg)DQhqQSkLZ&)WiUpIy$`B0oPaAn(4*IXezeKcH{b zb8o$5Q@3u(-v_jBtCOlZn+>%3Vc_fWD>>^Pfpa%F9|Ga@Tn!yJ3wqS+c2RencS)?< zCkZxxeYW-`ch+$BG_cyA=adn#tk3SAtdFM$>jSwyEhZbaQ8XWa8||ddA86wkt-b2y z_hv0;88>mZQ7><`5AA|Bi*~EEHPtS)i}mX{`wH0X=g!9dFTlsTY(UvhyOpziV2?kY z_rrC@(;M}P>sDS*oO3-`KioS|56)vbiw)5xc0fncZK%Tx@&fH9z|OYYIXeL8dC;x{ zU2*Q={G)uVr||>Ee(3*uqW|ytY!c>8)ca9?9{@k{y2GDttlzUjAJ9)mKa<=#cBzN$ z5Z8I1W)tNm+Em9yJ#kIzfpJlHT-Um>{-0>$B25p*3AkRR;5<>Uv2KhbXe@%hxF_`V zgzr7qCwV!Y15{Se23)^Y{fW?z@fURT$GO%&$3N~m3DUQ2h_QYI+xV*!Kl3c`jWG$UkT?y-+1`fnf1l>rSI6@zMkIhO-YSiTl<19(9;Z{YJYho!*C}oD#?S=G97lQ`bs;`5H;TXQ%Y^9%u)r z;aZt@n=~->7HJ?~E48&0|FsgFB;)a9qu%yT{h2eHtF-6+I?I+$_e*! z7z6dpNm8#@RF}0sarPb1+RyZjWqmO=>5J=eUtEv-j_qONLlW2!jGc$14q!uYPPd-r zs06KjbXLbgx3C^EZK84 z#uwMH*wky84cGj~fny`Jv5t7G>PBAxy)^!J4WfQ;EAE?NuOsYLCrIpeVCpFUeY$X* z(jE8W_iJ^QPHj`Y?~PaI(UKyxwN99aO#@onTAViDo75{7{YUHlW>e?J_||*jg?%J; z8_+64Z6vi9O9|}fQZQC2Xy5n6qfg*TaV)8zT`6n#qf{SwND}X%xe00^louQqOKSeK zdmI0K1jfp^f1~@N*0wl#w8UlsZ=&vLtIE?n1$H^j#jNjONg0N*crp5WK7e742P4sr zmJa@Yp^5BKd+CPxGOSNXDDKEQy@~sEwVmL;0QEp~^?F;IhIVltK=x>>&Uqkzs$KjS z7cl=oIr?rKo>84CF&|`Tt6o1RQa`y7vr`c5Y&GzQ z;h9e$Z}balRJ;Flf9gW`(}?)dSz&;urz;+5a zK>8SP0L!W10A>p~fax@F05%pJzz0}Phi<@}3f+L|4Cn^fIOqm^K;4<(0JUl00M%!K z1GvV61K7_72e6$34v;hx0Ms~a^>_>R(*YYmGInfTKs8VY)B~ii5!)uf3-|z* z3w?kYumI_R4X^_)fb`pm4_VSnJ`lGWAe|&jx=ertAUV=g3)p}e5)dv^S(}6m`g?JmbCZv(iX6!fl(`erdPHerh&NKx}^!q$#s(qX|q*(N#Cm5yVZKi!V4 zi_(EQpb=;S$c`6VA7GjTodlA_)(*IUYM>6N2Ph9Vq&H%p^6SOcjI9l@0Cj*5acnO1 z0gV(7z6+?wemb^xfXc8QTQfL%9vg9N!Erjkuy4cG4!D47pcbeDOh~K8wh?Foyg(h| zeAxQ1W#>Z&Y?-j7@?yxF8T;fr*&;hsKjahnOg@tT2}M!cEg zu_YaP`I3H$vjB~N4aauK(m6x=U3852I&3X;j5N}()*t1O@&u3#_57nWKcDQ84$@gm z`oU?Wbm%6XDj#v_h*NbVo_vV*e65BrKGN4+D=#VsJC5rRPd-qdTmac6dyR;%LwXbC z0U(<;#1pp`vQ4y)I4{!3Cm*(?o63svNWM}1)M86^OxQAt!#=wZ$AASOKgcgH(x}a; zWky@X>H5_2?+y<1s%42S#p%cDKKSX-L3YWnM!>{j>?1DX_KB;#Ob=I9BiZuumFunBR{GjxB+e(LgJ?X=i+5%n6d^o0d zLhXZLOYM>5$zLWf_1HsaU;#0TsYkK=0WHkyX?z6rc~?E3&JUn&O>yOz@=+s0SGA`4Ddd$R981L0OQjssqOsfb837AKONt9{W^}#&~=m9%7_@(gkH0O_`2OZu9yB|A;nx6?j!S+F%-q~*1M=x0kU6*Ekm4( zxPS%wRQERQt2}Us+eF7mtH+k)EZCAP*(Bd6A9hLuhxC~MvQ-WEC?06SemX$qla6C5 zGm_JF)UN{%XaZO*WN*R-r~{e+-|aZQ1NQEOA4_2mTi0FS0kwpU&=*nxGxE5L3b;R2bR3fO>hU_J00 z@Hwy#7<8e`&IR1SZ9pUNE6{%)WPs(s-N0MGFF@b4`Z{Gc0Vn`g z0rkL_faH?dU|WC<4|1^}rXvabQpd+793b zHUjSe`+<`@Xgh!hxD$92_zM_VDYGoV3ET;62Yf*PrFho^SOTmA8i4NrX_?H10@H!z zz=Oc&K^$*@eKh!1KT#fcYxa z1F#Hu82B3Kd^PG5C9{SP5(bwgdkI z`rnCs0A;{!z+1o`p!Z!en+%iz8-OjqA3)a)=!by0z~#Whz=uE!FlZy%GH@yIFz`9h z;cm29pb%IKYzB4$UGBj-1=xXgz#G5;VCcO#&w%TJ?Z9EcT!-@sSOGi%`~Y;i5BUWa z0M`MVfn7k4`_cY@#lX!#BhUg2d;tA4Pzl@tyaTiVogYNo0nP<30oDPp0eb+`Lufz1 zBH#w#Ip7DN!zT2(z#QOm;6Y$J(BWa!J>USY2c7}G13Eu~Is*!U8-NDjN1)52=<9){ zz}>(Hz0&W1F19k!39tR&N0&WD}1Nalr4O|Ai1{?v-d=l3m;Bnw@VANAG zy8yTm*a9>I=BLqL0G9(#0N(D~2Auv3+Bk3zupQ|7Eb0PS2Yd)5JcqIa zt^u9|z5?XuAqOk~t_Pk2b^%>Cqi%q5U?cE8un!pg0@@AW0qz2}0s8>+i?9VO1?~Yp z01g4e8e}#bxB}P&d%Q8C;xD0pz_z*Y(jCcjtOyF|h8Q@2t z%d0pSflGi5z`MX+px^v5o&bIVy1kEb0!o36z}vuHV8jRL+kk6<&43r^@gaNy zt_5BKegb-YguDWkz>~m_K>WvOM?e8^2k;pX*M#vEum*S?*bi8Cz(-&M@G)=%IQbKd zDS*p>dw~ytgFxR;@g5ei0JsWx4A=o21O|PEx&$r()&Z{odw}H6VG}3>Rs)X$O~3)5 z*B7|10mZ-_!0W(ofayzIPXITt0cZsF0A0R98vy13tAI_w4&W$Y-U&NEDR3LG1=s_` ze~ml>xj-dw3-CPf9Uy%Jzky6(32+ziIHzL1bh$3yHS6@0^oXJ8?X-;@H5H>Cwss0uYtqBz~9hLfQx}!fwzD^fbPFz zTmmctZUkNcyg=+9xK07{fGS`k@D9)d4E_^!2P_Bf0$v5a2Ri?SG6fa^Yk?PlZ-KbK zQC2_!a5L~Oa2Oc+Ka5)d4{!(22>b|i^uaG+43G|-4|ssJz_Y*(;8%b*V;lgS4a@+R z0M`PK0Ivh@13v-01^EXQ;6k7Rs0AJc-U5CEy6#1}03k;Sl1 zcvmxy#j^y~nI$r;yk#bawSKHS>%n^B(Q9u!TTj8`)xNAB>(2(Tfy|6mt%KPRHWUv= zhv7l!2zD|X$wsl!>=ZVJoysiiG(5sQou#rf@R;&Utj{`&jb~@$-O35f$`qE42aFS0 zCdoyT%8Igp15nK^7Orf4p}G|D_SpIyWju!YRd z@>u~ZWJS!u7O};wn3b@L*%DUD%2+vmO~=J9VQyBzJgkx}Wy{!dR>fAZOW9@Ya&`r~ zl2x;nY!zG0u3}fSYuL4{hF!;d*5dx&jf53@(uqwF#EID3LU$(~|QvwHRndzL-No@blc3+zSK zz+Pf6vsc)w>@~K9z0Mlh8|+Q?7Te0+X7Aul>1}K~dyl=(K42f>y=J^$#CEVx*r)6> z_Bs24eaXIJJK5Ll8}=>xj(yL5U|#kk+r@rjyV=j|7xpXL!+vAGvp?9M>@W5=`ycbM zX4b;?vVCknJHQUIL+mg+!j7_I>^S>}{fp}7Sk@t9DMm*ggN1IfJdVd>A#7)!$h+{a z+{BZ3H{PB1;CL&F_vXnwh4d3`5Am1Ka;2Nv-o&^Ha~|?;8w2ibe_Q{@=Tt^C-KRA3ZKfe`80km zpU!9SnS2(v@$+~N&*gc1HlM@i^7Hux{6apD&*vBM1$-g5^L$>w3waTD@I`zvFXkou zV!niz@-nQDc5)ZLgu8hK_wY)-lrQ7Uc@P5_zlvYYui@A7 z8h#yL!>{Kz@EiGBzK+-OoA`QuGrxu3%5USh^E>#R{4TzMZ{&CLd-%P)j^D@c=MV4) z`9pjYf0#eQALWnn$N3ZdN&Xann%DDZ__O>u{yg8zU*IqD2L2L%nZLqc<*)HA{B_>Q z-{5cZxA<26Hh+h|%eP?>;d}gj{sI4xf5boLO?(Icgn!CEMEI}B&nO!UFsqAlzK_M zrDQ2Z>Lc})`bqtz0n$LpEDe$dOGBig(n-=VX}B~(I$0Vijgm%7r$}R@QzeUZnlx5A zT}qYCkj6=8N@>zr(s=1?=^SZ-WR(;w{mzgkN|{oYG)bB)O_8Qb+0r!WTxq&ALz*eg zl5Em>QjU}>)pInrF|eCYz|LTR2fU%E(IAT5;aQod9m6-q^tLs}#)mWrhk>0)V# zR4SE8<&sl!NtZ}&sY3EdmC{manY3K0l2%BUN|#BOOIJu&O4ZUzX_d5Ex=OlQx<1Yo&Ekt#p&LUbhGO}bsWL%LJCOWGi9l68`7K7ThdnPZRs89U1^)NU3yP?U;04$Q2I#vSZb1XNS{cbN}oxeOJ7J| zN?%DkrLU!Lq;I9~r0=C4B(L9BM}Iw~ELj!XYY|Dx;XvLwrL2f3phBX^QxuzFIaNMG9w(nEr^#o@~Sad8Rx|w#nzoIdZO?C(oAW$aCfMO~Nd6B$WE|yC$RkuVgmCNLE*(tl^OJuiPA$#OXd8xciUM^S3E96Tt9dx;Tg?y!4 zEw7YU$*bk7NTjks2+vPjtJLS9N z4f00$ZuuVhUb#-bPrhG%Kz>kuNZuqrEI%SYDnBMaE{5nT9wAsK$R60&cc#> zk7I6$r#Q1TzdW3qA-MrcGmG=f7dvKFmd!%ub4#6`3d%)6e&G_s?1!ZXsdf}DnOsup z$Sql1p6{u2J3^>5parTzZf7l8R8r`0PcNzPAmc7)c|{0)A-RD{on@{{k7K4|nXNRx z%Hht$alWUdpro|K6RrsmFS1;qF}DLXH_?$_=qwLk!p1~Hb=e+AS(rwUsj6y63Q&`U z55#yJ?HIvL-hdRKW>R^fyUOKp&{>pMQnE@V*&g^rS?j-n760y)M?ay?FWconUTKm`tu z*i)A{!nFz%ZzyuG+F7>Ai1eUA7^$QVk!3=m5zVixl{34-;ihwHj??1^(`cd1kQwM( zsk0!zG^4P%#Ie*-hR;6P9PUDF@)uL)^NXsCt0D?1LqmZz7~CIBQB?=>0+db7n=yUi zM7MJp$|AIvMyvou)0`#cbg{#g$CKl9mQnAEP794VOwmRmWMIaY@Ag!M?VL$(AS*!8 zbX1AMUEs`j7fmiHFAC#iC}wDdxrI1yX1hwAFkyTK3OWPH5!6;>IhU26fado6(8@8i zL84(B6`XBl1uAkD6jW)~u@D(kVPfx|s(QD&vvO&x+de5o+ZVn}L$N;=Iw4(fK%uV`0% zTV+9MNky>(?YJ~tKNhuUSd;$NhlUX5lxc6uKqQ=r)=Pi8j8#mmqFy+oFhZBo&h&|> zipnK&p}kwtmO`s5VN^uzLT+V2MWMT-K&x}33!&x~LnR6ArJWCn`y){zFy_ z<-!@m(4}2#jXXkcSA3DgqcyD$vi=X|L#YVofvD;B$-1oN2v$0S(Ge`?M zr%$Y#ib6wJ2lU>cU0p}pF}3ys#?s*o&n~a{KbejwAJ#a1*U@3@G}UPP`Ji@nJUfhN zWRvYGTW^=qmbPX(yb1#smO8{cq;RtyTGox(hKh~nw2Vt|sl%8Zpcsd^`KfT0=g-V9 zqkc5>XeuN%SS1x&6vYieLuQ~t5AGspMCK_ebL6>k--uhvFtv#Ls4)B><@f?{cKK2a z`kd}6ZDgr-LS;_ML6&1tc9wBpluO?ZjzTi5!5qgWm5vIJ&5en;a98K{#*C%H8qx}- z(p^}L&liU+JTX_sQbvZ*+Rm$VxU2LlzVW?cPglaqtJy^Bdkx}U>o}Dv2 ze0!%Um0)6^y2^sG5)U;Mt-lCYw4ta0D(Repf}?}jDkZzT!h?x- zTfV2bO;xrg?Q*HNpiqqNcOrccJi917$*(P|MDWW<8Fiy!H2Kx2^STvbc(}=oM6Fmj z5&maQ&&Oyfct8fQgn7_!#eN{(Ynsp{SGc-T2Zzu6X`S(d_b)<$1WShvL&M zf&XSC6s5IM;@KdcwuPci&#x>mEXMVzEWf;HdP#XmlNwRInqg)#zsyjf-zZAPFqx*F zGM$(vEB9nN-R?@4$B^c~kY}Kqayy-iW-Zc-j({8&D4JM zV50w54b;A|eIKi}L!FmfT6 zX>w{Q=1#OpDoCFQcRDS>2qTb%r4s?_Pe7y;4^U}>pR!Jdf=jq98>lmlJj;zIH{~>7 zJHNoWTssQmVXGXBOvP2ZH0YY$*5#^$Ey_<@VMXOvd48#LvF05Oq$7AEu%mKF;A^>! zP)zy}&LtuXW!^PIi0X6B3p2iG<6iK#Sy9 zyTy!QbZSN;mx;#H9HpKiqDqZwH0vT1jjlC({R%7^)#W-dtrOXSHfprFqkO50a)PGf zf?W2GtRt3!@Z9S}xKnYi<4IApB6Nomxj=A-p?3Tg#U()#o0?!^v`pMl%B{GefxP%bkZMJ1JGQIhd^fcoePdT(KNITocC;R&J>4~(k(tv}?& z3k@T>hVN%ZYQO49>7I!t>gD0Pp4>9b$VHhw8b07b8b-Y8EoR8fOwF&*G=@4GwIL6w z!z5%F|FSWWsV#`jC@L!nIsR&+X+sNo!z04*LK9IhSr~Yc4{E~+>9FdEx>O=)E=g}J z!kYBZYADZeEo^@rxTZIhHmoYe5)FR=(Td?vL@E!R7uDbk!{pMcJg1hk2pzY7=9}~j zFRp}g#n09>i@jL{0j=B?Io)MpN8-77YNY2hg5S6+$}XphpX0BlTHI z(5c*(zA!T%PYv-}n6@H@TWZ+PW91`{&^RqMTotG%xm z#=hE$@dOp)@j3aWSpOA{8}8M}aB}LKinGh};SeUoN(yNduCO77UQ*}#WpM@ z41S~{)G7GdP%Jy>L1lYZuKI|u?QOvDxl`|xva`aFw29;F@>xwlzwS`(Cv47rFyp$J~uP+T}F4e?N!alU#?xgqbSQ6&LV>)Q0?{E@+&Iv&>MHN zcy+1}Jyv)hK`W{(40DmDI?O>I9;uwQ>W!RVjNS{;kezOuGt{V0y#~Q-D>W+J)bepR zI~{ijcncq0rNPQKp{VBO(_diu|^;F1y+Vl2eh7|=%W5@ldTdP&Z(GoT!Ez? zSbkJUi{B#9(f%eo3xh`jVtGOFTg)HzaT zg1aUcohjk;%qej!GoGWHnwMu=s4a`sY7OIde6zz~k+8s|UH=6k*edklZ5CW+B9PDt z5=DP5ifgR;KAtW3I;&dt)BR>~VWQ_sMHpfmdeF+&Ih_Lhp*hdhef*N6U;<;Qr-h(Nwda8c8D!iBFJ&@wS#fJ#&U7 z5vC78B~WkB*0?eXDx9UbG*f$UR(fXShSDg=P$S0;TIi~1Zz7r^YcGLzG7Ez@|Kt?D z)ML=S1?5C*P0>2#U$?2RCGclIip=NaFC)*WRYk+bJZXvBQGt%FWKjtgj8O-N?>QMf zZlnSZs2mz^W-P|tRd)HJpy@(&2~+E06K$y!iZRfs5VYw=%MLYev?~sS*bx^SY7(ej z&0B3vPxy6)0V32+43`+T<3(Iu*v1wXB^h;bhQvr72s*Va2HhF9s`bzFgk4D}lA~Kh z*e0QUC?i7SK!vnh+84GU+A$-PL_2PzqM#cmeN`kz`bw92m?FNy_z?f461uOio4~M1V1oOZ89-203d0{bqDp7sM zH8gDsy@7(OT11)$Q|ggPMz466VEzCQJTMBn)~qyVqsUboJ$&)%t<`9vxLwvX zA`PrC1y&X`RUvS((iiX6`_HK`*6BWt^3ztkVaVF;dE^T9-x7ssa1~)&oL@dth0tJM z^&Ks&btX7;bz?d*y0aMFdE`6_q@c%$ZS^3qP7CK*tHH5hSTsYaza|-hrakBL=fdEP zC&5GYQFQctTv&=C^+@W)2RGbQIpFBnq#t*@RnA4C`sac{1J) zb`<3~ab{qWFlfplys%#=cnVn*)0SgsRD33uu2pJOp3`W#To_4Btl|Vb4lwOkkmFe7 zc2v;&y!7$Hpy?mMgPcn3%U9Z`P1K|4ts4mcpDagH*jk-Zxwe*f^fnEIPqdAMR1v-N z75>#c>RZ%d+OlR!XKP2%%HV>j2^cUC+ZoQeD6&DPre-Y~ zvf8kt_r>o?w8i76N9~S(ZYjk4p+VXBnfj+nDl|(Gx&yr~bYbm_!2d{#rF`)&J!9Xo|{O+LzeE&&U6H-5xj)l_Nw=PaF7c;R~MV+GiPYz%NOs~1;m;NVd z^ozL9QoEu5B=5hGk67&bXA%U!w^Zu_DnWM%!`%sF6Bdnvz#t2(fHG zzzda1YuYDaawcr7+@$%m^C-Q%$DfEksCCJ=2#HTLuptf`E~ z8^d>_0=&R!p_ZY)V+f}fW9br)gXWbnB&5&yh9lF;^N1vM*?B~kb~hGnBNltDNaZSW zBlOo8hU1$u>W7o*UB8NOV+ERtr&R_HO(0w`5tEcg@>J(V*Bo^=RRS&Zi^hZKTB5Ew z%9g0pBeq1HNHeEF-nM;FW8p;gp^Lh3KerMK)GLDS;?<9IXdkwq?_&Aif)`@LsrR$h z9xAJ(2)z|%uc8&eN4P>>*@P^JHs+S#8#WP*WI5be;e-_kSXGSYlTqeHTj4p~iTRu0 z+eN`2jYs!fv~n_BX4{x}Nq1?9!SX=CwS{f$QurRWo-`_ky_I1LTchEX@kNVpFC5NO z$_-hKst$E>bd{lc8I@j@8J$vE!FHnciy?{j!UtuPTCBnJhgcsfU-c;pGR{YTJJn0a z_^K_mqc)LNBf(dQ_I!*eUDWQ3MzrmjwwY713-KEq<5HK8OAS}^@Zv-~j?PtW)<`^Y zGqFy|oe{i3P%Q9ZsY#{zE__T2%hxf56ZVV+McX=+EyM$LntGO2p(rw(3mvjh(^#D zz?>Di7IB*EO*R?>IrR3kE)eEq(BG^x8cYlRiZtyz1rb^(4gE=H6geYmNLK^D;^zNu z>%>xO^+8=?2zGY4%BQv$SQJJQlksv7-jzB58-9rsw4>X`N79yr=;L(?xj3*45va3&rtw2ilL& zg(BhXZf(aJ6M0dc47$kcUP44;hM2er;)R$+4&v#SjZOlAjPg-$rTjmy7tT+j>Nhq~ z=C1WOpF)+`EczuXy(aZ1JVB>`b{mHUA@l<~3qhloNyT5-(S{s>MgqjtS~d{#-~ES| zHuzbe@B*#h4r*ty-7n^xsDgGs(GsOFP1CgZ-~M>`6Oq<`heG`kq@b47 zzIHI1>i_Aa@D_+SX*oK*DD+{y)Z*a9jKOy4oqD>2M`(9snl3?+9VC|eQ!*z&)f<0g z5w%t#)6^fPiINtjv#LsM@v!z1Y?SK#BJ>5}6Oy2w`-B8k2Q!QRUwdx?7iIPRkKY+k zaUXX~&B>KqA5arba}ZQW)Dc|BG(bQ=5s*c}OmWFbEy=8?EQfvA$2BS~T%$4@(~?Y! zOpVfXTuR*P_dd^k24f*%eL}%gVmhvRp566BEI#|u%A)( zrjhia+Dkjb#3Y7Fr$gc@&Jb(6shPLmGL_{P`Q|C4F0{JAtyN9a$lh@K>84J-HZ)cn zBzcJbgSMH0X;knf$Bk6XILVm#Z^LO!df#qEdep&BHoR!*o zz1Y0NrMo?*=S*bbhb~aOxe>PPUrI|pB%YK1JGHj z=Do)7P(LBwNi*)9O;6VAe$wJ9Yzb=lJhVI*6s}tCjhPIuqOJWg3O%4V6#GCx0 zbe1PXCJN%iEgM6^R1F>0;Lxn6OJ;1yYSQAlx>OA*^YfKjo7Y!G93Y$G1?;+S&D+pv zQ~^tzqZ09DSu1-?O2v>*7+=V5SgV0SW|EhrWi{HHsA117=?g;^oiAz8^$*@J3T?b{ zMok;lA5ZTS)XphBGjUlB9_H19hM3p(CVT*) z5w%AA*d)U#*l;TpH}o3GkZyd`uWDm$LmHEMG^Q=J-^#1@l5LG9Bel&G$i-#*zGn&Si;tB#6eWBR-xd9!j z7TvLJFtYLNNVTz!sMBn~52X-+irToypeE35UpowfGa&@Em}UGL6n$!SzXzTn*Yphw z4-QG5DSp1(nu+P$iq6lC7n49M3;U!T$tHMCK%XqKkr!z+aF%A0PeVfpm7|nQf`gpA+DM7h)%XK|Dn2m!L;0GeDVy0DLgB% z{Iru)5S~3G#zor~RVZ6gy`lJ5tJIjY*DCtPM29!t$Gqf5dYLOti;lvpO13(Z>(GPM z1ia2eA*x}`8Mr|ZMOoVDPrenRwWr~di5rVws6w3RpVn_4i@Atzph#85OCI9)NUhcf z?c&l#**-sGaxRyN#HCS%&#bs$yR zLectJDrOkb5du9D5^y^X%K))+k+{teGO=h!tv26PFC>C?&!lfa*w!>Q*d%8gi(bfE zcwKC#K~IsIrS)pl(oP{JW!bJ6DNc*yC$4rSz*$QJJ7Lz<-ds;g5{f(A*lwx;L)A-$ z4cc&XEMyVgKD6Bk^F-1j9&}|~d|aB%&>>-k7$PqEVZh z&D=obFm($XN&f1XCz!-)*;N%^j@R+v1 zWa(Rj!yZW*^&L`ZxMRsgCRJ?E6YJ^X*@2w{*4Ph?=H5tseem%!+JVHR!nW?D8;gv` z8NPUpAeog)XrLb?Wj;Dgi{Y^hPlD}DY+pgO)wFFIap@!`>qaufDV9lnZD$8P%BfL> z2Hb|8iQ71tsvS6dGHzgt-rAO9-lj()rUN$8kJ@&!`(63 z`pm{s6|QG%D`I}Mk&S~zrN*`l7L~BSIo{8T!&-K6|9Gn=o6z7Myka&qE7$E~Y<*MR zT1De}4%;Ony9v=DamlfGK8{QHhV!G>62=FIhKE`GHi)rQZ*loL{j%Cdlt>@dMY&P< z7~TBHC@XJM8?&O5ZfQAugGGuZTJED@%!ZH_%HV@NR`$*`YBgvi@!&M<^op-v_+zgE ztQD}bWKYbBZj(mhAX%$!y`EKDNI}rf9+0%fpg=xg?S2xCOhlbHEJMW>q<-+ZIBTD= z6f261V(n0y5f+Ed((G%Hcy$Cnnn~ZpoIrb+SZy~I-`Fmx;@3U{$4^5Xf)`8;3k!|M zt%i7OS<-hw1I3L}=!(TZG90zVYB-CcMLiloY9G&Fe8dDVC_)Vn^y00Yqt;W#ghkh&qr--uUXzo)JgIbtXYW0r!V6ymr~Se@*SJT2PfbjP_jB^nU#TN ztUS&K@m7iW$pmbiM3>XzW;Qk}YN_uV79DQ+or&7YH1vgLQzd#JZsjc9SWlnD@E5;H z<2`KFOw_QpFru~;X}!IFBwk*H3-WbuHuE#pro}n9q!B+RX}K|}NddG)1KcIb>V=cB zEj;}B*u2>!>ftRS?u5pLL6)b~lAbgGY)xU37LS0@<0He>_|^`*+S)Fnyd`)LNbeV6 z4=DP6txxnUKkG*FiJ#?1JLbjHc}yJNF|ol~;DpCGTJbGRaSJ=zj0gK5+ZZ?26WH3b zm)9O?9==+Qf2&u@92;9v*lv8R@EGgo6&xR7b>n35jtD)>nWmnIDqH=WvzZPqtN9jS zmJ2Ux^+d)>)aME~AB)53T}UvV4VZ0mfceOzhw-a+-*<|`=7;=)7nsIPGgqn8G``40 zQM7(wG(AS|o|vYJLZ}Ust`BBJz^6j-hN0O<*pM5|UKqbV3#NwAn}23c&Ed3ECgp2# zc>n{CM`nxAZIsX?4&%raZ1d!mxES9kTWo$e3CCu{C3^-ZghW`&(_;5n`aTzbf6H34 z&5xQl9A-Aw&od4l!xx#ESYCXRZLBCa7`7m;o$Bgd2Q~jFhKU@W#?QOdk;YdmtsSlF zaPy;DA>FSXUz&(RJsyk|*=Z;_{b!M{R}^6Qe^UFAX%aM|fbY zXi(nAbpw#6N9~15>KyOkpCchKxa0^;ex<(>o4K?!t_1o+~75k9O1FXbC4uI77lH30Fv%CSkUOpGf$PgqI|g-{tu#C3KT;s)P{|u9R@A zge4LlmatO7-zBV(P;pPnUqV4bm4v<$&XF)e!Z-=nOZbk2S_waq@CymQldwv{8xqRz z^YYtEsFZM!genQu63&+}TEgWLZjvxp!g2|}k?@j)Hzbrx{nk;!J`%b~_>_dc5(Y^a zE1}U}|C0R0_}f>GVTt=wA$a13ON4mFB4iV>6wA2iYK;ReH6{f*cu59rEHcL_cW9VV z$bOg8DCaw>dEx_%w1)`J5ye+fZZPq@xW1S@>41AF_{3K|b@mP8D@E!b@MGeOcG4Q- zaSpUwom9sONgj-;%q6oKdxTnsQ#tH>WqkGvX}3Bl&kJdL)R#?2g61pKR+{;+tQmV1 zgw1B>#nxkwhq#z%nh$3MV;eba9^k=39Wf(Luy$ml1GWLj8M0T{{KRm+#|cWjPB~Gn zYM%+jqr^yuDY#CG9G{F0qhn@AhK6BLU>s96F|spaYLBzY6a1!5@EzthBoy1tGeM3B zDjEn6Iax6MqHe4jH+F|qXLaL*92Add5 zcjafZrpR9!3iwcH zTHHwJi|fb<&8J6OVWAVF65}Jp{FoD!?Hi2u=i}n=9R!v_)-m~g72`XEf&n(tAoHDc zoDmg|8^JLljD1TylJi}|zoTDB%zvGtUleHAQIj?sL&|Z-8OA#&MiJ{NqrhYQ*|pAB zsFmVt0*sxOqq(tSw(O+H^QuHs86KW$#$tK@(G>$d9D;`pb@27Xhkp3j#P3C11D~xY z|6uGcr4=nsJ8uk^(J7NS)YvGIpBNbzFCG`;kdG*%$1#+|gSCQppvBlJgN%eLb@mkH zKW)Mks!fvEcD49;XOqa+#TyUyGf7OM3a=tXif}PTTRSwJa+i!mwqR_YOzcjo&Uow# zL62+L@FwDEGs&2Smm7_p>cgl`J57FzSHf&7^|^mStwlCV@Z-ig>%WN@Zma?{ zNXA$i=oTmdr-%DMN=*IhK-C~$N5*uZ!=Uq^j!n>;ptB%VQ^vAEPR$sL0_j1+ofu08 z-3J9VM>>#83&u8q44@e;87l*IZ-p@ix&ZQS%~%mg(T1@EP$g(gTgEgXM+IhT&@qtE zjbYLtMbOogD$k=X>b0_4Dwkbi6f>a=e_N4%bRG@#PKZwOY?Q`Rw zB)+U3>ZRXR5*j3Q3gr4q2~`pr(@WXbLh48_G5^GLUN#P-)E)#wWyADrs1pC-&n@$( z!EX;_?5laoZx)>5mE}il|1VS8KKAb%kt1KDo&KGC>ZhfAsm=e+pD{gI2(HB7cH&?8 zCf+~BdK-}rn(|!R_W$0Fyx(kT{BIwxU$3g>*6XX<%g`qciBqji5m5{M16gOXl>D&8|EvGzB9(-D?9}&= z^!Gyl>&y$8kFblG)tS%Q&VOZwm|{BS)9GiPJELTQXBM7uv(!IX`D4``##~n#Yi6PH zkOG^-0y8cB*&G&1@$moG{`-G?nEZ{vYT6}9EqI*1;Q61yRnp%IDc@=---pE^s3g(< z>wmIF{^a%k9Hc*EyX&8WQ2)`Nt>cy9=JWNCaUQcgjn5>;{FdwMmygbcrNxL|}a4 zX<7k$wCif{(B;$Rr19lgTHkE)F1w{M%<5uC%DQ?zjD5%?wXdg9H<+5k%0bgo>}mfb zfAo0*p5I}GSEy;;^$wWk`!MzA9#wDgyrnT4R5O-sPkScv4aU(QSjB^vYv=>$SW{ry zGMg&Kavr9AQf5B!yg1xyu~L-T(YjLXX^*%ctoX(W-SRTcyZ({7d>^L%W?szK2-Xe( zJ{;>ioxLgkwfdN@T7sMKZ#bBRAULYDs;TZcFUxLw@>{WH?#?&!6`vnMZhwAe)*yq4 zH=FDaVAj-)mb0flX60Mip2%{j*_*;x3!^vTo{W|Gr~Z6mmb+Vro;c#EX&bwW#f*wUyg$7lh2$}?+;@jV38z_Q%NH2<~o#VH!)iTC1-Q>dAz+tT>g z$}?*P^|81wQ6sIj(Boy>V_$KcijUbWVxc6hYll7g;VoEfBSw=w4}O+4x1~{6&cpbJ z^_L1v+hR-OUn@_V#<9XP4C@8W9KqsH{Sxf4AAQF;Q2KN=ow_BPHpR+8(=zPI-(n3g zI>=&DXh7*<%d5ZYJ>EEm&2879nz2lK+GjR?xC_#1liE4hcp7Tymk*oLSSzEq+859H zRLM8`GhS+#cCq#2yexa#&(l*YEn8@L%)AZutwat`#g+iT1{kHBYW$!G^~+RdNPC!rH3tVl0Uxun+X5Lsu@#To6C8w_SCt1GOvZshvQs)lLH_!zavzLxJu zSsS7aY1Nf$PkClzPMYh@Vvk*6tMP<&wR*UCMK5pF-;=^JhBl;CSMo#Kqc&cUHpX&Jc zy-m(fF-c)un@$>54w{x>PyU|top-pO zBYVm-b2XFAXCB5w8%t)al|A)AkI_cpG10-a%o1(4IK8u_VJyYyo%XlC-mYkt1}7ug zP%tuCYb%4sa<;4f zQoBb!g#C@@3RA-4jF02%zaLBwuk34|(eAY#(6~M9E?=NVS<5d03(Er|@iGAvtR0^p z92$r>H)BFn@d=@lWvuCi8DC{+L{H2wE-pAZFgk2mV3hclx-p5he4}E*@oBO!dI7+w zX0@I?Cv!z>`BC}S>M9Mn|6RZ;uZf_ljt)!>d;{d%$$@Er7bV^R9D%jgBv%1nlz0Ja ztz$t7$O$`O%{2qB1O|afPUwJj*d$i~)gY1+-jw95GuGpQNKW_*i1ZCWp$nH2o&=G+ z3aE7Ea>7F(lIuyOdqX^zX^#K|l?N{E7KqMy|MvEB1tAHsWk`wms z#pMDp7DRHw4!yZt2@C>}oY0{Umn(p35XlK|N^;g0{R<+w3V0AieXS>1KQ1TS1rqH^ z*q_S@vp}Lffd)xV___<1Yk*ZC%AauU<6NEw)PqP)7(al^Q-I|lk`snt{X69!3)F!~ zPUt^~%Y%R#5XlKW2Xna^m4zHiF9ucY#P= zPWS|u6J~)(t^*n*IpOOgxm*LR0#SVk*Sd3g8c+`+Ibr-LE>8iLgGf#oGMdX{fjSV$ z3H_hs@*toFL~=sUF898l9v-s z;Bvw&5Xp5wgCr+>eIl1@fK?!>58>KLT%HEhgGf#o@6F{Yz;Y1D2}69iJQk<}k(|)~ zX)X@}YCt3>^qkD)YG4|Oh~$J0)3{s# zRD(!PcvF%yHS7-}Ibov2rvQ6Tm&yX}1W}wx@nh^A5Y0i#8F>E)WB?xvd<8^u4e&=$ z4asMsT_8~o+%NG4pkkJk4{)r+tAO()J_Y!m#FrCFyb!?H(;&(-7Wk6HYvwTa5s2hf zK=v%>342Jq26zNi4IRT=#+uFJIx1j1$j}9C1Qvpvx;lt>GZ61kfhTMog!iw&D}ehz z-p=TE;NoD$wBXZ#pMji_j~>`*KDV0^7$)(tz~Lb%7dk57T2M9kG++kFQ8yj%z9eU% zjLiq>p%V-27sf;%7Jzyp$O)S*;AJU*V?kp6z!;D_`i^i}IO+_Z@D0#h@EYK)2)qvl zo<-suV8x`L=cU^6yO$68svme$1%1IJYiWp-U|ay_zkE6JmE!9C3sx|V>du#E0)Mu=2F-Y z@^WC`Wq212eIx+4NW2EvB#Fxvz(k2p0bZ1N1JEy->jVK0O1vJ}XF2Nph=YiqfOiH@ zxZ`>F19(Ee6|fI@!b>1EcmuG>N{r!d4kAW^-wK{^6-Wy{1vqdO?=Jy(H3jd~QCgt$ zYK#-;5N-x_2Tyo)4f+KcvlcS;Yv^uc*4CBPx!0E6TY~C>kw{`c*4z~a->ZI z4%o>3RsjAC3W8j*iLt;}VITA(q3342mk6G)08|NH54;T$eIO0*IKBq|fm{PT1|qp0 zsM&(PAUQDTEyhB@6IOzfz!Uxs+63MJT$|3*rUARX4W9fQI9uX_fRXQTc^YuzHuxUW zrU8Ehk#8G-GvDJnLBIlu*8w}ek1+^+6)6o~w`3h1igyaw1jgV#p^^aoL2 zqyYCzazgJ+j2ZMD;S|s@@F~C+*?8|0d@GbrfP09Ct;&E`B%V-~!{v^^ zK@v~sA@N?oY!Hoi!c&r*uv+2?U2}Q4!+~w`Fn@PP{{r(tHK0t@p|C*)HEJOv^-p<@BpCk&N%!Y?KM7_fUG*C%|Pc$BLH%8KA8$kP!x z14MZeE-Xf@gFFg&4YUos0oc0~^#6jxI-~(VAvySRpz8;itEgOHIEeH&0ly<2I+eil5`O`hRR-HZ zKO5NPL+%^Sz@I^(kY50{{upy7cm*&6w1V`3e}dA$*8tu2@v?>kUjk9PQi1P~9OZ5U zmPot~SV27MCZfbw0cD?HoFh+1;A+qn@EV}H9JYNFV*$7ZM0u_Qrb|3wfy5U9k4Ze? zS&1k7^&or>`BVcF55c#=Cjs9BiS+^Aka)+#@EH)5)d#qQc+@!o_=+S?19~4}qAwA? z1tR@);71a_5BQ73UjVi~%JbF9I(67AC5x`Oq$#uYxYSbC+O#ycL9p@6r zGYF^yi8{aym(h2SYk=}U5SPHO0B$y*zrd#f58dSaVc=B|%@+n>+dsMe`v6yg$hPUg zZh!ImbO*i&N%fNs4IrvR4e&?}#vA0PfbH&}&W|~;j=*vd%>@SF#=Fpg zd=t>+9_I;*Ksv|?o89MfC*V2|)rTW#SuxbP9qM**MiC1Xm+eS!CS z%a}X(`@qP4GNu9_1^fj>eRKi%Y=6$r1;)F`M4w3jzWX@mw*dzak%>Mg0KWy@?}hje zTs4&QDL`*mnK;G?y@$!z1?Uid3nJfeAC5Xc!EHk50V4nO0=^*eDZpW)Q5Mn;2Y!NG z7!tsj1J^tQeemmm!{*4?ZtyB#{oE~B_H`te>w!@VWvm?e5E?+_ z8-ydHWb77f?hgDEMEO(zofdN)!Z9FU^pP5PE}Glz3NRoR`9e;Z0U|%o1}c{Dv}1rZ zaolGJpNZ!>bAjI^$XF55o&u^8xjx~jr80I5@-e^{K;__5fbW24jBEq$mH0BCLE>wG z!s#wnS?z1Ab()Va$bjW;9bxa%Kv#8TL-!TJ{|Zmi1IH7>Ls4=u@$_|gMc4N zydHRgc<2+}l6a>VP$r1vgs*~Ven|tK1(9tD9ah2@Q8!26Ga%BR3;dXP*pRJ4+d&b~ zNdf)@It;!F*f&MSG~iu;;h+`ZBY-)eYVcZM;%f8@_#|LDi0-8jzOn{>3wavwHi&$n z1~_UhFLw-34RALlF7bL`>lbR$$Ix}N9b1atvWT0(D$ zCwv1$Wu*hZdr8Jx^~LxFI;3)aN8kwJk*7N_QsR?;R&)NkHdKXglUj!e9`|LxCTHs1Eyp?Ox%0M_{DHM*&ZPsP71UU*-N!_~d5zC;E2` zFatz7*}xw_G}oU62B%@1pgy6%91xYO1&|%0EfV)A|F2cTVVm$YQ{eho@82Dqr^>1;VRA32+ zY^Vb^PnWSl&`|?Nzs=h_2Dl1DI;p_k+jy+&11tymLZ5K>d+Y|du`Wm@zNe)-gYOT zns~G^3YaDFr-0{n!zYn{70|E;wg6AK?E|C%PZ(0h?HL8k230{$`0+>F2lfF+eavk* z26zla^Auspe%KuPI$+qR@GPn;p8+ffQT~LTPw_fC1C`(67<33vd`KX z9e5YC0{ng8t5^7WV;b=7tH=}bZNPcgP*3ndz-u5HM+RUo10REZfE{jOY(l3a@Fa-* z{}gbXlbjucTm|%ME@xN36Ao%27yX2ABZ%y|3HS%`NNWH#YsuwKz^)SS0!$(vIw`=n zK;8o#M4a48&H}&_`hpU`tAT}}`zV(%yseydgq(04$Q?Z4EQMV3!vNr4pmmV5c5?P6 zXe;=1U@3^|sRRBd@mGM+?RnZ%U{VJ;(?FlFT}R%=KEM}1ddO3OdpgV6@Iml@;GV8> z)}46Z*N@0qC3N(_5k2M15ps86IEc!P08Ub(ZIF8dpLz_o#rcT}_+c;PgY&d~z_TE- z51~tM&J!j{ysD3!U4C57f{@P@;8O#*&Q{=n!EzP_xeBNTX~3rezXZ|!mSeyxAgT}H z^dWMlh0Y9M>!G~83gAdV&UBCm0rf=S2@N1IZUfi5qP>u(0!u-ZzYe%}INFH*Dg#~u zQCZc%CL?$~oq+2=7m$`POOj^;_Ye>L!@!><{sM5^6LQvSF#G|y1mp}}59~1#b|X1( z9f<5kIMbc?R{(Gki1LgAHX9{}Z7|k=i6C$ANxAle1XF4Z?5`=@V{{c*0DHC)_9T zguhBWp1n&%O&h4@r1)A zo-jb-31cLl@E}M7-y^&#$qhioc%CQWQIHOP^8f$YX8}j3;cSeR;jxkuq`+@?AVB=% z$MO6MGIc#UPl@MyR^*g8m1j|#k8!uZbV!;bV=b^c#gR1wUZ8^TXTWa*y3hE#YMmpi zLFh96c4Yp{lld?&)(+e>Hj`n;WHx~X;{R!EDw~1d)0i)QlMe19jvC=63=`A_hvE1& z3uyxJ{{(3HLxWO~=2SKjJpJu=yoNhMGDsb1&T?1+ zi^C(&Xcms#B3Tp*L(b7`0gHh)!Xb17HXJlc#QFFi&&gN^$bF$3&VrG~6WXyXSwk&bemj|ZSs_fT*#&<|wswW$Up&oCSdF-bcZch9KJPoQOkO;S_&rfCDEw1H-+ z15Hw^{*96z7u)a7TA}?$+s_hh5Rcl$pnmj6)*k}vkHG(Aw;^m8{>Obl)*k7|%8Oz9 zU}z_sSdF}f?6?&9k=S`b`SCmQpRrkLu z%6}TZTvu-|q>4v+@}*dl5*qJ6YU3E}fJwd>gF3_^7h|2tC#Y^wXagS^7#pH3$Pz|7 zv_aZwV#(oRuTr~>_9SoOepKfXfsn;Qa|qfTg@25V7u#ZPhdK|muMISAWun#NYD=#h zNw_a8j=~wJC-qf4$~El?iY+?F8u`PGcjGuWVngG776L$H5&0kSO?Q6?Uhr$y8)HXDPE>vea1tSwUGTS*clRS?O7tENzx9t1PQL zt0GIERhdx#6PT7iV=WJ!ROSX{ho~_FE&Q@m!WCvwOWXEPFWv67PW~XJR zXKS*x*}Ckq?DFi2Y<+fRc2#zDwjsMFo8>s=C~};0lsPUrLXLZmD#trVofD7~loOE? zo0F82l9QT~mXn^N${bbb1HK5Ih8q8In_CaoSGb#>y)d=b#S93U9^JMU8~Z1Yt`BSZICuX8>>yyrf5^OY1(wHMyu88v}M|IZG~2^ zt<+X&tF;Dgjh5v*+;L;%kwMp_4$?gRr%HVhWwg*R^U{iC~z)N7Pu4$1?~l^0`CHKK|n!JK}11pK~h0V zL25x-L3)9vKwF?IC@Uy0s3_1ER2EbfR2LWuY6@7PQ=y{Jxlmc?QYaL<7pe-q3)O`I zg+YZ8g|UT6g(-!pg=vN9g_=Tbp{}s3u)MIMP+wSCSXEeEXeg{HWJOLziX!JCWsysf zP~={uFRm=EDy}Xz6xS595~mVHiF1jv#HBqbX zwdXarR+g&ByGUIWP!v=YQ50L0RFqPbT9j6lUZg3~7U_!0ipq;Biu6U5MO8)BMTVl9 zB3A5FtSELaRu;Py3&rlms$%bAb#Xv(P;o?YY;jU?N^xp&T5)=@rdV67D=sT8FRmzV zxINw_>XLwxppuA^*pj4@l#W#Pxld<;S84v%h(SQb~;aV7dU7k^qq0gwy zsLH6$Fl5wZuuP{+MW%D6GSekf$aK$CWqN0-GXpXe(l|=Rc+q04RA8J`V~jXqe7In2 zcw<~dU`(W9JZLc%DliVJF$SFA|1R)-Z}@!#d_EQau7$5xz|X7U<4*8z7x=a}{5k?Y zoeF=}!j~)H$JOv*C-|=meAgSk6aha_&{S%wH8mQi4Cf4&4EGH0 zjDU=YjHHazjPwj`Mj5PI3Cq@GIKieau%|a{8IhTknVOlNsm(0QtjMesBfAqKy9@ly z8q50x3&{QdOzCG^jMTG^I4HR8y)eEicuVR+Sn`Svl_c!WWrFp;2lCjY^}| z1ZiS5DVj8mMx)b|YxJ5bjX}dQ6d9}v_vD~TGp@5Zdm3j)%D@p<8HjQ4StYzyfZwX% zxoY@sY(`b43%oD_9;k)y8N~Alcl3E#Zk3gJ&Ar~Nrh}z|V2u>CScSGJ(Tb{4D$Ehr zu2`FjIw~_X8A4`xrU2hk!iTD|)$kD|{K1eLgkBCpk1El33iJ;{PcT?p0c$eYi@`Q} z%1_DjQ=#3;jB@0s&s4)x)$m3EerL!D5_8k%3CK+aFHj)T{wFH-}^nlOhovbN|fSqu3Z8CLwX>2&;pXUg0iFWvkg=+2V%IVETNZA~q>b^K4| zD3^esRy8SS@;klZ7CdIp4wrQsHk{qwqSe|i%QvSLZTL0Wf3EAg0e`hkcY9*#u^-Qk z(Pmy-c<-?re!)L&SDx;9e#iHJJBNPL{@K7g0nQ`#P5LV1i93r{ozl5Kb)eg!O~byg z9P0eHOWR#}Yri`b?NuH;;?2%~KeKJ)(#5B*XHITC@Sm1(XWkFeznV7UXwuA=lo?-N zT->6b76Lu!z;VD(e2)nJ8Reeop1e7kZ1Vdh<4l?o%R1@ym{Fv(0SQ3IlN7l6(R%+ zZP2Mb+R9}AI6A_S)(dUvcL)02L~sBIJxI{Tv9n{x370cVZ*BQ01F@AA&(11|UbBk7YD#tpprLBA1;17DWy z^?7!?tjW8DWBVRBws+OR>oMz(-VKeoyn67~%i}+|yXnz$^RIuR4*wu(|IOC?(g`?$^B=bIu3BvK`-K^~+E!d9V2Vp*x4(p8mnWW=_Y4TvG4MyW3*I&`iS(4Be}s+0xKm z`TFI1D~?Wm=J(0(EIZZo{*$JjOG9_{Mw78S$HO>wojSCdjW4-|#YHPUgJZ*7I|}X5 z7mm$3wDd}hn;(pi%tb|oxwb`a;y`aYBO-WNLYQk0p&JQWcIe0jN*esNUlMlhDRwx9 zd1vV`eLpNd0iR>X_RP`NZSp8#ZFph*5Kd=S(V#KqD2`qC-dj zWPI2xAuL4c850*96DRHpg-nJ}Z5%rEuRTl!DzVK1FVR0NZYhFLJc?EhR!(xm5N>#A z?>0o4;HN{>bMAFKxb#&|SzpiH8RsY5s{Y{l zLkY)vo!-5b$!|~jSA;{p;VG&d(k<_UM+gPuDy@>_T#jdxpeRk8S@PahU#g z!Re^&uSdQV_W0Tt4+eEST=Dsn9nX}nHuP+r@Z*+VgDR12bS=mz51@O`nJi~4SeU%=()#^CA@R$+zZ#n{cy!M zWym?ft*H~{q$W+8$z+cG1PbudZ$Y-cb3{Ty?C7CGV?yF%ha`xuL(_ohV>~`M2~80n z@gfLv=rV-W;krIc*MVX`>%00@|p*%f?Ku4U5dh~T{CA2Wsz`?0r zWNIq7P$}&k9}{|J!>No@l|u&wWhnZ~U^ij7`(W34AaDFxqjO_zw&$cEzP~6|6F`IV1-b9C-Rlv@h#iOOv*1A)vjj1j(2sB z9D4QgGjFouJE7=IdMT6@Py^BHFQXVS2Ym)b(oo zUmru5r7?yDSNGakn#Qo(DB~EO|4?IiI2=hF!vh-|!~WQJCoGP}@$g2+ab`%%QC?*q z_s;Y3`MAwL8HV5%{;%uOe<&W*_UR+h|EwS5KeKJ8I1SKs_0_{j;=dwkt~R?97u?iZH)wP5U|qS&}!xBMFTmEyz0 zYeTno-QPFm=jv~I<>)_>FV9%^`m%pZ7)|Ir96kmfu{@>UL}6C*SXyz46H(9rKp=+S#XM$Y-%fKAF0< zpVPgT`}3#0?ew$4C9dErK91MOX2VkcLMw89aaxw+`A28^)t4se28K+t6d~R?oG`${ zg)m`&@izweqtX~nh#xGD@n!Kt;-v^J4)l?=y7Kh{>vV%7gNM{p9hwjyKR6_KaJbtL zoGl7tsB%3WN8qWUt7fQXuxV-v2o0o0D6n^wyO{*HiAN)|+C1Iy(Qkdv_=R*C_uLcv zT3<3dF|iu`telu6J-Pd}0nFF1dA=|*DQjK-W--n?f9!i!b84$Y!TPCvx4)xu=zi|_ zFUem%7SZ&~Ubo$gKfN`mU&ycvKB0?SUpf@t=5~|p5m75%?tJvOoj>jT?VR%HlD1#H zk#KhJ+#mOk?CF_wDQVAFE{@8qg6oqHr#}8#o0Jpn?w^~xG-Tj>% zqt7&7qPX8Zd3Vb5MUl52Y}?za^T6w?o^3w%-Dl5t{-VR`#cYUsYwhEk2mQSB)|`A< zX{T+2hWd2-q1VTU{!ZFD{m}XyYf|SK#_pb;kvweRkmo-oJzpZ&TzN0>e6 zWuI{$e!c4RPoL@)5#s;O{>X%)BR$5f+ER6BU-wGKL}5)61;SK~6sDR?n;3QF%iq5H zq`K#f5tpV+G7VELabgl@9wr|Cn!;5W$|HwM?KOqJw}+e335@1>chTICO-H=@p9PSWvzD)D|cOe{7Uu*t)nk}IxjV5Q_RZ_8F_aOx4G7# zP2BwfFlr&x0vH3b#^Se=#@BE+mWCz$BkGXHSKgC$Je{KzjI~j8)4qZ_V#n`w{xOb)&~aF$?6~0 z2`|=cP(Mhx_N!s>xw|KV^g(Ka!V7I}+{3>;DNc`Y%SMhYiBH3`elKE1>O2-L;r!cZ< z^Pu(Kvh@$59Av@(1TE>rNiOT$ooW-0GpG7j&_g}d{(@7}rs1nw;XZ({dYv&5f^(9v zROn;;jo|DoHA#%jrkCNu)LJe1`tinw2h&x0ym=#xBZ>x;G@g9CXf#QKNj&vRs5h~g z#6%2m@nWsIXOpd6g5N#3c|eeM-q>cj{iF8xaXb*>r(U4)QdKD_ys`s*8y1^+R2 z|D=yom&V*Ix%on(XY1nr^ERKnrQeZot7p^p55fbdD$gFfe&(7!v=5HFJlOH%+HEIBy)nMy}wKj!c zwVgaK_n(gk9$dCzkYa}B?&5O?E3dY0)#;1Pt^XW4;@s_b#=rPo;jy#x^Cmyl_tY|n z>3$avG@+COS5E?iTp%#|skuJ@>@C zp?0bt6aVM#v$zg(6>u5G;~uWU5EW~G{;!1Q#;(k2PVVZys!hAn@MXp>|4|(*=6*~ z-%f;|JbLf({-2$EzW3G(ul0U2ZP}VT8S8p4Xg_0^I$?)PzmNMw9z5uGqht7nmnWPW zoRRfg>LBGCCEcHX$?2z7f1aNb z{YHxmvp;@%&u}a7H2rq`zWp!mn7=mOV@s`X!??~g z#&453$?BB#FgLi2G4rV_t>^UFb+gxrP8EYz^nHA(w#U5ggGWDd_?i%WdS%O?2ZzSC zJzTo+!LkS>=7(o!{1R zQpWO#h|+iS<|^lYzhp1{SucVb~hn((ay^YJkRXXZTj}N*603`DUZMH8Zy@D5$9d2-<@{!bw$(r%~s#t zc;?O;pWE}JGyLzi-|GD0kS(wM9uei`wsS$oug=-;gigQay2jxjoJZc1%P`Na|KA8k za)rgoYu(LwjY{ZRdw0CKgKI03JMoS}@47>duDI>_uSzH^&TK)cKpMMg5c3Tynmsb^rA0f&7Ka%Og8n zX!`Z{gKq};mh1`N)3Z?blA`pdsH!1*%-EO4-2UR7CapK`8r^i{x<~IsxX3nx=a$+}Rd+*)2WM&v0CO$k62Y zf%`8NO?mWN&quc;?sMweYS*QHUax&uwr=c) zy61P_`0dZzzcg9t-Tu(~Uu)0**)%`C+ts~2uUz`|HC4o$Q=1p)|N8rT*QZ{X*)o38 yx!1DBpMC27i{1nFZ#r^gZ>J482VVJP<>gn|rmz-2Y=2ul`9#)B&jp{o`hNiAL1W+m literal 0 HcmV?d00001 diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamUserStats.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamUserStats.cs index a86e5df..4654900 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamUserStats.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamUserStats.cs @@ -536,24 +536,24 @@ internal bool GetGlobalStat2( string pchStatName, ref double pData ) #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetGlobalStatHistoryDelegate( IntPtr self, string pchStatName, ref long pData, uint cubData ); + private delegate int GetGlobalStatHistoryDelegate( IntPtr self, string pchStatName, [In,Out] long[] pData, uint cubData ); private GetGlobalStatHistoryDelegate GetGlobalStatHistoryDelegatePointer; #endregion - internal int GetGlobalStatHistory( string pchStatName, ref long pData, uint cubData ) + internal int GetGlobalStatHistory( string pchStatName, [In,Out] long[] pData, uint cubData ) { - return GetGlobalStatHistoryDelegatePointer( Self, pchStatName, ref pData, cubData ); + return GetGlobalStatHistoryDelegatePointer( Self, pchStatName, pData, cubData ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetGlobalStatHistory2Delegate( IntPtr self, string pchStatName, ref double pData, uint cubData ); + private delegate int GetGlobalStatHistory2Delegate( IntPtr self, string pchStatName, [In,Out] double[] pData, uint cubData ); private GetGlobalStatHistory2Delegate GetGlobalStatHistory2DelegatePointer; #endregion - internal int GetGlobalStatHistory2( string pchStatName, ref double pData, uint cubData ) + internal int GetGlobalStatHistory2( string pchStatName, [In,Out] double[] pData, uint cubData ) { - return GetGlobalStatHistory2DelegatePointer( Self, pchStatName, ref pData, cubData ); + return GetGlobalStatHistory2DelegatePointer( Self, pchStatName, pData, cubData ); } } diff --git a/Facepunch.Steamworks/Structs/Stat.cs b/Facepunch.Steamworks/Structs/Stat.cs new file mode 100644 index 0000000..2e6d4fe --- /dev/null +++ b/Facepunch.Steamworks/Structs/Stat.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace Steamworks.Data +{ + public struct Stat + { + public string Name { get; internal set; } + public SteamId UserId { get; internal set; } + + public Stat( string name ) + { + Name = name; + UserId = 0; + } + + public Stat( string name, SteamId user ) + { + Name = name; + UserId = user; + } + + internal void LocalUserOnly( [CallerMemberName] string caller = null ) + { + if ( UserId == 0 ) return; + throw new System.Exception( $"Stat.{caller} can only be called for the local user" ); + } + + public double GetGlobalFloat() + { + double val = 0.0; + + if ( SteamUserStats.Internal.GetGlobalStat2( Name, ref val ) ) + return val; + + return 0; + } + + public long GetGlobalInt() + { + long val = 0; + SteamUserStats.Internal.GetGlobalStat( Name, ref val ); + return val; + } + + public async Task GetGlobalIntDays( int days ) + { + var result = await SteamUserStats.Internal.RequestGlobalStats( days ); + if ( result?.Result != Result.OK ) return null; + + var r = new long[days]; + + var rows = SteamUserStats.Internal.GetGlobalStatHistory( Name, r, (uint) r.Length ); + + if ( days != rows ) + r = r.Take( rows ).ToArray(); + + return r; + } + + public async Task GetGlobalFloatDays( int days ) + { + var result = await SteamUserStats.Internal.RequestGlobalStats( days ); + if ( result?.Result != Result.OK ) return null; + + var r = new double[days]; + + var rows = SteamUserStats.Internal.GetGlobalStatHistory2( Name, r, (uint)r.Length ); + + if ( days != rows ) + r = r.Take( rows ).ToArray(); + + return r; + } + + public float GetFloat() + { + float val = 0.0f; + + if ( UserId > 0 ) + { + SteamUserStats.Internal.GetUserStat2( UserId, Name, ref val ); + } + else + { + SteamUserStats.Internal.GetStat2( Name, ref val ); + } + + return 0; + } + + public int GetInt() + { + int val = 0; + + if ( UserId > 0 ) + { + SteamUserStats.Internal.GetUserStat( UserId, Name, ref val ); + } + else + { + SteamUserStats.Internal.GetStat( Name, ref val ); + } + + return val; + } + + public bool Set( int val ) + { + LocalUserOnly(); + return SteamUserStats.Internal.SetStat( Name, val ); + } + + public bool Set( float val ) + { + LocalUserOnly(); + return SteamUserStats.Internal.SetStat2( Name, val ); + } + + public bool UpdateAverageRate( float count, float sessionlength ) + { + LocalUserOnly(); + return SteamUserStats.Internal.UpdateAvgRateStat( Name, count, sessionlength ); + } + + public bool Store() + { + LocalUserOnly(); + return SteamUserStats.Internal.StoreStats(); + } + } +} \ No newline at end of file diff --git a/Generator/CodeWriter/ClassVTable.cs b/Generator/CodeWriter/ClassVTable.cs index 0775a8e..a7a2529 100644 --- a/Generator/CodeWriter/ClassVTable.cs +++ b/Generator/CodeWriter/ClassVTable.cs @@ -71,8 +71,14 @@ void WriteFunctionPointerReader( CodeParser.Class clss ) private void WriteFunction( CodeParser.Class clss, CodeParser.Class.Function func ) { var returnType = BaseType.Parse( func.ReturnType ); + returnType.Func = func.Name; - var args = func.Arguments.Select( x => BaseType.Parse( x.Value, x.Key ) ).ToArray(); + var args = func.Arguments.Select( x => + { + var bt = BaseType.Parse( x.Value, x.Key ); + bt.Func = func.Name; + return bt; + } ).ToArray(); var argstr = string.Join( ", ", args.Select( x => x.AsArgument() ) ); var delegateargstr = string.Join( ", ", args.Select( x => x.AsArgument() ) ); diff --git a/Generator/CodeWriter/Types/BaseType.cs b/Generator/CodeWriter/Types/BaseType.cs index 0bbedfb..61db8d0 100644 --- a/Generator/CodeWriter/Types/BaseType.cs +++ b/Generator/CodeWriter/Types/BaseType.cs @@ -11,6 +11,8 @@ internal class BaseType public virtual string TypeName => $"{NativeType}"; public virtual string TypeNameFrom => TypeName; + public string Func; + public static BaseType Parse( string type, string varname = null ) { type = Cleanup.ConvertType( type ); @@ -63,6 +65,7 @@ public virtual bool IsVector if ( VarName == "pScoreDetails" ) return true; if ( VarName == "prgUsers" ) return true; if ( VarName == "pDetails" ) return true; + if ( VarName == "pData" && NativeType.EndsWith( "*" ) && Func.StartsWith( "GetGlobalStatHistory" ) ) return true; if ( NativeType.EndsWith( "**" ) ) return true; if ( NativeType.EndsWith( "*" ) ) From eb16bebae9ffa5fccc00810feb7c1c95478ecd53 Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Wed, 17 Apr 2019 13:33:38 +0100 Subject: [PATCH 09/22] Nice name deduplucate --- Facepunch.Steamworks.Test/UserStatsTest.cs | 3 +- .../Generated/Interfaces/ISteamUserStats.cs | 50 +++++++++---------- Facepunch.Steamworks/Structs/Stat.cs | 10 ++-- Generator/CodeParser/CodeParser.Class.cs | 24 ++++----- 4 files changed, 42 insertions(+), 45 deletions(-) diff --git a/Facepunch.Steamworks.Test/UserStatsTest.cs b/Facepunch.Steamworks.Test/UserStatsTest.cs index 8021ac8..5b8766b 100644 --- a/Facepunch.Steamworks.Test/UserStatsTest.cs +++ b/Facepunch.Steamworks.Test/UserStatsTest.cs @@ -182,8 +182,9 @@ public async Task GetStatGlobalHistoryInt() var startups = new Stat( "GMA_X_STARTUPS_STAT" ); var history = await startups.GetGlobalIntDays( 60 ); + Assert.AreNotEqual( 0, history.Length ); - for( int i=0; i< history.Length; i++ ) + for ( int i=0; i< history.Length; i++ ) { Console.WriteLine( $"{i} : {history[i]}" ); } diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamUserStats.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamUserStats.cs index 4654900..931b7bf 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamUserStats.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamUserStats.cs @@ -18,9 +18,9 @@ public ISteamUserStats( bool server = false ) : base( server ) public override void InitInternals() { RequestCurrentStatsDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); - GetStatDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); + GetStat1DelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); GetStat2DelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); - SetStatDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); + SetStat1DelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); SetStat2DelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); UpdateAvgRateStatDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); GetAchievementDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 48) ); @@ -34,7 +34,7 @@ public override void InitInternals() GetNumAchievementsDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 112) ); GetAchievementNameDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 120) ); RequestUserStatsDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 128) ); - GetUserStatDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 136) ); + GetUserStat1DelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 136) ); GetUserStat2DelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 144) ); GetUserAchievementDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 152) ); GetUserAchievementAndUnlockTimeDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 160) ); @@ -56,9 +56,9 @@ public override void InitInternals() GetNextMostAchievedAchievementInfoDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 288) ); GetAchievementAchievedPercentDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 296) ); RequestGlobalStatsDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 304) ); - GetGlobalStatDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 312) ); + GetGlobalStat1DelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 312) ); GetGlobalStat2DelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 320) ); - GetGlobalStatHistoryDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 328) ); + GetGlobalStatHistory1DelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 328) ); GetGlobalStatHistory2DelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 336) ); } @@ -77,13 +77,13 @@ internal bool RequestCurrentStats() #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetStatDelegate( IntPtr self, string pchName, ref int pData ); - private GetStatDelegate GetStatDelegatePointer; + private delegate bool GetStat1Delegate( IntPtr self, string pchName, ref int pData ); + private GetStat1Delegate GetStat1DelegatePointer; #endregion - internal bool GetStat( string pchName, ref int pData ) + internal bool GetStat1( string pchName, ref int pData ) { - return GetStatDelegatePointer( Self, pchName, ref pData ); + return GetStat1DelegatePointer( Self, pchName, ref pData ); } #region FunctionMeta @@ -101,13 +101,13 @@ internal bool GetStat2( string pchName, ref float pData ) #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool SetStatDelegate( IntPtr self, string pchName, int nData ); - private SetStatDelegate SetStatDelegatePointer; + private delegate bool SetStat1Delegate( IntPtr self, string pchName, int nData ); + private SetStat1Delegate SetStat1DelegatePointer; #endregion - internal bool SetStat( string pchName, int nData ) + internal bool SetStat1( string pchName, int nData ) { - return SetStatDelegatePointer( Self, pchName, nData ); + return SetStat1DelegatePointer( Self, pchName, nData ); } #region FunctionMeta @@ -264,13 +264,13 @@ internal string GetAchievementName( uint iAchievement ) #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetUserStatDelegate( IntPtr self, SteamId steamIDUser, string pchName, ref int pData ); - private GetUserStatDelegate GetUserStatDelegatePointer; + private delegate bool GetUserStat1Delegate( IntPtr self, SteamId steamIDUser, string pchName, ref int pData ); + private GetUserStat1Delegate GetUserStat1DelegatePointer; #endregion - internal bool GetUserStat( SteamId steamIDUser, string pchName, ref int pData ) + internal bool GetUserStat1( SteamId steamIDUser, string pchName, ref int pData ) { - return GetUserStatDelegatePointer( Self, steamIDUser, pchName, ref pData ); + return GetUserStat1DelegatePointer( Self, steamIDUser, pchName, ref pData ); } #region FunctionMeta @@ -513,13 +513,13 @@ internal bool GetAchievementAchievedPercent( string pchName, ref float pflPercen #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetGlobalStatDelegate( IntPtr self, string pchStatName, ref long pData ); - private GetGlobalStatDelegate GetGlobalStatDelegatePointer; + private delegate bool GetGlobalStat1Delegate( IntPtr self, string pchStatName, ref long pData ); + private GetGlobalStat1Delegate GetGlobalStat1DelegatePointer; #endregion - internal bool GetGlobalStat( string pchStatName, ref long pData ) + internal bool GetGlobalStat1( string pchStatName, ref long pData ) { - return GetGlobalStatDelegatePointer( Self, pchStatName, ref pData ); + return GetGlobalStat1DelegatePointer( Self, pchStatName, ref pData ); } #region FunctionMeta @@ -536,13 +536,13 @@ internal bool GetGlobalStat2( string pchStatName, ref double pData ) #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetGlobalStatHistoryDelegate( IntPtr self, string pchStatName, [In,Out] long[] pData, uint cubData ); - private GetGlobalStatHistoryDelegate GetGlobalStatHistoryDelegatePointer; + private delegate int GetGlobalStatHistory1Delegate( IntPtr self, string pchStatName, [In,Out] long[] pData, uint cubData ); + private GetGlobalStatHistory1Delegate GetGlobalStatHistory1DelegatePointer; #endregion - internal int GetGlobalStatHistory( string pchStatName, [In,Out] long[] pData, uint cubData ) + internal int GetGlobalStatHistory1( string pchStatName, [In,Out] long[] pData, uint cubData ) { - return GetGlobalStatHistoryDelegatePointer( Self, pchStatName, pData, cubData ); + return GetGlobalStatHistory1DelegatePointer( Self, pchStatName, pData, cubData ); } #region FunctionMeta diff --git a/Facepunch.Steamworks/Structs/Stat.cs b/Facepunch.Steamworks/Structs/Stat.cs index 2e6d4fe..becb57c 100644 --- a/Facepunch.Steamworks/Structs/Stat.cs +++ b/Facepunch.Steamworks/Structs/Stat.cs @@ -45,7 +45,7 @@ public double GetGlobalFloat() public long GetGlobalInt() { long val = 0; - SteamUserStats.Internal.GetGlobalStat( Name, ref val ); + SteamUserStats.Internal.GetGlobalStat1( Name, ref val ); return val; } @@ -56,7 +56,7 @@ public async Task GetGlobalIntDays( int days ) var r = new long[days]; - var rows = SteamUserStats.Internal.GetGlobalStatHistory( Name, r, (uint) r.Length ); + var rows = SteamUserStats.Internal.GetGlobalStatHistory1( Name, r, (uint) r.Length ); if ( days != rows ) r = r.Take( rows ).ToArray(); @@ -101,11 +101,11 @@ public int GetInt() if ( UserId > 0 ) { - SteamUserStats.Internal.GetUserStat( UserId, Name, ref val ); + SteamUserStats.Internal.GetUserStat1( UserId, Name, ref val ); } else { - SteamUserStats.Internal.GetStat( Name, ref val ); + SteamUserStats.Internal.GetStat1( Name, ref val ); } return val; @@ -114,7 +114,7 @@ public int GetInt() public bool Set( int val ) { LocalUserOnly(); - return SteamUserStats.Internal.SetStat( Name, val ); + return SteamUserStats.Internal.SetStat1( Name, val ); } public bool Set( float val ) diff --git a/Generator/CodeParser/CodeParser.Class.cs b/Generator/CodeParser/CodeParser.Class.cs index 92e830b..b132066 100644 --- a/Generator/CodeParser/CodeParser.Class.cs +++ b/Generator/CodeParser/CodeParser.Class.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Text.RegularExpressions; namespace Generator @@ -14,6 +15,7 @@ public class Class public class Function { public string Name; + public string DuplicateName; public Dictionary Arguments = new Dictionary(); public string ReturnType; @@ -51,24 +53,18 @@ internal Function AddFunction( string funcName, string returnType, string args ) public void PostProcess() { - var LastName = ""; - var DuplicateCount = 0; + var duplicateFunctions = Functions + .GroupBy( x => x.Name ) + .Where( x => x.Count() > 1 ); - for (int i=0; i< Functions.Count; i++ ) + foreach ( var group in duplicateFunctions ) { - var ThisName = Functions[i].Name; - - if ( Functions[i].Name == LastName) + var g = group.ToArray(); + for ( int i=0; i< g.Count(); i++ ) { - DuplicateCount++; - Functions[i].Name += $"{DuplicateCount + 1}"; + g[i].DuplicateName = g[i].Name; + g[i].Name = $"{g[i].Name}{i+1}"; } - else - { - DuplicateCount = 0; - } - - LastName = ThisName; } } } From 6c1dd241ba49b3777fd87a4b12191bcc5414af61 Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Wed, 17 Apr 2019 13:36:11 +0100 Subject: [PATCH 10/22] Delegate name refactor --- .../Generated/Interfaces/ISteamApps.cs | 224 +++---- .../Generated/Interfaces/ISteamFriends.cs | 584 +++++++++--------- .../Generated/Interfaces/ISteamGameServer.cs | 352 +++++------ .../Interfaces/ISteamMatchmakingServers.cs | 136 ++-- .../Generated/Interfaces/ISteamMusic.cs | 72 +-- .../Interfaces/ISteamParentalSettings.cs | 48 +- .../Generated/Interfaces/ISteamScreenshots.cs | 72 +-- .../Generated/Interfaces/ISteamUser.cs | 240 +++---- .../Generated/Interfaces/ISteamUserStats.cs | 344 +++++------ .../Generated/Interfaces/ISteamUtils.cs | 240 +++---- .../Generated/Interfaces/ISteamVideo.cs | 32 +- Generator/CodeWriter/ClassVTable.cs | 12 +- 12 files changed, 1178 insertions(+), 1178 deletions(-) diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamApps.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamApps.cs index ef8c356..8e3881b 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamApps.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamApps.cs @@ -17,357 +17,357 @@ public ISteamApps( bool server = false ) : base( server ) public override void InitInternals() { - BIsSubscribedDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); - BIsLowViolenceDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); - BIsCybercafeDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); - BIsVACBannedDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); - GetCurrentGameLanguageDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); - GetAvailableGameLanguagesDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); - BIsSubscribedAppDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 48) ); - BIsDlcInstalledDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 56) ); - GetEarliestPurchaseUnixTimeDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 64) ); - BIsSubscribedFromFreeWeekendDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 72) ); - GetDLCCountDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 80) ); - BGetDLCDataByIndexDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 88) ); - InstallDLCDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 96) ); - UninstallDLCDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 104) ); - RequestAppProofOfPurchaseKeyDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 112) ); - GetCurrentBetaNameDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 120) ); - MarkContentCorruptDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 128) ); - GetInstalledDepotsDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 136) ); - GetAppInstallDirDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 144) ); - BIsAppInstalledDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 152) ); - GetAppOwnerDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 160) ); - GetLaunchQueryParamDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 168) ); - GetDlcDownloadProgressDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 176) ); - GetAppBuildIdDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 184) ); - RequestAllProofOfPurchaseKeysDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 192) ); - GetFileDetailsDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 200) ); - GetLaunchCommandLineDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 208) ); - BIsSubscribedFromFamilySharingDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 216) ); + _BIsSubscribed = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); + _BIsLowViolence = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); + _BIsCybercafe = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); + _BIsVACBanned = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); + _GetCurrentGameLanguage = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); + _GetAvailableGameLanguages = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); + _BIsSubscribedApp = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 48) ); + _BIsDlcInstalled = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 56) ); + _GetEarliestPurchaseUnixTime = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 64) ); + _BIsSubscribedFromFreeWeekend = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 72) ); + _GetDLCCount = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 80) ); + _BGetDLCDataByIndex = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 88) ); + _InstallDLC = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 96) ); + _UninstallDLC = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 104) ); + _RequestAppProofOfPurchaseKey = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 112) ); + _GetCurrentBetaName = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 120) ); + _MarkContentCorrupt = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 128) ); + _GetInstalledDepots = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 136) ); + _GetAppInstallDir = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 144) ); + _BIsAppInstalled = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 152) ); + _GetAppOwner = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 160) ); + _GetLaunchQueryParam = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 168) ); + _GetDlcDownloadProgress = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 176) ); + _GetAppBuildId = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 184) ); + _RequestAllProofOfPurchaseKeys = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 192) ); + _GetFileDetails = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 200) ); + _GetLaunchCommandLine = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 208) ); + _BIsSubscribedFromFamilySharing = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 216) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BIsSubscribedDelegate( IntPtr self ); - private BIsSubscribedDelegate BIsSubscribedDelegatePointer; + private delegate bool FBIsSubscribed( IntPtr self ); + private FBIsSubscribed _BIsSubscribed; #endregion internal bool BIsSubscribed() { - return BIsSubscribedDelegatePointer( Self ); + return _BIsSubscribed( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BIsLowViolenceDelegate( IntPtr self ); - private BIsLowViolenceDelegate BIsLowViolenceDelegatePointer; + private delegate bool FBIsLowViolence( IntPtr self ); + private FBIsLowViolence _BIsLowViolence; #endregion internal bool BIsLowViolence() { - return BIsLowViolenceDelegatePointer( Self ); + return _BIsLowViolence( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BIsCybercafeDelegate( IntPtr self ); - private BIsCybercafeDelegate BIsCybercafeDelegatePointer; + private delegate bool FBIsCybercafe( IntPtr self ); + private FBIsCybercafe _BIsCybercafe; #endregion internal bool BIsCybercafe() { - return BIsCybercafeDelegatePointer( Self ); + return _BIsCybercafe( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BIsVACBannedDelegate( IntPtr self ); - private BIsVACBannedDelegate BIsVACBannedDelegatePointer; + private delegate bool FBIsVACBanned( IntPtr self ); + private FBIsVACBanned _BIsVACBanned; #endregion internal bool BIsVACBanned() { - return BIsVACBannedDelegatePointer( Self ); + return _BIsVACBanned( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate IntPtr GetCurrentGameLanguageDelegate( IntPtr self ); - private GetCurrentGameLanguageDelegate GetCurrentGameLanguageDelegatePointer; + private delegate IntPtr FGetCurrentGameLanguage( IntPtr self ); + private FGetCurrentGameLanguage _GetCurrentGameLanguage; #endregion internal string GetCurrentGameLanguage() { - return GetString( GetCurrentGameLanguageDelegatePointer( Self ) ); + return GetString( _GetCurrentGameLanguage( Self ) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate IntPtr GetAvailableGameLanguagesDelegate( IntPtr self ); - private GetAvailableGameLanguagesDelegate GetAvailableGameLanguagesDelegatePointer; + private delegate IntPtr FGetAvailableGameLanguages( IntPtr self ); + private FGetAvailableGameLanguages _GetAvailableGameLanguages; #endregion internal string GetAvailableGameLanguages() { - return GetString( GetAvailableGameLanguagesDelegatePointer( Self ) ); + return GetString( _GetAvailableGameLanguages( Self ) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BIsSubscribedAppDelegate( IntPtr self, AppId_t appID ); - private BIsSubscribedAppDelegate BIsSubscribedAppDelegatePointer; + private delegate bool FBIsSubscribedApp( IntPtr self, AppId_t appID ); + private FBIsSubscribedApp _BIsSubscribedApp; #endregion internal bool BIsSubscribedApp( AppId_t appID ) { - return BIsSubscribedAppDelegatePointer( Self, appID ); + return _BIsSubscribedApp( Self, appID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BIsDlcInstalledDelegate( IntPtr self, AppId_t appID ); - private BIsDlcInstalledDelegate BIsDlcInstalledDelegatePointer; + private delegate bool FBIsDlcInstalled( IntPtr self, AppId_t appID ); + private FBIsDlcInstalled _BIsDlcInstalled; #endregion internal bool BIsDlcInstalled( AppId_t appID ) { - return BIsDlcInstalledDelegatePointer( Self, appID ); + return _BIsDlcInstalled( Self, appID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate uint GetEarliestPurchaseUnixTimeDelegate( IntPtr self, AppId_t nAppID ); - private GetEarliestPurchaseUnixTimeDelegate GetEarliestPurchaseUnixTimeDelegatePointer; + private delegate uint FGetEarliestPurchaseUnixTime( IntPtr self, AppId_t nAppID ); + private FGetEarliestPurchaseUnixTime _GetEarliestPurchaseUnixTime; #endregion internal uint GetEarliestPurchaseUnixTime( AppId_t nAppID ) { - return GetEarliestPurchaseUnixTimeDelegatePointer( Self, nAppID ); + return _GetEarliestPurchaseUnixTime( Self, nAppID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BIsSubscribedFromFreeWeekendDelegate( IntPtr self ); - private BIsSubscribedFromFreeWeekendDelegate BIsSubscribedFromFreeWeekendDelegatePointer; + private delegate bool FBIsSubscribedFromFreeWeekend( IntPtr self ); + private FBIsSubscribedFromFreeWeekend _BIsSubscribedFromFreeWeekend; #endregion internal bool BIsSubscribedFromFreeWeekend() { - return BIsSubscribedFromFreeWeekendDelegatePointer( Self ); + return _BIsSubscribedFromFreeWeekend( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetDLCCountDelegate( IntPtr self ); - private GetDLCCountDelegate GetDLCCountDelegatePointer; + private delegate int FGetDLCCount( IntPtr self ); + private FGetDLCCount _GetDLCCount; #endregion internal int GetDLCCount() { - return GetDLCCountDelegatePointer( Self ); + return _GetDLCCount( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BGetDLCDataByIndexDelegate( IntPtr self, int iDLC, ref AppId_t pAppID, [MarshalAs( UnmanagedType.U1 )] ref bool pbAvailable, StringBuilder pchName, int cchNameBufferSize ); - private BGetDLCDataByIndexDelegate BGetDLCDataByIndexDelegatePointer; + private delegate bool FBGetDLCDataByIndex( IntPtr self, int iDLC, ref AppId_t pAppID, [MarshalAs( UnmanagedType.U1 )] ref bool pbAvailable, StringBuilder pchName, int cchNameBufferSize ); + private FBGetDLCDataByIndex _BGetDLCDataByIndex; #endregion internal bool BGetDLCDataByIndex( int iDLC, ref AppId_t pAppID, [MarshalAs( UnmanagedType.U1 )] ref bool pbAvailable, StringBuilder pchName, int cchNameBufferSize ) { - return BGetDLCDataByIndexDelegatePointer( Self, iDLC, ref pAppID, ref pbAvailable, pchName, cchNameBufferSize ); + return _BGetDLCDataByIndex( Self, iDLC, ref pAppID, ref pbAvailable, pchName, cchNameBufferSize ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void InstallDLCDelegate( IntPtr self, AppId_t nAppID ); - private InstallDLCDelegate InstallDLCDelegatePointer; + private delegate void FInstallDLC( IntPtr self, AppId_t nAppID ); + private FInstallDLC _InstallDLC; #endregion internal void InstallDLC( AppId_t nAppID ) { - InstallDLCDelegatePointer( Self, nAppID ); + _InstallDLC( Self, nAppID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void UninstallDLCDelegate( IntPtr self, AppId_t nAppID ); - private UninstallDLCDelegate UninstallDLCDelegatePointer; + private delegate void FUninstallDLC( IntPtr self, AppId_t nAppID ); + private FUninstallDLC _UninstallDLC; #endregion internal void UninstallDLC( AppId_t nAppID ) { - UninstallDLCDelegatePointer( Self, nAppID ); + _UninstallDLC( Self, nAppID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void RequestAppProofOfPurchaseKeyDelegate( IntPtr self, AppId_t nAppID ); - private RequestAppProofOfPurchaseKeyDelegate RequestAppProofOfPurchaseKeyDelegatePointer; + private delegate void FRequestAppProofOfPurchaseKey( IntPtr self, AppId_t nAppID ); + private FRequestAppProofOfPurchaseKey _RequestAppProofOfPurchaseKey; #endregion internal void RequestAppProofOfPurchaseKey( AppId_t nAppID ) { - RequestAppProofOfPurchaseKeyDelegatePointer( Self, nAppID ); + _RequestAppProofOfPurchaseKey( Self, nAppID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetCurrentBetaNameDelegate( IntPtr self, StringBuilder pchName, int cchNameBufferSize ); - private GetCurrentBetaNameDelegate GetCurrentBetaNameDelegatePointer; + private delegate bool FGetCurrentBetaName( IntPtr self, StringBuilder pchName, int cchNameBufferSize ); + private FGetCurrentBetaName _GetCurrentBetaName; #endregion internal bool GetCurrentBetaName( StringBuilder pchName, int cchNameBufferSize ) { - return GetCurrentBetaNameDelegatePointer( Self, pchName, cchNameBufferSize ); + return _GetCurrentBetaName( Self, pchName, cchNameBufferSize ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool MarkContentCorruptDelegate( IntPtr self, [MarshalAs( UnmanagedType.U1 )] bool bMissingFilesOnly ); - private MarkContentCorruptDelegate MarkContentCorruptDelegatePointer; + private delegate bool FMarkContentCorrupt( IntPtr self, [MarshalAs( UnmanagedType.U1 )] bool bMissingFilesOnly ); + private FMarkContentCorrupt _MarkContentCorrupt; #endregion internal bool MarkContentCorrupt( [MarshalAs( UnmanagedType.U1 )] bool bMissingFilesOnly ) { - return MarkContentCorruptDelegatePointer( Self, bMissingFilesOnly ); + return _MarkContentCorrupt( Self, bMissingFilesOnly ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate uint GetInstalledDepotsDelegate( IntPtr self, AppId_t appID, [In,Out] DepotId_t[] pvecDepots, uint cMaxDepots ); - private GetInstalledDepotsDelegate GetInstalledDepotsDelegatePointer; + private delegate uint FGetInstalledDepots( IntPtr self, AppId_t appID, [In,Out] DepotId_t[] pvecDepots, uint cMaxDepots ); + private FGetInstalledDepots _GetInstalledDepots; #endregion internal uint GetInstalledDepots( AppId_t appID, [In,Out] DepotId_t[] pvecDepots, uint cMaxDepots ) { - return GetInstalledDepotsDelegatePointer( Self, appID, pvecDepots, cMaxDepots ); + return _GetInstalledDepots( Self, appID, pvecDepots, cMaxDepots ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate uint GetAppInstallDirDelegate( IntPtr self, AppId_t appID, StringBuilder pchFolder, uint cchFolderBufferSize ); - private GetAppInstallDirDelegate GetAppInstallDirDelegatePointer; + private delegate uint FGetAppInstallDir( IntPtr self, AppId_t appID, StringBuilder pchFolder, uint cchFolderBufferSize ); + private FGetAppInstallDir _GetAppInstallDir; #endregion internal uint GetAppInstallDir( AppId_t appID, StringBuilder pchFolder, uint cchFolderBufferSize ) { - return GetAppInstallDirDelegatePointer( Self, appID, pchFolder, cchFolderBufferSize ); + return _GetAppInstallDir( Self, appID, pchFolder, cchFolderBufferSize ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BIsAppInstalledDelegate( IntPtr self, AppId_t appID ); - private BIsAppInstalledDelegate BIsAppInstalledDelegatePointer; + private delegate bool FBIsAppInstalled( IntPtr self, AppId_t appID ); + private FBIsAppInstalled _BIsAppInstalled; #endregion internal bool BIsAppInstalled( AppId_t appID ) { - return BIsAppInstalledDelegatePointer( Self, appID ); + return _BIsAppInstalled( Self, appID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void GetAppOwnerDelegate( IntPtr self, ref SteamId retVal ); - private GetAppOwnerDelegate GetAppOwnerDelegatePointer; + private delegate void FGetAppOwner( IntPtr self, ref SteamId retVal ); + private FGetAppOwner _GetAppOwner; #endregion internal SteamId GetAppOwner() { var retVal = default( SteamId ); - GetAppOwnerDelegatePointer( Self, ref retVal ); + _GetAppOwner( Self, ref retVal ); return retVal; } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate IntPtr GetLaunchQueryParamDelegate( IntPtr self, string pchKey ); - private GetLaunchQueryParamDelegate GetLaunchQueryParamDelegatePointer; + private delegate IntPtr FGetLaunchQueryParam( IntPtr self, string pchKey ); + private FGetLaunchQueryParam _GetLaunchQueryParam; #endregion internal string GetLaunchQueryParam( string pchKey ) { - return GetString( GetLaunchQueryParamDelegatePointer( Self, pchKey ) ); + return GetString( _GetLaunchQueryParam( Self, pchKey ) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetDlcDownloadProgressDelegate( IntPtr self, AppId_t nAppID, ref ulong punBytesDownloaded, ref ulong punBytesTotal ); - private GetDlcDownloadProgressDelegate GetDlcDownloadProgressDelegatePointer; + private delegate bool FGetDlcDownloadProgress( IntPtr self, AppId_t nAppID, ref ulong punBytesDownloaded, ref ulong punBytesTotal ); + private FGetDlcDownloadProgress _GetDlcDownloadProgress; #endregion internal bool GetDlcDownloadProgress( AppId_t nAppID, ref ulong punBytesDownloaded, ref ulong punBytesTotal ) { - return GetDlcDownloadProgressDelegatePointer( Self, nAppID, ref punBytesDownloaded, ref punBytesTotal ); + return _GetDlcDownloadProgress( Self, nAppID, ref punBytesDownloaded, ref punBytesTotal ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetAppBuildIdDelegate( IntPtr self ); - private GetAppBuildIdDelegate GetAppBuildIdDelegatePointer; + private delegate int FGetAppBuildId( IntPtr self ); + private FGetAppBuildId _GetAppBuildId; #endregion internal int GetAppBuildId() { - return GetAppBuildIdDelegatePointer( Self ); + return _GetAppBuildId( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void RequestAllProofOfPurchaseKeysDelegate( IntPtr self ); - private RequestAllProofOfPurchaseKeysDelegate RequestAllProofOfPurchaseKeysDelegatePointer; + private delegate void FRequestAllProofOfPurchaseKeys( IntPtr self ); + private FRequestAllProofOfPurchaseKeys _RequestAllProofOfPurchaseKeys; #endregion internal void RequestAllProofOfPurchaseKeys() { - RequestAllProofOfPurchaseKeysDelegatePointer( Self ); + _RequestAllProofOfPurchaseKeys( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t GetFileDetailsDelegate( IntPtr self, string pszFileName ); - private GetFileDetailsDelegate GetFileDetailsDelegatePointer; + private delegate SteamAPICall_t FGetFileDetails( IntPtr self, string pszFileName ); + private FGetFileDetails _GetFileDetails; #endregion internal async Task GetFileDetails( string pszFileName ) { - return await (new Result( GetFileDetailsDelegatePointer( Self, pszFileName ) )).GetResult(); + return await (new Result( _GetFileDetails( Self, pszFileName ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetLaunchCommandLineDelegate( IntPtr self, StringBuilder pszCommandLine, int cubCommandLine ); - private GetLaunchCommandLineDelegate GetLaunchCommandLineDelegatePointer; + private delegate int FGetLaunchCommandLine( IntPtr self, StringBuilder pszCommandLine, int cubCommandLine ); + private FGetLaunchCommandLine _GetLaunchCommandLine; #endregion internal int GetLaunchCommandLine( StringBuilder pszCommandLine, int cubCommandLine ) { - return GetLaunchCommandLineDelegatePointer( Self, pszCommandLine, cubCommandLine ); + return _GetLaunchCommandLine( Self, pszCommandLine, cubCommandLine ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BIsSubscribedFromFamilySharingDelegate( IntPtr self ); - private BIsSubscribedFromFamilySharingDelegate BIsSubscribedFromFamilySharingDelegatePointer; + private delegate bool FBIsSubscribedFromFamilySharing( IntPtr self ); + private FBIsSubscribedFromFamilySharing _BIsSubscribedFromFamilySharing; #endregion internal bool BIsSubscribedFromFamilySharing() { - return BIsSubscribedFromFamilySharingDelegatePointer( Self ); + return _BIsSubscribedFromFamilySharing( Self ); } } diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamFriends.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamFriends.cs index 45229ce..25d2de8 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamFriends.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamFriends.cs @@ -17,913 +17,913 @@ public ISteamFriends( bool server = false ) : base( server ) public override void InitInternals() { - GetPersonaNameDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); - SetPersonaNameDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); - GetPersonaStateDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); - GetFriendCountDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); - GetFriendByIndexDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); - GetFriendRelationshipDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); - GetFriendPersonaStateDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 48) ); - GetFriendPersonaNameDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 56) ); - GetFriendGamePlayedDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 64) ); - GetFriendPersonaNameHistoryDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 72) ); - GetFriendSteamLevelDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 80) ); - GetPlayerNicknameDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 88) ); - GetFriendsGroupCountDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 96) ); - GetFriendsGroupIDByIndexDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 104) ); - GetFriendsGroupNameDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 112) ); - GetFriendsGroupMembersCountDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 120) ); - GetFriendsGroupMembersListDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 128) ); - HasFriendDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 136) ); - GetClanCountDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 144) ); - GetClanByIndexDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 152) ); - GetClanNameDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 160) ); - GetClanTagDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 168) ); - GetClanActivityCountsDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 176) ); - DownloadClanActivityCountsDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 184) ); - GetFriendCountFromSourceDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 192) ); - GetFriendFromSourceByIndexDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 200) ); - IsUserInSourceDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 208) ); - SetInGameVoiceSpeakingDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 216) ); - ActivateGameOverlayDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 224) ); - ActivateGameOverlayToUserDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 232) ); - ActivateGameOverlayToWebPageDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 240) ); - ActivateGameOverlayToStoreDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 248) ); - SetPlayedWithDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 256) ); - ActivateGameOverlayInviteDialogDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 264) ); - GetSmallFriendAvatarDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 272) ); - GetMediumFriendAvatarDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 280) ); - GetLargeFriendAvatarDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 288) ); - RequestUserInformationDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 296) ); - RequestClanOfficerListDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 304) ); - GetClanOwnerDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 312) ); - GetClanOfficerCountDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 320) ); - GetClanOfficerByIndexDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 328) ); - GetUserRestrictionsDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 336) ); - SetRichPresenceDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 344) ); - ClearRichPresenceDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 352) ); - GetFriendRichPresenceDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 360) ); - GetFriendRichPresenceKeyCountDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 368) ); - GetFriendRichPresenceKeyByIndexDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 376) ); - RequestFriendRichPresenceDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 384) ); - InviteUserToGameDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 392) ); - GetCoplayFriendCountDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 400) ); - GetCoplayFriendDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 408) ); - GetFriendCoplayTimeDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 416) ); - GetFriendCoplayGameDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 424) ); - JoinClanChatRoomDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 432) ); - LeaveClanChatRoomDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 440) ); - GetClanChatMemberCountDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 448) ); - GetChatMemberByIndexDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 456) ); - SendClanChatMessageDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 464) ); - GetClanChatMessageDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 472) ); - IsClanChatAdminDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 480) ); - IsClanChatWindowOpenInSteamDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 488) ); - OpenClanChatWindowInSteamDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 496) ); - CloseClanChatWindowInSteamDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 504) ); - SetListenForFriendsMessagesDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 512) ); - ReplyToFriendMessageDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 520) ); - GetFriendMessageDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 528) ); - GetFollowerCountDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 536) ); - IsFollowingDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 544) ); - EnumerateFollowingListDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 552) ); - IsClanPublicDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 560) ); - IsClanOfficialGameGroupDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 568) ); - GetNumChatsWithUnreadPriorityMessagesDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 576) ); + _GetPersonaName = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); + _SetPersonaName = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); + _GetPersonaState = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); + _GetFriendCount = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); + _GetFriendByIndex = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); + _GetFriendRelationship = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); + _GetFriendPersonaState = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 48) ); + _GetFriendPersonaName = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 56) ); + _GetFriendGamePlayed = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 64) ); + _GetFriendPersonaNameHistory = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 72) ); + _GetFriendSteamLevel = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 80) ); + _GetPlayerNickname = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 88) ); + _GetFriendsGroupCount = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 96) ); + _GetFriendsGroupIDByIndex = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 104) ); + _GetFriendsGroupName = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 112) ); + _GetFriendsGroupMembersCount = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 120) ); + _GetFriendsGroupMembersList = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 128) ); + _HasFriend = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 136) ); + _GetClanCount = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 144) ); + _GetClanByIndex = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 152) ); + _GetClanName = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 160) ); + _GetClanTag = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 168) ); + _GetClanActivityCounts = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 176) ); + _DownloadClanActivityCounts = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 184) ); + _GetFriendCountFromSource = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 192) ); + _GetFriendFromSourceByIndex = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 200) ); + _IsUserInSource = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 208) ); + _SetInGameVoiceSpeaking = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 216) ); + _ActivateGameOverlay = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 224) ); + _ActivateGameOverlayToUser = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 232) ); + _ActivateGameOverlayToWebPage = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 240) ); + _ActivateGameOverlayToStore = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 248) ); + _SetPlayedWith = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 256) ); + _ActivateGameOverlayInviteDialog = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 264) ); + _GetSmallFriendAvatar = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 272) ); + _GetMediumFriendAvatar = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 280) ); + _GetLargeFriendAvatar = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 288) ); + _RequestUserInformation = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 296) ); + _RequestClanOfficerList = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 304) ); + _GetClanOwner = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 312) ); + _GetClanOfficerCount = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 320) ); + _GetClanOfficerByIndex = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 328) ); + _GetUserRestrictions = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 336) ); + _SetRichPresence = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 344) ); + _ClearRichPresence = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 352) ); + _GetFriendRichPresence = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 360) ); + _GetFriendRichPresenceKeyCount = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 368) ); + _GetFriendRichPresenceKeyByIndex = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 376) ); + _RequestFriendRichPresence = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 384) ); + _InviteUserToGame = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 392) ); + _GetCoplayFriendCount = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 400) ); + _GetCoplayFriend = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 408) ); + _GetFriendCoplayTime = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 416) ); + _GetFriendCoplayGame = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 424) ); + _JoinClanChatRoom = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 432) ); + _LeaveClanChatRoom = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 440) ); + _GetClanChatMemberCount = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 448) ); + _GetChatMemberByIndex = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 456) ); + _SendClanChatMessage = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 464) ); + _GetClanChatMessage = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 472) ); + _IsClanChatAdmin = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 480) ); + _IsClanChatWindowOpenInSteam = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 488) ); + _OpenClanChatWindowInSteam = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 496) ); + _CloseClanChatWindowInSteam = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 504) ); + _SetListenForFriendsMessages = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 512) ); + _ReplyToFriendMessage = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 520) ); + _GetFriendMessage = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 528) ); + _GetFollowerCount = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 536) ); + _IsFollowing = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 544) ); + _EnumerateFollowingList = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 552) ); + _IsClanPublic = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 560) ); + _IsClanOfficialGameGroup = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 568) ); + _GetNumChatsWithUnreadPriorityMessages = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 576) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate IntPtr GetPersonaNameDelegate( IntPtr self ); - private GetPersonaNameDelegate GetPersonaNameDelegatePointer; + private delegate IntPtr FGetPersonaName( IntPtr self ); + private FGetPersonaName _GetPersonaName; #endregion internal string GetPersonaName() { - return GetString( GetPersonaNameDelegatePointer( Self ) ); + return GetString( _GetPersonaName( Self ) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t SetPersonaNameDelegate( IntPtr self, string pchPersonaName ); - private SetPersonaNameDelegate SetPersonaNameDelegatePointer; + private delegate SteamAPICall_t FSetPersonaName( IntPtr self, string pchPersonaName ); + private FSetPersonaName _SetPersonaName; #endregion internal async Task SetPersonaName( string pchPersonaName ) { - return await (new Result( SetPersonaNameDelegatePointer( Self, pchPersonaName ) )).GetResult(); + return await (new Result( _SetPersonaName( Self, pchPersonaName ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate FriendState GetPersonaStateDelegate( IntPtr self ); - private GetPersonaStateDelegate GetPersonaStateDelegatePointer; + private delegate FriendState FGetPersonaState( IntPtr self ); + private FGetPersonaState _GetPersonaState; #endregion internal FriendState GetPersonaState() { - return GetPersonaStateDelegatePointer( Self ); + return _GetPersonaState( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetFriendCountDelegate( IntPtr self, int iFriendFlags ); - private GetFriendCountDelegate GetFriendCountDelegatePointer; + private delegate int FGetFriendCount( IntPtr self, int iFriendFlags ); + private FGetFriendCount _GetFriendCount; #endregion internal int GetFriendCount( int iFriendFlags ) { - return GetFriendCountDelegatePointer( Self, iFriendFlags ); + return _GetFriendCount( Self, iFriendFlags ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void GetFriendByIndexDelegate( IntPtr self, ref SteamId retVal, int iFriend, int iFriendFlags ); - private GetFriendByIndexDelegate GetFriendByIndexDelegatePointer; + private delegate void FGetFriendByIndex( IntPtr self, ref SteamId retVal, int iFriend, int iFriendFlags ); + private FGetFriendByIndex _GetFriendByIndex; #endregion internal SteamId GetFriendByIndex( int iFriend, int iFriendFlags ) { var retVal = default( SteamId ); - GetFriendByIndexDelegatePointer( Self, ref retVal, iFriend, iFriendFlags ); + _GetFriendByIndex( Self, ref retVal, iFriend, iFriendFlags ); return retVal; } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate Relationship GetFriendRelationshipDelegate( IntPtr self, SteamId steamIDFriend ); - private GetFriendRelationshipDelegate GetFriendRelationshipDelegatePointer; + private delegate Relationship FGetFriendRelationship( IntPtr self, SteamId steamIDFriend ); + private FGetFriendRelationship _GetFriendRelationship; #endregion internal Relationship GetFriendRelationship( SteamId steamIDFriend ) { - return GetFriendRelationshipDelegatePointer( Self, steamIDFriend ); + return _GetFriendRelationship( Self, steamIDFriend ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate FriendState GetFriendPersonaStateDelegate( IntPtr self, SteamId steamIDFriend ); - private GetFriendPersonaStateDelegate GetFriendPersonaStateDelegatePointer; + private delegate FriendState FGetFriendPersonaState( IntPtr self, SteamId steamIDFriend ); + private FGetFriendPersonaState _GetFriendPersonaState; #endregion internal FriendState GetFriendPersonaState( SteamId steamIDFriend ) { - return GetFriendPersonaStateDelegatePointer( Self, steamIDFriend ); + return _GetFriendPersonaState( Self, steamIDFriend ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate IntPtr GetFriendPersonaNameDelegate( IntPtr self, SteamId steamIDFriend ); - private GetFriendPersonaNameDelegate GetFriendPersonaNameDelegatePointer; + private delegate IntPtr FGetFriendPersonaName( IntPtr self, SteamId steamIDFriend ); + private FGetFriendPersonaName _GetFriendPersonaName; #endregion internal string GetFriendPersonaName( SteamId steamIDFriend ) { - return GetString( GetFriendPersonaNameDelegatePointer( Self, steamIDFriend ) ); + return GetString( _GetFriendPersonaName( Self, steamIDFriend ) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetFriendGamePlayedDelegate( IntPtr self, SteamId steamIDFriend, ref FriendGameInfo_t pFriendGameInfo ); - private GetFriendGamePlayedDelegate GetFriendGamePlayedDelegatePointer; + private delegate bool FGetFriendGamePlayed( IntPtr self, SteamId steamIDFriend, ref FriendGameInfo_t pFriendGameInfo ); + private FGetFriendGamePlayed _GetFriendGamePlayed; #endregion internal bool GetFriendGamePlayed( SteamId steamIDFriend, ref FriendGameInfo_t pFriendGameInfo ) { - return GetFriendGamePlayedDelegatePointer( Self, steamIDFriend, ref pFriendGameInfo ); + return _GetFriendGamePlayed( Self, steamIDFriend, ref pFriendGameInfo ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate IntPtr GetFriendPersonaNameHistoryDelegate( IntPtr self, SteamId steamIDFriend, int iPersonaName ); - private GetFriendPersonaNameHistoryDelegate GetFriendPersonaNameHistoryDelegatePointer; + private delegate IntPtr FGetFriendPersonaNameHistory( IntPtr self, SteamId steamIDFriend, int iPersonaName ); + private FGetFriendPersonaNameHistory _GetFriendPersonaNameHistory; #endregion internal string GetFriendPersonaNameHistory( SteamId steamIDFriend, int iPersonaName ) { - return GetString( GetFriendPersonaNameHistoryDelegatePointer( Self, steamIDFriend, iPersonaName ) ); + return GetString( _GetFriendPersonaNameHistory( Self, steamIDFriend, iPersonaName ) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetFriendSteamLevelDelegate( IntPtr self, SteamId steamIDFriend ); - private GetFriendSteamLevelDelegate GetFriendSteamLevelDelegatePointer; + private delegate int FGetFriendSteamLevel( IntPtr self, SteamId steamIDFriend ); + private FGetFriendSteamLevel _GetFriendSteamLevel; #endregion internal int GetFriendSteamLevel( SteamId steamIDFriend ) { - return GetFriendSteamLevelDelegatePointer( Self, steamIDFriend ); + return _GetFriendSteamLevel( Self, steamIDFriend ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate IntPtr GetPlayerNicknameDelegate( IntPtr self, SteamId steamIDPlayer ); - private GetPlayerNicknameDelegate GetPlayerNicknameDelegatePointer; + private delegate IntPtr FGetPlayerNickname( IntPtr self, SteamId steamIDPlayer ); + private FGetPlayerNickname _GetPlayerNickname; #endregion internal string GetPlayerNickname( SteamId steamIDPlayer ) { - return GetString( GetPlayerNicknameDelegatePointer( Self, steamIDPlayer ) ); + return GetString( _GetPlayerNickname( Self, steamIDPlayer ) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetFriendsGroupCountDelegate( IntPtr self ); - private GetFriendsGroupCountDelegate GetFriendsGroupCountDelegatePointer; + private delegate int FGetFriendsGroupCount( IntPtr self ); + private FGetFriendsGroupCount _GetFriendsGroupCount; #endregion internal int GetFriendsGroupCount() { - return GetFriendsGroupCountDelegatePointer( Self ); + return _GetFriendsGroupCount( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate FriendsGroupID_t GetFriendsGroupIDByIndexDelegate( IntPtr self, int iFG ); - private GetFriendsGroupIDByIndexDelegate GetFriendsGroupIDByIndexDelegatePointer; + private delegate FriendsGroupID_t FGetFriendsGroupIDByIndex( IntPtr self, int iFG ); + private FGetFriendsGroupIDByIndex _GetFriendsGroupIDByIndex; #endregion internal FriendsGroupID_t GetFriendsGroupIDByIndex( int iFG ) { - return GetFriendsGroupIDByIndexDelegatePointer( Self, iFG ); + return _GetFriendsGroupIDByIndex( Self, iFG ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate IntPtr GetFriendsGroupNameDelegate( IntPtr self, FriendsGroupID_t friendsGroupID ); - private GetFriendsGroupNameDelegate GetFriendsGroupNameDelegatePointer; + private delegate IntPtr FGetFriendsGroupName( IntPtr self, FriendsGroupID_t friendsGroupID ); + private FGetFriendsGroupName _GetFriendsGroupName; #endregion internal string GetFriendsGroupName( FriendsGroupID_t friendsGroupID ) { - return GetString( GetFriendsGroupNameDelegatePointer( Self, friendsGroupID ) ); + return GetString( _GetFriendsGroupName( Self, friendsGroupID ) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetFriendsGroupMembersCountDelegate( IntPtr self, FriendsGroupID_t friendsGroupID ); - private GetFriendsGroupMembersCountDelegate GetFriendsGroupMembersCountDelegatePointer; + private delegate int FGetFriendsGroupMembersCount( IntPtr self, FriendsGroupID_t friendsGroupID ); + private FGetFriendsGroupMembersCount _GetFriendsGroupMembersCount; #endregion internal int GetFriendsGroupMembersCount( FriendsGroupID_t friendsGroupID ) { - return GetFriendsGroupMembersCountDelegatePointer( Self, friendsGroupID ); + return _GetFriendsGroupMembersCount( Self, friendsGroupID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void GetFriendsGroupMembersListDelegate( IntPtr self, FriendsGroupID_t friendsGroupID, [In,Out] SteamId[] pOutSteamIDMembers, int nMembersCount ); - private GetFriendsGroupMembersListDelegate GetFriendsGroupMembersListDelegatePointer; + private delegate void FGetFriendsGroupMembersList( IntPtr self, FriendsGroupID_t friendsGroupID, [In,Out] SteamId[] pOutSteamIDMembers, int nMembersCount ); + private FGetFriendsGroupMembersList _GetFriendsGroupMembersList; #endregion internal void GetFriendsGroupMembersList( FriendsGroupID_t friendsGroupID, [In,Out] SteamId[] pOutSteamIDMembers, int nMembersCount ) { - GetFriendsGroupMembersListDelegatePointer( Self, friendsGroupID, pOutSteamIDMembers, nMembersCount ); + _GetFriendsGroupMembersList( Self, friendsGroupID, pOutSteamIDMembers, nMembersCount ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool HasFriendDelegate( IntPtr self, SteamId steamIDFriend, int iFriendFlags ); - private HasFriendDelegate HasFriendDelegatePointer; + private delegate bool FHasFriend( IntPtr self, SteamId steamIDFriend, int iFriendFlags ); + private FHasFriend _HasFriend; #endregion internal bool HasFriend( SteamId steamIDFriend, int iFriendFlags ) { - return HasFriendDelegatePointer( Self, steamIDFriend, iFriendFlags ); + return _HasFriend( Self, steamIDFriend, iFriendFlags ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetClanCountDelegate( IntPtr self ); - private GetClanCountDelegate GetClanCountDelegatePointer; + private delegate int FGetClanCount( IntPtr self ); + private FGetClanCount _GetClanCount; #endregion internal int GetClanCount() { - return GetClanCountDelegatePointer( Self ); + return _GetClanCount( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void GetClanByIndexDelegate( IntPtr self, ref SteamId retVal, int iClan ); - private GetClanByIndexDelegate GetClanByIndexDelegatePointer; + private delegate void FGetClanByIndex( IntPtr self, ref SteamId retVal, int iClan ); + private FGetClanByIndex _GetClanByIndex; #endregion internal SteamId GetClanByIndex( int iClan ) { var retVal = default( SteamId ); - GetClanByIndexDelegatePointer( Self, ref retVal, iClan ); + _GetClanByIndex( Self, ref retVal, iClan ); return retVal; } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate IntPtr GetClanNameDelegate( IntPtr self, SteamId steamIDClan ); - private GetClanNameDelegate GetClanNameDelegatePointer; + private delegate IntPtr FGetClanName( IntPtr self, SteamId steamIDClan ); + private FGetClanName _GetClanName; #endregion internal string GetClanName( SteamId steamIDClan ) { - return GetString( GetClanNameDelegatePointer( Self, steamIDClan ) ); + return GetString( _GetClanName( Self, steamIDClan ) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate IntPtr GetClanTagDelegate( IntPtr self, SteamId steamIDClan ); - private GetClanTagDelegate GetClanTagDelegatePointer; + private delegate IntPtr FGetClanTag( IntPtr self, SteamId steamIDClan ); + private FGetClanTag _GetClanTag; #endregion internal string GetClanTag( SteamId steamIDClan ) { - return GetString( GetClanTagDelegatePointer( Self, steamIDClan ) ); + return GetString( _GetClanTag( Self, steamIDClan ) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetClanActivityCountsDelegate( IntPtr self, SteamId steamIDClan, ref int pnOnline, ref int pnInGame, ref int pnChatting ); - private GetClanActivityCountsDelegate GetClanActivityCountsDelegatePointer; + private delegate bool FGetClanActivityCounts( IntPtr self, SteamId steamIDClan, ref int pnOnline, ref int pnInGame, ref int pnChatting ); + private FGetClanActivityCounts _GetClanActivityCounts; #endregion internal bool GetClanActivityCounts( SteamId steamIDClan, ref int pnOnline, ref int pnInGame, ref int pnChatting ) { - return GetClanActivityCountsDelegatePointer( Self, steamIDClan, ref pnOnline, ref pnInGame, ref pnChatting ); + return _GetClanActivityCounts( Self, steamIDClan, ref pnOnline, ref pnInGame, ref pnChatting ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t DownloadClanActivityCountsDelegate( IntPtr self, [In,Out] SteamId[] psteamIDClans, int cClansToRequest ); - private DownloadClanActivityCountsDelegate DownloadClanActivityCountsDelegatePointer; + private delegate SteamAPICall_t FDownloadClanActivityCounts( IntPtr self, [In,Out] SteamId[] psteamIDClans, int cClansToRequest ); + private FDownloadClanActivityCounts _DownloadClanActivityCounts; #endregion internal async Task DownloadClanActivityCounts( [In,Out] SteamId[] psteamIDClans, int cClansToRequest ) { - return await (new Result( DownloadClanActivityCountsDelegatePointer( Self, psteamIDClans, cClansToRequest ) )).GetResult(); + return await (new Result( _DownloadClanActivityCounts( Self, psteamIDClans, cClansToRequest ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetFriendCountFromSourceDelegate( IntPtr self, SteamId steamIDSource ); - private GetFriendCountFromSourceDelegate GetFriendCountFromSourceDelegatePointer; + private delegate int FGetFriendCountFromSource( IntPtr self, SteamId steamIDSource ); + private FGetFriendCountFromSource _GetFriendCountFromSource; #endregion internal int GetFriendCountFromSource( SteamId steamIDSource ) { - return GetFriendCountFromSourceDelegatePointer( Self, steamIDSource ); + return _GetFriendCountFromSource( Self, steamIDSource ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void GetFriendFromSourceByIndexDelegate( IntPtr self, ref SteamId retVal, SteamId steamIDSource, int iFriend ); - private GetFriendFromSourceByIndexDelegate GetFriendFromSourceByIndexDelegatePointer; + private delegate void FGetFriendFromSourceByIndex( IntPtr self, ref SteamId retVal, SteamId steamIDSource, int iFriend ); + private FGetFriendFromSourceByIndex _GetFriendFromSourceByIndex; #endregion internal SteamId GetFriendFromSourceByIndex( SteamId steamIDSource, int iFriend ) { var retVal = default( SteamId ); - GetFriendFromSourceByIndexDelegatePointer( Self, ref retVal, steamIDSource, iFriend ); + _GetFriendFromSourceByIndex( Self, ref retVal, steamIDSource, iFriend ); return retVal; } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool IsUserInSourceDelegate( IntPtr self, SteamId steamIDUser, SteamId steamIDSource ); - private IsUserInSourceDelegate IsUserInSourceDelegatePointer; + private delegate bool FIsUserInSource( IntPtr self, SteamId steamIDUser, SteamId steamIDSource ); + private FIsUserInSource _IsUserInSource; #endregion internal bool IsUserInSource( SteamId steamIDUser, SteamId steamIDSource ) { - return IsUserInSourceDelegatePointer( Self, steamIDUser, steamIDSource ); + return _IsUserInSource( Self, steamIDUser, steamIDSource ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetInGameVoiceSpeakingDelegate( IntPtr self, SteamId steamIDUser, [MarshalAs( UnmanagedType.U1 )] bool bSpeaking ); - private SetInGameVoiceSpeakingDelegate SetInGameVoiceSpeakingDelegatePointer; + private delegate void FSetInGameVoiceSpeaking( IntPtr self, SteamId steamIDUser, [MarshalAs( UnmanagedType.U1 )] bool bSpeaking ); + private FSetInGameVoiceSpeaking _SetInGameVoiceSpeaking; #endregion internal void SetInGameVoiceSpeaking( SteamId steamIDUser, [MarshalAs( UnmanagedType.U1 )] bool bSpeaking ) { - SetInGameVoiceSpeakingDelegatePointer( Self, steamIDUser, bSpeaking ); + _SetInGameVoiceSpeaking( Self, steamIDUser, bSpeaking ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void ActivateGameOverlayDelegate( IntPtr self, string pchDialog ); - private ActivateGameOverlayDelegate ActivateGameOverlayDelegatePointer; + private delegate void FActivateGameOverlay( IntPtr self, string pchDialog ); + private FActivateGameOverlay _ActivateGameOverlay; #endregion internal void ActivateGameOverlay( string pchDialog ) { - ActivateGameOverlayDelegatePointer( Self, pchDialog ); + _ActivateGameOverlay( Self, pchDialog ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void ActivateGameOverlayToUserDelegate( IntPtr self, string pchDialog, SteamId steamID ); - private ActivateGameOverlayToUserDelegate ActivateGameOverlayToUserDelegatePointer; + private delegate void FActivateGameOverlayToUser( IntPtr self, string pchDialog, SteamId steamID ); + private FActivateGameOverlayToUser _ActivateGameOverlayToUser; #endregion internal void ActivateGameOverlayToUser( string pchDialog, SteamId steamID ) { - ActivateGameOverlayToUserDelegatePointer( Self, pchDialog, steamID ); + _ActivateGameOverlayToUser( Self, pchDialog, steamID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void ActivateGameOverlayToWebPageDelegate( IntPtr self, string pchURL, ActivateGameOverlayToWebPageMode eMode ); - private ActivateGameOverlayToWebPageDelegate ActivateGameOverlayToWebPageDelegatePointer; + private delegate void FActivateGameOverlayToWebPage( IntPtr self, string pchURL, ActivateGameOverlayToWebPageMode eMode ); + private FActivateGameOverlayToWebPage _ActivateGameOverlayToWebPage; #endregion internal void ActivateGameOverlayToWebPage( string pchURL, ActivateGameOverlayToWebPageMode eMode ) { - ActivateGameOverlayToWebPageDelegatePointer( Self, pchURL, eMode ); + _ActivateGameOverlayToWebPage( Self, pchURL, eMode ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void ActivateGameOverlayToStoreDelegate( IntPtr self, AppId_t nAppID, OverlayToStoreFlag eFlag ); - private ActivateGameOverlayToStoreDelegate ActivateGameOverlayToStoreDelegatePointer; + private delegate void FActivateGameOverlayToStore( IntPtr self, AppId_t nAppID, OverlayToStoreFlag eFlag ); + private FActivateGameOverlayToStore _ActivateGameOverlayToStore; #endregion internal void ActivateGameOverlayToStore( AppId_t nAppID, OverlayToStoreFlag eFlag ) { - ActivateGameOverlayToStoreDelegatePointer( Self, nAppID, eFlag ); + _ActivateGameOverlayToStore( Self, nAppID, eFlag ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetPlayedWithDelegate( IntPtr self, SteamId steamIDUserPlayedWith ); - private SetPlayedWithDelegate SetPlayedWithDelegatePointer; + private delegate void FSetPlayedWith( IntPtr self, SteamId steamIDUserPlayedWith ); + private FSetPlayedWith _SetPlayedWith; #endregion internal void SetPlayedWith( SteamId steamIDUserPlayedWith ) { - SetPlayedWithDelegatePointer( Self, steamIDUserPlayedWith ); + _SetPlayedWith( Self, steamIDUserPlayedWith ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void ActivateGameOverlayInviteDialogDelegate( IntPtr self, SteamId steamIDLobby ); - private ActivateGameOverlayInviteDialogDelegate ActivateGameOverlayInviteDialogDelegatePointer; + private delegate void FActivateGameOverlayInviteDialog( IntPtr self, SteamId steamIDLobby ); + private FActivateGameOverlayInviteDialog _ActivateGameOverlayInviteDialog; #endregion internal void ActivateGameOverlayInviteDialog( SteamId steamIDLobby ) { - ActivateGameOverlayInviteDialogDelegatePointer( Self, steamIDLobby ); + _ActivateGameOverlayInviteDialog( Self, steamIDLobby ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetSmallFriendAvatarDelegate( IntPtr self, SteamId steamIDFriend ); - private GetSmallFriendAvatarDelegate GetSmallFriendAvatarDelegatePointer; + private delegate int FGetSmallFriendAvatar( IntPtr self, SteamId steamIDFriend ); + private FGetSmallFriendAvatar _GetSmallFriendAvatar; #endregion internal int GetSmallFriendAvatar( SteamId steamIDFriend ) { - return GetSmallFriendAvatarDelegatePointer( Self, steamIDFriend ); + return _GetSmallFriendAvatar( Self, steamIDFriend ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetMediumFriendAvatarDelegate( IntPtr self, SteamId steamIDFriend ); - private GetMediumFriendAvatarDelegate GetMediumFriendAvatarDelegatePointer; + private delegate int FGetMediumFriendAvatar( IntPtr self, SteamId steamIDFriend ); + private FGetMediumFriendAvatar _GetMediumFriendAvatar; #endregion internal int GetMediumFriendAvatar( SteamId steamIDFriend ) { - return GetMediumFriendAvatarDelegatePointer( Self, steamIDFriend ); + return _GetMediumFriendAvatar( Self, steamIDFriend ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetLargeFriendAvatarDelegate( IntPtr self, SteamId steamIDFriend ); - private GetLargeFriendAvatarDelegate GetLargeFriendAvatarDelegatePointer; + private delegate int FGetLargeFriendAvatar( IntPtr self, SteamId steamIDFriend ); + private FGetLargeFriendAvatar _GetLargeFriendAvatar; #endregion internal int GetLargeFriendAvatar( SteamId steamIDFriend ) { - return GetLargeFriendAvatarDelegatePointer( Self, steamIDFriend ); + return _GetLargeFriendAvatar( Self, steamIDFriend ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool RequestUserInformationDelegate( IntPtr self, SteamId steamIDUser, [MarshalAs( UnmanagedType.U1 )] bool bRequireNameOnly ); - private RequestUserInformationDelegate RequestUserInformationDelegatePointer; + private delegate bool FRequestUserInformation( IntPtr self, SteamId steamIDUser, [MarshalAs( UnmanagedType.U1 )] bool bRequireNameOnly ); + private FRequestUserInformation _RequestUserInformation; #endregion internal bool RequestUserInformation( SteamId steamIDUser, [MarshalAs( UnmanagedType.U1 )] bool bRequireNameOnly ) { - return RequestUserInformationDelegatePointer( Self, steamIDUser, bRequireNameOnly ); + return _RequestUserInformation( Self, steamIDUser, bRequireNameOnly ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t RequestClanOfficerListDelegate( IntPtr self, SteamId steamIDClan ); - private RequestClanOfficerListDelegate RequestClanOfficerListDelegatePointer; + private delegate SteamAPICall_t FRequestClanOfficerList( IntPtr self, SteamId steamIDClan ); + private FRequestClanOfficerList _RequestClanOfficerList; #endregion internal async Task RequestClanOfficerList( SteamId steamIDClan ) { - return await (new Result( RequestClanOfficerListDelegatePointer( Self, steamIDClan ) )).GetResult(); + return await (new Result( _RequestClanOfficerList( Self, steamIDClan ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void GetClanOwnerDelegate( IntPtr self, ref SteamId retVal, SteamId steamIDClan ); - private GetClanOwnerDelegate GetClanOwnerDelegatePointer; + private delegate void FGetClanOwner( IntPtr self, ref SteamId retVal, SteamId steamIDClan ); + private FGetClanOwner _GetClanOwner; #endregion internal SteamId GetClanOwner( SteamId steamIDClan ) { var retVal = default( SteamId ); - GetClanOwnerDelegatePointer( Self, ref retVal, steamIDClan ); + _GetClanOwner( Self, ref retVal, steamIDClan ); return retVal; } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetClanOfficerCountDelegate( IntPtr self, SteamId steamIDClan ); - private GetClanOfficerCountDelegate GetClanOfficerCountDelegatePointer; + private delegate int FGetClanOfficerCount( IntPtr self, SteamId steamIDClan ); + private FGetClanOfficerCount _GetClanOfficerCount; #endregion internal int GetClanOfficerCount( SteamId steamIDClan ) { - return GetClanOfficerCountDelegatePointer( Self, steamIDClan ); + return _GetClanOfficerCount( Self, steamIDClan ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void GetClanOfficerByIndexDelegate( IntPtr self, ref SteamId retVal, SteamId steamIDClan, int iOfficer ); - private GetClanOfficerByIndexDelegate GetClanOfficerByIndexDelegatePointer; + private delegate void FGetClanOfficerByIndex( IntPtr self, ref SteamId retVal, SteamId steamIDClan, int iOfficer ); + private FGetClanOfficerByIndex _GetClanOfficerByIndex; #endregion internal SteamId GetClanOfficerByIndex( SteamId steamIDClan, int iOfficer ) { var retVal = default( SteamId ); - GetClanOfficerByIndexDelegatePointer( Self, ref retVal, steamIDClan, iOfficer ); + _GetClanOfficerByIndex( Self, ref retVal, steamIDClan, iOfficer ); return retVal; } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate uint GetUserRestrictionsDelegate( IntPtr self ); - private GetUserRestrictionsDelegate GetUserRestrictionsDelegatePointer; + private delegate uint FGetUserRestrictions( IntPtr self ); + private FGetUserRestrictions _GetUserRestrictions; #endregion internal uint GetUserRestrictions() { - return GetUserRestrictionsDelegatePointer( Self ); + return _GetUserRestrictions( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool SetRichPresenceDelegate( IntPtr self, string pchKey, string pchValue ); - private SetRichPresenceDelegate SetRichPresenceDelegatePointer; + private delegate bool FSetRichPresence( IntPtr self, string pchKey, string pchValue ); + private FSetRichPresence _SetRichPresence; #endregion internal bool SetRichPresence( string pchKey, string pchValue ) { - return SetRichPresenceDelegatePointer( Self, pchKey, pchValue ); + return _SetRichPresence( Self, pchKey, pchValue ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void ClearRichPresenceDelegate( IntPtr self ); - private ClearRichPresenceDelegate ClearRichPresenceDelegatePointer; + private delegate void FClearRichPresence( IntPtr self ); + private FClearRichPresence _ClearRichPresence; #endregion internal void ClearRichPresence() { - ClearRichPresenceDelegatePointer( Self ); + _ClearRichPresence( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate IntPtr GetFriendRichPresenceDelegate( IntPtr self, SteamId steamIDFriend, string pchKey ); - private GetFriendRichPresenceDelegate GetFriendRichPresenceDelegatePointer; + private delegate IntPtr FGetFriendRichPresence( IntPtr self, SteamId steamIDFriend, string pchKey ); + private FGetFriendRichPresence _GetFriendRichPresence; #endregion internal string GetFriendRichPresence( SteamId steamIDFriend, string pchKey ) { - return GetString( GetFriendRichPresenceDelegatePointer( Self, steamIDFriend, pchKey ) ); + return GetString( _GetFriendRichPresence( Self, steamIDFriend, pchKey ) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetFriendRichPresenceKeyCountDelegate( IntPtr self, SteamId steamIDFriend ); - private GetFriendRichPresenceKeyCountDelegate GetFriendRichPresenceKeyCountDelegatePointer; + private delegate int FGetFriendRichPresenceKeyCount( IntPtr self, SteamId steamIDFriend ); + private FGetFriendRichPresenceKeyCount _GetFriendRichPresenceKeyCount; #endregion internal int GetFriendRichPresenceKeyCount( SteamId steamIDFriend ) { - return GetFriendRichPresenceKeyCountDelegatePointer( Self, steamIDFriend ); + return _GetFriendRichPresenceKeyCount( Self, steamIDFriend ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate IntPtr GetFriendRichPresenceKeyByIndexDelegate( IntPtr self, SteamId steamIDFriend, int iKey ); - private GetFriendRichPresenceKeyByIndexDelegate GetFriendRichPresenceKeyByIndexDelegatePointer; + private delegate IntPtr FGetFriendRichPresenceKeyByIndex( IntPtr self, SteamId steamIDFriend, int iKey ); + private FGetFriendRichPresenceKeyByIndex _GetFriendRichPresenceKeyByIndex; #endregion internal string GetFriendRichPresenceKeyByIndex( SteamId steamIDFriend, int iKey ) { - return GetString( GetFriendRichPresenceKeyByIndexDelegatePointer( Self, steamIDFriend, iKey ) ); + return GetString( _GetFriendRichPresenceKeyByIndex( Self, steamIDFriend, iKey ) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void RequestFriendRichPresenceDelegate( IntPtr self, SteamId steamIDFriend ); - private RequestFriendRichPresenceDelegate RequestFriendRichPresenceDelegatePointer; + private delegate void FRequestFriendRichPresence( IntPtr self, SteamId steamIDFriend ); + private FRequestFriendRichPresence _RequestFriendRichPresence; #endregion internal void RequestFriendRichPresence( SteamId steamIDFriend ) { - RequestFriendRichPresenceDelegatePointer( Self, steamIDFriend ); + _RequestFriendRichPresence( Self, steamIDFriend ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool InviteUserToGameDelegate( IntPtr self, SteamId steamIDFriend, string pchConnectString ); - private InviteUserToGameDelegate InviteUserToGameDelegatePointer; + private delegate bool FInviteUserToGame( IntPtr self, SteamId steamIDFriend, string pchConnectString ); + private FInviteUserToGame _InviteUserToGame; #endregion internal bool InviteUserToGame( SteamId steamIDFriend, string pchConnectString ) { - return InviteUserToGameDelegatePointer( Self, steamIDFriend, pchConnectString ); + return _InviteUserToGame( Self, steamIDFriend, pchConnectString ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetCoplayFriendCountDelegate( IntPtr self ); - private GetCoplayFriendCountDelegate GetCoplayFriendCountDelegatePointer; + private delegate int FGetCoplayFriendCount( IntPtr self ); + private FGetCoplayFriendCount _GetCoplayFriendCount; #endregion internal int GetCoplayFriendCount() { - return GetCoplayFriendCountDelegatePointer( Self ); + return _GetCoplayFriendCount( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void GetCoplayFriendDelegate( IntPtr self, ref SteamId retVal, int iCoplayFriend ); - private GetCoplayFriendDelegate GetCoplayFriendDelegatePointer; + private delegate void FGetCoplayFriend( IntPtr self, ref SteamId retVal, int iCoplayFriend ); + private FGetCoplayFriend _GetCoplayFriend; #endregion internal SteamId GetCoplayFriend( int iCoplayFriend ) { var retVal = default( SteamId ); - GetCoplayFriendDelegatePointer( Self, ref retVal, iCoplayFriend ); + _GetCoplayFriend( Self, ref retVal, iCoplayFriend ); return retVal; } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetFriendCoplayTimeDelegate( IntPtr self, SteamId steamIDFriend ); - private GetFriendCoplayTimeDelegate GetFriendCoplayTimeDelegatePointer; + private delegate int FGetFriendCoplayTime( IntPtr self, SteamId steamIDFriend ); + private FGetFriendCoplayTime _GetFriendCoplayTime; #endregion internal int GetFriendCoplayTime( SteamId steamIDFriend ) { - return GetFriendCoplayTimeDelegatePointer( Self, steamIDFriend ); + return _GetFriendCoplayTime( Self, steamIDFriend ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate AppId_t GetFriendCoplayGameDelegate( IntPtr self, SteamId steamIDFriend ); - private GetFriendCoplayGameDelegate GetFriendCoplayGameDelegatePointer; + private delegate AppId_t FGetFriendCoplayGame( IntPtr self, SteamId steamIDFriend ); + private FGetFriendCoplayGame _GetFriendCoplayGame; #endregion internal AppId_t GetFriendCoplayGame( SteamId steamIDFriend ) { - return GetFriendCoplayGameDelegatePointer( Self, steamIDFriend ); + return _GetFriendCoplayGame( Self, steamIDFriend ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t JoinClanChatRoomDelegate( IntPtr self, SteamId steamIDClan ); - private JoinClanChatRoomDelegate JoinClanChatRoomDelegatePointer; + private delegate SteamAPICall_t FJoinClanChatRoom( IntPtr self, SteamId steamIDClan ); + private FJoinClanChatRoom _JoinClanChatRoom; #endregion internal async Task JoinClanChatRoom( SteamId steamIDClan ) { - return await (new Result( JoinClanChatRoomDelegatePointer( Self, steamIDClan ) )).GetResult(); + return await (new Result( _JoinClanChatRoom( Self, steamIDClan ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool LeaveClanChatRoomDelegate( IntPtr self, SteamId steamIDClan ); - private LeaveClanChatRoomDelegate LeaveClanChatRoomDelegatePointer; + private delegate bool FLeaveClanChatRoom( IntPtr self, SteamId steamIDClan ); + private FLeaveClanChatRoom _LeaveClanChatRoom; #endregion internal bool LeaveClanChatRoom( SteamId steamIDClan ) { - return LeaveClanChatRoomDelegatePointer( Self, steamIDClan ); + return _LeaveClanChatRoom( Self, steamIDClan ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetClanChatMemberCountDelegate( IntPtr self, SteamId steamIDClan ); - private GetClanChatMemberCountDelegate GetClanChatMemberCountDelegatePointer; + private delegate int FGetClanChatMemberCount( IntPtr self, SteamId steamIDClan ); + private FGetClanChatMemberCount _GetClanChatMemberCount; #endregion internal int GetClanChatMemberCount( SteamId steamIDClan ) { - return GetClanChatMemberCountDelegatePointer( Self, steamIDClan ); + return _GetClanChatMemberCount( Self, steamIDClan ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void GetChatMemberByIndexDelegate( IntPtr self, ref SteamId retVal, SteamId steamIDClan, int iUser ); - private GetChatMemberByIndexDelegate GetChatMemberByIndexDelegatePointer; + private delegate void FGetChatMemberByIndex( IntPtr self, ref SteamId retVal, SteamId steamIDClan, int iUser ); + private FGetChatMemberByIndex _GetChatMemberByIndex; #endregion internal SteamId GetChatMemberByIndex( SteamId steamIDClan, int iUser ) { var retVal = default( SteamId ); - GetChatMemberByIndexDelegatePointer( Self, ref retVal, steamIDClan, iUser ); + _GetChatMemberByIndex( Self, ref retVal, steamIDClan, iUser ); return retVal; } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool SendClanChatMessageDelegate( IntPtr self, SteamId steamIDClanChat, string pchText ); - private SendClanChatMessageDelegate SendClanChatMessageDelegatePointer; + private delegate bool FSendClanChatMessage( IntPtr self, SteamId steamIDClanChat, string pchText ); + private FSendClanChatMessage _SendClanChatMessage; #endregion internal bool SendClanChatMessage( SteamId steamIDClanChat, string pchText ) { - return SendClanChatMessageDelegatePointer( Self, steamIDClanChat, pchText ); + return _SendClanChatMessage( Self, steamIDClanChat, pchText ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetClanChatMessageDelegate( IntPtr self, SteamId steamIDClanChat, int iMessage, IntPtr prgchText, int cchTextMax, ref ChatEntryType peChatEntryType, ref SteamId psteamidChatter ); - private GetClanChatMessageDelegate GetClanChatMessageDelegatePointer; + private delegate int FGetClanChatMessage( IntPtr self, SteamId steamIDClanChat, int iMessage, IntPtr prgchText, int cchTextMax, ref ChatEntryType peChatEntryType, ref SteamId psteamidChatter ); + private FGetClanChatMessage _GetClanChatMessage; #endregion internal int GetClanChatMessage( SteamId steamIDClanChat, int iMessage, IntPtr prgchText, int cchTextMax, ref ChatEntryType peChatEntryType, ref SteamId psteamidChatter ) { - return GetClanChatMessageDelegatePointer( Self, steamIDClanChat, iMessage, prgchText, cchTextMax, ref peChatEntryType, ref psteamidChatter ); + return _GetClanChatMessage( Self, steamIDClanChat, iMessage, prgchText, cchTextMax, ref peChatEntryType, ref psteamidChatter ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool IsClanChatAdminDelegate( IntPtr self, SteamId steamIDClanChat, SteamId steamIDUser ); - private IsClanChatAdminDelegate IsClanChatAdminDelegatePointer; + private delegate bool FIsClanChatAdmin( IntPtr self, SteamId steamIDClanChat, SteamId steamIDUser ); + private FIsClanChatAdmin _IsClanChatAdmin; #endregion internal bool IsClanChatAdmin( SteamId steamIDClanChat, SteamId steamIDUser ) { - return IsClanChatAdminDelegatePointer( Self, steamIDClanChat, steamIDUser ); + return _IsClanChatAdmin( Self, steamIDClanChat, steamIDUser ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool IsClanChatWindowOpenInSteamDelegate( IntPtr self, SteamId steamIDClanChat ); - private IsClanChatWindowOpenInSteamDelegate IsClanChatWindowOpenInSteamDelegatePointer; + private delegate bool FIsClanChatWindowOpenInSteam( IntPtr self, SteamId steamIDClanChat ); + private FIsClanChatWindowOpenInSteam _IsClanChatWindowOpenInSteam; #endregion internal bool IsClanChatWindowOpenInSteam( SteamId steamIDClanChat ) { - return IsClanChatWindowOpenInSteamDelegatePointer( Self, steamIDClanChat ); + return _IsClanChatWindowOpenInSteam( Self, steamIDClanChat ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool OpenClanChatWindowInSteamDelegate( IntPtr self, SteamId steamIDClanChat ); - private OpenClanChatWindowInSteamDelegate OpenClanChatWindowInSteamDelegatePointer; + private delegate bool FOpenClanChatWindowInSteam( IntPtr self, SteamId steamIDClanChat ); + private FOpenClanChatWindowInSteam _OpenClanChatWindowInSteam; #endregion internal bool OpenClanChatWindowInSteam( SteamId steamIDClanChat ) { - return OpenClanChatWindowInSteamDelegatePointer( Self, steamIDClanChat ); + return _OpenClanChatWindowInSteam( Self, steamIDClanChat ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool CloseClanChatWindowInSteamDelegate( IntPtr self, SteamId steamIDClanChat ); - private CloseClanChatWindowInSteamDelegate CloseClanChatWindowInSteamDelegatePointer; + private delegate bool FCloseClanChatWindowInSteam( IntPtr self, SteamId steamIDClanChat ); + private FCloseClanChatWindowInSteam _CloseClanChatWindowInSteam; #endregion internal bool CloseClanChatWindowInSteam( SteamId steamIDClanChat ) { - return CloseClanChatWindowInSteamDelegatePointer( Self, steamIDClanChat ); + return _CloseClanChatWindowInSteam( Self, steamIDClanChat ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool SetListenForFriendsMessagesDelegate( IntPtr self, [MarshalAs( UnmanagedType.U1 )] bool bInterceptEnabled ); - private SetListenForFriendsMessagesDelegate SetListenForFriendsMessagesDelegatePointer; + private delegate bool FSetListenForFriendsMessages( IntPtr self, [MarshalAs( UnmanagedType.U1 )] bool bInterceptEnabled ); + private FSetListenForFriendsMessages _SetListenForFriendsMessages; #endregion internal bool SetListenForFriendsMessages( [MarshalAs( UnmanagedType.U1 )] bool bInterceptEnabled ) { - return SetListenForFriendsMessagesDelegatePointer( Self, bInterceptEnabled ); + return _SetListenForFriendsMessages( Self, bInterceptEnabled ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool ReplyToFriendMessageDelegate( IntPtr self, SteamId steamIDFriend, string pchMsgToSend ); - private ReplyToFriendMessageDelegate ReplyToFriendMessageDelegatePointer; + private delegate bool FReplyToFriendMessage( IntPtr self, SteamId steamIDFriend, string pchMsgToSend ); + private FReplyToFriendMessage _ReplyToFriendMessage; #endregion internal bool ReplyToFriendMessage( SteamId steamIDFriend, string pchMsgToSend ) { - return ReplyToFriendMessageDelegatePointer( Self, steamIDFriend, pchMsgToSend ); + return _ReplyToFriendMessage( Self, steamIDFriend, pchMsgToSend ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetFriendMessageDelegate( IntPtr self, SteamId steamIDFriend, int iMessageID, IntPtr pvData, int cubData, ref ChatEntryType peChatEntryType ); - private GetFriendMessageDelegate GetFriendMessageDelegatePointer; + private delegate int FGetFriendMessage( IntPtr self, SteamId steamIDFriend, int iMessageID, IntPtr pvData, int cubData, ref ChatEntryType peChatEntryType ); + private FGetFriendMessage _GetFriendMessage; #endregion internal int GetFriendMessage( SteamId steamIDFriend, int iMessageID, IntPtr pvData, int cubData, ref ChatEntryType peChatEntryType ) { - return GetFriendMessageDelegatePointer( Self, steamIDFriend, iMessageID, pvData, cubData, ref peChatEntryType ); + return _GetFriendMessage( Self, steamIDFriend, iMessageID, pvData, cubData, ref peChatEntryType ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t GetFollowerCountDelegate( IntPtr self, SteamId steamID ); - private GetFollowerCountDelegate GetFollowerCountDelegatePointer; + private delegate SteamAPICall_t FGetFollowerCount( IntPtr self, SteamId steamID ); + private FGetFollowerCount _GetFollowerCount; #endregion internal async Task GetFollowerCount( SteamId steamID ) { - return await (new Result( GetFollowerCountDelegatePointer( Self, steamID ) )).GetResult(); + return await (new Result( _GetFollowerCount( Self, steamID ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t IsFollowingDelegate( IntPtr self, SteamId steamID ); - private IsFollowingDelegate IsFollowingDelegatePointer; + private delegate SteamAPICall_t FIsFollowing( IntPtr self, SteamId steamID ); + private FIsFollowing _IsFollowing; #endregion internal async Task IsFollowing( SteamId steamID ) { - return await (new Result( IsFollowingDelegatePointer( Self, steamID ) )).GetResult(); + return await (new Result( _IsFollowing( Self, steamID ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t EnumerateFollowingListDelegate( IntPtr self, uint unStartIndex ); - private EnumerateFollowingListDelegate EnumerateFollowingListDelegatePointer; + private delegate SteamAPICall_t FEnumerateFollowingList( IntPtr self, uint unStartIndex ); + private FEnumerateFollowingList _EnumerateFollowingList; #endregion internal async Task EnumerateFollowingList( uint unStartIndex ) { - return await (new Result( EnumerateFollowingListDelegatePointer( Self, unStartIndex ) )).GetResult(); + return await (new Result( _EnumerateFollowingList( Self, unStartIndex ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool IsClanPublicDelegate( IntPtr self, SteamId steamIDClan ); - private IsClanPublicDelegate IsClanPublicDelegatePointer; + private delegate bool FIsClanPublic( IntPtr self, SteamId steamIDClan ); + private FIsClanPublic _IsClanPublic; #endregion internal bool IsClanPublic( SteamId steamIDClan ) { - return IsClanPublicDelegatePointer( Self, steamIDClan ); + return _IsClanPublic( Self, steamIDClan ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool IsClanOfficialGameGroupDelegate( IntPtr self, SteamId steamIDClan ); - private IsClanOfficialGameGroupDelegate IsClanOfficialGameGroupDelegatePointer; + private delegate bool FIsClanOfficialGameGroup( IntPtr self, SteamId steamIDClan ); + private FIsClanOfficialGameGroup _IsClanOfficialGameGroup; #endregion internal bool IsClanOfficialGameGroup( SteamId steamIDClan ) { - return IsClanOfficialGameGroupDelegatePointer( Self, steamIDClan ); + return _IsClanOfficialGameGroup( Self, steamIDClan ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetNumChatsWithUnreadPriorityMessagesDelegate( IntPtr self ); - private GetNumChatsWithUnreadPriorityMessagesDelegate GetNumChatsWithUnreadPriorityMessagesDelegatePointer; + private delegate int FGetNumChatsWithUnreadPriorityMessages( IntPtr self ); + private FGetNumChatsWithUnreadPriorityMessages _GetNumChatsWithUnreadPriorityMessages; #endregion internal int GetNumChatsWithUnreadPriorityMessages() { - return GetNumChatsWithUnreadPriorityMessagesDelegatePointer( Self ); + return _GetNumChatsWithUnreadPriorityMessages( Self ); } } diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamGameServer.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamGameServer.cs index b3ef075..5a71bdd 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamGameServer.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamGameServer.cs @@ -17,546 +17,546 @@ public ISteamGameServer( bool server = false ) : base( server ) public override void InitInternals() { - InitGameServerDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); - SetProductDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); - SetGameDescriptionDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); - SetModDirDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); - SetDedicatedServerDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); - LogOnDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); - LogOnAnonymousDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 48) ); - LogOffDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 56) ); - BLoggedOnDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 64) ); - BSecureDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 72) ); - GetSteamIDDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 80) ); - WasRestartRequestedDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 88) ); - SetMaxPlayerCountDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 96) ); - SetBotPlayerCountDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 104) ); - SetServerNameDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 112) ); - SetMapNameDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 120) ); - SetPasswordProtectedDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 128) ); - SetSpectatorPortDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 136) ); - SetSpectatorServerNameDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 144) ); - ClearAllKeyValuesDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 152) ); - SetKeyValueDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 160) ); - SetGameTagsDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 168) ); - SetGameDataDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 176) ); - SetRegionDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 184) ); - SendUserConnectAndAuthenticateDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 192) ); - CreateUnauthenticatedUserConnectionDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 200) ); - SendUserDisconnectDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 208) ); - BUpdateUserDataDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 216) ); - GetAuthSessionTicketDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 224) ); - BeginAuthSessionDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 232) ); - EndAuthSessionDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 240) ); - CancelAuthTicketDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 248) ); - UserHasLicenseForAppDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 256) ); - RequestUserGroupStatusDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 264) ); - GetGameplayStatsDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 272) ); - GetServerReputationDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 280) ); - GetPublicIPDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 288) ); - HandleIncomingPacketDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 296) ); - GetNextOutgoingPacketDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 304) ); - EnableHeartbeatsDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 312) ); - SetHeartbeatIntervalDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 320) ); - ForceHeartbeatDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 328) ); - AssociateWithClanDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 336) ); - ComputeNewPlayerCompatibilityDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 344) ); + _InitGameServer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); + _SetProduct = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); + _SetGameDescription = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); + _SetModDir = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); + _SetDedicatedServer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); + _LogOn = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); + _LogOnAnonymous = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 48) ); + _LogOff = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 56) ); + _BLoggedOn = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 64) ); + _BSecure = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 72) ); + _GetSteamID = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 80) ); + _WasRestartRequested = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 88) ); + _SetMaxPlayerCount = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 96) ); + _SetBotPlayerCount = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 104) ); + _SetServerName = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 112) ); + _SetMapName = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 120) ); + _SetPasswordProtected = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 128) ); + _SetSpectatorPort = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 136) ); + _SetSpectatorServerName = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 144) ); + _ClearAllKeyValues = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 152) ); + _SetKeyValue = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 160) ); + _SetGameTags = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 168) ); + _SetGameData = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 176) ); + _SetRegion = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 184) ); + _SendUserConnectAndAuthenticate = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 192) ); + _CreateUnauthenticatedUserConnection = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 200) ); + _SendUserDisconnect = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 208) ); + _BUpdateUserData = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 216) ); + _GetAuthSessionTicket = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 224) ); + _BeginAuthSession = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 232) ); + _EndAuthSession = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 240) ); + _CancelAuthTicket = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 248) ); + _UserHasLicenseForApp = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 256) ); + _RequestUserGroupStatus = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 264) ); + _GetGameplayStats = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 272) ); + _GetServerReputation = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 280) ); + _GetPublicIP = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 288) ); + _HandleIncomingPacket = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 296) ); + _GetNextOutgoingPacket = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 304) ); + _EnableHeartbeats = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 312) ); + _SetHeartbeatInterval = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 320) ); + _ForceHeartbeat = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 328) ); + _AssociateWithClan = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 336) ); + _ComputeNewPlayerCompatibility = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 344) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool InitGameServerDelegate( IntPtr self, uint unIP, ushort usGamePort, ushort usQueryPort, uint unFlags, AppId_t nGameAppId, string pchVersionString ); - private InitGameServerDelegate InitGameServerDelegatePointer; + private delegate bool FInitGameServer( IntPtr self, uint unIP, ushort usGamePort, ushort usQueryPort, uint unFlags, AppId_t nGameAppId, string pchVersionString ); + private FInitGameServer _InitGameServer; #endregion internal bool InitGameServer( uint unIP, ushort usGamePort, ushort usQueryPort, uint unFlags, AppId_t nGameAppId, string pchVersionString ) { - return InitGameServerDelegatePointer( Self, unIP, usGamePort, usQueryPort, unFlags, nGameAppId, pchVersionString ); + return _InitGameServer( Self, unIP, usGamePort, usQueryPort, unFlags, nGameAppId, pchVersionString ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetProductDelegate( IntPtr self, string pszProduct ); - private SetProductDelegate SetProductDelegatePointer; + private delegate void FSetProduct( IntPtr self, string pszProduct ); + private FSetProduct _SetProduct; #endregion internal void SetProduct( string pszProduct ) { - SetProductDelegatePointer( Self, pszProduct ); + _SetProduct( Self, pszProduct ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetGameDescriptionDelegate( IntPtr self, string pszGameDescription ); - private SetGameDescriptionDelegate SetGameDescriptionDelegatePointer; + private delegate void FSetGameDescription( IntPtr self, string pszGameDescription ); + private FSetGameDescription _SetGameDescription; #endregion internal void SetGameDescription( string pszGameDescription ) { - SetGameDescriptionDelegatePointer( Self, pszGameDescription ); + _SetGameDescription( Self, pszGameDescription ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetModDirDelegate( IntPtr self, string pszModDir ); - private SetModDirDelegate SetModDirDelegatePointer; + private delegate void FSetModDir( IntPtr self, string pszModDir ); + private FSetModDir _SetModDir; #endregion internal void SetModDir( string pszModDir ) { - SetModDirDelegatePointer( Self, pszModDir ); + _SetModDir( Self, pszModDir ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetDedicatedServerDelegate( IntPtr self, [MarshalAs( UnmanagedType.U1 )] bool bDedicated ); - private SetDedicatedServerDelegate SetDedicatedServerDelegatePointer; + private delegate void FSetDedicatedServer( IntPtr self, [MarshalAs( UnmanagedType.U1 )] bool bDedicated ); + private FSetDedicatedServer _SetDedicatedServer; #endregion internal void SetDedicatedServer( [MarshalAs( UnmanagedType.U1 )] bool bDedicated ) { - SetDedicatedServerDelegatePointer( Self, bDedicated ); + _SetDedicatedServer( Self, bDedicated ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void LogOnDelegate( IntPtr self, string pszToken ); - private LogOnDelegate LogOnDelegatePointer; + private delegate void FLogOn( IntPtr self, string pszToken ); + private FLogOn _LogOn; #endregion internal void LogOn( string pszToken ) { - LogOnDelegatePointer( Self, pszToken ); + _LogOn( Self, pszToken ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void LogOnAnonymousDelegate( IntPtr self ); - private LogOnAnonymousDelegate LogOnAnonymousDelegatePointer; + private delegate void FLogOnAnonymous( IntPtr self ); + private FLogOnAnonymous _LogOnAnonymous; #endregion internal void LogOnAnonymous() { - LogOnAnonymousDelegatePointer( Self ); + _LogOnAnonymous( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void LogOffDelegate( IntPtr self ); - private LogOffDelegate LogOffDelegatePointer; + private delegate void FLogOff( IntPtr self ); + private FLogOff _LogOff; #endregion internal void LogOff() { - LogOffDelegatePointer( Self ); + _LogOff( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BLoggedOnDelegate( IntPtr self ); - private BLoggedOnDelegate BLoggedOnDelegatePointer; + private delegate bool FBLoggedOn( IntPtr self ); + private FBLoggedOn _BLoggedOn; #endregion internal bool BLoggedOn() { - return BLoggedOnDelegatePointer( Self ); + return _BLoggedOn( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BSecureDelegate( IntPtr self ); - private BSecureDelegate BSecureDelegatePointer; + private delegate bool FBSecure( IntPtr self ); + private FBSecure _BSecure; #endregion internal bool BSecure() { - return BSecureDelegatePointer( Self ); + return _BSecure( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void GetSteamIDDelegate( IntPtr self, ref SteamId retVal ); - private GetSteamIDDelegate GetSteamIDDelegatePointer; + private delegate void FGetSteamID( IntPtr self, ref SteamId retVal ); + private FGetSteamID _GetSteamID; #endregion internal SteamId GetSteamID() { var retVal = default( SteamId ); - GetSteamIDDelegatePointer( Self, ref retVal ); + _GetSteamID( Self, ref retVal ); return retVal; } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool WasRestartRequestedDelegate( IntPtr self ); - private WasRestartRequestedDelegate WasRestartRequestedDelegatePointer; + private delegate bool FWasRestartRequested( IntPtr self ); + private FWasRestartRequested _WasRestartRequested; #endregion internal bool WasRestartRequested() { - return WasRestartRequestedDelegatePointer( Self ); + return _WasRestartRequested( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetMaxPlayerCountDelegate( IntPtr self, int cPlayersMax ); - private SetMaxPlayerCountDelegate SetMaxPlayerCountDelegatePointer; + private delegate void FSetMaxPlayerCount( IntPtr self, int cPlayersMax ); + private FSetMaxPlayerCount _SetMaxPlayerCount; #endregion internal void SetMaxPlayerCount( int cPlayersMax ) { - SetMaxPlayerCountDelegatePointer( Self, cPlayersMax ); + _SetMaxPlayerCount( Self, cPlayersMax ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetBotPlayerCountDelegate( IntPtr self, int cBotplayers ); - private SetBotPlayerCountDelegate SetBotPlayerCountDelegatePointer; + private delegate void FSetBotPlayerCount( IntPtr self, int cBotplayers ); + private FSetBotPlayerCount _SetBotPlayerCount; #endregion internal void SetBotPlayerCount( int cBotplayers ) { - SetBotPlayerCountDelegatePointer( Self, cBotplayers ); + _SetBotPlayerCount( Self, cBotplayers ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetServerNameDelegate( IntPtr self, string pszServerName ); - private SetServerNameDelegate SetServerNameDelegatePointer; + private delegate void FSetServerName( IntPtr self, string pszServerName ); + private FSetServerName _SetServerName; #endregion internal void SetServerName( string pszServerName ) { - SetServerNameDelegatePointer( Self, pszServerName ); + _SetServerName( Self, pszServerName ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetMapNameDelegate( IntPtr self, string pszMapName ); - private SetMapNameDelegate SetMapNameDelegatePointer; + private delegate void FSetMapName( IntPtr self, string pszMapName ); + private FSetMapName _SetMapName; #endregion internal void SetMapName( string pszMapName ) { - SetMapNameDelegatePointer( Self, pszMapName ); + _SetMapName( Self, pszMapName ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetPasswordProtectedDelegate( IntPtr self, [MarshalAs( UnmanagedType.U1 )] bool bPasswordProtected ); - private SetPasswordProtectedDelegate SetPasswordProtectedDelegatePointer; + private delegate void FSetPasswordProtected( IntPtr self, [MarshalAs( UnmanagedType.U1 )] bool bPasswordProtected ); + private FSetPasswordProtected _SetPasswordProtected; #endregion internal void SetPasswordProtected( [MarshalAs( UnmanagedType.U1 )] bool bPasswordProtected ) { - SetPasswordProtectedDelegatePointer( Self, bPasswordProtected ); + _SetPasswordProtected( Self, bPasswordProtected ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetSpectatorPortDelegate( IntPtr self, ushort unSpectatorPort ); - private SetSpectatorPortDelegate SetSpectatorPortDelegatePointer; + private delegate void FSetSpectatorPort( IntPtr self, ushort unSpectatorPort ); + private FSetSpectatorPort _SetSpectatorPort; #endregion internal void SetSpectatorPort( ushort unSpectatorPort ) { - SetSpectatorPortDelegatePointer( Self, unSpectatorPort ); + _SetSpectatorPort( Self, unSpectatorPort ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetSpectatorServerNameDelegate( IntPtr self, string pszSpectatorServerName ); - private SetSpectatorServerNameDelegate SetSpectatorServerNameDelegatePointer; + private delegate void FSetSpectatorServerName( IntPtr self, string pszSpectatorServerName ); + private FSetSpectatorServerName _SetSpectatorServerName; #endregion internal void SetSpectatorServerName( string pszSpectatorServerName ) { - SetSpectatorServerNameDelegatePointer( Self, pszSpectatorServerName ); + _SetSpectatorServerName( Self, pszSpectatorServerName ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void ClearAllKeyValuesDelegate( IntPtr self ); - private ClearAllKeyValuesDelegate ClearAllKeyValuesDelegatePointer; + private delegate void FClearAllKeyValues( IntPtr self ); + private FClearAllKeyValues _ClearAllKeyValues; #endregion internal void ClearAllKeyValues() { - ClearAllKeyValuesDelegatePointer( Self ); + _ClearAllKeyValues( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetKeyValueDelegate( IntPtr self, string pKey, string pValue ); - private SetKeyValueDelegate SetKeyValueDelegatePointer; + private delegate void FSetKeyValue( IntPtr self, string pKey, string pValue ); + private FSetKeyValue _SetKeyValue; #endregion internal void SetKeyValue( string pKey, string pValue ) { - SetKeyValueDelegatePointer( Self, pKey, pValue ); + _SetKeyValue( Self, pKey, pValue ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetGameTagsDelegate( IntPtr self, string pchGameTags ); - private SetGameTagsDelegate SetGameTagsDelegatePointer; + private delegate void FSetGameTags( IntPtr self, string pchGameTags ); + private FSetGameTags _SetGameTags; #endregion internal void SetGameTags( string pchGameTags ) { - SetGameTagsDelegatePointer( Self, pchGameTags ); + _SetGameTags( Self, pchGameTags ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetGameDataDelegate( IntPtr self, string pchGameData ); - private SetGameDataDelegate SetGameDataDelegatePointer; + private delegate void FSetGameData( IntPtr self, string pchGameData ); + private FSetGameData _SetGameData; #endregion internal void SetGameData( string pchGameData ) { - SetGameDataDelegatePointer( Self, pchGameData ); + _SetGameData( Self, pchGameData ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetRegionDelegate( IntPtr self, string pszRegion ); - private SetRegionDelegate SetRegionDelegatePointer; + private delegate void FSetRegion( IntPtr self, string pszRegion ); + private FSetRegion _SetRegion; #endregion internal void SetRegion( string pszRegion ) { - SetRegionDelegatePointer( Self, pszRegion ); + _SetRegion( Self, pszRegion ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool SendUserConnectAndAuthenticateDelegate( IntPtr self, uint unIPClient, IntPtr pvAuthBlob, uint cubAuthBlobSize, ref SteamId pSteamIDUser ); - private SendUserConnectAndAuthenticateDelegate SendUserConnectAndAuthenticateDelegatePointer; + private delegate bool FSendUserConnectAndAuthenticate( IntPtr self, uint unIPClient, IntPtr pvAuthBlob, uint cubAuthBlobSize, ref SteamId pSteamIDUser ); + private FSendUserConnectAndAuthenticate _SendUserConnectAndAuthenticate; #endregion internal bool SendUserConnectAndAuthenticate( uint unIPClient, IntPtr pvAuthBlob, uint cubAuthBlobSize, ref SteamId pSteamIDUser ) { - return SendUserConnectAndAuthenticateDelegatePointer( Self, unIPClient, pvAuthBlob, cubAuthBlobSize, ref pSteamIDUser ); + return _SendUserConnectAndAuthenticate( Self, unIPClient, pvAuthBlob, cubAuthBlobSize, ref pSteamIDUser ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void CreateUnauthenticatedUserConnectionDelegate( IntPtr self, ref SteamId retVal ); - private CreateUnauthenticatedUserConnectionDelegate CreateUnauthenticatedUserConnectionDelegatePointer; + private delegate void FCreateUnauthenticatedUserConnection( IntPtr self, ref SteamId retVal ); + private FCreateUnauthenticatedUserConnection _CreateUnauthenticatedUserConnection; #endregion internal SteamId CreateUnauthenticatedUserConnection() { var retVal = default( SteamId ); - CreateUnauthenticatedUserConnectionDelegatePointer( Self, ref retVal ); + _CreateUnauthenticatedUserConnection( Self, ref retVal ); return retVal; } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SendUserDisconnectDelegate( IntPtr self, SteamId steamIDUser ); - private SendUserDisconnectDelegate SendUserDisconnectDelegatePointer; + private delegate void FSendUserDisconnect( IntPtr self, SteamId steamIDUser ); + private FSendUserDisconnect _SendUserDisconnect; #endregion internal void SendUserDisconnect( SteamId steamIDUser ) { - SendUserDisconnectDelegatePointer( Self, steamIDUser ); + _SendUserDisconnect( Self, steamIDUser ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BUpdateUserDataDelegate( IntPtr self, SteamId steamIDUser, string pchPlayerName, uint uScore ); - private BUpdateUserDataDelegate BUpdateUserDataDelegatePointer; + private delegate bool FBUpdateUserData( IntPtr self, SteamId steamIDUser, string pchPlayerName, uint uScore ); + private FBUpdateUserData _BUpdateUserData; #endregion internal bool BUpdateUserData( SteamId steamIDUser, string pchPlayerName, uint uScore ) { - return BUpdateUserDataDelegatePointer( Self, steamIDUser, pchPlayerName, uScore ); + return _BUpdateUserData( Self, steamIDUser, pchPlayerName, uScore ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate HAuthTicket GetAuthSessionTicketDelegate( IntPtr self, IntPtr pTicket, int cbMaxTicket, ref uint pcbTicket ); - private GetAuthSessionTicketDelegate GetAuthSessionTicketDelegatePointer; + private delegate HAuthTicket FGetAuthSessionTicket( IntPtr self, IntPtr pTicket, int cbMaxTicket, ref uint pcbTicket ); + private FGetAuthSessionTicket _GetAuthSessionTicket; #endregion internal HAuthTicket GetAuthSessionTicket( IntPtr pTicket, int cbMaxTicket, ref uint pcbTicket ) { - return GetAuthSessionTicketDelegatePointer( Self, pTicket, cbMaxTicket, ref pcbTicket ); + return _GetAuthSessionTicket( Self, pTicket, cbMaxTicket, ref pcbTicket ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate BeginAuthResult BeginAuthSessionDelegate( IntPtr self, IntPtr pAuthTicket, int cbAuthTicket, SteamId steamID ); - private BeginAuthSessionDelegate BeginAuthSessionDelegatePointer; + private delegate BeginAuthResult FBeginAuthSession( IntPtr self, IntPtr pAuthTicket, int cbAuthTicket, SteamId steamID ); + private FBeginAuthSession _BeginAuthSession; #endregion internal BeginAuthResult BeginAuthSession( IntPtr pAuthTicket, int cbAuthTicket, SteamId steamID ) { - return BeginAuthSessionDelegatePointer( Self, pAuthTicket, cbAuthTicket, steamID ); + return _BeginAuthSession( Self, pAuthTicket, cbAuthTicket, steamID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void EndAuthSessionDelegate( IntPtr self, SteamId steamID ); - private EndAuthSessionDelegate EndAuthSessionDelegatePointer; + private delegate void FEndAuthSession( IntPtr self, SteamId steamID ); + private FEndAuthSession _EndAuthSession; #endregion internal void EndAuthSession( SteamId steamID ) { - EndAuthSessionDelegatePointer( Self, steamID ); + _EndAuthSession( Self, steamID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void CancelAuthTicketDelegate( IntPtr self, HAuthTicket hAuthTicket ); - private CancelAuthTicketDelegate CancelAuthTicketDelegatePointer; + private delegate void FCancelAuthTicket( IntPtr self, HAuthTicket hAuthTicket ); + private FCancelAuthTicket _CancelAuthTicket; #endregion internal void CancelAuthTicket( HAuthTicket hAuthTicket ) { - CancelAuthTicketDelegatePointer( Self, hAuthTicket ); + _CancelAuthTicket( Self, hAuthTicket ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate UserHasLicenseForAppResult UserHasLicenseForAppDelegate( IntPtr self, SteamId steamID, AppId_t appID ); - private UserHasLicenseForAppDelegate UserHasLicenseForAppDelegatePointer; + private delegate UserHasLicenseForAppResult FUserHasLicenseForApp( IntPtr self, SteamId steamID, AppId_t appID ); + private FUserHasLicenseForApp _UserHasLicenseForApp; #endregion internal UserHasLicenseForAppResult UserHasLicenseForApp( SteamId steamID, AppId_t appID ) { - return UserHasLicenseForAppDelegatePointer( Self, steamID, appID ); + return _UserHasLicenseForApp( Self, steamID, appID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool RequestUserGroupStatusDelegate( IntPtr self, SteamId steamIDUser, SteamId steamIDGroup ); - private RequestUserGroupStatusDelegate RequestUserGroupStatusDelegatePointer; + private delegate bool FRequestUserGroupStatus( IntPtr self, SteamId steamIDUser, SteamId steamIDGroup ); + private FRequestUserGroupStatus _RequestUserGroupStatus; #endregion internal bool RequestUserGroupStatus( SteamId steamIDUser, SteamId steamIDGroup ) { - return RequestUserGroupStatusDelegatePointer( Self, steamIDUser, steamIDGroup ); + return _RequestUserGroupStatus( Self, steamIDUser, steamIDGroup ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void GetGameplayStatsDelegate( IntPtr self ); - private GetGameplayStatsDelegate GetGameplayStatsDelegatePointer; + private delegate void FGetGameplayStats( IntPtr self ); + private FGetGameplayStats _GetGameplayStats; #endregion internal void GetGameplayStats() { - GetGameplayStatsDelegatePointer( Self ); + _GetGameplayStats( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t GetServerReputationDelegate( IntPtr self ); - private GetServerReputationDelegate GetServerReputationDelegatePointer; + private delegate SteamAPICall_t FGetServerReputation( IntPtr self ); + private FGetServerReputation _GetServerReputation; #endregion internal async Task GetServerReputation() { - return await (new Result( GetServerReputationDelegatePointer( Self ) )).GetResult(); + return await (new Result( _GetServerReputation( Self ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate uint GetPublicIPDelegate( IntPtr self ); - private GetPublicIPDelegate GetPublicIPDelegatePointer; + private delegate uint FGetPublicIP( IntPtr self ); + private FGetPublicIP _GetPublicIP; #endregion internal uint GetPublicIP() { - return GetPublicIPDelegatePointer( Self ); + return _GetPublicIP( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool HandleIncomingPacketDelegate( IntPtr self, IntPtr pData, int cbData, uint srcIP, ushort srcPort ); - private HandleIncomingPacketDelegate HandleIncomingPacketDelegatePointer; + private delegate bool FHandleIncomingPacket( IntPtr self, IntPtr pData, int cbData, uint srcIP, ushort srcPort ); + private FHandleIncomingPacket _HandleIncomingPacket; #endregion internal bool HandleIncomingPacket( IntPtr pData, int cbData, uint srcIP, ushort srcPort ) { - return HandleIncomingPacketDelegatePointer( Self, pData, cbData, srcIP, srcPort ); + return _HandleIncomingPacket( Self, pData, cbData, srcIP, srcPort ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetNextOutgoingPacketDelegate( IntPtr self, IntPtr pOut, int cbMaxOut, ref uint pNetAdr, ref ushort pPort ); - private GetNextOutgoingPacketDelegate GetNextOutgoingPacketDelegatePointer; + private delegate int FGetNextOutgoingPacket( IntPtr self, IntPtr pOut, int cbMaxOut, ref uint pNetAdr, ref ushort pPort ); + private FGetNextOutgoingPacket _GetNextOutgoingPacket; #endregion internal int GetNextOutgoingPacket( IntPtr pOut, int cbMaxOut, ref uint pNetAdr, ref ushort pPort ) { - return GetNextOutgoingPacketDelegatePointer( Self, pOut, cbMaxOut, ref pNetAdr, ref pPort ); + return _GetNextOutgoingPacket( Self, pOut, cbMaxOut, ref pNetAdr, ref pPort ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void EnableHeartbeatsDelegate( IntPtr self, [MarshalAs( UnmanagedType.U1 )] bool bActive ); - private EnableHeartbeatsDelegate EnableHeartbeatsDelegatePointer; + private delegate void FEnableHeartbeats( IntPtr self, [MarshalAs( UnmanagedType.U1 )] bool bActive ); + private FEnableHeartbeats _EnableHeartbeats; #endregion internal void EnableHeartbeats( [MarshalAs( UnmanagedType.U1 )] bool bActive ) { - EnableHeartbeatsDelegatePointer( Self, bActive ); + _EnableHeartbeats( Self, bActive ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetHeartbeatIntervalDelegate( IntPtr self, int iHeartbeatInterval ); - private SetHeartbeatIntervalDelegate SetHeartbeatIntervalDelegatePointer; + private delegate void FSetHeartbeatInterval( IntPtr self, int iHeartbeatInterval ); + private FSetHeartbeatInterval _SetHeartbeatInterval; #endregion internal void SetHeartbeatInterval( int iHeartbeatInterval ) { - SetHeartbeatIntervalDelegatePointer( Self, iHeartbeatInterval ); + _SetHeartbeatInterval( Self, iHeartbeatInterval ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void ForceHeartbeatDelegate( IntPtr self ); - private ForceHeartbeatDelegate ForceHeartbeatDelegatePointer; + private delegate void FForceHeartbeat( IntPtr self ); + private FForceHeartbeat _ForceHeartbeat; #endregion internal void ForceHeartbeat() { - ForceHeartbeatDelegatePointer( Self ); + _ForceHeartbeat( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t AssociateWithClanDelegate( IntPtr self, SteamId steamIDClan ); - private AssociateWithClanDelegate AssociateWithClanDelegatePointer; + private delegate SteamAPICall_t FAssociateWithClan( IntPtr self, SteamId steamIDClan ); + private FAssociateWithClan _AssociateWithClan; #endregion internal async Task AssociateWithClan( SteamId steamIDClan ) { - return await (new Result( AssociateWithClanDelegatePointer( Self, steamIDClan ) )).GetResult(); + return await (new Result( _AssociateWithClan( Self, steamIDClan ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t ComputeNewPlayerCompatibilityDelegate( IntPtr self, SteamId steamIDNewPlayer ); - private ComputeNewPlayerCompatibilityDelegate ComputeNewPlayerCompatibilityDelegatePointer; + private delegate SteamAPICall_t FComputeNewPlayerCompatibility( IntPtr self, SteamId steamIDNewPlayer ); + private FComputeNewPlayerCompatibility _ComputeNewPlayerCompatibility; #endregion internal async Task ComputeNewPlayerCompatibility( SteamId steamIDNewPlayer ) { - return await (new Result( ComputeNewPlayerCompatibilityDelegatePointer( Self, steamIDNewPlayer ) )).GetResult(); + return await (new Result( _ComputeNewPlayerCompatibility( Self, steamIDNewPlayer ) )).GetResult(); } } diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingServers.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingServers.cs index 1dfdc4f..46f873b 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingServers.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingServers.cs @@ -17,211 +17,211 @@ public ISteamMatchmakingServers( bool server = false ) : base( server ) public override void InitInternals() { - RequestInternetServerListDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); - RequestLANServerListDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); - RequestFriendsServerListDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); - RequestFavoritesServerListDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); - RequestHistoryServerListDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); - RequestSpectatorServerListDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); - ReleaseRequestDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 48) ); - GetServerDetailsDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 56) ); - CancelQueryDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 64) ); - RefreshQueryDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 72) ); - IsRefreshingDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 80) ); - GetServerCountDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 88) ); - RefreshServerDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 96) ); - PingServerDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 104) ); - PlayerDetailsDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 112) ); - ServerRulesDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 120) ); - CancelServerQueryDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 128) ); + _RequestInternetServerList = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); + _RequestLANServerList = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); + _RequestFriendsServerList = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); + _RequestFavoritesServerList = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); + _RequestHistoryServerList = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); + _RequestSpectatorServerList = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); + _ReleaseRequest = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 48) ); + _GetServerDetails = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 56) ); + _CancelQuery = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 64) ); + _RefreshQuery = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 72) ); + _IsRefreshing = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 80) ); + _GetServerCount = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 88) ); + _RefreshServer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 96) ); + _PingServer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 104) ); + _PlayerDetails = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 112) ); + _ServerRules = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 120) ); + _CancelServerQuery = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 128) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate HServerListRequest RequestInternetServerListDelegate( IntPtr self, AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ); - private RequestInternetServerListDelegate RequestInternetServerListDelegatePointer; + private delegate HServerListRequest FRequestInternetServerList( IntPtr self, AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ); + private FRequestInternetServerList _RequestInternetServerList; #endregion internal HServerListRequest RequestInternetServerList( AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ) { - return RequestInternetServerListDelegatePointer( Self, iApp, ref ppchFilters, nFilters, pRequestServersResponse ); + return _RequestInternetServerList( Self, iApp, ref ppchFilters, nFilters, pRequestServersResponse ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate HServerListRequest RequestLANServerListDelegate( IntPtr self, AppId_t iApp, IntPtr pRequestServersResponse ); - private RequestLANServerListDelegate RequestLANServerListDelegatePointer; + private delegate HServerListRequest FRequestLANServerList( IntPtr self, AppId_t iApp, IntPtr pRequestServersResponse ); + private FRequestLANServerList _RequestLANServerList; #endregion internal HServerListRequest RequestLANServerList( AppId_t iApp, IntPtr pRequestServersResponse ) { - return RequestLANServerListDelegatePointer( Self, iApp, pRequestServersResponse ); + return _RequestLANServerList( Self, iApp, pRequestServersResponse ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate HServerListRequest RequestFriendsServerListDelegate( IntPtr self, AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ); - private RequestFriendsServerListDelegate RequestFriendsServerListDelegatePointer; + private delegate HServerListRequest FRequestFriendsServerList( IntPtr self, AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ); + private FRequestFriendsServerList _RequestFriendsServerList; #endregion internal HServerListRequest RequestFriendsServerList( AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ) { - return RequestFriendsServerListDelegatePointer( Self, iApp, ref ppchFilters, nFilters, pRequestServersResponse ); + return _RequestFriendsServerList( Self, iApp, ref ppchFilters, nFilters, pRequestServersResponse ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate HServerListRequest RequestFavoritesServerListDelegate( IntPtr self, AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ); - private RequestFavoritesServerListDelegate RequestFavoritesServerListDelegatePointer; + private delegate HServerListRequest FRequestFavoritesServerList( IntPtr self, AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ); + private FRequestFavoritesServerList _RequestFavoritesServerList; #endregion internal HServerListRequest RequestFavoritesServerList( AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ) { - return RequestFavoritesServerListDelegatePointer( Self, iApp, ref ppchFilters, nFilters, pRequestServersResponse ); + return _RequestFavoritesServerList( Self, iApp, ref ppchFilters, nFilters, pRequestServersResponse ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate HServerListRequest RequestHistoryServerListDelegate( IntPtr self, AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ); - private RequestHistoryServerListDelegate RequestHistoryServerListDelegatePointer; + private delegate HServerListRequest FRequestHistoryServerList( IntPtr self, AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ); + private FRequestHistoryServerList _RequestHistoryServerList; #endregion internal HServerListRequest RequestHistoryServerList( AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ) { - return RequestHistoryServerListDelegatePointer( Self, iApp, ref ppchFilters, nFilters, pRequestServersResponse ); + return _RequestHistoryServerList( Self, iApp, ref ppchFilters, nFilters, pRequestServersResponse ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate HServerListRequest RequestSpectatorServerListDelegate( IntPtr self, AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ); - private RequestSpectatorServerListDelegate RequestSpectatorServerListDelegatePointer; + private delegate HServerListRequest FRequestSpectatorServerList( IntPtr self, AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ); + private FRequestSpectatorServerList _RequestSpectatorServerList; #endregion internal HServerListRequest RequestSpectatorServerList( AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ) { - return RequestSpectatorServerListDelegatePointer( Self, iApp, ref ppchFilters, nFilters, pRequestServersResponse ); + return _RequestSpectatorServerList( Self, iApp, ref ppchFilters, nFilters, pRequestServersResponse ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void ReleaseRequestDelegate( IntPtr self, HServerListRequest hServerListRequest ); - private ReleaseRequestDelegate ReleaseRequestDelegatePointer; + private delegate void FReleaseRequest( IntPtr self, HServerListRequest hServerListRequest ); + private FReleaseRequest _ReleaseRequest; #endregion internal void ReleaseRequest( HServerListRequest hServerListRequest ) { - ReleaseRequestDelegatePointer( Self, hServerListRequest ); + _ReleaseRequest( Self, hServerListRequest ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate IntPtr GetServerDetailsDelegate( IntPtr self, HServerListRequest hRequest, int iServer ); - private GetServerDetailsDelegate GetServerDetailsDelegatePointer; + private delegate IntPtr FGetServerDetails( IntPtr self, HServerListRequest hRequest, int iServer ); + private FGetServerDetails _GetServerDetails; #endregion internal gameserveritem_t GetServerDetails( HServerListRequest hRequest, int iServer ) { - return new gameserveritem_t().Fill( GetServerDetailsDelegatePointer( Self, hRequest, iServer ) ); + return new gameserveritem_t().Fill( _GetServerDetails( Self, hRequest, iServer ) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void CancelQueryDelegate( IntPtr self, HServerListRequest hRequest ); - private CancelQueryDelegate CancelQueryDelegatePointer; + private delegate void FCancelQuery( IntPtr self, HServerListRequest hRequest ); + private FCancelQuery _CancelQuery; #endregion internal void CancelQuery( HServerListRequest hRequest ) { - CancelQueryDelegatePointer( Self, hRequest ); + _CancelQuery( Self, hRequest ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void RefreshQueryDelegate( IntPtr self, HServerListRequest hRequest ); - private RefreshQueryDelegate RefreshQueryDelegatePointer; + private delegate void FRefreshQuery( IntPtr self, HServerListRequest hRequest ); + private FRefreshQuery _RefreshQuery; #endregion internal void RefreshQuery( HServerListRequest hRequest ) { - RefreshQueryDelegatePointer( Self, hRequest ); + _RefreshQuery( Self, hRequest ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool IsRefreshingDelegate( IntPtr self, HServerListRequest hRequest ); - private IsRefreshingDelegate IsRefreshingDelegatePointer; + private delegate bool FIsRefreshing( IntPtr self, HServerListRequest hRequest ); + private FIsRefreshing _IsRefreshing; #endregion internal bool IsRefreshing( HServerListRequest hRequest ) { - return IsRefreshingDelegatePointer( Self, hRequest ); + return _IsRefreshing( Self, hRequest ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetServerCountDelegate( IntPtr self, HServerListRequest hRequest ); - private GetServerCountDelegate GetServerCountDelegatePointer; + private delegate int FGetServerCount( IntPtr self, HServerListRequest hRequest ); + private FGetServerCount _GetServerCount; #endregion internal int GetServerCount( HServerListRequest hRequest ) { - return GetServerCountDelegatePointer( Self, hRequest ); + return _GetServerCount( Self, hRequest ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void RefreshServerDelegate( IntPtr self, HServerListRequest hRequest, int iServer ); - private RefreshServerDelegate RefreshServerDelegatePointer; + private delegate void FRefreshServer( IntPtr self, HServerListRequest hRequest, int iServer ); + private FRefreshServer _RefreshServer; #endregion internal void RefreshServer( HServerListRequest hRequest, int iServer ) { - RefreshServerDelegatePointer( Self, hRequest, iServer ); + _RefreshServer( Self, hRequest, iServer ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate HServerQuery PingServerDelegate( IntPtr self, uint unIP, ushort usPort, IntPtr pRequestServersResponse ); - private PingServerDelegate PingServerDelegatePointer; + private delegate HServerQuery FPingServer( IntPtr self, uint unIP, ushort usPort, IntPtr pRequestServersResponse ); + private FPingServer _PingServer; #endregion internal HServerQuery PingServer( uint unIP, ushort usPort, IntPtr pRequestServersResponse ) { - return PingServerDelegatePointer( Self, unIP, usPort, pRequestServersResponse ); + return _PingServer( Self, unIP, usPort, pRequestServersResponse ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate HServerQuery PlayerDetailsDelegate( IntPtr self, uint unIP, ushort usPort, IntPtr pRequestServersResponse ); - private PlayerDetailsDelegate PlayerDetailsDelegatePointer; + private delegate HServerQuery FPlayerDetails( IntPtr self, uint unIP, ushort usPort, IntPtr pRequestServersResponse ); + private FPlayerDetails _PlayerDetails; #endregion internal HServerQuery PlayerDetails( uint unIP, ushort usPort, IntPtr pRequestServersResponse ) { - return PlayerDetailsDelegatePointer( Self, unIP, usPort, pRequestServersResponse ); + return _PlayerDetails( Self, unIP, usPort, pRequestServersResponse ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate HServerQuery ServerRulesDelegate( IntPtr self, uint unIP, ushort usPort, IntPtr pRequestServersResponse ); - private ServerRulesDelegate ServerRulesDelegatePointer; + private delegate HServerQuery FServerRules( IntPtr self, uint unIP, ushort usPort, IntPtr pRequestServersResponse ); + private FServerRules _ServerRules; #endregion internal HServerQuery ServerRules( uint unIP, ushort usPort, IntPtr pRequestServersResponse ) { - return ServerRulesDelegatePointer( Self, unIP, usPort, pRequestServersResponse ); + return _ServerRules( Self, unIP, usPort, pRequestServersResponse ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void CancelServerQueryDelegate( IntPtr self, HServerQuery hServerQuery ); - private CancelServerQueryDelegate CancelServerQueryDelegatePointer; + private delegate void FCancelServerQuery( IntPtr self, HServerQuery hServerQuery ); + private FCancelServerQuery _CancelServerQuery; #endregion internal void CancelServerQuery( HServerQuery hServerQuery ) { - CancelServerQueryDelegatePointer( Self, hServerQuery ); + _CancelServerQuery( Self, hServerQuery ); } } diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamMusic.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamMusic.cs index 3048716..f55dfac 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamMusic.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamMusic.cs @@ -17,116 +17,116 @@ public ISteamMusic( bool server = false ) : base( server ) public override void InitInternals() { - BIsEnabledDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); - BIsPlayingDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); - GetPlaybackStatusDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); - PlayDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); - PauseDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); - PlayPreviousDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); - PlayNextDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 48) ); - SetVolumeDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 56) ); - GetVolumeDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 64) ); + _BIsEnabled = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); + _BIsPlaying = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); + _GetPlaybackStatus = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); + _Play = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); + _Pause = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); + _PlayPrevious = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); + _PlayNext = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 48) ); + _SetVolume = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 56) ); + _GetVolume = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 64) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BIsEnabledDelegate( IntPtr self ); - private BIsEnabledDelegate BIsEnabledDelegatePointer; + private delegate bool FBIsEnabled( IntPtr self ); + private FBIsEnabled _BIsEnabled; #endregion internal bool BIsEnabled() { - return BIsEnabledDelegatePointer( Self ); + return _BIsEnabled( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BIsPlayingDelegate( IntPtr self ); - private BIsPlayingDelegate BIsPlayingDelegatePointer; + private delegate bool FBIsPlaying( IntPtr self ); + private FBIsPlaying _BIsPlaying; #endregion internal bool BIsPlaying() { - return BIsPlayingDelegatePointer( Self ); + return _BIsPlaying( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate MusicStatus GetPlaybackStatusDelegate( IntPtr self ); - private GetPlaybackStatusDelegate GetPlaybackStatusDelegatePointer; + private delegate MusicStatus FGetPlaybackStatus( IntPtr self ); + private FGetPlaybackStatus _GetPlaybackStatus; #endregion internal MusicStatus GetPlaybackStatus() { - return GetPlaybackStatusDelegatePointer( Self ); + return _GetPlaybackStatus( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void PlayDelegate( IntPtr self ); - private PlayDelegate PlayDelegatePointer; + private delegate void FPlay( IntPtr self ); + private FPlay _Play; #endregion internal void Play() { - PlayDelegatePointer( Self ); + _Play( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void PauseDelegate( IntPtr self ); - private PauseDelegate PauseDelegatePointer; + private delegate void FPause( IntPtr self ); + private FPause _Pause; #endregion internal void Pause() { - PauseDelegatePointer( Self ); + _Pause( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void PlayPreviousDelegate( IntPtr self ); - private PlayPreviousDelegate PlayPreviousDelegatePointer; + private delegate void FPlayPrevious( IntPtr self ); + private FPlayPrevious _PlayPrevious; #endregion internal void PlayPrevious() { - PlayPreviousDelegatePointer( Self ); + _PlayPrevious( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void PlayNextDelegate( IntPtr self ); - private PlayNextDelegate PlayNextDelegatePointer; + private delegate void FPlayNext( IntPtr self ); + private FPlayNext _PlayNext; #endregion internal void PlayNext() { - PlayNextDelegatePointer( Self ); + _PlayNext( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetVolumeDelegate( IntPtr self, float flVolume ); - private SetVolumeDelegate SetVolumeDelegatePointer; + private delegate void FSetVolume( IntPtr self, float flVolume ); + private FSetVolume _SetVolume; #endregion internal void SetVolume( float flVolume ) { - SetVolumeDelegatePointer( Self, flVolume ); + _SetVolume( Self, flVolume ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate float GetVolumeDelegate( IntPtr self ); - private GetVolumeDelegate GetVolumeDelegatePointer; + private delegate float FGetVolume( IntPtr self ); + private FGetVolume _GetVolume; #endregion internal float GetVolume() { - return GetVolumeDelegatePointer( Self ); + return _GetVolume( Self ); } } diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamParentalSettings.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamParentalSettings.cs index 406beb7..ce13528 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamParentalSettings.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamParentalSettings.cs @@ -17,84 +17,84 @@ public ISteamParentalSettings( bool server = false ) : base( server ) public override void InitInternals() { - BIsParentalLockEnabledDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); - BIsParentalLockLockedDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); - BIsAppBlockedDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); - BIsAppInBlockListDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); - BIsFeatureBlockedDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); - BIsFeatureInBlockListDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); + _BIsParentalLockEnabled = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); + _BIsParentalLockLocked = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); + _BIsAppBlocked = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); + _BIsAppInBlockList = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); + _BIsFeatureBlocked = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); + _BIsFeatureInBlockList = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BIsParentalLockEnabledDelegate( IntPtr self ); - private BIsParentalLockEnabledDelegate BIsParentalLockEnabledDelegatePointer; + private delegate bool FBIsParentalLockEnabled( IntPtr self ); + private FBIsParentalLockEnabled _BIsParentalLockEnabled; #endregion internal bool BIsParentalLockEnabled() { - return BIsParentalLockEnabledDelegatePointer( Self ); + return _BIsParentalLockEnabled( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BIsParentalLockLockedDelegate( IntPtr self ); - private BIsParentalLockLockedDelegate BIsParentalLockLockedDelegatePointer; + private delegate bool FBIsParentalLockLocked( IntPtr self ); + private FBIsParentalLockLocked _BIsParentalLockLocked; #endregion internal bool BIsParentalLockLocked() { - return BIsParentalLockLockedDelegatePointer( Self ); + return _BIsParentalLockLocked( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BIsAppBlockedDelegate( IntPtr self, AppId_t nAppID ); - private BIsAppBlockedDelegate BIsAppBlockedDelegatePointer; + private delegate bool FBIsAppBlocked( IntPtr self, AppId_t nAppID ); + private FBIsAppBlocked _BIsAppBlocked; #endregion internal bool BIsAppBlocked( AppId_t nAppID ) { - return BIsAppBlockedDelegatePointer( Self, nAppID ); + return _BIsAppBlocked( Self, nAppID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BIsAppInBlockListDelegate( IntPtr self, AppId_t nAppID ); - private BIsAppInBlockListDelegate BIsAppInBlockListDelegatePointer; + private delegate bool FBIsAppInBlockList( IntPtr self, AppId_t nAppID ); + private FBIsAppInBlockList _BIsAppInBlockList; #endregion internal bool BIsAppInBlockList( AppId_t nAppID ) { - return BIsAppInBlockListDelegatePointer( Self, nAppID ); + return _BIsAppInBlockList( Self, nAppID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BIsFeatureBlockedDelegate( IntPtr self, ParentalFeature eFeature ); - private BIsFeatureBlockedDelegate BIsFeatureBlockedDelegatePointer; + private delegate bool FBIsFeatureBlocked( IntPtr self, ParentalFeature eFeature ); + private FBIsFeatureBlocked _BIsFeatureBlocked; #endregion internal bool BIsFeatureBlocked( ParentalFeature eFeature ) { - return BIsFeatureBlockedDelegatePointer( Self, eFeature ); + return _BIsFeatureBlocked( Self, eFeature ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BIsFeatureInBlockListDelegate( IntPtr self, ParentalFeature eFeature ); - private BIsFeatureInBlockListDelegate BIsFeatureInBlockListDelegatePointer; + private delegate bool FBIsFeatureInBlockList( IntPtr self, ParentalFeature eFeature ); + private FBIsFeatureInBlockList _BIsFeatureInBlockList; #endregion internal bool BIsFeatureInBlockList( ParentalFeature eFeature ) { - return BIsFeatureInBlockListDelegatePointer( Self, eFeature ); + return _BIsFeatureInBlockList( Self, eFeature ); } } diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamScreenshots.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamScreenshots.cs index 5920bf6..251061b 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamScreenshots.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamScreenshots.cs @@ -17,118 +17,118 @@ public ISteamScreenshots( bool server = false ) : base( server ) public override void InitInternals() { - WriteScreenshotDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); - AddScreenshotToLibraryDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); - TriggerScreenshotDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); - HookScreenshotsDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); - SetLocationDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); - TagUserDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); - TagPublishedFileDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 48) ); - IsScreenshotsHookedDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 56) ); - AddVRScreenshotToLibraryDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 64) ); + _WriteScreenshot = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); + _AddScreenshotToLibrary = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); + _TriggerScreenshot = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); + _HookScreenshots = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); + _SetLocation = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); + _TagUser = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); + _TagPublishedFile = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 48) ); + _IsScreenshotsHooked = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 56) ); + _AddVRScreenshotToLibrary = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 64) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate ScreenshotHandle WriteScreenshotDelegate( IntPtr self, IntPtr pubRGB, uint cubRGB, int nWidth, int nHeight ); - private WriteScreenshotDelegate WriteScreenshotDelegatePointer; + private delegate ScreenshotHandle FWriteScreenshot( IntPtr self, IntPtr pubRGB, uint cubRGB, int nWidth, int nHeight ); + private FWriteScreenshot _WriteScreenshot; #endregion internal ScreenshotHandle WriteScreenshot( IntPtr pubRGB, uint cubRGB, int nWidth, int nHeight ) { - return WriteScreenshotDelegatePointer( Self, pubRGB, cubRGB, nWidth, nHeight ); + return _WriteScreenshot( Self, pubRGB, cubRGB, nWidth, nHeight ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate ScreenshotHandle AddScreenshotToLibraryDelegate( IntPtr self, string pchFilename, string pchThumbnailFilename, int nWidth, int nHeight ); - private AddScreenshotToLibraryDelegate AddScreenshotToLibraryDelegatePointer; + private delegate ScreenshotHandle FAddScreenshotToLibrary( IntPtr self, string pchFilename, string pchThumbnailFilename, int nWidth, int nHeight ); + private FAddScreenshotToLibrary _AddScreenshotToLibrary; #endregion internal ScreenshotHandle AddScreenshotToLibrary( string pchFilename, string pchThumbnailFilename, int nWidth, int nHeight ) { - return AddScreenshotToLibraryDelegatePointer( Self, pchFilename, pchThumbnailFilename, nWidth, nHeight ); + return _AddScreenshotToLibrary( Self, pchFilename, pchThumbnailFilename, nWidth, nHeight ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void TriggerScreenshotDelegate( IntPtr self ); - private TriggerScreenshotDelegate TriggerScreenshotDelegatePointer; + private delegate void FTriggerScreenshot( IntPtr self ); + private FTriggerScreenshot _TriggerScreenshot; #endregion internal void TriggerScreenshot() { - TriggerScreenshotDelegatePointer( Self ); + _TriggerScreenshot( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void HookScreenshotsDelegate( IntPtr self, [MarshalAs( UnmanagedType.U1 )] bool bHook ); - private HookScreenshotsDelegate HookScreenshotsDelegatePointer; + private delegate void FHookScreenshots( IntPtr self, [MarshalAs( UnmanagedType.U1 )] bool bHook ); + private FHookScreenshots _HookScreenshots; #endregion internal void HookScreenshots( [MarshalAs( UnmanagedType.U1 )] bool bHook ) { - HookScreenshotsDelegatePointer( Self, bHook ); + _HookScreenshots( Self, bHook ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool SetLocationDelegate( IntPtr self, ScreenshotHandle hScreenshot, string pchLocation ); - private SetLocationDelegate SetLocationDelegatePointer; + private delegate bool FSetLocation( IntPtr self, ScreenshotHandle hScreenshot, string pchLocation ); + private FSetLocation _SetLocation; #endregion internal bool SetLocation( ScreenshotHandle hScreenshot, string pchLocation ) { - return SetLocationDelegatePointer( Self, hScreenshot, pchLocation ); + return _SetLocation( Self, hScreenshot, pchLocation ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool TagUserDelegate( IntPtr self, ScreenshotHandle hScreenshot, SteamId steamID ); - private TagUserDelegate TagUserDelegatePointer; + private delegate bool FTagUser( IntPtr self, ScreenshotHandle hScreenshot, SteamId steamID ); + private FTagUser _TagUser; #endregion internal bool TagUser( ScreenshotHandle hScreenshot, SteamId steamID ) { - return TagUserDelegatePointer( Self, hScreenshot, steamID ); + return _TagUser( Self, hScreenshot, steamID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool TagPublishedFileDelegate( IntPtr self, ScreenshotHandle hScreenshot, PublishedFileId unPublishedFileID ); - private TagPublishedFileDelegate TagPublishedFileDelegatePointer; + private delegate bool FTagPublishedFile( IntPtr self, ScreenshotHandle hScreenshot, PublishedFileId unPublishedFileID ); + private FTagPublishedFile _TagPublishedFile; #endregion internal bool TagPublishedFile( ScreenshotHandle hScreenshot, PublishedFileId unPublishedFileID ) { - return TagPublishedFileDelegatePointer( Self, hScreenshot, unPublishedFileID ); + return _TagPublishedFile( Self, hScreenshot, unPublishedFileID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool IsScreenshotsHookedDelegate( IntPtr self ); - private IsScreenshotsHookedDelegate IsScreenshotsHookedDelegatePointer; + private delegate bool FIsScreenshotsHooked( IntPtr self ); + private FIsScreenshotsHooked _IsScreenshotsHooked; #endregion internal bool IsScreenshotsHooked() { - return IsScreenshotsHookedDelegatePointer( Self ); + return _IsScreenshotsHooked( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate ScreenshotHandle AddVRScreenshotToLibraryDelegate( IntPtr self, VRScreenshotType eType, string pchFilename, string pchVRFilename ); - private AddVRScreenshotToLibraryDelegate AddVRScreenshotToLibraryDelegatePointer; + private delegate ScreenshotHandle FAddVRScreenshotToLibrary( IntPtr self, VRScreenshotType eType, string pchFilename, string pchVRFilename ); + private FAddVRScreenshotToLibrary _AddVRScreenshotToLibrary; #endregion internal ScreenshotHandle AddVRScreenshotToLibrary( VRScreenshotType eType, string pchFilename, string pchVRFilename ) { - return AddVRScreenshotToLibraryDelegatePointer( Self, eType, pchFilename, pchVRFilename ); + return _AddVRScreenshotToLibrary( Self, eType, pchFilename, pchVRFilename ); } } diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamUser.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamUser.cs index 0cc6382..ce4f29c 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamUser.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamUser.cs @@ -17,376 +17,376 @@ public ISteamUser( bool server = false ) : base( server ) public override void InitInternals() { - GetHSteamUserDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); - BLoggedOnDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); - GetSteamIDDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); - InitiateGameConnectionDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); - TerminateGameConnectionDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); - TrackAppUsageEventDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); - GetUserDataFolderDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 48) ); - StartVoiceRecordingDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 56) ); - StopVoiceRecordingDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 64) ); - GetAvailableVoiceDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 72) ); - GetVoiceDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 80) ); - DecompressVoiceDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 88) ); - GetVoiceOptimalSampleRateDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 96) ); - GetAuthSessionTicketDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 104) ); - BeginAuthSessionDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 112) ); - EndAuthSessionDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 120) ); - CancelAuthTicketDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 128) ); - UserHasLicenseForAppDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 136) ); - BIsBehindNATDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 144) ); - AdvertiseGameDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 152) ); - RequestEncryptedAppTicketDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 160) ); - GetEncryptedAppTicketDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 168) ); - GetGameBadgeLevelDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 176) ); - GetPlayerSteamLevelDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 184) ); - RequestStoreAuthURLDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 192) ); - BIsPhoneVerifiedDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 200) ); - BIsTwoFactorEnabledDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 208) ); - BIsPhoneIdentifyingDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 216) ); - BIsPhoneRequiringVerificationDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 224) ); - GetMarketEligibilityDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 232) ); + _GetHSteamUser = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); + _BLoggedOn = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); + _GetSteamID = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); + _InitiateGameConnection = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); + _TerminateGameConnection = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); + _TrackAppUsageEvent = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); + _GetUserDataFolder = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 48) ); + _StartVoiceRecording = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 56) ); + _StopVoiceRecording = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 64) ); + _GetAvailableVoice = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 72) ); + _GetVoice = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 80) ); + _DecompressVoice = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 88) ); + _GetVoiceOptimalSampleRate = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 96) ); + _GetAuthSessionTicket = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 104) ); + _BeginAuthSession = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 112) ); + _EndAuthSession = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 120) ); + _CancelAuthTicket = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 128) ); + _UserHasLicenseForApp = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 136) ); + _BIsBehindNAT = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 144) ); + _AdvertiseGame = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 152) ); + _RequestEncryptedAppTicket = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 160) ); + _GetEncryptedAppTicket = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 168) ); + _GetGameBadgeLevel = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 176) ); + _GetPlayerSteamLevel = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 184) ); + _RequestStoreAuthURL = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 192) ); + _BIsPhoneVerified = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 200) ); + _BIsTwoFactorEnabled = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 208) ); + _BIsPhoneIdentifying = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 216) ); + _BIsPhoneRequiringVerification = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 224) ); + _GetMarketEligibility = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 232) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate HSteamUser GetHSteamUserDelegate( IntPtr self ); - private GetHSteamUserDelegate GetHSteamUserDelegatePointer; + private delegate HSteamUser FGetHSteamUser( IntPtr self ); + private FGetHSteamUser _GetHSteamUser; #endregion internal HSteamUser GetHSteamUser() { - return GetHSteamUserDelegatePointer( Self ); + return _GetHSteamUser( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BLoggedOnDelegate( IntPtr self ); - private BLoggedOnDelegate BLoggedOnDelegatePointer; + private delegate bool FBLoggedOn( IntPtr self ); + private FBLoggedOn _BLoggedOn; #endregion internal bool BLoggedOn() { - return BLoggedOnDelegatePointer( Self ); + return _BLoggedOn( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void GetSteamIDDelegate( IntPtr self, ref SteamId retVal ); - private GetSteamIDDelegate GetSteamIDDelegatePointer; + private delegate void FGetSteamID( IntPtr self, ref SteamId retVal ); + private FGetSteamID _GetSteamID; #endregion internal SteamId GetSteamID() { var retVal = default( SteamId ); - GetSteamIDDelegatePointer( Self, ref retVal ); + _GetSteamID( Self, ref retVal ); return retVal; } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int InitiateGameConnectionDelegate( IntPtr self, IntPtr pAuthBlob, int cbMaxAuthBlob, SteamId steamIDGameServer, uint unIPServer, ushort usPortServer, [MarshalAs( UnmanagedType.U1 )] bool bSecure ); - private InitiateGameConnectionDelegate InitiateGameConnectionDelegatePointer; + private delegate int FInitiateGameConnection( IntPtr self, IntPtr pAuthBlob, int cbMaxAuthBlob, SteamId steamIDGameServer, uint unIPServer, ushort usPortServer, [MarshalAs( UnmanagedType.U1 )] bool bSecure ); + private FInitiateGameConnection _InitiateGameConnection; #endregion internal int InitiateGameConnection( IntPtr pAuthBlob, int cbMaxAuthBlob, SteamId steamIDGameServer, uint unIPServer, ushort usPortServer, [MarshalAs( UnmanagedType.U1 )] bool bSecure ) { - return InitiateGameConnectionDelegatePointer( Self, pAuthBlob, cbMaxAuthBlob, steamIDGameServer, unIPServer, usPortServer, bSecure ); + return _InitiateGameConnection( Self, pAuthBlob, cbMaxAuthBlob, steamIDGameServer, unIPServer, usPortServer, bSecure ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void TerminateGameConnectionDelegate( IntPtr self, uint unIPServer, ushort usPortServer ); - private TerminateGameConnectionDelegate TerminateGameConnectionDelegatePointer; + private delegate void FTerminateGameConnection( IntPtr self, uint unIPServer, ushort usPortServer ); + private FTerminateGameConnection _TerminateGameConnection; #endregion internal void TerminateGameConnection( uint unIPServer, ushort usPortServer ) { - TerminateGameConnectionDelegatePointer( Self, unIPServer, usPortServer ); + _TerminateGameConnection( Self, unIPServer, usPortServer ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void TrackAppUsageEventDelegate( IntPtr self, GameId gameID, int eAppUsageEvent, string pchExtraInfo ); - private TrackAppUsageEventDelegate TrackAppUsageEventDelegatePointer; + private delegate void FTrackAppUsageEvent( IntPtr self, GameId gameID, int eAppUsageEvent, string pchExtraInfo ); + private FTrackAppUsageEvent _TrackAppUsageEvent; #endregion internal void TrackAppUsageEvent( GameId gameID, int eAppUsageEvent, string pchExtraInfo ) { - TrackAppUsageEventDelegatePointer( Self, gameID, eAppUsageEvent, pchExtraInfo ); + _TrackAppUsageEvent( Self, gameID, eAppUsageEvent, pchExtraInfo ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetUserDataFolderDelegate( IntPtr self, StringBuilder pchBuffer, int cubBuffer ); - private GetUserDataFolderDelegate GetUserDataFolderDelegatePointer; + private delegate bool FGetUserDataFolder( IntPtr self, StringBuilder pchBuffer, int cubBuffer ); + private FGetUserDataFolder _GetUserDataFolder; #endregion internal bool GetUserDataFolder( StringBuilder pchBuffer, int cubBuffer ) { - return GetUserDataFolderDelegatePointer( Self, pchBuffer, cubBuffer ); + return _GetUserDataFolder( Self, pchBuffer, cubBuffer ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void StartVoiceRecordingDelegate( IntPtr self ); - private StartVoiceRecordingDelegate StartVoiceRecordingDelegatePointer; + private delegate void FStartVoiceRecording( IntPtr self ); + private FStartVoiceRecording _StartVoiceRecording; #endregion internal void StartVoiceRecording() { - StartVoiceRecordingDelegatePointer( Self ); + _StartVoiceRecording( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void StopVoiceRecordingDelegate( IntPtr self ); - private StopVoiceRecordingDelegate StopVoiceRecordingDelegatePointer; + private delegate void FStopVoiceRecording( IntPtr self ); + private FStopVoiceRecording _StopVoiceRecording; #endregion internal void StopVoiceRecording() { - StopVoiceRecordingDelegatePointer( Self ); + _StopVoiceRecording( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate VoiceResult GetAvailableVoiceDelegate( IntPtr self, ref uint pcbCompressed, ref uint pcbUncompressed_Deprecated, uint nUncompressedVoiceDesiredSampleRate_Deprecated ); - private GetAvailableVoiceDelegate GetAvailableVoiceDelegatePointer; + private delegate VoiceResult FGetAvailableVoice( IntPtr self, ref uint pcbCompressed, ref uint pcbUncompressed_Deprecated, uint nUncompressedVoiceDesiredSampleRate_Deprecated ); + private FGetAvailableVoice _GetAvailableVoice; #endregion internal VoiceResult GetAvailableVoice( ref uint pcbCompressed, ref uint pcbUncompressed_Deprecated, uint nUncompressedVoiceDesiredSampleRate_Deprecated ) { - return GetAvailableVoiceDelegatePointer( Self, ref pcbCompressed, ref pcbUncompressed_Deprecated, nUncompressedVoiceDesiredSampleRate_Deprecated ); + return _GetAvailableVoice( Self, ref pcbCompressed, ref pcbUncompressed_Deprecated, nUncompressedVoiceDesiredSampleRate_Deprecated ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate VoiceResult GetVoiceDelegate( IntPtr self, [MarshalAs( UnmanagedType.U1 )] bool bWantCompressed, IntPtr pDestBuffer, uint cbDestBufferSize, ref uint nBytesWritten, [MarshalAs( UnmanagedType.U1 )] bool bWantUncompressed_Deprecated, IntPtr pUncompressedDestBuffer_Deprecated, uint cbUncompressedDestBufferSize_Deprecated, ref uint nUncompressBytesWritten_Deprecated, uint nUncompressedVoiceDesiredSampleRate_Deprecated ); - private GetVoiceDelegate GetVoiceDelegatePointer; + private delegate VoiceResult FGetVoice( IntPtr self, [MarshalAs( UnmanagedType.U1 )] bool bWantCompressed, IntPtr pDestBuffer, uint cbDestBufferSize, ref uint nBytesWritten, [MarshalAs( UnmanagedType.U1 )] bool bWantUncompressed_Deprecated, IntPtr pUncompressedDestBuffer_Deprecated, uint cbUncompressedDestBufferSize_Deprecated, ref uint nUncompressBytesWritten_Deprecated, uint nUncompressedVoiceDesiredSampleRate_Deprecated ); + private FGetVoice _GetVoice; #endregion internal VoiceResult GetVoice( [MarshalAs( UnmanagedType.U1 )] bool bWantCompressed, IntPtr pDestBuffer, uint cbDestBufferSize, ref uint nBytesWritten, [MarshalAs( UnmanagedType.U1 )] bool bWantUncompressed_Deprecated, IntPtr pUncompressedDestBuffer_Deprecated, uint cbUncompressedDestBufferSize_Deprecated, ref uint nUncompressBytesWritten_Deprecated, uint nUncompressedVoiceDesiredSampleRate_Deprecated ) { - return GetVoiceDelegatePointer( Self, bWantCompressed, pDestBuffer, cbDestBufferSize, ref nBytesWritten, bWantUncompressed_Deprecated, pUncompressedDestBuffer_Deprecated, cbUncompressedDestBufferSize_Deprecated, ref nUncompressBytesWritten_Deprecated, nUncompressedVoiceDesiredSampleRate_Deprecated ); + return _GetVoice( Self, bWantCompressed, pDestBuffer, cbDestBufferSize, ref nBytesWritten, bWantUncompressed_Deprecated, pUncompressedDestBuffer_Deprecated, cbUncompressedDestBufferSize_Deprecated, ref nUncompressBytesWritten_Deprecated, nUncompressedVoiceDesiredSampleRate_Deprecated ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate VoiceResult DecompressVoiceDelegate( IntPtr self, IntPtr pCompressed, uint cbCompressed, IntPtr pDestBuffer, uint cbDestBufferSize, ref uint nBytesWritten, uint nDesiredSampleRate ); - private DecompressVoiceDelegate DecompressVoiceDelegatePointer; + private delegate VoiceResult FDecompressVoice( IntPtr self, IntPtr pCompressed, uint cbCompressed, IntPtr pDestBuffer, uint cbDestBufferSize, ref uint nBytesWritten, uint nDesiredSampleRate ); + private FDecompressVoice _DecompressVoice; #endregion internal VoiceResult DecompressVoice( IntPtr pCompressed, uint cbCompressed, IntPtr pDestBuffer, uint cbDestBufferSize, ref uint nBytesWritten, uint nDesiredSampleRate ) { - return DecompressVoiceDelegatePointer( Self, pCompressed, cbCompressed, pDestBuffer, cbDestBufferSize, ref nBytesWritten, nDesiredSampleRate ); + return _DecompressVoice( Self, pCompressed, cbCompressed, pDestBuffer, cbDestBufferSize, ref nBytesWritten, nDesiredSampleRate ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate uint GetVoiceOptimalSampleRateDelegate( IntPtr self ); - private GetVoiceOptimalSampleRateDelegate GetVoiceOptimalSampleRateDelegatePointer; + private delegate uint FGetVoiceOptimalSampleRate( IntPtr self ); + private FGetVoiceOptimalSampleRate _GetVoiceOptimalSampleRate; #endregion internal uint GetVoiceOptimalSampleRate() { - return GetVoiceOptimalSampleRateDelegatePointer( Self ); + return _GetVoiceOptimalSampleRate( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate HAuthTicket GetAuthSessionTicketDelegate( IntPtr self, IntPtr pTicket, int cbMaxTicket, ref uint pcbTicket ); - private GetAuthSessionTicketDelegate GetAuthSessionTicketDelegatePointer; + private delegate HAuthTicket FGetAuthSessionTicket( IntPtr self, IntPtr pTicket, int cbMaxTicket, ref uint pcbTicket ); + private FGetAuthSessionTicket _GetAuthSessionTicket; #endregion internal HAuthTicket GetAuthSessionTicket( IntPtr pTicket, int cbMaxTicket, ref uint pcbTicket ) { - return GetAuthSessionTicketDelegatePointer( Self, pTicket, cbMaxTicket, ref pcbTicket ); + return _GetAuthSessionTicket( Self, pTicket, cbMaxTicket, ref pcbTicket ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate BeginAuthResult BeginAuthSessionDelegate( IntPtr self, IntPtr pAuthTicket, int cbAuthTicket, SteamId steamID ); - private BeginAuthSessionDelegate BeginAuthSessionDelegatePointer; + private delegate BeginAuthResult FBeginAuthSession( IntPtr self, IntPtr pAuthTicket, int cbAuthTicket, SteamId steamID ); + private FBeginAuthSession _BeginAuthSession; #endregion internal BeginAuthResult BeginAuthSession( IntPtr pAuthTicket, int cbAuthTicket, SteamId steamID ) { - return BeginAuthSessionDelegatePointer( Self, pAuthTicket, cbAuthTicket, steamID ); + return _BeginAuthSession( Self, pAuthTicket, cbAuthTicket, steamID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void EndAuthSessionDelegate( IntPtr self, SteamId steamID ); - private EndAuthSessionDelegate EndAuthSessionDelegatePointer; + private delegate void FEndAuthSession( IntPtr self, SteamId steamID ); + private FEndAuthSession _EndAuthSession; #endregion internal void EndAuthSession( SteamId steamID ) { - EndAuthSessionDelegatePointer( Self, steamID ); + _EndAuthSession( Self, steamID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void CancelAuthTicketDelegate( IntPtr self, HAuthTicket hAuthTicket ); - private CancelAuthTicketDelegate CancelAuthTicketDelegatePointer; + private delegate void FCancelAuthTicket( IntPtr self, HAuthTicket hAuthTicket ); + private FCancelAuthTicket _CancelAuthTicket; #endregion internal void CancelAuthTicket( HAuthTicket hAuthTicket ) { - CancelAuthTicketDelegatePointer( Self, hAuthTicket ); + _CancelAuthTicket( Self, hAuthTicket ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate UserHasLicenseForAppResult UserHasLicenseForAppDelegate( IntPtr self, SteamId steamID, AppId_t appID ); - private UserHasLicenseForAppDelegate UserHasLicenseForAppDelegatePointer; + private delegate UserHasLicenseForAppResult FUserHasLicenseForApp( IntPtr self, SteamId steamID, AppId_t appID ); + private FUserHasLicenseForApp _UserHasLicenseForApp; #endregion internal UserHasLicenseForAppResult UserHasLicenseForApp( SteamId steamID, AppId_t appID ) { - return UserHasLicenseForAppDelegatePointer( Self, steamID, appID ); + return _UserHasLicenseForApp( Self, steamID, appID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BIsBehindNATDelegate( IntPtr self ); - private BIsBehindNATDelegate BIsBehindNATDelegatePointer; + private delegate bool FBIsBehindNAT( IntPtr self ); + private FBIsBehindNAT _BIsBehindNAT; #endregion internal bool BIsBehindNAT() { - return BIsBehindNATDelegatePointer( Self ); + return _BIsBehindNAT( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void AdvertiseGameDelegate( IntPtr self, SteamId steamIDGameServer, uint unIPServer, ushort usPortServer ); - private AdvertiseGameDelegate AdvertiseGameDelegatePointer; + private delegate void FAdvertiseGame( IntPtr self, SteamId steamIDGameServer, uint unIPServer, ushort usPortServer ); + private FAdvertiseGame _AdvertiseGame; #endregion internal void AdvertiseGame( SteamId steamIDGameServer, uint unIPServer, ushort usPortServer ) { - AdvertiseGameDelegatePointer( Self, steamIDGameServer, unIPServer, usPortServer ); + _AdvertiseGame( Self, steamIDGameServer, unIPServer, usPortServer ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t RequestEncryptedAppTicketDelegate( IntPtr self, IntPtr pDataToInclude, int cbDataToInclude ); - private RequestEncryptedAppTicketDelegate RequestEncryptedAppTicketDelegatePointer; + private delegate SteamAPICall_t FRequestEncryptedAppTicket( IntPtr self, IntPtr pDataToInclude, int cbDataToInclude ); + private FRequestEncryptedAppTicket _RequestEncryptedAppTicket; #endregion internal async Task RequestEncryptedAppTicket( IntPtr pDataToInclude, int cbDataToInclude ) { - return await (new Result( RequestEncryptedAppTicketDelegatePointer( Self, pDataToInclude, cbDataToInclude ) )).GetResult(); + return await (new Result( _RequestEncryptedAppTicket( Self, pDataToInclude, cbDataToInclude ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetEncryptedAppTicketDelegate( IntPtr self, IntPtr pTicket, int cbMaxTicket, ref uint pcbTicket ); - private GetEncryptedAppTicketDelegate GetEncryptedAppTicketDelegatePointer; + private delegate bool FGetEncryptedAppTicket( IntPtr self, IntPtr pTicket, int cbMaxTicket, ref uint pcbTicket ); + private FGetEncryptedAppTicket _GetEncryptedAppTicket; #endregion internal bool GetEncryptedAppTicket( IntPtr pTicket, int cbMaxTicket, ref uint pcbTicket ) { - return GetEncryptedAppTicketDelegatePointer( Self, pTicket, cbMaxTicket, ref pcbTicket ); + return _GetEncryptedAppTicket( Self, pTicket, cbMaxTicket, ref pcbTicket ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetGameBadgeLevelDelegate( IntPtr self, int nSeries, [MarshalAs( UnmanagedType.U1 )] bool bFoil ); - private GetGameBadgeLevelDelegate GetGameBadgeLevelDelegatePointer; + private delegate int FGetGameBadgeLevel( IntPtr self, int nSeries, [MarshalAs( UnmanagedType.U1 )] bool bFoil ); + private FGetGameBadgeLevel _GetGameBadgeLevel; #endregion internal int GetGameBadgeLevel( int nSeries, [MarshalAs( UnmanagedType.U1 )] bool bFoil ) { - return GetGameBadgeLevelDelegatePointer( Self, nSeries, bFoil ); + return _GetGameBadgeLevel( Self, nSeries, bFoil ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetPlayerSteamLevelDelegate( IntPtr self ); - private GetPlayerSteamLevelDelegate GetPlayerSteamLevelDelegatePointer; + private delegate int FGetPlayerSteamLevel( IntPtr self ); + private FGetPlayerSteamLevel _GetPlayerSteamLevel; #endregion internal int GetPlayerSteamLevel() { - return GetPlayerSteamLevelDelegatePointer( Self ); + return _GetPlayerSteamLevel( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t RequestStoreAuthURLDelegate( IntPtr self, string pchRedirectURL ); - private RequestStoreAuthURLDelegate RequestStoreAuthURLDelegatePointer; + private delegate SteamAPICall_t FRequestStoreAuthURL( IntPtr self, string pchRedirectURL ); + private FRequestStoreAuthURL _RequestStoreAuthURL; #endregion internal async Task RequestStoreAuthURL( string pchRedirectURL ) { - return await (new Result( RequestStoreAuthURLDelegatePointer( Self, pchRedirectURL ) )).GetResult(); + return await (new Result( _RequestStoreAuthURL( Self, pchRedirectURL ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BIsPhoneVerifiedDelegate( IntPtr self ); - private BIsPhoneVerifiedDelegate BIsPhoneVerifiedDelegatePointer; + private delegate bool FBIsPhoneVerified( IntPtr self ); + private FBIsPhoneVerified _BIsPhoneVerified; #endregion internal bool BIsPhoneVerified() { - return BIsPhoneVerifiedDelegatePointer( Self ); + return _BIsPhoneVerified( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BIsTwoFactorEnabledDelegate( IntPtr self ); - private BIsTwoFactorEnabledDelegate BIsTwoFactorEnabledDelegatePointer; + private delegate bool FBIsTwoFactorEnabled( IntPtr self ); + private FBIsTwoFactorEnabled _BIsTwoFactorEnabled; #endregion internal bool BIsTwoFactorEnabled() { - return BIsTwoFactorEnabledDelegatePointer( Self ); + return _BIsTwoFactorEnabled( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BIsPhoneIdentifyingDelegate( IntPtr self ); - private BIsPhoneIdentifyingDelegate BIsPhoneIdentifyingDelegatePointer; + private delegate bool FBIsPhoneIdentifying( IntPtr self ); + private FBIsPhoneIdentifying _BIsPhoneIdentifying; #endregion internal bool BIsPhoneIdentifying() { - return BIsPhoneIdentifyingDelegatePointer( Self ); + return _BIsPhoneIdentifying( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BIsPhoneRequiringVerificationDelegate( IntPtr self ); - private BIsPhoneRequiringVerificationDelegate BIsPhoneRequiringVerificationDelegatePointer; + private delegate bool FBIsPhoneRequiringVerification( IntPtr self ); + private FBIsPhoneRequiringVerification _BIsPhoneRequiringVerification; #endregion internal bool BIsPhoneRequiringVerification() { - return BIsPhoneRequiringVerificationDelegatePointer( Self ); + return _BIsPhoneRequiringVerification( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t GetMarketEligibilityDelegate( IntPtr self ); - private GetMarketEligibilityDelegate GetMarketEligibilityDelegatePointer; + private delegate SteamAPICall_t FGetMarketEligibility( IntPtr self ); + private FGetMarketEligibility _GetMarketEligibility; #endregion internal async Task GetMarketEligibility() { - return await (new Result( GetMarketEligibilityDelegatePointer( Self ) )).GetResult(); + return await (new Result( _GetMarketEligibility( Self ) )).GetResult(); } } diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamUserStats.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamUserStats.cs index 931b7bf..494794e 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamUserStats.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamUserStats.cs @@ -17,543 +17,543 @@ public ISteamUserStats( bool server = false ) : base( server ) public override void InitInternals() { - RequestCurrentStatsDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); - GetStat1DelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); - GetStat2DelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); - SetStat1DelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); - SetStat2DelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); - UpdateAvgRateStatDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); - GetAchievementDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 48) ); - SetAchievementDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 56) ); - ClearAchievementDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 64) ); - GetAchievementAndUnlockTimeDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 72) ); - StoreStatsDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 80) ); - GetAchievementIconDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 88) ); - GetAchievementDisplayAttributeDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 96) ); - IndicateAchievementProgressDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 104) ); - GetNumAchievementsDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 112) ); - GetAchievementNameDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 120) ); - RequestUserStatsDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 128) ); - GetUserStat1DelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 136) ); - GetUserStat2DelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 144) ); - GetUserAchievementDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 152) ); - GetUserAchievementAndUnlockTimeDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 160) ); - ResetAllStatsDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 168) ); - FindOrCreateLeaderboardDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 176) ); - FindLeaderboardDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 184) ); - GetLeaderboardNameDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 192) ); - GetLeaderboardEntryCountDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 200) ); - GetLeaderboardSortMethodDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 208) ); - GetLeaderboardDisplayTypeDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 216) ); - DownloadLeaderboardEntriesDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 224) ); - DownloadLeaderboardEntriesForUsersDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 232) ); - GetDownloadedLeaderboardEntryDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 240) ); - UploadLeaderboardScoreDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 248) ); - AttachLeaderboardUGCDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 256) ); - GetNumberOfCurrentPlayersDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 264) ); - RequestGlobalAchievementPercentagesDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 272) ); - GetMostAchievedAchievementInfoDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 280) ); - GetNextMostAchievedAchievementInfoDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 288) ); - GetAchievementAchievedPercentDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 296) ); - RequestGlobalStatsDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 304) ); - GetGlobalStat1DelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 312) ); - GetGlobalStat2DelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 320) ); - GetGlobalStatHistory1DelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 328) ); - GetGlobalStatHistory2DelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 336) ); + _RequestCurrentStats = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); + _GetStat1 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); + _GetStat2 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); + _SetStat1 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); + _SetStat2 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); + _UpdateAvgRateStat = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); + _GetAchievement = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 48) ); + _SetAchievement = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 56) ); + _ClearAchievement = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 64) ); + _GetAchievementAndUnlockTime = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 72) ); + _StoreStats = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 80) ); + _GetAchievementIcon = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 88) ); + _GetAchievementDisplayAttribute = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 96) ); + _IndicateAchievementProgress = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 104) ); + _GetNumAchievements = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 112) ); + _GetAchievementName = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 120) ); + _RequestUserStats = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 128) ); + _GetUserStat1 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 136) ); + _GetUserStat2 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 144) ); + _GetUserAchievement = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 152) ); + _GetUserAchievementAndUnlockTime = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 160) ); + _ResetAllStats = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 168) ); + _FindOrCreateLeaderboard = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 176) ); + _FindLeaderboard = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 184) ); + _GetLeaderboardName = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 192) ); + _GetLeaderboardEntryCount = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 200) ); + _GetLeaderboardSortMethod = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 208) ); + _GetLeaderboardDisplayType = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 216) ); + _DownloadLeaderboardEntries = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 224) ); + _DownloadLeaderboardEntriesForUsers = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 232) ); + _GetDownloadedLeaderboardEntry = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 240) ); + _UploadLeaderboardScore = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 248) ); + _AttachLeaderboardUGC = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 256) ); + _GetNumberOfCurrentPlayers = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 264) ); + _RequestGlobalAchievementPercentages = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 272) ); + _GetMostAchievedAchievementInfo = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 280) ); + _GetNextMostAchievedAchievementInfo = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 288) ); + _GetAchievementAchievedPercent = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 296) ); + _RequestGlobalStats = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 304) ); + _GetGlobalStat1 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 312) ); + _GetGlobalStat2 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 320) ); + _GetGlobalStatHistory1 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 328) ); + _GetGlobalStatHistory2 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 336) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool RequestCurrentStatsDelegate( IntPtr self ); - private RequestCurrentStatsDelegate RequestCurrentStatsDelegatePointer; + private delegate bool FRequestCurrentStats( IntPtr self ); + private FRequestCurrentStats _RequestCurrentStats; #endregion internal bool RequestCurrentStats() { - return RequestCurrentStatsDelegatePointer( Self ); + return _RequestCurrentStats( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetStat1Delegate( IntPtr self, string pchName, ref int pData ); - private GetStat1Delegate GetStat1DelegatePointer; + private delegate bool FGetStat1( IntPtr self, string pchName, ref int pData ); + private FGetStat1 _GetStat1; #endregion internal bool GetStat1( string pchName, ref int pData ) { - return GetStat1DelegatePointer( Self, pchName, ref pData ); + return _GetStat1( Self, pchName, ref pData ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetStat2Delegate( IntPtr self, string pchName, ref float pData ); - private GetStat2Delegate GetStat2DelegatePointer; + private delegate bool FGetStat2( IntPtr self, string pchName, ref float pData ); + private FGetStat2 _GetStat2; #endregion internal bool GetStat2( string pchName, ref float pData ) { - return GetStat2DelegatePointer( Self, pchName, ref pData ); + return _GetStat2( Self, pchName, ref pData ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool SetStat1Delegate( IntPtr self, string pchName, int nData ); - private SetStat1Delegate SetStat1DelegatePointer; + private delegate bool FSetStat1( IntPtr self, string pchName, int nData ); + private FSetStat1 _SetStat1; #endregion internal bool SetStat1( string pchName, int nData ) { - return SetStat1DelegatePointer( Self, pchName, nData ); + return _SetStat1( Self, pchName, nData ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool SetStat2Delegate( IntPtr self, string pchName, float fData ); - private SetStat2Delegate SetStat2DelegatePointer; + private delegate bool FSetStat2( IntPtr self, string pchName, float fData ); + private FSetStat2 _SetStat2; #endregion internal bool SetStat2( string pchName, float fData ) { - return SetStat2DelegatePointer( Self, pchName, fData ); + return _SetStat2( Self, pchName, fData ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool UpdateAvgRateStatDelegate( IntPtr self, string pchName, float flCountThisSession, double dSessionLength ); - private UpdateAvgRateStatDelegate UpdateAvgRateStatDelegatePointer; + private delegate bool FUpdateAvgRateStat( IntPtr self, string pchName, float flCountThisSession, double dSessionLength ); + private FUpdateAvgRateStat _UpdateAvgRateStat; #endregion internal bool UpdateAvgRateStat( string pchName, float flCountThisSession, double dSessionLength ) { - return UpdateAvgRateStatDelegatePointer( Self, pchName, flCountThisSession, dSessionLength ); + return _UpdateAvgRateStat( Self, pchName, flCountThisSession, dSessionLength ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetAchievementDelegate( IntPtr self, string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ); - private GetAchievementDelegate GetAchievementDelegatePointer; + private delegate bool FGetAchievement( IntPtr self, string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ); + private FGetAchievement _GetAchievement; #endregion internal bool GetAchievement( string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ) { - return GetAchievementDelegatePointer( Self, pchName, ref pbAchieved ); + return _GetAchievement( Self, pchName, ref pbAchieved ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool SetAchievementDelegate( IntPtr self, string pchName ); - private SetAchievementDelegate SetAchievementDelegatePointer; + private delegate bool FSetAchievement( IntPtr self, string pchName ); + private FSetAchievement _SetAchievement; #endregion internal bool SetAchievement( string pchName ) { - return SetAchievementDelegatePointer( Self, pchName ); + return _SetAchievement( Self, pchName ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool ClearAchievementDelegate( IntPtr self, string pchName ); - private ClearAchievementDelegate ClearAchievementDelegatePointer; + private delegate bool FClearAchievement( IntPtr self, string pchName ); + private FClearAchievement _ClearAchievement; #endregion internal bool ClearAchievement( string pchName ) { - return ClearAchievementDelegatePointer( Self, pchName ); + return _ClearAchievement( Self, pchName ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetAchievementAndUnlockTimeDelegate( IntPtr self, string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved, ref uint punUnlockTime ); - private GetAchievementAndUnlockTimeDelegate GetAchievementAndUnlockTimeDelegatePointer; + private delegate bool FGetAchievementAndUnlockTime( IntPtr self, string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved, ref uint punUnlockTime ); + private FGetAchievementAndUnlockTime _GetAchievementAndUnlockTime; #endregion internal bool GetAchievementAndUnlockTime( string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved, ref uint punUnlockTime ) { - return GetAchievementAndUnlockTimeDelegatePointer( Self, pchName, ref pbAchieved, ref punUnlockTime ); + return _GetAchievementAndUnlockTime( Self, pchName, ref pbAchieved, ref punUnlockTime ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool StoreStatsDelegate( IntPtr self ); - private StoreStatsDelegate StoreStatsDelegatePointer; + private delegate bool FStoreStats( IntPtr self ); + private FStoreStats _StoreStats; #endregion internal bool StoreStats() { - return StoreStatsDelegatePointer( Self ); + return _StoreStats( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetAchievementIconDelegate( IntPtr self, string pchName ); - private GetAchievementIconDelegate GetAchievementIconDelegatePointer; + private delegate int FGetAchievementIcon( IntPtr self, string pchName ); + private FGetAchievementIcon _GetAchievementIcon; #endregion internal int GetAchievementIcon( string pchName ) { - return GetAchievementIconDelegatePointer( Self, pchName ); + return _GetAchievementIcon( Self, pchName ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate IntPtr GetAchievementDisplayAttributeDelegate( IntPtr self, string pchName, string pchKey ); - private GetAchievementDisplayAttributeDelegate GetAchievementDisplayAttributeDelegatePointer; + private delegate IntPtr FGetAchievementDisplayAttribute( IntPtr self, string pchName, string pchKey ); + private FGetAchievementDisplayAttribute _GetAchievementDisplayAttribute; #endregion internal string GetAchievementDisplayAttribute( string pchName, string pchKey ) { - return GetString( GetAchievementDisplayAttributeDelegatePointer( Self, pchName, pchKey ) ); + return GetString( _GetAchievementDisplayAttribute( Self, pchName, pchKey ) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool IndicateAchievementProgressDelegate( IntPtr self, string pchName, uint nCurProgress, uint nMaxProgress ); - private IndicateAchievementProgressDelegate IndicateAchievementProgressDelegatePointer; + private delegate bool FIndicateAchievementProgress( IntPtr self, string pchName, uint nCurProgress, uint nMaxProgress ); + private FIndicateAchievementProgress _IndicateAchievementProgress; #endregion internal bool IndicateAchievementProgress( string pchName, uint nCurProgress, uint nMaxProgress ) { - return IndicateAchievementProgressDelegatePointer( Self, pchName, nCurProgress, nMaxProgress ); + return _IndicateAchievementProgress( Self, pchName, nCurProgress, nMaxProgress ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate uint GetNumAchievementsDelegate( IntPtr self ); - private GetNumAchievementsDelegate GetNumAchievementsDelegatePointer; + private delegate uint FGetNumAchievements( IntPtr self ); + private FGetNumAchievements _GetNumAchievements; #endregion internal uint GetNumAchievements() { - return GetNumAchievementsDelegatePointer( Self ); + return _GetNumAchievements( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate IntPtr GetAchievementNameDelegate( IntPtr self, uint iAchievement ); - private GetAchievementNameDelegate GetAchievementNameDelegatePointer; + private delegate IntPtr FGetAchievementName( IntPtr self, uint iAchievement ); + private FGetAchievementName _GetAchievementName; #endregion internal string GetAchievementName( uint iAchievement ) { - return GetString( GetAchievementNameDelegatePointer( Self, iAchievement ) ); + return GetString( _GetAchievementName( Self, iAchievement ) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t RequestUserStatsDelegate( IntPtr self, SteamId steamIDUser ); - private RequestUserStatsDelegate RequestUserStatsDelegatePointer; + private delegate SteamAPICall_t FRequestUserStats( IntPtr self, SteamId steamIDUser ); + private FRequestUserStats _RequestUserStats; #endregion internal async Task RequestUserStats( SteamId steamIDUser ) { - return await (new Result( RequestUserStatsDelegatePointer( Self, steamIDUser ) )).GetResult(); + return await (new Result( _RequestUserStats( Self, steamIDUser ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetUserStat1Delegate( IntPtr self, SteamId steamIDUser, string pchName, ref int pData ); - private GetUserStat1Delegate GetUserStat1DelegatePointer; + private delegate bool FGetUserStat1( IntPtr self, SteamId steamIDUser, string pchName, ref int pData ); + private FGetUserStat1 _GetUserStat1; #endregion internal bool GetUserStat1( SteamId steamIDUser, string pchName, ref int pData ) { - return GetUserStat1DelegatePointer( Self, steamIDUser, pchName, ref pData ); + return _GetUserStat1( Self, steamIDUser, pchName, ref pData ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetUserStat2Delegate( IntPtr self, SteamId steamIDUser, string pchName, ref float pData ); - private GetUserStat2Delegate GetUserStat2DelegatePointer; + private delegate bool FGetUserStat2( IntPtr self, SteamId steamIDUser, string pchName, ref float pData ); + private FGetUserStat2 _GetUserStat2; #endregion internal bool GetUserStat2( SteamId steamIDUser, string pchName, ref float pData ) { - return GetUserStat2DelegatePointer( Self, steamIDUser, pchName, ref pData ); + return _GetUserStat2( Self, steamIDUser, pchName, ref pData ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetUserAchievementDelegate( IntPtr self, SteamId steamIDUser, string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ); - private GetUserAchievementDelegate GetUserAchievementDelegatePointer; + private delegate bool FGetUserAchievement( IntPtr self, SteamId steamIDUser, string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ); + private FGetUserAchievement _GetUserAchievement; #endregion internal bool GetUserAchievement( SteamId steamIDUser, string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ) { - return GetUserAchievementDelegatePointer( Self, steamIDUser, pchName, ref pbAchieved ); + return _GetUserAchievement( Self, steamIDUser, pchName, ref pbAchieved ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetUserAchievementAndUnlockTimeDelegate( IntPtr self, SteamId steamIDUser, string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved, ref uint punUnlockTime ); - private GetUserAchievementAndUnlockTimeDelegate GetUserAchievementAndUnlockTimeDelegatePointer; + private delegate bool FGetUserAchievementAndUnlockTime( IntPtr self, SteamId steamIDUser, string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved, ref uint punUnlockTime ); + private FGetUserAchievementAndUnlockTime _GetUserAchievementAndUnlockTime; #endregion internal bool GetUserAchievementAndUnlockTime( SteamId steamIDUser, string pchName, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved, ref uint punUnlockTime ) { - return GetUserAchievementAndUnlockTimeDelegatePointer( Self, steamIDUser, pchName, ref pbAchieved, ref punUnlockTime ); + return _GetUserAchievementAndUnlockTime( Self, steamIDUser, pchName, ref pbAchieved, ref punUnlockTime ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool ResetAllStatsDelegate( IntPtr self, [MarshalAs( UnmanagedType.U1 )] bool bAchievementsToo ); - private ResetAllStatsDelegate ResetAllStatsDelegatePointer; + private delegate bool FResetAllStats( IntPtr self, [MarshalAs( UnmanagedType.U1 )] bool bAchievementsToo ); + private FResetAllStats _ResetAllStats; #endregion internal bool ResetAllStats( [MarshalAs( UnmanagedType.U1 )] bool bAchievementsToo ) { - return ResetAllStatsDelegatePointer( Self, bAchievementsToo ); + return _ResetAllStats( Self, bAchievementsToo ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t FindOrCreateLeaderboardDelegate( IntPtr self, string pchLeaderboardName, LeaderboardSort eLeaderboardSortMethod, LeaderboardDisplay eLeaderboardDisplayType ); - private FindOrCreateLeaderboardDelegate FindOrCreateLeaderboardDelegatePointer; + private delegate SteamAPICall_t FFindOrCreateLeaderboard( IntPtr self, string pchLeaderboardName, LeaderboardSort eLeaderboardSortMethod, LeaderboardDisplay eLeaderboardDisplayType ); + private FFindOrCreateLeaderboard _FindOrCreateLeaderboard; #endregion internal async Task FindOrCreateLeaderboard( string pchLeaderboardName, LeaderboardSort eLeaderboardSortMethod, LeaderboardDisplay eLeaderboardDisplayType ) { - return await (new Result( FindOrCreateLeaderboardDelegatePointer( Self, pchLeaderboardName, eLeaderboardSortMethod, eLeaderboardDisplayType ) )).GetResult(); + return await (new Result( _FindOrCreateLeaderboard( Self, pchLeaderboardName, eLeaderboardSortMethod, eLeaderboardDisplayType ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t FindLeaderboardDelegate( IntPtr self, string pchLeaderboardName ); - private FindLeaderboardDelegate FindLeaderboardDelegatePointer; + private delegate SteamAPICall_t FFindLeaderboard( IntPtr self, string pchLeaderboardName ); + private FFindLeaderboard _FindLeaderboard; #endregion internal async Task FindLeaderboard( string pchLeaderboardName ) { - return await (new Result( FindLeaderboardDelegatePointer( Self, pchLeaderboardName ) )).GetResult(); + return await (new Result( _FindLeaderboard( Self, pchLeaderboardName ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate IntPtr GetLeaderboardNameDelegate( IntPtr self, SteamLeaderboard_t hSteamLeaderboard ); - private GetLeaderboardNameDelegate GetLeaderboardNameDelegatePointer; + private delegate IntPtr FGetLeaderboardName( IntPtr self, SteamLeaderboard_t hSteamLeaderboard ); + private FGetLeaderboardName _GetLeaderboardName; #endregion internal string GetLeaderboardName( SteamLeaderboard_t hSteamLeaderboard ) { - return GetString( GetLeaderboardNameDelegatePointer( Self, hSteamLeaderboard ) ); + return GetString( _GetLeaderboardName( Self, hSteamLeaderboard ) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetLeaderboardEntryCountDelegate( IntPtr self, SteamLeaderboard_t hSteamLeaderboard ); - private GetLeaderboardEntryCountDelegate GetLeaderboardEntryCountDelegatePointer; + private delegate int FGetLeaderboardEntryCount( IntPtr self, SteamLeaderboard_t hSteamLeaderboard ); + private FGetLeaderboardEntryCount _GetLeaderboardEntryCount; #endregion internal int GetLeaderboardEntryCount( SteamLeaderboard_t hSteamLeaderboard ) { - return GetLeaderboardEntryCountDelegatePointer( Self, hSteamLeaderboard ); + return _GetLeaderboardEntryCount( Self, hSteamLeaderboard ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate LeaderboardSort GetLeaderboardSortMethodDelegate( IntPtr self, SteamLeaderboard_t hSteamLeaderboard ); - private GetLeaderboardSortMethodDelegate GetLeaderboardSortMethodDelegatePointer; + private delegate LeaderboardSort FGetLeaderboardSortMethod( IntPtr self, SteamLeaderboard_t hSteamLeaderboard ); + private FGetLeaderboardSortMethod _GetLeaderboardSortMethod; #endregion internal LeaderboardSort GetLeaderboardSortMethod( SteamLeaderboard_t hSteamLeaderboard ) { - return GetLeaderboardSortMethodDelegatePointer( Self, hSteamLeaderboard ); + return _GetLeaderboardSortMethod( Self, hSteamLeaderboard ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate LeaderboardDisplay GetLeaderboardDisplayTypeDelegate( IntPtr self, SteamLeaderboard_t hSteamLeaderboard ); - private GetLeaderboardDisplayTypeDelegate GetLeaderboardDisplayTypeDelegatePointer; + private delegate LeaderboardDisplay FGetLeaderboardDisplayType( IntPtr self, SteamLeaderboard_t hSteamLeaderboard ); + private FGetLeaderboardDisplayType _GetLeaderboardDisplayType; #endregion internal LeaderboardDisplay GetLeaderboardDisplayType( SteamLeaderboard_t hSteamLeaderboard ) { - return GetLeaderboardDisplayTypeDelegatePointer( Self, hSteamLeaderboard ); + return _GetLeaderboardDisplayType( Self, hSteamLeaderboard ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t DownloadLeaderboardEntriesDelegate( IntPtr self, SteamLeaderboard_t hSteamLeaderboard, LeaderboardDataRequest eLeaderboardDataRequest, int nRangeStart, int nRangeEnd ); - private DownloadLeaderboardEntriesDelegate DownloadLeaderboardEntriesDelegatePointer; + private delegate SteamAPICall_t FDownloadLeaderboardEntries( IntPtr self, SteamLeaderboard_t hSteamLeaderboard, LeaderboardDataRequest eLeaderboardDataRequest, int nRangeStart, int nRangeEnd ); + private FDownloadLeaderboardEntries _DownloadLeaderboardEntries; #endregion internal async Task DownloadLeaderboardEntries( SteamLeaderboard_t hSteamLeaderboard, LeaderboardDataRequest eLeaderboardDataRequest, int nRangeStart, int nRangeEnd ) { - return await (new Result( DownloadLeaderboardEntriesDelegatePointer( Self, hSteamLeaderboard, eLeaderboardDataRequest, nRangeStart, nRangeEnd ) )).GetResult(); + return await (new Result( _DownloadLeaderboardEntries( Self, hSteamLeaderboard, eLeaderboardDataRequest, nRangeStart, nRangeEnd ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t DownloadLeaderboardEntriesForUsersDelegate( IntPtr self, SteamLeaderboard_t hSteamLeaderboard, [In,Out] SteamId[] prgUsers, int cUsers ); - private DownloadLeaderboardEntriesForUsersDelegate DownloadLeaderboardEntriesForUsersDelegatePointer; + private delegate SteamAPICall_t FDownloadLeaderboardEntriesForUsers( IntPtr self, SteamLeaderboard_t hSteamLeaderboard, [In,Out] SteamId[] prgUsers, int cUsers ); + private FDownloadLeaderboardEntriesForUsers _DownloadLeaderboardEntriesForUsers; #endregion internal async Task DownloadLeaderboardEntriesForUsers( SteamLeaderboard_t hSteamLeaderboard, [In,Out] SteamId[] prgUsers, int cUsers ) { - return await (new Result( DownloadLeaderboardEntriesForUsersDelegatePointer( Self, hSteamLeaderboard, prgUsers, cUsers ) )).GetResult(); + return await (new Result( _DownloadLeaderboardEntriesForUsers( Self, hSteamLeaderboard, prgUsers, cUsers ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetDownloadedLeaderboardEntryDelegate( IntPtr self, SteamLeaderboardEntries_t hSteamLeaderboardEntries, int index, ref LeaderboardEntry_t pLeaderboardEntry, [In,Out] int[] pDetails, int cDetailsMax ); - private GetDownloadedLeaderboardEntryDelegate GetDownloadedLeaderboardEntryDelegatePointer; + private delegate bool FGetDownloadedLeaderboardEntry( IntPtr self, SteamLeaderboardEntries_t hSteamLeaderboardEntries, int index, ref LeaderboardEntry_t pLeaderboardEntry, [In,Out] int[] pDetails, int cDetailsMax ); + private FGetDownloadedLeaderboardEntry _GetDownloadedLeaderboardEntry; #endregion internal bool GetDownloadedLeaderboardEntry( SteamLeaderboardEntries_t hSteamLeaderboardEntries, int index, ref LeaderboardEntry_t pLeaderboardEntry, [In,Out] int[] pDetails, int cDetailsMax ) { - return GetDownloadedLeaderboardEntryDelegatePointer( Self, hSteamLeaderboardEntries, index, ref pLeaderboardEntry, pDetails, cDetailsMax ); + return _GetDownloadedLeaderboardEntry( Self, hSteamLeaderboardEntries, index, ref pLeaderboardEntry, pDetails, cDetailsMax ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t UploadLeaderboardScoreDelegate( IntPtr self, SteamLeaderboard_t hSteamLeaderboard, LeaderboardUploadScoreMethod eLeaderboardUploadScoreMethod, int nScore, [In,Out] int[] pScoreDetails, int cScoreDetailsCount ); - private UploadLeaderboardScoreDelegate UploadLeaderboardScoreDelegatePointer; + private delegate SteamAPICall_t FUploadLeaderboardScore( IntPtr self, SteamLeaderboard_t hSteamLeaderboard, LeaderboardUploadScoreMethod eLeaderboardUploadScoreMethod, int nScore, [In,Out] int[] pScoreDetails, int cScoreDetailsCount ); + private FUploadLeaderboardScore _UploadLeaderboardScore; #endregion internal async Task UploadLeaderboardScore( SteamLeaderboard_t hSteamLeaderboard, LeaderboardUploadScoreMethod eLeaderboardUploadScoreMethod, int nScore, [In,Out] int[] pScoreDetails, int cScoreDetailsCount ) { - return await (new Result( UploadLeaderboardScoreDelegatePointer( Self, hSteamLeaderboard, eLeaderboardUploadScoreMethod, nScore, pScoreDetails, cScoreDetailsCount ) )).GetResult(); + return await (new Result( _UploadLeaderboardScore( Self, hSteamLeaderboard, eLeaderboardUploadScoreMethod, nScore, pScoreDetails, cScoreDetailsCount ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t AttachLeaderboardUGCDelegate( IntPtr self, SteamLeaderboard_t hSteamLeaderboard, UGCHandle_t hUGC ); - private AttachLeaderboardUGCDelegate AttachLeaderboardUGCDelegatePointer; + private delegate SteamAPICall_t FAttachLeaderboardUGC( IntPtr self, SteamLeaderboard_t hSteamLeaderboard, UGCHandle_t hUGC ); + private FAttachLeaderboardUGC _AttachLeaderboardUGC; #endregion internal async Task AttachLeaderboardUGC( SteamLeaderboard_t hSteamLeaderboard, UGCHandle_t hUGC ) { - return await (new Result( AttachLeaderboardUGCDelegatePointer( Self, hSteamLeaderboard, hUGC ) )).GetResult(); + return await (new Result( _AttachLeaderboardUGC( Self, hSteamLeaderboard, hUGC ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t GetNumberOfCurrentPlayersDelegate( IntPtr self ); - private GetNumberOfCurrentPlayersDelegate GetNumberOfCurrentPlayersDelegatePointer; + private delegate SteamAPICall_t FGetNumberOfCurrentPlayers( IntPtr self ); + private FGetNumberOfCurrentPlayers _GetNumberOfCurrentPlayers; #endregion internal async Task GetNumberOfCurrentPlayers() { - return await (new Result( GetNumberOfCurrentPlayersDelegatePointer( Self ) )).GetResult(); + return await (new Result( _GetNumberOfCurrentPlayers( Self ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t RequestGlobalAchievementPercentagesDelegate( IntPtr self ); - private RequestGlobalAchievementPercentagesDelegate RequestGlobalAchievementPercentagesDelegatePointer; + private delegate SteamAPICall_t FRequestGlobalAchievementPercentages( IntPtr self ); + private FRequestGlobalAchievementPercentages _RequestGlobalAchievementPercentages; #endregion internal async Task RequestGlobalAchievementPercentages() { - return await (new Result( RequestGlobalAchievementPercentagesDelegatePointer( Self ) )).GetResult(); + return await (new Result( _RequestGlobalAchievementPercentages( Self ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetMostAchievedAchievementInfoDelegate( IntPtr self, StringBuilder pchName, uint unNameBufLen, ref float pflPercent, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ); - private GetMostAchievedAchievementInfoDelegate GetMostAchievedAchievementInfoDelegatePointer; + private delegate int FGetMostAchievedAchievementInfo( IntPtr self, StringBuilder pchName, uint unNameBufLen, ref float pflPercent, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ); + private FGetMostAchievedAchievementInfo _GetMostAchievedAchievementInfo; #endregion internal int GetMostAchievedAchievementInfo( StringBuilder pchName, uint unNameBufLen, ref float pflPercent, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ) { - return GetMostAchievedAchievementInfoDelegatePointer( Self, pchName, unNameBufLen, ref pflPercent, ref pbAchieved ); + return _GetMostAchievedAchievementInfo( Self, pchName, unNameBufLen, ref pflPercent, ref pbAchieved ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetNextMostAchievedAchievementInfoDelegate( IntPtr self, int iIteratorPrevious, StringBuilder pchName, uint unNameBufLen, ref float pflPercent, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ); - private GetNextMostAchievedAchievementInfoDelegate GetNextMostAchievedAchievementInfoDelegatePointer; + private delegate int FGetNextMostAchievedAchievementInfo( IntPtr self, int iIteratorPrevious, StringBuilder pchName, uint unNameBufLen, ref float pflPercent, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ); + private FGetNextMostAchievedAchievementInfo _GetNextMostAchievedAchievementInfo; #endregion internal int GetNextMostAchievedAchievementInfo( int iIteratorPrevious, StringBuilder pchName, uint unNameBufLen, ref float pflPercent, [MarshalAs( UnmanagedType.U1 )] ref bool pbAchieved ) { - return GetNextMostAchievedAchievementInfoDelegatePointer( Self, iIteratorPrevious, pchName, unNameBufLen, ref pflPercent, ref pbAchieved ); + return _GetNextMostAchievedAchievementInfo( Self, iIteratorPrevious, pchName, unNameBufLen, ref pflPercent, ref pbAchieved ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetAchievementAchievedPercentDelegate( IntPtr self, string pchName, ref float pflPercent ); - private GetAchievementAchievedPercentDelegate GetAchievementAchievedPercentDelegatePointer; + private delegate bool FGetAchievementAchievedPercent( IntPtr self, string pchName, ref float pflPercent ); + private FGetAchievementAchievedPercent _GetAchievementAchievedPercent; #endregion internal bool GetAchievementAchievedPercent( string pchName, ref float pflPercent ) { - return GetAchievementAchievedPercentDelegatePointer( Self, pchName, ref pflPercent ); + return _GetAchievementAchievedPercent( Self, pchName, ref pflPercent ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t RequestGlobalStatsDelegate( IntPtr self, int nHistoryDays ); - private RequestGlobalStatsDelegate RequestGlobalStatsDelegatePointer; + private delegate SteamAPICall_t FRequestGlobalStats( IntPtr self, int nHistoryDays ); + private FRequestGlobalStats _RequestGlobalStats; #endregion internal async Task RequestGlobalStats( int nHistoryDays ) { - return await (new Result( RequestGlobalStatsDelegatePointer( Self, nHistoryDays ) )).GetResult(); + return await (new Result( _RequestGlobalStats( Self, nHistoryDays ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetGlobalStat1Delegate( IntPtr self, string pchStatName, ref long pData ); - private GetGlobalStat1Delegate GetGlobalStat1DelegatePointer; + private delegate bool FGetGlobalStat1( IntPtr self, string pchStatName, ref long pData ); + private FGetGlobalStat1 _GetGlobalStat1; #endregion internal bool GetGlobalStat1( string pchStatName, ref long pData ) { - return GetGlobalStat1DelegatePointer( Self, pchStatName, ref pData ); + return _GetGlobalStat1( Self, pchStatName, ref pData ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetGlobalStat2Delegate( IntPtr self, string pchStatName, ref double pData ); - private GetGlobalStat2Delegate GetGlobalStat2DelegatePointer; + private delegate bool FGetGlobalStat2( IntPtr self, string pchStatName, ref double pData ); + private FGetGlobalStat2 _GetGlobalStat2; #endregion internal bool GetGlobalStat2( string pchStatName, ref double pData ) { - return GetGlobalStat2DelegatePointer( Self, pchStatName, ref pData ); + return _GetGlobalStat2( Self, pchStatName, ref pData ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetGlobalStatHistory1Delegate( IntPtr self, string pchStatName, [In,Out] long[] pData, uint cubData ); - private GetGlobalStatHistory1Delegate GetGlobalStatHistory1DelegatePointer; + private delegate int FGetGlobalStatHistory1( IntPtr self, string pchStatName, [In,Out] long[] pData, uint cubData ); + private FGetGlobalStatHistory1 _GetGlobalStatHistory1; #endregion internal int GetGlobalStatHistory1( string pchStatName, [In,Out] long[] pData, uint cubData ) { - return GetGlobalStatHistory1DelegatePointer( Self, pchStatName, pData, cubData ); + return _GetGlobalStatHistory1( Self, pchStatName, pData, cubData ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate int GetGlobalStatHistory2Delegate( IntPtr self, string pchStatName, [In,Out] double[] pData, uint cubData ); - private GetGlobalStatHistory2Delegate GetGlobalStatHistory2DelegatePointer; + private delegate int FGetGlobalStatHistory2( IntPtr self, string pchStatName, [In,Out] double[] pData, uint cubData ); + private FGetGlobalStatHistory2 _GetGlobalStatHistory2; #endregion internal int GetGlobalStatHistory2( string pchStatName, [In,Out] double[] pData, uint cubData ) { - return GetGlobalStatHistory2DelegatePointer( Self, pchStatName, pData, cubData ); + return _GetGlobalStatHistory2( Self, pchStatName, pData, cubData ); } } diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamUtils.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamUtils.cs index 17fb980..56a3bc2 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamUtils.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamUtils.cs @@ -17,378 +17,378 @@ public ISteamUtils( bool server = false ) : base( server ) public override void InitInternals() { - GetSecondsSinceAppActiveDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); - GetSecondsSinceComputerActiveDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); - GetConnectedUniverseDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); - GetServerRealTimeDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); - GetIPCountryDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); - GetImageSizeDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); - GetImageRGBADelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 48) ); - GetCSERIPPortDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 56) ); - GetCurrentBatteryPowerDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 64) ); - GetAppIDDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 72) ); - SetOverlayNotificationPositionDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 80) ); - IsAPICallCompletedDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 88) ); - GetAPICallFailureReasonDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 96) ); - GetAPICallResultDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 104) ); - RunFrameDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 112) ); - GetIPCCallCountDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 120) ); - SetWarningMessageHookDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 128) ); - IsOverlayEnabledDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 136) ); - BOverlayNeedsPresentDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 144) ); - CheckFileSignatureDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 152) ); - ShowGamepadTextInputDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 160) ); - GetEnteredGamepadTextLengthDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 168) ); - GetEnteredGamepadTextInputDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 176) ); - GetSteamUILanguageDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 184) ); - IsSteamRunningInVRDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 192) ); - SetOverlayNotificationInsetDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 200) ); - IsSteamInBigPictureModeDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 208) ); - StartVRDashboardDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 216) ); - IsVRHeadsetStreamingEnabledDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 224) ); - SetVRHeadsetStreamingEnabledDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 232) ); + _GetSecondsSinceAppActive = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); + _GetSecondsSinceComputerActive = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); + _GetConnectedUniverse = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); + _GetServerRealTime = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); + _GetIPCountry = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); + _GetImageSize = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); + _GetImageRGBA = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 48) ); + _GetCSERIPPort = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 56) ); + _GetCurrentBatteryPower = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 64) ); + _GetAppID = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 72) ); + _SetOverlayNotificationPosition = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 80) ); + _IsAPICallCompleted = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 88) ); + _GetAPICallFailureReason = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 96) ); + _GetAPICallResult = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 104) ); + _RunFrame = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 112) ); + _GetIPCCallCount = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 120) ); + _SetWarningMessageHook = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 128) ); + _IsOverlayEnabled = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 136) ); + _BOverlayNeedsPresent = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 144) ); + _CheckFileSignature = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 152) ); + _ShowGamepadTextInput = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 160) ); + _GetEnteredGamepadTextLength = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 168) ); + _GetEnteredGamepadTextInput = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 176) ); + _GetSteamUILanguage = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 184) ); + _IsSteamRunningInVR = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 192) ); + _SetOverlayNotificationInset = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 200) ); + _IsSteamInBigPictureMode = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 208) ); + _StartVRDashboard = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 216) ); + _IsVRHeadsetStreamingEnabled = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 224) ); + _SetVRHeadsetStreamingEnabled = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 232) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate uint GetSecondsSinceAppActiveDelegate( IntPtr self ); - private GetSecondsSinceAppActiveDelegate GetSecondsSinceAppActiveDelegatePointer; + private delegate uint FGetSecondsSinceAppActive( IntPtr self ); + private FGetSecondsSinceAppActive _GetSecondsSinceAppActive; #endregion internal uint GetSecondsSinceAppActive() { - return GetSecondsSinceAppActiveDelegatePointer( Self ); + return _GetSecondsSinceAppActive( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate uint GetSecondsSinceComputerActiveDelegate( IntPtr self ); - private GetSecondsSinceComputerActiveDelegate GetSecondsSinceComputerActiveDelegatePointer; + private delegate uint FGetSecondsSinceComputerActive( IntPtr self ); + private FGetSecondsSinceComputerActive _GetSecondsSinceComputerActive; #endregion internal uint GetSecondsSinceComputerActive() { - return GetSecondsSinceComputerActiveDelegatePointer( Self ); + return _GetSecondsSinceComputerActive( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate Universe GetConnectedUniverseDelegate( IntPtr self ); - private GetConnectedUniverseDelegate GetConnectedUniverseDelegatePointer; + private delegate Universe FGetConnectedUniverse( IntPtr self ); + private FGetConnectedUniverse _GetConnectedUniverse; #endregion internal Universe GetConnectedUniverse() { - return GetConnectedUniverseDelegatePointer( Self ); + return _GetConnectedUniverse( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate uint GetServerRealTimeDelegate( IntPtr self ); - private GetServerRealTimeDelegate GetServerRealTimeDelegatePointer; + private delegate uint FGetServerRealTime( IntPtr self ); + private FGetServerRealTime _GetServerRealTime; #endregion internal uint GetServerRealTime() { - return GetServerRealTimeDelegatePointer( Self ); + return _GetServerRealTime( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate IntPtr GetIPCountryDelegate( IntPtr self ); - private GetIPCountryDelegate GetIPCountryDelegatePointer; + private delegate IntPtr FGetIPCountry( IntPtr self ); + private FGetIPCountry _GetIPCountry; #endregion internal string GetIPCountry() { - return GetString( GetIPCountryDelegatePointer( Self ) ); + return GetString( _GetIPCountry( Self ) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetImageSizeDelegate( IntPtr self, int iImage, ref uint pnWidth, ref uint pnHeight ); - private GetImageSizeDelegate GetImageSizeDelegatePointer; + private delegate bool FGetImageSize( IntPtr self, int iImage, ref uint pnWidth, ref uint pnHeight ); + private FGetImageSize _GetImageSize; #endregion internal bool GetImageSize( int iImage, ref uint pnWidth, ref uint pnHeight ) { - return GetImageSizeDelegatePointer( Self, iImage, ref pnWidth, ref pnHeight ); + return _GetImageSize( Self, iImage, ref pnWidth, ref pnHeight ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetImageRGBADelegate( IntPtr self, int iImage, [In,Out] byte[] pubDest, int nDestBufferSize ); - private GetImageRGBADelegate GetImageRGBADelegatePointer; + private delegate bool FGetImageRGBA( IntPtr self, int iImage, [In,Out] byte[] pubDest, int nDestBufferSize ); + private FGetImageRGBA _GetImageRGBA; #endregion internal bool GetImageRGBA( int iImage, [In,Out] byte[] pubDest, int nDestBufferSize ) { - return GetImageRGBADelegatePointer( Self, iImage, pubDest, nDestBufferSize ); + return _GetImageRGBA( Self, iImage, pubDest, nDestBufferSize ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetCSERIPPortDelegate( IntPtr self, ref uint unIP, ref ushort usPort ); - private GetCSERIPPortDelegate GetCSERIPPortDelegatePointer; + private delegate bool FGetCSERIPPort( IntPtr self, ref uint unIP, ref ushort usPort ); + private FGetCSERIPPort _GetCSERIPPort; #endregion internal bool GetCSERIPPort( ref uint unIP, ref ushort usPort ) { - return GetCSERIPPortDelegatePointer( Self, ref unIP, ref usPort ); + return _GetCSERIPPort( Self, ref unIP, ref usPort ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate byte GetCurrentBatteryPowerDelegate( IntPtr self ); - private GetCurrentBatteryPowerDelegate GetCurrentBatteryPowerDelegatePointer; + private delegate byte FGetCurrentBatteryPower( IntPtr self ); + private FGetCurrentBatteryPower _GetCurrentBatteryPower; #endregion internal byte GetCurrentBatteryPower() { - return GetCurrentBatteryPowerDelegatePointer( Self ); + return _GetCurrentBatteryPower( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate uint GetAppIDDelegate( IntPtr self ); - private GetAppIDDelegate GetAppIDDelegatePointer; + private delegate uint FGetAppID( IntPtr self ); + private FGetAppID _GetAppID; #endregion internal uint GetAppID() { - return GetAppIDDelegatePointer( Self ); + return _GetAppID( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetOverlayNotificationPositionDelegate( IntPtr self, NotificationPosition eNotificationPosition ); - private SetOverlayNotificationPositionDelegate SetOverlayNotificationPositionDelegatePointer; + private delegate void FSetOverlayNotificationPosition( IntPtr self, NotificationPosition eNotificationPosition ); + private FSetOverlayNotificationPosition _SetOverlayNotificationPosition; #endregion internal void SetOverlayNotificationPosition( NotificationPosition eNotificationPosition ) { - SetOverlayNotificationPositionDelegatePointer( Self, eNotificationPosition ); + _SetOverlayNotificationPosition( Self, eNotificationPosition ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool IsAPICallCompletedDelegate( IntPtr self, SteamAPICall_t hSteamAPICall, [MarshalAs( UnmanagedType.U1 )] ref bool pbFailed ); - private IsAPICallCompletedDelegate IsAPICallCompletedDelegatePointer; + private delegate bool FIsAPICallCompleted( IntPtr self, SteamAPICall_t hSteamAPICall, [MarshalAs( UnmanagedType.U1 )] ref bool pbFailed ); + private FIsAPICallCompleted _IsAPICallCompleted; #endregion internal bool IsAPICallCompleted( SteamAPICall_t hSteamAPICall, [MarshalAs( UnmanagedType.U1 )] ref bool pbFailed ) { - return IsAPICallCompletedDelegatePointer( Self, hSteamAPICall, ref pbFailed ); + return _IsAPICallCompleted( Self, hSteamAPICall, ref pbFailed ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICallFailure GetAPICallFailureReasonDelegate( IntPtr self, SteamAPICall_t hSteamAPICall ); - private GetAPICallFailureReasonDelegate GetAPICallFailureReasonDelegatePointer; + private delegate SteamAPICallFailure FGetAPICallFailureReason( IntPtr self, SteamAPICall_t hSteamAPICall ); + private FGetAPICallFailureReason _GetAPICallFailureReason; #endregion internal SteamAPICallFailure GetAPICallFailureReason( SteamAPICall_t hSteamAPICall ) { - return GetAPICallFailureReasonDelegatePointer( Self, hSteamAPICall ); + return _GetAPICallFailureReason( Self, hSteamAPICall ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetAPICallResultDelegate( IntPtr self, SteamAPICall_t hSteamAPICall, IntPtr pCallback, int cubCallback, int iCallbackExpected, [MarshalAs( UnmanagedType.U1 )] ref bool pbFailed ); - private GetAPICallResultDelegate GetAPICallResultDelegatePointer; + private delegate bool FGetAPICallResult( IntPtr self, SteamAPICall_t hSteamAPICall, IntPtr pCallback, int cubCallback, int iCallbackExpected, [MarshalAs( UnmanagedType.U1 )] ref bool pbFailed ); + private FGetAPICallResult _GetAPICallResult; #endregion internal bool GetAPICallResult( SteamAPICall_t hSteamAPICall, IntPtr pCallback, int cubCallback, int iCallbackExpected, [MarshalAs( UnmanagedType.U1 )] ref bool pbFailed ) { - return GetAPICallResultDelegatePointer( Self, hSteamAPICall, pCallback, cubCallback, iCallbackExpected, ref pbFailed ); + return _GetAPICallResult( Self, hSteamAPICall, pCallback, cubCallback, iCallbackExpected, ref pbFailed ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void RunFrameDelegate( IntPtr self ); - private RunFrameDelegate RunFrameDelegatePointer; + private delegate void FRunFrame( IntPtr self ); + private FRunFrame _RunFrame; #endregion internal void RunFrame() { - RunFrameDelegatePointer( Self ); + _RunFrame( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate uint GetIPCCallCountDelegate( IntPtr self ); - private GetIPCCallCountDelegate GetIPCCallCountDelegatePointer; + private delegate uint FGetIPCCallCount( IntPtr self ); + private FGetIPCCallCount _GetIPCCallCount; #endregion internal uint GetIPCCallCount() { - return GetIPCCallCountDelegatePointer( Self ); + return _GetIPCCallCount( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetWarningMessageHookDelegate( IntPtr self, IntPtr pFunction ); - private SetWarningMessageHookDelegate SetWarningMessageHookDelegatePointer; + private delegate void FSetWarningMessageHook( IntPtr self, IntPtr pFunction ); + private FSetWarningMessageHook _SetWarningMessageHook; #endregion internal void SetWarningMessageHook( IntPtr pFunction ) { - SetWarningMessageHookDelegatePointer( Self, pFunction ); + _SetWarningMessageHook( Self, pFunction ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool IsOverlayEnabledDelegate( IntPtr self ); - private IsOverlayEnabledDelegate IsOverlayEnabledDelegatePointer; + private delegate bool FIsOverlayEnabled( IntPtr self ); + private FIsOverlayEnabled _IsOverlayEnabled; #endregion internal bool IsOverlayEnabled() { - return IsOverlayEnabledDelegatePointer( Self ); + return _IsOverlayEnabled( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool BOverlayNeedsPresentDelegate( IntPtr self ); - private BOverlayNeedsPresentDelegate BOverlayNeedsPresentDelegatePointer; + private delegate bool FBOverlayNeedsPresent( IntPtr self ); + private FBOverlayNeedsPresent _BOverlayNeedsPresent; #endregion internal bool BOverlayNeedsPresent() { - return BOverlayNeedsPresentDelegatePointer( Self ); + return _BOverlayNeedsPresent( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t CheckFileSignatureDelegate( IntPtr self, string szFileName ); - private CheckFileSignatureDelegate CheckFileSignatureDelegatePointer; + private delegate SteamAPICall_t FCheckFileSignature( IntPtr self, string szFileName ); + private FCheckFileSignature _CheckFileSignature; #endregion internal async Task CheckFileSignature( string szFileName ) { - return await (new Result( CheckFileSignatureDelegatePointer( Self, szFileName ) )).GetResult(); + return await (new Result( _CheckFileSignature( Self, szFileName ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool ShowGamepadTextInputDelegate( IntPtr self, GamepadTextInputMode eInputMode, GamepadTextInputLineMode eLineInputMode, string pchDescription, uint unCharMax, string pchExistingText ); - private ShowGamepadTextInputDelegate ShowGamepadTextInputDelegatePointer; + private delegate bool FShowGamepadTextInput( IntPtr self, GamepadTextInputMode eInputMode, GamepadTextInputLineMode eLineInputMode, string pchDescription, uint unCharMax, string pchExistingText ); + private FShowGamepadTextInput _ShowGamepadTextInput; #endregion internal bool ShowGamepadTextInput( GamepadTextInputMode eInputMode, GamepadTextInputLineMode eLineInputMode, string pchDescription, uint unCharMax, string pchExistingText ) { - return ShowGamepadTextInputDelegatePointer( Self, eInputMode, eLineInputMode, pchDescription, unCharMax, pchExistingText ); + return _ShowGamepadTextInput( Self, eInputMode, eLineInputMode, pchDescription, unCharMax, pchExistingText ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate uint GetEnteredGamepadTextLengthDelegate( IntPtr self ); - private GetEnteredGamepadTextLengthDelegate GetEnteredGamepadTextLengthDelegatePointer; + private delegate uint FGetEnteredGamepadTextLength( IntPtr self ); + private FGetEnteredGamepadTextLength _GetEnteredGamepadTextLength; #endregion internal uint GetEnteredGamepadTextLength() { - return GetEnteredGamepadTextLengthDelegatePointer( Self ); + return _GetEnteredGamepadTextLength( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetEnteredGamepadTextInputDelegate( IntPtr self, StringBuilder pchText, uint cchText ); - private GetEnteredGamepadTextInputDelegate GetEnteredGamepadTextInputDelegatePointer; + private delegate bool FGetEnteredGamepadTextInput( IntPtr self, StringBuilder pchText, uint cchText ); + private FGetEnteredGamepadTextInput _GetEnteredGamepadTextInput; #endregion internal bool GetEnteredGamepadTextInput( StringBuilder pchText, uint cchText ) { - return GetEnteredGamepadTextInputDelegatePointer( Self, pchText, cchText ); + return _GetEnteredGamepadTextInput( Self, pchText, cchText ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate IntPtr GetSteamUILanguageDelegate( IntPtr self ); - private GetSteamUILanguageDelegate GetSteamUILanguageDelegatePointer; + private delegate IntPtr FGetSteamUILanguage( IntPtr self ); + private FGetSteamUILanguage _GetSteamUILanguage; #endregion internal string GetSteamUILanguage() { - return GetString( GetSteamUILanguageDelegatePointer( Self ) ); + return GetString( _GetSteamUILanguage( Self ) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool IsSteamRunningInVRDelegate( IntPtr self ); - private IsSteamRunningInVRDelegate IsSteamRunningInVRDelegatePointer; + private delegate bool FIsSteamRunningInVR( IntPtr self ); + private FIsSteamRunningInVR _IsSteamRunningInVR; #endregion internal bool IsSteamRunningInVR() { - return IsSteamRunningInVRDelegatePointer( Self ); + return _IsSteamRunningInVR( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetOverlayNotificationInsetDelegate( IntPtr self, int nHorizontalInset, int nVerticalInset ); - private SetOverlayNotificationInsetDelegate SetOverlayNotificationInsetDelegatePointer; + private delegate void FSetOverlayNotificationInset( IntPtr self, int nHorizontalInset, int nVerticalInset ); + private FSetOverlayNotificationInset _SetOverlayNotificationInset; #endregion internal void SetOverlayNotificationInset( int nHorizontalInset, int nVerticalInset ) { - SetOverlayNotificationInsetDelegatePointer( Self, nHorizontalInset, nVerticalInset ); + _SetOverlayNotificationInset( Self, nHorizontalInset, nVerticalInset ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool IsSteamInBigPictureModeDelegate( IntPtr self ); - private IsSteamInBigPictureModeDelegate IsSteamInBigPictureModeDelegatePointer; + private delegate bool FIsSteamInBigPictureMode( IntPtr self ); + private FIsSteamInBigPictureMode _IsSteamInBigPictureMode; #endregion internal bool IsSteamInBigPictureMode() { - return IsSteamInBigPictureModeDelegatePointer( Self ); + return _IsSteamInBigPictureMode( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void StartVRDashboardDelegate( IntPtr self ); - private StartVRDashboardDelegate StartVRDashboardDelegatePointer; + private delegate void FStartVRDashboard( IntPtr self ); + private FStartVRDashboard _StartVRDashboard; #endregion internal void StartVRDashboard() { - StartVRDashboardDelegatePointer( Self ); + _StartVRDashboard( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool IsVRHeadsetStreamingEnabledDelegate( IntPtr self ); - private IsVRHeadsetStreamingEnabledDelegate IsVRHeadsetStreamingEnabledDelegatePointer; + private delegate bool FIsVRHeadsetStreamingEnabled( IntPtr self ); + private FIsVRHeadsetStreamingEnabled _IsVRHeadsetStreamingEnabled; #endregion internal bool IsVRHeadsetStreamingEnabled() { - return IsVRHeadsetStreamingEnabledDelegatePointer( Self ); + return _IsVRHeadsetStreamingEnabled( Self ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void SetVRHeadsetStreamingEnabledDelegate( IntPtr self, [MarshalAs( UnmanagedType.U1 )] bool bEnabled ); - private SetVRHeadsetStreamingEnabledDelegate SetVRHeadsetStreamingEnabledDelegatePointer; + private delegate void FSetVRHeadsetStreamingEnabled( IntPtr self, [MarshalAs( UnmanagedType.U1 )] bool bEnabled ); + private FSetVRHeadsetStreamingEnabled _SetVRHeadsetStreamingEnabled; #endregion internal void SetVRHeadsetStreamingEnabled( [MarshalAs( UnmanagedType.U1 )] bool bEnabled ) { - SetVRHeadsetStreamingEnabledDelegatePointer( Self, bEnabled ); + _SetVRHeadsetStreamingEnabled( Self, bEnabled ); } } diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamVideo.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamVideo.cs index bbe5f3a..1107826 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamVideo.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamVideo.cs @@ -17,56 +17,56 @@ public ISteamVideo( bool server = false ) : base( server ) public override void InitInternals() { - GetVideoURLDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); - IsBroadcastingDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); - GetOPFSettingsDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); - GetOPFStringForAppDelegatePointer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); + _GetVideoURL = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); + _IsBroadcasting = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); + _GetOPFSettings = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); + _GetOPFStringForApp = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void GetVideoURLDelegate( IntPtr self, AppId_t unVideoAppID ); - private GetVideoURLDelegate GetVideoURLDelegatePointer; + private delegate void FGetVideoURL( IntPtr self, AppId_t unVideoAppID ); + private FGetVideoURL _GetVideoURL; #endregion internal void GetVideoURL( AppId_t unVideoAppID ) { - GetVideoURLDelegatePointer( Self, unVideoAppID ); + _GetVideoURL( Self, unVideoAppID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool IsBroadcastingDelegate( IntPtr self, ref int pnNumViewers ); - private IsBroadcastingDelegate IsBroadcastingDelegatePointer; + private delegate bool FIsBroadcasting( IntPtr self, ref int pnNumViewers ); + private FIsBroadcasting _IsBroadcasting; #endregion internal bool IsBroadcasting( ref int pnNumViewers ) { - return IsBroadcastingDelegatePointer( Self, ref pnNumViewers ); + return _IsBroadcasting( Self, ref pnNumViewers ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void GetOPFSettingsDelegate( IntPtr self, AppId_t unVideoAppID ); - private GetOPFSettingsDelegate GetOPFSettingsDelegatePointer; + private delegate void FGetOPFSettings( IntPtr self, AppId_t unVideoAppID ); + private FGetOPFSettings _GetOPFSettings; #endregion internal void GetOPFSettings( AppId_t unVideoAppID ) { - GetOPFSettingsDelegatePointer( Self, unVideoAppID ); + _GetOPFSettings( Self, unVideoAppID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool GetOPFStringForAppDelegate( IntPtr self, AppId_t unVideoAppID, StringBuilder pchBuffer, ref int pnBufferSize ); - private GetOPFStringForAppDelegate GetOPFStringForAppDelegatePointer; + private delegate bool FGetOPFStringForApp( IntPtr self, AppId_t unVideoAppID, StringBuilder pchBuffer, ref int pnBufferSize ); + private FGetOPFStringForApp _GetOPFStringForApp; #endregion internal bool GetOPFStringForApp( AppId_t unVideoAppID, StringBuilder pchBuffer, ref int pnBufferSize ) { - return GetOPFStringForAppDelegatePointer( Self, unVideoAppID, pchBuffer, ref pnBufferSize ); + return _GetOPFStringForApp( Self, unVideoAppID, pchBuffer, ref pnBufferSize ); } } diff --git a/Generator/CodeWriter/ClassVTable.cs b/Generator/CodeWriter/ClassVTable.cs index a7a2529..2293a54 100644 --- a/Generator/CodeWriter/ClassVTable.cs +++ b/Generator/CodeWriter/ClassVTable.cs @@ -62,7 +62,7 @@ void WriteFunctionPointerReader( CodeParser.Class clss ) for (int i=0; i< clss.Functions.Count; i++ ) { var func = clss.Functions[i]; - WriteLine( $"{func.Name}DelegatePointer = Marshal.GetDelegateForFunctionPointer<{func.Name}Delegate>( Marshal.ReadIntPtr( VTable, {i*8}) );" ); + WriteLine( $"_{func.Name} = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, {i*8}) );" ); } } EndBlock(); @@ -100,8 +100,8 @@ private void WriteFunction( CodeParser.Class clss, CodeParser.Class.Function fun if ( returnType.ReturnAttribute != null) WriteLine( returnType.ReturnAttribute ); - WriteLine( $"private delegate {(returnType.IsReturnedWeird?"void":returnType.TypeNameFrom)} {func.Name}Delegate( IntPtr self, {delegateargstr} );".Replace( "( IntPtr self, )", "( IntPtr self )" ) ); - WriteLine( $"private {func.Name}Delegate {func.Name}DelegatePointer;" ); + WriteLine( $"private delegate {(returnType.IsReturnedWeird?"void":returnType.TypeNameFrom)} F{func.Name}( IntPtr self, {delegateargstr} );".Replace( "( IntPtr self, )", "( IntPtr self )" ) ); + WriteLine( $"private F{func.Name} _{func.Name};" ); WriteLine(); WriteLine( $"#endregion" ); @@ -112,16 +112,16 @@ private void WriteFunction( CodeParser.Class clss, CodeParser.Class.Function fun if ( returnType.IsReturnedWeird ) { WriteLine( $"var retVal = default( {returnType.TypeName} );" ); - WriteLine( $"{func.Name}DelegatePointer( Self, ref retVal, {callargs} );".Replace( ", );", " );" ) ); + WriteLine( $"_{func.Name}( Self, ref retVal, {callargs} );".Replace( ", );", " );" ) ); WriteLine( $"{returnType.Return( "retVal" )}" ); } else if ( returnType.IsVoid ) { - WriteLine( $"{func.Name}DelegatePointer( Self, {callargs} );".Replace( "( Self, )", "( Self )" ) ); + WriteLine( $"_{func.Name}( Self, {callargs} );".Replace( "( Self, )", "( Self )" ) ); } else { - var v = $"{func.Name}DelegatePointer( Self, {callargs} )".Replace( "( Self, )", "( Self )" ); + var v = $"_{func.Name}( Self, {callargs} )".Replace( "( Self, )", "( Self )" ); WriteLine( returnType.Return( v ) ); } From 9af8935f471399cea395e5717032520de1505038 Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Wed, 17 Apr 2019 13:53:54 +0100 Subject: [PATCH 11/22] Overloaded function vtable order --- .../Generated/Interfaces/ISteamUserStats.cs | 20 +++++------ Generator/CodeWriter/ClassVTable.cs | 35 ++++++++++++++++++- 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamUserStats.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamUserStats.cs index 494794e..90b1618 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamUserStats.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamUserStats.cs @@ -18,10 +18,10 @@ public ISteamUserStats( bool server = false ) : base( server ) public override void InitInternals() { _RequestCurrentStats = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); - _GetStat1 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); - _GetStat2 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); - _SetStat1 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); - _SetStat2 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); + _GetStat1 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); + _GetStat2 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); + _SetStat1 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); + _SetStat2 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); _UpdateAvgRateStat = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); _GetAchievement = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 48) ); _SetAchievement = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 56) ); @@ -34,8 +34,8 @@ public override void InitInternals() _GetNumAchievements = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 112) ); _GetAchievementName = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 120) ); _RequestUserStats = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 128) ); - _GetUserStat1 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 136) ); - _GetUserStat2 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 144) ); + _GetUserStat1 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 144) ); + _GetUserStat2 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 136) ); _GetUserAchievement = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 152) ); _GetUserAchievementAndUnlockTime = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 160) ); _ResetAllStats = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 168) ); @@ -56,10 +56,10 @@ public override void InitInternals() _GetNextMostAchievedAchievementInfo = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 288) ); _GetAchievementAchievedPercent = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 296) ); _RequestGlobalStats = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 304) ); - _GetGlobalStat1 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 312) ); - _GetGlobalStat2 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 320) ); - _GetGlobalStatHistory1 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 328) ); - _GetGlobalStatHistory2 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 336) ); + _GetGlobalStat1 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 320) ); + _GetGlobalStat2 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 312) ); + _GetGlobalStatHistory1 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 336) ); + _GetGlobalStatHistory2 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 328) ); } #region FunctionMeta diff --git a/Generator/CodeWriter/ClassVTable.cs b/Generator/CodeWriter/ClassVTable.cs index 2293a54..7dc30fd 100644 --- a/Generator/CodeWriter/ClassVTable.cs +++ b/Generator/CodeWriter/ClassVTable.cs @@ -57,17 +57,50 @@ public void GenerateVTableClass( string className, string filename ) void WriteFunctionPointerReader( CodeParser.Class clss ) { + // TODO - we'll probably have to do this PER platform + + int[] locations = new int[clss.Functions.Count]; + + for ( int i = 0; i < clss.Functions.Count; i++ ) + { + locations[i] = i * 8; + } + + // + // MSVC switches the order in the vtable of overloaded functions + // I'm not going to try to try to work out how to order shit + // so lets just manually fix shit here + // + if ( clss.Name == "ISteamUserStats" ) + { + Swap( clss, "GetStat1", "GetStat2", locations ); + Swap( clss, "SetStat1", "SetStat2", locations ); + Swap( clss, "GetUserStat1", "GetUserStat2", locations ); + Swap( clss, "GetGlobalStat1", "GetGlobalStat2", locations ); + Swap( clss, "GetGlobalStatHistory1", "GetGlobalStatHistory2", locations ); + } + StartBlock( $"public override void InitInternals()" ); { for (int i=0; i< clss.Functions.Count; i++ ) { var func = clss.Functions[i]; - WriteLine( $"_{func.Name} = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, {i*8}) );" ); + WriteLine( $"_{func.Name} = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, {locations[i]}) );" ); } } EndBlock(); } + private void Swap( CodeParser.Class clss, string v1, string v2, int[] locations ) + { + var a = clss.Functions.IndexOf( clss.Functions.Single( x => x.Name == v1 ) ); + var b = clss.Functions.IndexOf( clss.Functions.Single( x => x.Name == v2 ) ); + + var s = locations[a]; + locations[a] = locations[b]; + locations[b] = s; + } + private void WriteFunction( CodeParser.Class clss, CodeParser.Class.Function func ) { var returnType = BaseType.Parse( func.ReturnType ); From 6dd5164f34a8cc48a48a3b125b37e4a3db5e3204 Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Wed, 17 Apr 2019 14:07:58 +0100 Subject: [PATCH 12/22] ISteamUGC --- .../Generated/Interfaces/ISteamUGC.cs | 980 ++++++++++++++++++ Generator/CodeParser/ParseClasses.cs | 3 +- Generator/CodeWriter/CodeWriter.cs | 1 + 3 files changed, 983 insertions(+), 1 deletion(-) create mode 100644 Facepunch.Steamworks/Generated/Interfaces/ISteamUGC.cs diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamUGC.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamUGC.cs new file mode 100644 index 0000000..88e46d9 --- /dev/null +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamUGC.cs @@ -0,0 +1,980 @@ +using System; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using Steamworks.Data; + + +namespace Steamworks +{ + internal class ISteamUGC : SteamInterface + { + public ISteamUGC( bool server = false ) : base( server ) + { + } + + public override string InterfaceName => "STEAMUGC_INTERFACE_VERSION012"; + + public override void InitInternals() + { + _CreateQueryUserUGCRequest = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); + _CreateQueryAllUGCRequest1 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); + _CreateQueryAllUGCRequest2 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); + _CreateQueryUGCDetailsRequest = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); + _SendQueryUGCRequest = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); + _GetQueryUGCResult = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); + _GetQueryUGCPreviewURL = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 48) ); + _GetQueryUGCMetadata = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 56) ); + _GetQueryUGCChildren = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 64) ); + _GetQueryUGCStatistic = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 72) ); + _GetQueryUGCNumAdditionalPreviews = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 80) ); + _GetQueryUGCAdditionalPreview = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 88) ); + _GetQueryUGCNumKeyValueTags = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 96) ); + _GetQueryUGCKeyValueTag = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 104) ); + _ReleaseQueryUGCRequest = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 112) ); + _AddRequiredTag = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 120) ); + _AddExcludedTag = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 128) ); + _SetReturnOnlyIDs = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 136) ); + _SetReturnKeyValueTags = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 144) ); + _SetReturnLongDescription = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 152) ); + _SetReturnMetadata = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 160) ); + _SetReturnChildren = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 168) ); + _SetReturnAdditionalPreviews = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 176) ); + _SetReturnTotalOnly = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 184) ); + _SetReturnPlaytimeStats = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 192) ); + _SetLanguage = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 200) ); + _SetAllowCachedResponse = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 208) ); + _SetCloudFileNameFilter = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 216) ); + _SetMatchAnyTag = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 224) ); + _SetSearchText = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 232) ); + _SetRankedByTrendDays = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 240) ); + _AddRequiredKeyValueTag = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 248) ); + _RequestUGCDetails = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 256) ); + _CreateItem = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 264) ); + _StartItemUpdate = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 272) ); + _SetItemTitle = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 280) ); + _SetItemDescription = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 288) ); + _SetItemUpdateLanguage = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 296) ); + _SetItemMetadata = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 304) ); + _SetItemVisibility = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 312) ); + _SetItemTags = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 320) ); + _SetItemContent = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 328) ); + _SetItemPreview = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 336) ); + _SetAllowLegacyUpload = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 344) ); + _RemoveItemKeyValueTags = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 352) ); + _AddItemKeyValueTag = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 360) ); + _AddItemPreviewFile = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 368) ); + _AddItemPreviewVideo = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 376) ); + _UpdateItemPreviewFile = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 384) ); + _UpdateItemPreviewVideo = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 392) ); + _RemoveItemPreview = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 400) ); + _SubmitItemUpdate = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 408) ); + _GetItemUpdateProgress = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 416) ); + _SetUserItemVote = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 424) ); + _GetUserItemVote = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 432) ); + _AddItemToFavorites = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 440) ); + _RemoveItemFromFavorites = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 448) ); + _SubscribeItem = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 456) ); + _UnsubscribeItem = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 464) ); + _GetNumSubscribedItems = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 472) ); + _GetSubscribedItems = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 480) ); + _GetItemState = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 488) ); + _GetItemInstallInfo = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 496) ); + _GetItemDownloadInfo = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 504) ); + _DownloadItem = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 512) ); + _BInitWorkshopForGameServer = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 520) ); + _SuspendDownloads = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 528) ); + _StartPlaytimeTracking = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 536) ); + _StopPlaytimeTracking = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 544) ); + _StopPlaytimeTrackingForAllItems = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 552) ); + _AddDependency = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 560) ); + _RemoveDependency = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 568) ); + _AddAppDependency = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 576) ); + _RemoveAppDependency = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 584) ); + _GetAppDependencies = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 592) ); + _DeleteItem = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 600) ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate UGCQueryHandle_t FCreateQueryUserUGCRequest( IntPtr self, AccountID_t unAccountID, UserUGCList eListType, UGCMatchingUGCType eMatchingUGCType, UserUGCListSortOrder eSortOrder, AppId_t nCreatorAppID, AppId_t nConsumerAppID, uint unPage ); + private FCreateQueryUserUGCRequest _CreateQueryUserUGCRequest; + + #endregion + internal UGCQueryHandle_t CreateQueryUserUGCRequest( AccountID_t unAccountID, UserUGCList eListType, UGCMatchingUGCType eMatchingUGCType, UserUGCListSortOrder eSortOrder, AppId_t nCreatorAppID, AppId_t nConsumerAppID, uint unPage ) + { + return _CreateQueryUserUGCRequest( Self, unAccountID, eListType, eMatchingUGCType, eSortOrder, nCreatorAppID, nConsumerAppID, unPage ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate UGCQueryHandle_t FCreateQueryAllUGCRequest1( IntPtr self, UGCQuery eQueryType, UGCMatchingUGCType eMatchingeMatchingUGCTypeFileType, AppId_t nCreatorAppID, AppId_t nConsumerAppID, uint unPage ); + private FCreateQueryAllUGCRequest1 _CreateQueryAllUGCRequest1; + + #endregion + internal UGCQueryHandle_t CreateQueryAllUGCRequest1( UGCQuery eQueryType, UGCMatchingUGCType eMatchingeMatchingUGCTypeFileType, AppId_t nCreatorAppID, AppId_t nConsumerAppID, uint unPage ) + { + return _CreateQueryAllUGCRequest1( Self, eQueryType, eMatchingeMatchingUGCTypeFileType, nCreatorAppID, nConsumerAppID, unPage ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate UGCQueryHandle_t FCreateQueryAllUGCRequest2( IntPtr self, UGCQuery eQueryType, UGCMatchingUGCType eMatchingeMatchingUGCTypeFileType, AppId_t nCreatorAppID, AppId_t nConsumerAppID, string pchCursor ); + private FCreateQueryAllUGCRequest2 _CreateQueryAllUGCRequest2; + + #endregion + internal UGCQueryHandle_t CreateQueryAllUGCRequest2( UGCQuery eQueryType, UGCMatchingUGCType eMatchingeMatchingUGCTypeFileType, AppId_t nCreatorAppID, AppId_t nConsumerAppID, string pchCursor ) + { + return _CreateQueryAllUGCRequest2( Self, eQueryType, eMatchingeMatchingUGCTypeFileType, nCreatorAppID, nConsumerAppID, pchCursor ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate UGCQueryHandle_t FCreateQueryUGCDetailsRequest( IntPtr self, [In,Out] PublishedFileId[] pvecPublishedFileID, uint unNumPublishedFileIDs ); + private FCreateQueryUGCDetailsRequest _CreateQueryUGCDetailsRequest; + + #endregion + internal UGCQueryHandle_t CreateQueryUGCDetailsRequest( [In,Out] PublishedFileId[] pvecPublishedFileID, uint unNumPublishedFileIDs ) + { + return _CreateQueryUGCDetailsRequest( Self, pvecPublishedFileID, unNumPublishedFileIDs ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate SteamAPICall_t FSendQueryUGCRequest( IntPtr self, UGCQueryHandle_t handle ); + private FSendQueryUGCRequest _SendQueryUGCRequest; + + #endregion + internal async Task SendQueryUGCRequest( UGCQueryHandle_t handle ) + { + return await (new Result( _SendQueryUGCRequest( Self, handle ) )).GetResult(); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FGetQueryUGCResult( IntPtr self, UGCQueryHandle_t handle, uint index, [In,Out] SteamUGCDetails_t[] pDetails ); + private FGetQueryUGCResult _GetQueryUGCResult; + + #endregion + internal bool GetQueryUGCResult( UGCQueryHandle_t handle, uint index, [In,Out] SteamUGCDetails_t[] pDetails ) + { + return _GetQueryUGCResult( Self, handle, index, pDetails ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FGetQueryUGCPreviewURL( IntPtr self, UGCQueryHandle_t handle, uint index, StringBuilder pchURL, uint cchURLSize ); + private FGetQueryUGCPreviewURL _GetQueryUGCPreviewURL; + + #endregion + internal bool GetQueryUGCPreviewURL( UGCQueryHandle_t handle, uint index, StringBuilder pchURL, uint cchURLSize ) + { + return _GetQueryUGCPreviewURL( Self, handle, index, pchURL, cchURLSize ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FGetQueryUGCMetadata( IntPtr self, UGCQueryHandle_t handle, uint index, StringBuilder pchMetadata, uint cchMetadatasize ); + private FGetQueryUGCMetadata _GetQueryUGCMetadata; + + #endregion + internal bool GetQueryUGCMetadata( UGCQueryHandle_t handle, uint index, StringBuilder pchMetadata, uint cchMetadatasize ) + { + return _GetQueryUGCMetadata( Self, handle, index, pchMetadata, cchMetadatasize ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FGetQueryUGCChildren( IntPtr self, UGCQueryHandle_t handle, uint index, [In,Out] PublishedFileId[] pvecPublishedFileID, uint cMaxEntries ); + private FGetQueryUGCChildren _GetQueryUGCChildren; + + #endregion + internal bool GetQueryUGCChildren( UGCQueryHandle_t handle, uint index, [In,Out] PublishedFileId[] pvecPublishedFileID, uint cMaxEntries ) + { + return _GetQueryUGCChildren( Self, handle, index, pvecPublishedFileID, cMaxEntries ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FGetQueryUGCStatistic( IntPtr self, UGCQueryHandle_t handle, uint index, ItemStatistic eStatType, ref ulong pStatValue ); + private FGetQueryUGCStatistic _GetQueryUGCStatistic; + + #endregion + internal bool GetQueryUGCStatistic( UGCQueryHandle_t handle, uint index, ItemStatistic eStatType, ref ulong pStatValue ) + { + return _GetQueryUGCStatistic( Self, handle, index, eStatType, ref pStatValue ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate uint FGetQueryUGCNumAdditionalPreviews( IntPtr self, UGCQueryHandle_t handle, uint index ); + private FGetQueryUGCNumAdditionalPreviews _GetQueryUGCNumAdditionalPreviews; + + #endregion + internal uint GetQueryUGCNumAdditionalPreviews( UGCQueryHandle_t handle, uint index ) + { + return _GetQueryUGCNumAdditionalPreviews( Self, handle, index ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FGetQueryUGCAdditionalPreview( IntPtr self, UGCQueryHandle_t handle, uint index, uint previewIndex, StringBuilder pchURLOrVideoID, uint cchURLSize, StringBuilder pchOriginalFileName, uint cchOriginalFileNameSize, ref ItemPreviewType pPreviewType ); + private FGetQueryUGCAdditionalPreview _GetQueryUGCAdditionalPreview; + + #endregion + internal bool GetQueryUGCAdditionalPreview( UGCQueryHandle_t handle, uint index, uint previewIndex, StringBuilder pchURLOrVideoID, uint cchURLSize, StringBuilder pchOriginalFileName, uint cchOriginalFileNameSize, ref ItemPreviewType pPreviewType ) + { + return _GetQueryUGCAdditionalPreview( Self, handle, index, previewIndex, pchURLOrVideoID, cchURLSize, pchOriginalFileName, cchOriginalFileNameSize, ref pPreviewType ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate uint FGetQueryUGCNumKeyValueTags( IntPtr self, UGCQueryHandle_t handle, uint index ); + private FGetQueryUGCNumKeyValueTags _GetQueryUGCNumKeyValueTags; + + #endregion + internal uint GetQueryUGCNumKeyValueTags( UGCQueryHandle_t handle, uint index ) + { + return _GetQueryUGCNumKeyValueTags( Self, handle, index ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FGetQueryUGCKeyValueTag( IntPtr self, UGCQueryHandle_t handle, uint index, uint keyValueTagIndex, StringBuilder pchKey, uint cchKeySize, StringBuilder pchValue, uint cchValueSize ); + private FGetQueryUGCKeyValueTag _GetQueryUGCKeyValueTag; + + #endregion + internal bool GetQueryUGCKeyValueTag( UGCQueryHandle_t handle, uint index, uint keyValueTagIndex, StringBuilder pchKey, uint cchKeySize, StringBuilder pchValue, uint cchValueSize ) + { + return _GetQueryUGCKeyValueTag( Self, handle, index, keyValueTagIndex, pchKey, cchKeySize, pchValue, cchValueSize ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FReleaseQueryUGCRequest( IntPtr self, UGCQueryHandle_t handle ); + private FReleaseQueryUGCRequest _ReleaseQueryUGCRequest; + + #endregion + internal bool ReleaseQueryUGCRequest( UGCQueryHandle_t handle ) + { + return _ReleaseQueryUGCRequest( Self, handle ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FAddRequiredTag( IntPtr self, UGCQueryHandle_t handle, string pTagName ); + private FAddRequiredTag _AddRequiredTag; + + #endregion + internal bool AddRequiredTag( UGCQueryHandle_t handle, string pTagName ) + { + return _AddRequiredTag( Self, handle, pTagName ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FAddExcludedTag( IntPtr self, UGCQueryHandle_t handle, string pTagName ); + private FAddExcludedTag _AddExcludedTag; + + #endregion + internal bool AddExcludedTag( UGCQueryHandle_t handle, string pTagName ) + { + return _AddExcludedTag( Self, handle, pTagName ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetReturnOnlyIDs( IntPtr self, UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.U1 )] bool bReturnOnlyIDs ); + private FSetReturnOnlyIDs _SetReturnOnlyIDs; + + #endregion + internal bool SetReturnOnlyIDs( UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.U1 )] bool bReturnOnlyIDs ) + { + return _SetReturnOnlyIDs( Self, handle, bReturnOnlyIDs ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetReturnKeyValueTags( IntPtr self, UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.U1 )] bool bReturnKeyValueTags ); + private FSetReturnKeyValueTags _SetReturnKeyValueTags; + + #endregion + internal bool SetReturnKeyValueTags( UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.U1 )] bool bReturnKeyValueTags ) + { + return _SetReturnKeyValueTags( Self, handle, bReturnKeyValueTags ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetReturnLongDescription( IntPtr self, UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.U1 )] bool bReturnLongDescription ); + private FSetReturnLongDescription _SetReturnLongDescription; + + #endregion + internal bool SetReturnLongDescription( UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.U1 )] bool bReturnLongDescription ) + { + return _SetReturnLongDescription( Self, handle, bReturnLongDescription ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetReturnMetadata( IntPtr self, UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.U1 )] bool bReturnMetadata ); + private FSetReturnMetadata _SetReturnMetadata; + + #endregion + internal bool SetReturnMetadata( UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.U1 )] bool bReturnMetadata ) + { + return _SetReturnMetadata( Self, handle, bReturnMetadata ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetReturnChildren( IntPtr self, UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.U1 )] bool bReturnChildren ); + private FSetReturnChildren _SetReturnChildren; + + #endregion + internal bool SetReturnChildren( UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.U1 )] bool bReturnChildren ) + { + return _SetReturnChildren( Self, handle, bReturnChildren ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetReturnAdditionalPreviews( IntPtr self, UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.U1 )] bool bReturnAdditionalPreviews ); + private FSetReturnAdditionalPreviews _SetReturnAdditionalPreviews; + + #endregion + internal bool SetReturnAdditionalPreviews( UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.U1 )] bool bReturnAdditionalPreviews ) + { + return _SetReturnAdditionalPreviews( Self, handle, bReturnAdditionalPreviews ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetReturnTotalOnly( IntPtr self, UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.U1 )] bool bReturnTotalOnly ); + private FSetReturnTotalOnly _SetReturnTotalOnly; + + #endregion + internal bool SetReturnTotalOnly( UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.U1 )] bool bReturnTotalOnly ) + { + return _SetReturnTotalOnly( Self, handle, bReturnTotalOnly ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetReturnPlaytimeStats( IntPtr self, UGCQueryHandle_t handle, uint unDays ); + private FSetReturnPlaytimeStats _SetReturnPlaytimeStats; + + #endregion + internal bool SetReturnPlaytimeStats( UGCQueryHandle_t handle, uint unDays ) + { + return _SetReturnPlaytimeStats( Self, handle, unDays ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetLanguage( IntPtr self, UGCQueryHandle_t handle, string pchLanguage ); + private FSetLanguage _SetLanguage; + + #endregion + internal bool SetLanguage( UGCQueryHandle_t handle, string pchLanguage ) + { + return _SetLanguage( Self, handle, pchLanguage ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetAllowCachedResponse( IntPtr self, UGCQueryHandle_t handle, uint unMaxAgeSeconds ); + private FSetAllowCachedResponse _SetAllowCachedResponse; + + #endregion + internal bool SetAllowCachedResponse( UGCQueryHandle_t handle, uint unMaxAgeSeconds ) + { + return _SetAllowCachedResponse( Self, handle, unMaxAgeSeconds ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetCloudFileNameFilter( IntPtr self, UGCQueryHandle_t handle, string pMatchCloudFileName ); + private FSetCloudFileNameFilter _SetCloudFileNameFilter; + + #endregion + internal bool SetCloudFileNameFilter( UGCQueryHandle_t handle, string pMatchCloudFileName ) + { + return _SetCloudFileNameFilter( Self, handle, pMatchCloudFileName ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetMatchAnyTag( IntPtr self, UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.U1 )] bool bMatchAnyTag ); + private FSetMatchAnyTag _SetMatchAnyTag; + + #endregion + internal bool SetMatchAnyTag( UGCQueryHandle_t handle, [MarshalAs( UnmanagedType.U1 )] bool bMatchAnyTag ) + { + return _SetMatchAnyTag( Self, handle, bMatchAnyTag ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetSearchText( IntPtr self, UGCQueryHandle_t handle, string pSearchText ); + private FSetSearchText _SetSearchText; + + #endregion + internal bool SetSearchText( UGCQueryHandle_t handle, string pSearchText ) + { + return _SetSearchText( Self, handle, pSearchText ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetRankedByTrendDays( IntPtr self, UGCQueryHandle_t handle, uint unDays ); + private FSetRankedByTrendDays _SetRankedByTrendDays; + + #endregion + internal bool SetRankedByTrendDays( UGCQueryHandle_t handle, uint unDays ) + { + return _SetRankedByTrendDays( Self, handle, unDays ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FAddRequiredKeyValueTag( IntPtr self, UGCQueryHandle_t handle, string pKey, string pValue ); + private FAddRequiredKeyValueTag _AddRequiredKeyValueTag; + + #endregion + internal bool AddRequiredKeyValueTag( UGCQueryHandle_t handle, string pKey, string pValue ) + { + return _AddRequiredKeyValueTag( Self, handle, pKey, pValue ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate SteamAPICall_t FRequestUGCDetails( IntPtr self, PublishedFileId nPublishedFileID, uint unMaxAgeSeconds ); + private FRequestUGCDetails _RequestUGCDetails; + + #endregion + internal async Task RequestUGCDetails( PublishedFileId nPublishedFileID, uint unMaxAgeSeconds ) + { + return await (new Result( _RequestUGCDetails( Self, nPublishedFileID, unMaxAgeSeconds ) )).GetResult(); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate SteamAPICall_t FCreateItem( IntPtr self, AppId_t nConsumerAppId, WorkshopFileType eFileType ); + private FCreateItem _CreateItem; + + #endregion + internal async Task CreateItem( AppId_t nConsumerAppId, WorkshopFileType eFileType ) + { + return await (new Result( _CreateItem( Self, nConsumerAppId, eFileType ) )).GetResult(); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate UGCUpdateHandle_t FStartItemUpdate( IntPtr self, AppId_t nConsumerAppId, PublishedFileId nPublishedFileID ); + private FStartItemUpdate _StartItemUpdate; + + #endregion + internal UGCUpdateHandle_t StartItemUpdate( AppId_t nConsumerAppId, PublishedFileId nPublishedFileID ) + { + return _StartItemUpdate( Self, nConsumerAppId, nPublishedFileID ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetItemTitle( IntPtr self, UGCUpdateHandle_t handle, string pchTitle ); + private FSetItemTitle _SetItemTitle; + + #endregion + internal bool SetItemTitle( UGCUpdateHandle_t handle, string pchTitle ) + { + return _SetItemTitle( Self, handle, pchTitle ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetItemDescription( IntPtr self, UGCUpdateHandle_t handle, string pchDescription ); + private FSetItemDescription _SetItemDescription; + + #endregion + internal bool SetItemDescription( UGCUpdateHandle_t handle, string pchDescription ) + { + return _SetItemDescription( Self, handle, pchDescription ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetItemUpdateLanguage( IntPtr self, UGCUpdateHandle_t handle, string pchLanguage ); + private FSetItemUpdateLanguage _SetItemUpdateLanguage; + + #endregion + internal bool SetItemUpdateLanguage( UGCUpdateHandle_t handle, string pchLanguage ) + { + return _SetItemUpdateLanguage( Self, handle, pchLanguage ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetItemMetadata( IntPtr self, UGCUpdateHandle_t handle, string pchMetaData ); + private FSetItemMetadata _SetItemMetadata; + + #endregion + internal bool SetItemMetadata( UGCUpdateHandle_t handle, string pchMetaData ) + { + return _SetItemMetadata( Self, handle, pchMetaData ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetItemVisibility( IntPtr self, UGCUpdateHandle_t handle, RemoteStoragePublishedFileVisibility eVisibility ); + private FSetItemVisibility _SetItemVisibility; + + #endregion + internal bool SetItemVisibility( UGCUpdateHandle_t handle, RemoteStoragePublishedFileVisibility eVisibility ) + { + return _SetItemVisibility( Self, handle, eVisibility ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetItemTags( IntPtr self, UGCUpdateHandle_t updateHandle, ref SteamParamStringArray_t pTags ); + private FSetItemTags _SetItemTags; + + #endregion + internal bool SetItemTags( UGCUpdateHandle_t updateHandle, ref SteamParamStringArray_t pTags ) + { + return _SetItemTags( Self, updateHandle, ref pTags ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetItemContent( IntPtr self, UGCUpdateHandle_t handle, string pszContentFolder ); + private FSetItemContent _SetItemContent; + + #endregion + internal bool SetItemContent( UGCUpdateHandle_t handle, string pszContentFolder ) + { + return _SetItemContent( Self, handle, pszContentFolder ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetItemPreview( IntPtr self, UGCUpdateHandle_t handle, string pszPreviewFile ); + private FSetItemPreview _SetItemPreview; + + #endregion + internal bool SetItemPreview( UGCUpdateHandle_t handle, string pszPreviewFile ) + { + return _SetItemPreview( Self, handle, pszPreviewFile ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FSetAllowLegacyUpload( IntPtr self, UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.U1 )] bool bAllowLegacyUpload ); + private FSetAllowLegacyUpload _SetAllowLegacyUpload; + + #endregion + internal bool SetAllowLegacyUpload( UGCUpdateHandle_t handle, [MarshalAs( UnmanagedType.U1 )] bool bAllowLegacyUpload ) + { + return _SetAllowLegacyUpload( Self, handle, bAllowLegacyUpload ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FRemoveItemKeyValueTags( IntPtr self, UGCUpdateHandle_t handle, string pchKey ); + private FRemoveItemKeyValueTags _RemoveItemKeyValueTags; + + #endregion + internal bool RemoveItemKeyValueTags( UGCUpdateHandle_t handle, string pchKey ) + { + return _RemoveItemKeyValueTags( Self, handle, pchKey ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FAddItemKeyValueTag( IntPtr self, UGCUpdateHandle_t handle, string pchKey, string pchValue ); + private FAddItemKeyValueTag _AddItemKeyValueTag; + + #endregion + internal bool AddItemKeyValueTag( UGCUpdateHandle_t handle, string pchKey, string pchValue ) + { + return _AddItemKeyValueTag( Self, handle, pchKey, pchValue ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FAddItemPreviewFile( IntPtr self, UGCUpdateHandle_t handle, string pszPreviewFile, ItemPreviewType type ); + private FAddItemPreviewFile _AddItemPreviewFile; + + #endregion + internal bool AddItemPreviewFile( UGCUpdateHandle_t handle, string pszPreviewFile, ItemPreviewType type ) + { + return _AddItemPreviewFile( Self, handle, pszPreviewFile, type ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FAddItemPreviewVideo( IntPtr self, UGCUpdateHandle_t handle, string pszVideoID ); + private FAddItemPreviewVideo _AddItemPreviewVideo; + + #endregion + internal bool AddItemPreviewVideo( UGCUpdateHandle_t handle, string pszVideoID ) + { + return _AddItemPreviewVideo( Self, handle, pszVideoID ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FUpdateItemPreviewFile( IntPtr self, UGCUpdateHandle_t handle, uint index, string pszPreviewFile ); + private FUpdateItemPreviewFile _UpdateItemPreviewFile; + + #endregion + internal bool UpdateItemPreviewFile( UGCUpdateHandle_t handle, uint index, string pszPreviewFile ) + { + return _UpdateItemPreviewFile( Self, handle, index, pszPreviewFile ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FUpdateItemPreviewVideo( IntPtr self, UGCUpdateHandle_t handle, uint index, string pszVideoID ); + private FUpdateItemPreviewVideo _UpdateItemPreviewVideo; + + #endregion + internal bool UpdateItemPreviewVideo( UGCUpdateHandle_t handle, uint index, string pszVideoID ) + { + return _UpdateItemPreviewVideo( Self, handle, index, pszVideoID ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FRemoveItemPreview( IntPtr self, UGCUpdateHandle_t handle, uint index ); + private FRemoveItemPreview _RemoveItemPreview; + + #endregion + internal bool RemoveItemPreview( UGCUpdateHandle_t handle, uint index ) + { + return _RemoveItemPreview( Self, handle, index ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate SteamAPICall_t FSubmitItemUpdate( IntPtr self, UGCUpdateHandle_t handle, string pchChangeNote ); + private FSubmitItemUpdate _SubmitItemUpdate; + + #endregion + internal async Task SubmitItemUpdate( UGCUpdateHandle_t handle, string pchChangeNote ) + { + return await (new Result( _SubmitItemUpdate( Self, handle, pchChangeNote ) )).GetResult(); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate ItemUpdateStatus FGetItemUpdateProgress( IntPtr self, UGCUpdateHandle_t handle, ref ulong punBytesProcessed, ref ulong punBytesTotal ); + private FGetItemUpdateProgress _GetItemUpdateProgress; + + #endregion + internal ItemUpdateStatus GetItemUpdateProgress( UGCUpdateHandle_t handle, ref ulong punBytesProcessed, ref ulong punBytesTotal ) + { + return _GetItemUpdateProgress( Self, handle, ref punBytesProcessed, ref punBytesTotal ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate SteamAPICall_t FSetUserItemVote( IntPtr self, PublishedFileId nPublishedFileID, [MarshalAs( UnmanagedType.U1 )] bool bVoteUp ); + private FSetUserItemVote _SetUserItemVote; + + #endregion + internal async Task SetUserItemVote( PublishedFileId nPublishedFileID, [MarshalAs( UnmanagedType.U1 )] bool bVoteUp ) + { + return await (new Result( _SetUserItemVote( Self, nPublishedFileID, bVoteUp ) )).GetResult(); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate SteamAPICall_t FGetUserItemVote( IntPtr self, PublishedFileId nPublishedFileID ); + private FGetUserItemVote _GetUserItemVote; + + #endregion + internal async Task GetUserItemVote( PublishedFileId nPublishedFileID ) + { + return await (new Result( _GetUserItemVote( Self, nPublishedFileID ) )).GetResult(); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate SteamAPICall_t FAddItemToFavorites( IntPtr self, AppId_t nAppId, PublishedFileId nPublishedFileID ); + private FAddItemToFavorites _AddItemToFavorites; + + #endregion + internal async Task AddItemToFavorites( AppId_t nAppId, PublishedFileId nPublishedFileID ) + { + return await (new Result( _AddItemToFavorites( Self, nAppId, nPublishedFileID ) )).GetResult(); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate SteamAPICall_t FRemoveItemFromFavorites( IntPtr self, AppId_t nAppId, PublishedFileId nPublishedFileID ); + private FRemoveItemFromFavorites _RemoveItemFromFavorites; + + #endregion + internal async Task RemoveItemFromFavorites( AppId_t nAppId, PublishedFileId nPublishedFileID ) + { + return await (new Result( _RemoveItemFromFavorites( Self, nAppId, nPublishedFileID ) )).GetResult(); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate SteamAPICall_t FSubscribeItem( IntPtr self, PublishedFileId nPublishedFileID ); + private FSubscribeItem _SubscribeItem; + + #endregion + internal async Task SubscribeItem( PublishedFileId nPublishedFileID ) + { + return await (new Result( _SubscribeItem( Self, nPublishedFileID ) )).GetResult(); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate SteamAPICall_t FUnsubscribeItem( IntPtr self, PublishedFileId nPublishedFileID ); + private FUnsubscribeItem _UnsubscribeItem; + + #endregion + internal async Task UnsubscribeItem( PublishedFileId nPublishedFileID ) + { + return await (new Result( _UnsubscribeItem( Self, nPublishedFileID ) )).GetResult(); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate uint FGetNumSubscribedItems( IntPtr self ); + private FGetNumSubscribedItems _GetNumSubscribedItems; + + #endregion + internal uint GetNumSubscribedItems() + { + return _GetNumSubscribedItems( Self ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate uint FGetSubscribedItems( IntPtr self, [In,Out] PublishedFileId[] pvecPublishedFileID, uint cMaxEntries ); + private FGetSubscribedItems _GetSubscribedItems; + + #endregion + internal uint GetSubscribedItems( [In,Out] PublishedFileId[] pvecPublishedFileID, uint cMaxEntries ) + { + return _GetSubscribedItems( Self, pvecPublishedFileID, cMaxEntries ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate uint FGetItemState( IntPtr self, PublishedFileId nPublishedFileID ); + private FGetItemState _GetItemState; + + #endregion + internal uint GetItemState( PublishedFileId nPublishedFileID ) + { + return _GetItemState( Self, nPublishedFileID ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FGetItemInstallInfo( IntPtr self, PublishedFileId nPublishedFileID, ref ulong punSizeOnDisk, StringBuilder pchFolder, uint cchFolderSize, ref uint punTimeStamp ); + private FGetItemInstallInfo _GetItemInstallInfo; + + #endregion + internal bool GetItemInstallInfo( PublishedFileId nPublishedFileID, ref ulong punSizeOnDisk, StringBuilder pchFolder, uint cchFolderSize, ref uint punTimeStamp ) + { + return _GetItemInstallInfo( Self, nPublishedFileID, ref punSizeOnDisk, pchFolder, cchFolderSize, ref punTimeStamp ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FGetItemDownloadInfo( IntPtr self, PublishedFileId nPublishedFileID, ref ulong punBytesDownloaded, ref ulong punBytesTotal ); + private FGetItemDownloadInfo _GetItemDownloadInfo; + + #endregion + internal bool GetItemDownloadInfo( PublishedFileId nPublishedFileID, ref ulong punBytesDownloaded, ref ulong punBytesTotal ) + { + return _GetItemDownloadInfo( Self, nPublishedFileID, ref punBytesDownloaded, ref punBytesTotal ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FDownloadItem( IntPtr self, PublishedFileId nPublishedFileID, [MarshalAs( UnmanagedType.U1 )] bool bHighPriority ); + private FDownloadItem _DownloadItem; + + #endregion + internal bool DownloadItem( PublishedFileId nPublishedFileID, [MarshalAs( UnmanagedType.U1 )] bool bHighPriority ) + { + return _DownloadItem( Self, nPublishedFileID, bHighPriority ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + [return: MarshalAs( UnmanagedType.I1 )] + private delegate bool FBInitWorkshopForGameServer( IntPtr self, DepotId_t unWorkshopDepotID, string pszFolder ); + private FBInitWorkshopForGameServer _BInitWorkshopForGameServer; + + #endregion + internal bool BInitWorkshopForGameServer( DepotId_t unWorkshopDepotID, string pszFolder ) + { + return _BInitWorkshopForGameServer( Self, unWorkshopDepotID, pszFolder ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate void FSuspendDownloads( IntPtr self, [MarshalAs( UnmanagedType.U1 )] bool bSuspend ); + private FSuspendDownloads _SuspendDownloads; + + #endregion + internal void SuspendDownloads( [MarshalAs( UnmanagedType.U1 )] bool bSuspend ) + { + _SuspendDownloads( Self, bSuspend ); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate SteamAPICall_t FStartPlaytimeTracking( IntPtr self, [In,Out] PublishedFileId[] pvecPublishedFileID, uint unNumPublishedFileIDs ); + private FStartPlaytimeTracking _StartPlaytimeTracking; + + #endregion + internal async Task StartPlaytimeTracking( [In,Out] PublishedFileId[] pvecPublishedFileID, uint unNumPublishedFileIDs ) + { + return await (new Result( _StartPlaytimeTracking( Self, pvecPublishedFileID, unNumPublishedFileIDs ) )).GetResult(); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate SteamAPICall_t FStopPlaytimeTracking( IntPtr self, [In,Out] PublishedFileId[] pvecPublishedFileID, uint unNumPublishedFileIDs ); + private FStopPlaytimeTracking _StopPlaytimeTracking; + + #endregion + internal async Task StopPlaytimeTracking( [In,Out] PublishedFileId[] pvecPublishedFileID, uint unNumPublishedFileIDs ) + { + return await (new Result( _StopPlaytimeTracking( Self, pvecPublishedFileID, unNumPublishedFileIDs ) )).GetResult(); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate SteamAPICall_t FStopPlaytimeTrackingForAllItems( IntPtr self ); + private FStopPlaytimeTrackingForAllItems _StopPlaytimeTrackingForAllItems; + + #endregion + internal async Task StopPlaytimeTrackingForAllItems() + { + return await (new Result( _StopPlaytimeTrackingForAllItems( Self ) )).GetResult(); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate SteamAPICall_t FAddDependency( IntPtr self, PublishedFileId nParentPublishedFileID, PublishedFileId nChildPublishedFileID ); + private FAddDependency _AddDependency; + + #endregion + internal async Task AddDependency( PublishedFileId nParentPublishedFileID, PublishedFileId nChildPublishedFileID ) + { + return await (new Result( _AddDependency( Self, nParentPublishedFileID, nChildPublishedFileID ) )).GetResult(); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate SteamAPICall_t FRemoveDependency( IntPtr self, PublishedFileId nParentPublishedFileID, PublishedFileId nChildPublishedFileID ); + private FRemoveDependency _RemoveDependency; + + #endregion + internal async Task RemoveDependency( PublishedFileId nParentPublishedFileID, PublishedFileId nChildPublishedFileID ) + { + return await (new Result( _RemoveDependency( Self, nParentPublishedFileID, nChildPublishedFileID ) )).GetResult(); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate SteamAPICall_t FAddAppDependency( IntPtr self, PublishedFileId nPublishedFileID, AppId_t nAppID ); + private FAddAppDependency _AddAppDependency; + + #endregion + internal async Task AddAppDependency( PublishedFileId nPublishedFileID, AppId_t nAppID ) + { + return await (new Result( _AddAppDependency( Self, nPublishedFileID, nAppID ) )).GetResult(); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate SteamAPICall_t FRemoveAppDependency( IntPtr self, PublishedFileId nPublishedFileID, AppId_t nAppID ); + private FRemoveAppDependency _RemoveAppDependency; + + #endregion + internal async Task RemoveAppDependency( PublishedFileId nPublishedFileID, AppId_t nAppID ) + { + return await (new Result( _RemoveAppDependency( Self, nPublishedFileID, nAppID ) )).GetResult(); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate SteamAPICall_t FGetAppDependencies( IntPtr self, PublishedFileId nPublishedFileID ); + private FGetAppDependencies _GetAppDependencies; + + #endregion + internal async Task GetAppDependencies( PublishedFileId nPublishedFileID ) + { + return await (new Result( _GetAppDependencies( Self, nPublishedFileID ) )).GetResult(); + } + + #region FunctionMeta + [UnmanagedFunctionPointer( CallingConvention.ThisCall )] + private delegate SteamAPICall_t FDeleteItem( IntPtr self, PublishedFileId nPublishedFileID ); + private FDeleteItem _DeleteItem; + + #endregion + internal async Task DeleteItem( PublishedFileId nPublishedFileID ) + { + return await (new Result( _DeleteItem( Self, nPublishedFileID ) )).GetResult(); + } + + } +} diff --git a/Generator/CodeParser/ParseClasses.cs b/Generator/CodeParser/ParseClasses.cs index ac14be1..309c829 100644 --- a/Generator/CodeParser/ParseClasses.cs +++ b/Generator/CodeParser/ParseClasses.cs @@ -99,7 +99,7 @@ public void ProcessClass( string fulldef, string classname, string inner ) var args = f.Groups[3].Value.Trim(); // Console.WriteLine( $"Function: {funcName} returns {returnType} with args {args}" ); - + if ( funcName == "RequestUGCDetails" ) lastCallResult = "SteamUGCRequestUGCDetailsResult_t"; if ( funcName == "DownloadClanActivityCounts" ) lastCallResult = "DownloadClanActivityCountsResult_t"; if ( funcName.Contains( ' ' ) || funcName.Contains( '*' ) ) @@ -136,6 +136,7 @@ public string RemoveAnnotations( string str ) str = Regex.Replace( str, @"STEAM_OUT_STRUCT\((.+?)\) ", "" ); str = Regex.Replace( str, @"STEAM_OUT_ARRAY_COUNT\((.+?)\)", "" ); str = Regex.Replace( str, @"STEAM_ARRAY_COUNT_D\((.+?)\)", "" ); + str = Regex.Replace( str, @"STEAM_OUT_STRING_COUNT\((.+?)\)", "" ); diff --git a/Generator/CodeWriter/CodeWriter.cs b/Generator/CodeWriter/CodeWriter.cs index ef982ad..9ebb8b6 100644 --- a/Generator/CodeWriter/CodeWriter.cs +++ b/Generator/CodeWriter/CodeWriter.cs @@ -68,6 +68,7 @@ public void ToFolder( string folder ) GenerateVTableClass( "ISteamGameServer", $"{folder}../Generated/Interfaces/ISteamGameServer.cs" ); GenerateVTableClass( "ISteamScreenshots", $"{folder}../Generated/Interfaces/ISteamScreenshots.cs" ); GenerateVTableClass( "ISteamUserStats", $"{folder}../Generated/Interfaces/ISteamUserStats.cs" ); + GenerateVTableClass( "ISteamUGC", $"{folder}../Generated/Interfaces/ISteamUGC.cs" ); } } From e9f5898b6c1a37ab02b53e97a6a78d9711dc9dd0 Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Wed, 17 Apr 2019 16:41:06 +0100 Subject: [PATCH 13/22] Basic Ugc Querying --- .../Facepunch.Steamworks.Test.csproj | 1 + Facepunch.Steamworks.Test/UgcTest.cs | 46 ++++ Facepunch.Steamworks.Test/UtilsTest.cs | 2 +- .../Generated/Interfaces/ISteamUGC.cs | 10 +- Facepunch.Steamworks/ServerList/Base.cs | 2 +- Facepunch.Steamworks/SteamClient.cs | 7 + Facepunch.Steamworks/SteamUgc.cs | 32 +++ Facepunch.Steamworks/SteamUtils.cs | 5 - Facepunch.Steamworks/Structs/Friend.cs | 2 +- Facepunch.Steamworks/Structs/UgcQuery.cs | 241 ++++++++++++++++++ Generator/CodeWriter/ClassVTable.cs | 6 + Generator/CodeWriter/Types/BaseType.cs | 2 +- 12 files changed, 342 insertions(+), 14 deletions(-) create mode 100644 Facepunch.Steamworks.Test/UgcTest.cs create mode 100644 Facepunch.Steamworks/SteamUgc.cs create mode 100644 Facepunch.Steamworks/Structs/UgcQuery.cs diff --git a/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj b/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj index 6a8400f..efda689 100644 --- a/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj +++ b/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj @@ -91,6 +91,7 @@ + diff --git a/Facepunch.Steamworks.Test/UgcTest.cs b/Facepunch.Steamworks.Test/UgcTest.cs new file mode 100644 index 0000000..b8fffc2 --- /dev/null +++ b/Facepunch.Steamworks.Test/UgcTest.cs @@ -0,0 +1,46 @@ +using System; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Steamworks.Data; + +namespace Steamworks +{ + [TestClass] + [DeploymentItem( "steam_api64.dll" )] + public class UgcTests + { + [TestMethod] + public async Task QueryAll() + { + var q = UgcQuery.All(); + + var result = await q.GetPageAsync( 1 ); + Assert.IsNotNull( result ); + + Console.WriteLine( $"ResultCount: {result?.ResultCount}" ); + Console.WriteLine( $"TotalCount: {result?.TotalCount}" ); + } + + [TestMethod] + public async Task QueryAllFromFriends() + { + var q = UgcQuery.All() + .CreatedByFriends(); + + var result = await q.GetPageAsync( 1 ); + Assert.IsNotNull( result ); + + Console.WriteLine( $"ResultCount: {result?.ResultCount}" ); + Console.WriteLine( $"TotalCount: {result?.TotalCount}" ); + + foreach ( var entry in result.Value.Entries ) + { + Console.WriteLine( $" {entry.Title}" ); + } + } + } + +} diff --git a/Facepunch.Steamworks.Test/UtilsTest.cs b/Facepunch.Steamworks.Test/UtilsTest.cs index ecc1778..1d0fabd 100644 --- a/Facepunch.Steamworks.Test/UtilsTest.cs +++ b/Facepunch.Steamworks.Test/UtilsTest.cs @@ -63,7 +63,7 @@ public void CurrentBatteryPower() [TestMethod] public void AppId() { - var cnt = SteamUtils.AppId; + var cnt = SteamClient.AppId; Assert.IsTrue( cnt.Value > 0 ); diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamUGC.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamUGC.cs index 88e46d9..f9daf7d 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamUGC.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamUGC.cs @@ -18,8 +18,8 @@ public ISteamUGC( bool server = false ) : base( server ) public override void InitInternals() { _CreateQueryUserUGCRequest = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 0) ); - _CreateQueryAllUGCRequest1 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); - _CreateQueryAllUGCRequest2 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); + _CreateQueryAllUGCRequest1 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 16) ); + _CreateQueryAllUGCRequest2 = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 8) ); _CreateQueryUGCDetailsRequest = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 24) ); _SendQueryUGCRequest = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 32) ); _GetQueryUGCResult = Marshal.GetDelegateForFunctionPointer( Marshal.ReadIntPtr( VTable, 40) ); @@ -153,13 +153,13 @@ internal UGCQueryHandle_t CreateQueryUGCDetailsRequest( [In,Out] PublishedFileId #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool FGetQueryUGCResult( IntPtr self, UGCQueryHandle_t handle, uint index, [In,Out] SteamUGCDetails_t[] pDetails ); + private delegate bool FGetQueryUGCResult( IntPtr self, UGCQueryHandle_t handle, uint index, ref SteamUGCDetails_t pDetails ); private FGetQueryUGCResult _GetQueryUGCResult; #endregion - internal bool GetQueryUGCResult( UGCQueryHandle_t handle, uint index, [In,Out] SteamUGCDetails_t[] pDetails ) + internal bool GetQueryUGCResult( UGCQueryHandle_t handle, uint index, ref SteamUGCDetails_t pDetails ) { - return _GetQueryUGCResult( Self, handle, index, pDetails ); + return _GetQueryUGCResult( Self, handle, index, ref pDetails ); } #region FunctionMeta diff --git a/Facepunch.Steamworks/ServerList/Base.cs b/Facepunch.Steamworks/ServerList/Base.cs index 153f3b2..fff68ae 100644 --- a/Facepunch.Steamworks/ServerList/Base.cs +++ b/Facepunch.Steamworks/ServerList/Base.cs @@ -56,7 +56,7 @@ internal static ISteamMatchmakingServers Internal public Base() { - AppId = SteamUtils.AppId; // Default AppId is this + AppId = SteamClient.AppId; // Default AppId is this } ///

      diff --git a/Facepunch.Steamworks/SteamClient.cs b/Facepunch.Steamworks/SteamClient.cs index a0150b5..5ea8790 100644 --- a/Facepunch.Steamworks/SteamClient.cs +++ b/Facepunch.Steamworks/SteamClient.cs @@ -25,6 +25,8 @@ public static void Init( uint appid ) throw new System.Exception( "SteamApi_Init returned false. Steam isn't running, couldn't find Steam, AppId is ureleased, Don't own AppId." ); } + AppId = appid; + initialized = true; SteamApps.InstallEvents(); @@ -108,5 +110,10 @@ internal static void UnregisterCallback( IntPtr intPtr ) /// gets the status of the current user /// public static FriendState State => SteamFriends.Internal.GetPersonaState(); + + /// + /// returns the appID of the current process + /// + public static AppId AppId { get; internal set; } } } \ No newline at end of file diff --git a/Facepunch.Steamworks/SteamUgc.cs b/Facepunch.Steamworks/SteamUgc.cs new file mode 100644 index 0000000..7ea00ce --- /dev/null +++ b/Facepunch.Steamworks/SteamUgc.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using Steamworks.Data; + +namespace Steamworks +{ + /// + /// Functions for accessing and manipulating Steam user information. + /// This is also where the APIs for Steam Voice are exposed. + /// + public static class SteamUGC + { + static ISteamUGC _internal; + internal static ISteamUGC Internal + { + get + { + if ( _internal == null ) + { + _internal = new ISteamUGC(); + } + + return _internal; + } + } + + } +} \ No newline at end of file diff --git a/Facepunch.Steamworks/SteamUtils.cs b/Facepunch.Steamworks/SteamUtils.cs index 2c4dc12..30a079d 100644 --- a/Facepunch.Steamworks/SteamUtils.cs +++ b/Facepunch.Steamworks/SteamUtils.cs @@ -121,11 +121,6 @@ public static bool GetImageSize( int image, out uint width, out uint height ) /// public static float CurrentBatteryPower => Math.Min( Internal.GetCurrentBatteryPower() / 100, 1.0f ); - /// - /// returns the appID of the current process - /// - public static AppId AppId => Internal.GetAppID(); - static NotificationPosition overlayNotificationPosition = NotificationPosition.BottomRight; /// diff --git a/Facepunch.Steamworks/Structs/Friend.cs b/Facepunch.Steamworks/Structs/Friend.cs index c3cf09f..eeaf5ef 100644 --- a/Facepunch.Steamworks/Structs/Friend.cs +++ b/Facepunch.Steamworks/Structs/Friend.cs @@ -40,7 +40,7 @@ public override string ToString() /// /// Return true if this user is playing the game we're running /// - public bool IsPlayingThisGame => GameInfo?.GameID == SteamUtils.AppId; + public bool IsPlayingThisGame => GameInfo?.GameID == SteamClient.AppId; /// /// Returns true if this friend is online diff --git a/Facepunch.Steamworks/Structs/UgcQuery.cs b/Facepunch.Steamworks/Structs/UgcQuery.cs new file mode 100644 index 0000000..7d9932c --- /dev/null +++ b/Facepunch.Steamworks/Structs/UgcQuery.cs @@ -0,0 +1,241 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Steamworks.Data +{ + public struct UgcQuery + { + UGCMatchingUGCType matching; + + UserUGCList userGc; + UGCQuery queryType; + + AppId consumerApp; + AppId creatorApp; + + List requiredTags; + bool? matchAnyTag; + + List excludedTags; + + Dictionary requiredKv; + + bool? WantsReturnOnlyIDs; + bool? WantsReturnKeyValueTags; + bool? WantsReturnLongDescription; + bool? WantsReturnMetadata; + bool? WantsReturnChildren; + bool? WantsReturnAdditionalPreviews; + bool? WantsReturnTotalOnly; + bool? WantsReturnPlaytimeStats; + + string searchText; + string language; + int? trendDays; + int? maxCacheAge; + + public static UgcQuery Items() => new UgcQuery { matching = UGCMatchingUGCType.Items }; + public static UgcQuery ItemsMtx() => new UgcQuery { matching = UGCMatchingUGCType.Items_Mtx }; + public static UgcQuery ItemsReadyToUse() => new UgcQuery { matching = UGCMatchingUGCType.Items_ReadyToUse }; + public static UgcQuery Collections() => new UgcQuery { matching = UGCMatchingUGCType.Collections }; + public static UgcQuery Artwork() => new UgcQuery { matching = UGCMatchingUGCType.Artwork }; + public static UgcQuery Videos() => new UgcQuery { matching = UGCMatchingUGCType.Videos }; + public static UgcQuery Screenshots() => new UgcQuery { matching = UGCMatchingUGCType.Screenshots }; + public static UgcQuery AllGuides() => new UgcQuery { matching = UGCMatchingUGCType.AllGuides }; + public static UgcQuery WebGuides() => new UgcQuery { matching = UGCMatchingUGCType.WebGuides }; + public static UgcQuery IntegratedGuides() => new UgcQuery { matching = UGCMatchingUGCType.IntegratedGuides }; + public static UgcQuery UsableInGame() => new UgcQuery { matching = UGCMatchingUGCType.UsableInGame }; + public static UgcQuery ControllerBindings() => new UgcQuery { matching = UGCMatchingUGCType.ControllerBindings }; + public static UgcQuery GameManagedItems() => new UgcQuery { matching = UGCMatchingUGCType.GameManagedItems }; + public static UgcQuery All() => new UgcQuery { matching = UGCMatchingUGCType.All }; + + public UgcQuery RankedByVote() { queryType = UGCQuery.RankedByVote; return this; } + public UgcQuery RankedByPublicationDate() { queryType = UGCQuery.RankedByPublicationDate; return this; } + public UgcQuery RankedByAcceptanceDate() { queryType = UGCQuery.AcceptedForGameRankedByAcceptanceDate; return this; } + public UgcQuery RankedByTrend() { queryType = UGCQuery.RankedByTrend; return this; } + public UgcQuery FavoritedByFriends() { queryType = UGCQuery.FavoritedByFriendsRankedByPublicationDate; return this; } + public UgcQuery CreatedByFriends() { queryType = UGCQuery.CreatedByFriendsRankedByPublicationDate; return this; } + public UgcQuery RankedByNumTimesReported() { queryType = UGCQuery.RankedByNumTimesReported; return this; } + public UgcQuery CreatedByFollowedUsers() { queryType = UGCQuery.CreatedByFollowedUsersRankedByPublicationDate; return this; } + public UgcQuery NotYetRated() { queryType = UGCQuery.NotYetRated; return this; } + public UgcQuery RankedByTotalVotesAsc() { queryType = UGCQuery.RankedByTotalVotesAsc; return this; } + public UgcQuery RankedByVotesUp() { queryType = UGCQuery.RankedByVotesUp; return this; } + public UgcQuery RankedByTextSearch() { queryType = UGCQuery.RankedByTextSearch; return this; } + public UgcQuery RankedByTotalUniqueSubscriptions() { queryType = UGCQuery.RankedByTotalUniqueSubscriptions; return this; } + public UgcQuery RankedByPlaytimeTrend() { queryType = UGCQuery.RankedByPlaytimeTrend; return this; } + public UgcQuery RankedByTotalPlaytime() { queryType = UGCQuery.RankedByTotalPlaytime; return this; } + public UgcQuery RankedByAveragePlaytimeTrend() { queryType = UGCQuery.RankedByAveragePlaytimeTrend; return this; } + public UgcQuery RankedByLifetimeAveragePlaytime() { queryType = UGCQuery.RankedByLifetimeAveragePlaytime; return this; } + public UgcQuery RankedByPlaytimeSessionsTrend() { queryType = UGCQuery.RankedByPlaytimeSessionsTrend; return this; } + public UgcQuery RankedByLifetimePlaytimeSessions() { queryType = UGCQuery.RankedByLifetimePlaytimeSessions; return this; } + + public UgcQuery ReturnOnlyIDs( bool b) { WantsReturnOnlyIDs = b; return this; } + public UgcQuery ReturnKeyValueTag( bool b ) { WantsReturnKeyValueTags = b; return this; } + public UgcQuery ReturnLongDescription( bool b ) { WantsReturnLongDescription = b; return this; } + public UgcQuery ReturnMetadata( bool b ) { WantsReturnMetadata = b; return this; } + public UgcQuery ReturnChildren( bool b ) { WantsReturnChildren = b; return this; } + public UgcQuery ReturnAdditionalPreviews( bool b ) { WantsReturnAdditionalPreviews = b; return this; } + public UgcQuery ReturnTotalOnly( bool b ) { WantsReturnTotalOnly = b; return this; } + public UgcQuery ReturnPlaytimeStats( bool b ) { WantsReturnPlaytimeStats = b; return this; } + public UgcQuery AllowCachedResponse( int maxSecondsAge ) { maxCacheAge = maxSecondsAge; return this; } + + public UgcQuery InLanguage( string lang ) { language = lang; return this; } + public UgcQuery MatchAnyTag( bool b ) { matchAnyTag = b; return this; } + + public UgcQuery WithTag( string tag ) + { + if ( requiredTags == null ) requiredTags = new List(); + requiredTags.Add( tag ); + return this; + } + + public UgcQuery WithoutTag( string tag ) + { + if ( excludedTags == null ) excludedTags = new List(); + excludedTags.Add( tag ); + return this; + } + + public async Task GetPageAsync( int page ) + { + if ( page <= 0 ) throw new System.Exception( "page should be > 0" ); + + if ( consumerApp == 0 ) consumerApp = SteamClient.AppId; + if ( creatorApp == 0 ) creatorApp = consumerApp; + + UGCQueryHandle_t handle; + + handle = SteamUGC.Internal.CreateQueryAllUGCRequest1( queryType, matching, creatorApp.Value, consumerApp.Value, (uint) page ); + + // Apply stored constraints + { + if ( requiredTags != null ) + { + foreach ( var tag in requiredTags ) + SteamUGC.Internal.AddRequiredTag( handle, tag ); + } + + if ( excludedTags != null ) + { + foreach ( var tag in excludedTags ) + SteamUGC.Internal.AddExcludedTag( handle, tag ); + } + + if ( requiredKv != null ) + { + foreach ( var tag in requiredKv ) + SteamUGC.Internal.AddRequiredKeyValueTag( handle, tag.Key, tag.Value ); + } + + // + // TODO - add more + // + } + + var result = await SteamUGC.Internal.SendQueryUGCRequest( handle ); + if ( !result.HasValue ) + return null; + + if ( result.Value.Result != Result.OK ) + return null; + + return new UgcQueryPage + { + Handle = result.Value.Handle, + ResultCount = (int) result.Value.NumResultsReturned, + TotalCount = (int)result.Value.TotalMatchingResults, + CachedData = result.Value.CachedData + }; + } + + } + + public struct UgcQueryPage : System.IDisposable + { + internal UGCQueryHandle_t Handle; + + public int ResultCount; + public int TotalCount; + + public bool CachedData; + + public IEnumerable Entries + { + get + { + var details = default( SteamUGCDetails_t ); + for ( uint i=0; i< ResultCount; i++ ) + { + if ( SteamUGC.Internal.GetQueryUGCResult( Handle, i, ref details ) ) + { + yield return UgcDetails.From( details, Handle ); + } + } + } + } + + + public void Dispose() + { + if ( Handle > 0 ) + { + SteamUGC.Internal.ReleaseQueryUGCRequest( Handle ); + Handle = 0; + } + } + } + + public struct UgcDetails + { + public PublishedFileId Id; + + public string Title; + public string Description; + + + // + // TODO; + // + internal Result Result; // m_eResult enum EResult + internal WorkshopFileType FileType; // m_eFileType enum EWorkshopFileType + internal uint CreatorAppID; // m_nCreatorAppID AppId_t + internal uint ConsumerAppID; // m_nConsumerAppID AppId_t + + internal ulong SteamIDOwner; // m_ulSteamIDOwner uint64 + internal uint TimeCreated; // m_rtimeCreated uint32 + internal uint TimeUpdated; // m_rtimeUpdated uint32 + internal uint TimeAddedToUserList; // m_rtimeAddedToUserList uint32 + internal RemoteStoragePublishedFileVisibility Visibility; // m_eVisibility enum ERemoteStoragePublishedFileVisibility + internal bool Banned; // m_bBanned _Bool + internal bool AcceptedForUse; // m_bAcceptedForUse _Bool + internal bool TagsTruncated; // m_bTagsTruncated _Bool + internal string Tags; // m_rgchTags char [1025] + internal ulong File; // m_hFile UGCHandle_t + internal ulong PreviewFile; // m_hPreviewFile UGCHandle_t + internal string PchFileName; // m_pchFileName char [260] + internal int FileSize; // m_nFileSize int32 + internal int PreviewFileSize; // m_nPreviewFileSize int32 + internal string URL; // m_rgchURL char [256] + internal uint VotesUp; // m_unVotesUp uint32 + internal uint VotesDown; // m_unVotesDown uint32 + internal float Score; // m_flScore float + internal uint NumChildren; // m_unNumChildren uint32 + + internal static UgcDetails From( SteamUGCDetails_t details, UGCQueryHandle_t handle ) + { + var d = new UgcDetails + { + Id = details.PublishedFileId, + FileType = details.FileType, + + Title = details.Title, + Description = details.Description, + + }; + + return d; + } + } +} \ No newline at end of file diff --git a/Generator/CodeWriter/ClassVTable.cs b/Generator/CodeWriter/ClassVTable.cs index 7dc30fd..9d49d4a 100644 --- a/Generator/CodeWriter/ClassVTable.cs +++ b/Generator/CodeWriter/ClassVTable.cs @@ -80,6 +80,12 @@ void WriteFunctionPointerReader( CodeParser.Class clss ) Swap( clss, "GetGlobalStatHistory1", "GetGlobalStatHistory2", locations ); } + if ( clss.Name == "ISteamUGC" ) + { + Swap( clss, "CreateQueryAllUGCRequest1", "CreateQueryAllUGCRequest2", locations ); + } + + StartBlock( $"public override void InitInternals()" ); { for (int i=0; i< clss.Functions.Count; i++ ) diff --git a/Generator/CodeWriter/Types/BaseType.cs b/Generator/CodeWriter/Types/BaseType.cs index 61db8d0..54b64bb 100644 --- a/Generator/CodeWriter/Types/BaseType.cs +++ b/Generator/CodeWriter/Types/BaseType.cs @@ -64,7 +64,7 @@ public virtual bool IsVector if ( VarName == "psteamIDClans" ) return true; if ( VarName == "pScoreDetails" ) return true; if ( VarName == "prgUsers" ) return true; - if ( VarName == "pDetails" ) return true; + if ( VarName == "pDetails" && Func == "GetDownloadedLeaderboardEntry" ) return true; if ( VarName == "pData" && NativeType.EndsWith( "*" ) && Func.StartsWith( "GetGlobalStatHistory" ) ) return true; if ( NativeType.EndsWith( "**" ) ) return true; From 0e4946e5507196ba3de224f8bb6e1c230be08974 Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Fri, 26 Apr 2019 12:22:27 +0100 Subject: [PATCH 14/22] Query tags --- Facepunch.Steamworks.Test/UgcTest.cs | 22 ++++++++++++ Facepunch.Steamworks/Structs/UgcQuery.cs | 45 ++++++++++++++++++------ 2 files changed, 57 insertions(+), 10 deletions(-) diff --git a/Facepunch.Steamworks.Test/UgcTest.cs b/Facepunch.Steamworks.Test/UgcTest.cs index b8fffc2..e5e55e0 100644 --- a/Facepunch.Steamworks.Test/UgcTest.cs +++ b/Facepunch.Steamworks.Test/UgcTest.cs @@ -24,6 +24,28 @@ public async Task QueryAll() Console.WriteLine( $"TotalCount: {result?.TotalCount}" ); } + [TestMethod] + public async Task QueryWithTags() + { + var q = UgcQuery.All() + .WithTag( "Fun" ) + .WithTag( "Movie" ) + .MatchAllTags(); + + var result = await q.GetPageAsync( 1 ); + Assert.IsNotNull( result ); + + Console.WriteLine( $"ResultCount: {result?.ResultCount}" ); + Console.WriteLine( $"TotalCount: {result?.TotalCount}" ); + + foreach ( var entry in result.Value.Entries ) + { + Assert.IsTrue( entry.HasTag( "Fun" ) ); + Assert.IsTrue( entry.HasTag( "Movie" ) ); + + } + } + [TestMethod] public async Task QueryAllFromFriends() { diff --git a/Facepunch.Steamworks/Structs/UgcQuery.cs b/Facepunch.Steamworks/Structs/UgcQuery.cs index 7d9932c..337bb37 100644 --- a/Facepunch.Steamworks/Structs/UgcQuery.cs +++ b/Facepunch.Steamworks/Structs/UgcQuery.cs @@ -71,18 +71,27 @@ public struct UgcQuery public UgcQuery RankedByPlaytimeSessionsTrend() { queryType = UGCQuery.RankedByPlaytimeSessionsTrend; return this; } public UgcQuery RankedByLifetimePlaytimeSessions() { queryType = UGCQuery.RankedByLifetimePlaytimeSessions; return this; } - public UgcQuery ReturnOnlyIDs( bool b) { WantsReturnOnlyIDs = b; return this; } - public UgcQuery ReturnKeyValueTag( bool b ) { WantsReturnKeyValueTags = b; return this; } - public UgcQuery ReturnLongDescription( bool b ) { WantsReturnLongDescription = b; return this; } - public UgcQuery ReturnMetadata( bool b ) { WantsReturnMetadata = b; return this; } - public UgcQuery ReturnChildren( bool b ) { WantsReturnChildren = b; return this; } - public UgcQuery ReturnAdditionalPreviews( bool b ) { WantsReturnAdditionalPreviews = b; return this; } - public UgcQuery ReturnTotalOnly( bool b ) { WantsReturnTotalOnly = b; return this; } - public UgcQuery ReturnPlaytimeStats( bool b ) { WantsReturnPlaytimeStats = b; return this; } + public UgcQuery WithOnlyIDs( bool b) { WantsReturnOnlyIDs = b; return this; } + public UgcQuery WithKeyValueTag( bool b ) { WantsReturnKeyValueTags = b; return this; } + public UgcQuery WithLongDescription( bool b ) { WantsReturnLongDescription = b; return this; } + public UgcQuery WithMetadata( bool b ) { WantsReturnMetadata = b; return this; } + public UgcQuery WithChildren( bool b ) { WantsReturnChildren = b; return this; } + public UgcQuery WithAdditionalPreviews( bool b ) { WantsReturnAdditionalPreviews = b; return this; } + public UgcQuery WithTotalOnly( bool b ) { WantsReturnTotalOnly = b; return this; } + public UgcQuery WithPlaytimeStats( bool b ) { WantsReturnPlaytimeStats = b; return this; } public UgcQuery AllowCachedResponse( int maxSecondsAge ) { maxCacheAge = maxSecondsAge; return this; } public UgcQuery InLanguage( string lang ) { language = lang; return this; } - public UgcQuery MatchAnyTag( bool b ) { matchAnyTag = b; return this; } + + /// + /// Found items must have at least one of the defined tags + /// + public UgcQuery MatchAnyTag() { matchAnyTag = true; return this; } + + /// + /// Found items must have all defined tags + /// + public UgcQuery MatchAllTags() { matchAnyTag = false; return this; } public UgcQuery WithTag( string tag ) { @@ -129,6 +138,11 @@ public UgcQuery WithoutTag( string tag ) SteamUGC.Internal.AddRequiredKeyValueTag( handle, tag.Key, tag.Value ); } + if ( matchAnyTag .HasValue ) + { + SteamUGC.Internal.SetMatchAnyTag( handle, matchAnyTag.Value ); + } + // // TODO - add more // @@ -193,6 +207,7 @@ public struct UgcDetails public string Title; public string Description; + public string[] Tags; // @@ -211,7 +226,6 @@ public struct UgcDetails internal bool Banned; // m_bBanned _Bool internal bool AcceptedForUse; // m_bAcceptedForUse _Bool internal bool TagsTruncated; // m_bTagsTruncated _Bool - internal string Tags; // m_rgchTags char [1025] internal ulong File; // m_hFile UGCHandle_t internal ulong PreviewFile; // m_hPreviewFile UGCHandle_t internal string PchFileName; // m_pchFileName char [260] @@ -232,10 +246,21 @@ internal static UgcDetails From( SteamUGCDetails_t details, UGCQueryHandle_t han Title = details.Title, Description = details.Description, + Tags = details.Tags.Split( new[] { ',' }, StringSplitOptions.RemoveEmptyEntries ) }; return d; } + + /// + /// A case insensitive check for tag + /// + public bool HasTag( string find ) + { + if ( Tags.Length == 0 ) return false; + + return Tags.Contains( find, StringComparer.OrdinalIgnoreCase ); + } } } \ No newline at end of file From e2e2554e8823bf5f196ae0814e332e8a80715e27 Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Fri, 26 Apr 2019 13:46:12 +0100 Subject: [PATCH 15/22] Ugc Queries --- .../Facepunch.Steamworks.Test.csproj | 2 +- .../{UgcTest.cs => UgcQuery.cs} | 44 ++- .../Generated/Interfaces/ISteamUGC.cs | 12 +- Facepunch.Steamworks/Generated/SteamEnums.cs | 2 +- Facepunch.Steamworks/Structs/SteamId.cs | 2 + Facepunch.Steamworks/Structs/UgcDetails.cs | 69 ++++ Facepunch.Steamworks/Structs/UgcQuery.cs | 342 +++++++----------- Facepunch.Steamworks/Structs/UgcQueryUser.cs | 181 +++++++++ Facepunch.Steamworks/Structs/UgcResultPage.cs | 39 ++ Generator/Cleanup.cs | 2 + 10 files changed, 464 insertions(+), 231 deletions(-) rename Facepunch.Steamworks.Test/{UgcTest.cs => UgcQuery.cs} (60%) create mode 100644 Facepunch.Steamworks/Structs/UgcDetails.cs create mode 100644 Facepunch.Steamworks/Structs/UgcQueryUser.cs create mode 100644 Facepunch.Steamworks/Structs/UgcResultPage.cs diff --git a/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj b/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj index efda689..e5daa38 100644 --- a/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj +++ b/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj @@ -91,7 +91,7 @@ - + diff --git a/Facepunch.Steamworks.Test/UgcTest.cs b/Facepunch.Steamworks.Test/UgcQuery.cs similarity index 60% rename from Facepunch.Steamworks.Test/UgcTest.cs rename to Facepunch.Steamworks.Test/UgcQuery.cs index e5e55e0..6cc821c 100644 --- a/Facepunch.Steamworks.Test/UgcTest.cs +++ b/Facepunch.Steamworks.Test/UgcQuery.cs @@ -10,12 +10,12 @@ namespace Steamworks { [TestClass] [DeploymentItem( "steam_api64.dll" )] - public class UgcTests + public class UgcQueryTests { [TestMethod] public async Task QueryAll() { - var q = UgcQuery.All(); + var q = Ugc.Query.All; var result = await q.GetPageAsync( 1 ); Assert.IsNotNull( result ); @@ -27,7 +27,7 @@ public async Task QueryAll() [TestMethod] public async Task QueryWithTags() { - var q = UgcQuery.All() + var q = Ugc.Query.All .WithTag( "Fun" ) .WithTag( "Movie" ) .MatchAllTags(); @@ -49,7 +49,7 @@ public async Task QueryWithTags() [TestMethod] public async Task QueryAllFromFriends() { - var q = UgcQuery.All() + var q = Ugc.Query.All .CreatedByFriends(); var result = await q.GetPageAsync( 1 ); @@ -63,6 +63,42 @@ public async Task QueryAllFromFriends() Console.WriteLine( $" {entry.Title}" ); } } + + [TestMethod] + public async Task QueryUserOwn() + { + var q = Ugc.UserQuery.All + .FromSelf(); + + var result = await q.GetPageAsync( 1 ); + Assert.IsNotNull( result ); + + Console.WriteLine( $"ResultCount: {result?.ResultCount}" ); + Console.WriteLine( $"TotalCount: {result?.TotalCount}" ); + + foreach ( var entry in result.Value.Entries ) + { + Console.WriteLine( $" {entry.Title}" ); + } + } + + [TestMethod] + public async Task QueryFoohy() + { + var q = Ugc.UserQuery.All + .FromUser( 76561197997689747 ); + + var result = await q.GetPageAsync( 1 ); + Assert.IsNotNull( result ); + + Console.WriteLine( $"ResultCount: {result?.ResultCount}" ); + Console.WriteLine( $"TotalCount: {result?.TotalCount}" ); + + foreach ( var entry in result.Value.Entries ) + { + Console.WriteLine( $" {entry.Title}" ); + } + } } } diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamUGC.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamUGC.cs index f9daf7d..2a132e8 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamUGC.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamUGC.cs @@ -97,33 +97,33 @@ public override void InitInternals() #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate UGCQueryHandle_t FCreateQueryUserUGCRequest( IntPtr self, AccountID_t unAccountID, UserUGCList eListType, UGCMatchingUGCType eMatchingUGCType, UserUGCListSortOrder eSortOrder, AppId_t nCreatorAppID, AppId_t nConsumerAppID, uint unPage ); + private delegate UGCQueryHandle_t FCreateQueryUserUGCRequest( IntPtr self, AccountID_t unAccountID, UserUGCList eListType, UgcType eMatchingUGCType, UserUGCListSortOrder eSortOrder, AppId_t nCreatorAppID, AppId_t nConsumerAppID, uint unPage ); private FCreateQueryUserUGCRequest _CreateQueryUserUGCRequest; #endregion - internal UGCQueryHandle_t CreateQueryUserUGCRequest( AccountID_t unAccountID, UserUGCList eListType, UGCMatchingUGCType eMatchingUGCType, UserUGCListSortOrder eSortOrder, AppId_t nCreatorAppID, AppId_t nConsumerAppID, uint unPage ) + internal UGCQueryHandle_t CreateQueryUserUGCRequest( AccountID_t unAccountID, UserUGCList eListType, UgcType eMatchingUGCType, UserUGCListSortOrder eSortOrder, AppId_t nCreatorAppID, AppId_t nConsumerAppID, uint unPage ) { return _CreateQueryUserUGCRequest( Self, unAccountID, eListType, eMatchingUGCType, eSortOrder, nCreatorAppID, nConsumerAppID, unPage ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate UGCQueryHandle_t FCreateQueryAllUGCRequest1( IntPtr self, UGCQuery eQueryType, UGCMatchingUGCType eMatchingeMatchingUGCTypeFileType, AppId_t nCreatorAppID, AppId_t nConsumerAppID, uint unPage ); + private delegate UGCQueryHandle_t FCreateQueryAllUGCRequest1( IntPtr self, UGCQuery eQueryType, UgcType eMatchingeMatchingUGCTypeFileType, AppId_t nCreatorAppID, AppId_t nConsumerAppID, uint unPage ); private FCreateQueryAllUGCRequest1 _CreateQueryAllUGCRequest1; #endregion - internal UGCQueryHandle_t CreateQueryAllUGCRequest1( UGCQuery eQueryType, UGCMatchingUGCType eMatchingeMatchingUGCTypeFileType, AppId_t nCreatorAppID, AppId_t nConsumerAppID, uint unPage ) + internal UGCQueryHandle_t CreateQueryAllUGCRequest1( UGCQuery eQueryType, UgcType eMatchingeMatchingUGCTypeFileType, AppId_t nCreatorAppID, AppId_t nConsumerAppID, uint unPage ) { return _CreateQueryAllUGCRequest1( Self, eQueryType, eMatchingeMatchingUGCTypeFileType, nCreatorAppID, nConsumerAppID, unPage ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate UGCQueryHandle_t FCreateQueryAllUGCRequest2( IntPtr self, UGCQuery eQueryType, UGCMatchingUGCType eMatchingeMatchingUGCTypeFileType, AppId_t nCreatorAppID, AppId_t nConsumerAppID, string pchCursor ); + private delegate UGCQueryHandle_t FCreateQueryAllUGCRequest2( IntPtr self, UGCQuery eQueryType, UgcType eMatchingeMatchingUGCTypeFileType, AppId_t nCreatorAppID, AppId_t nConsumerAppID, string pchCursor ); private FCreateQueryAllUGCRequest2 _CreateQueryAllUGCRequest2; #endregion - internal UGCQueryHandle_t CreateQueryAllUGCRequest2( UGCQuery eQueryType, UGCMatchingUGCType eMatchingeMatchingUGCTypeFileType, AppId_t nCreatorAppID, AppId_t nConsumerAppID, string pchCursor ) + internal UGCQueryHandle_t CreateQueryAllUGCRequest2( UGCQuery eQueryType, UgcType eMatchingeMatchingUGCTypeFileType, AppId_t nCreatorAppID, AppId_t nConsumerAppID, string pchCursor ) { return _CreateQueryAllUGCRequest2( Self, eQueryType, eMatchingeMatchingUGCTypeFileType, nCreatorAppID, nConsumerAppID, pchCursor ); } diff --git a/Facepunch.Steamworks/Generated/SteamEnums.cs b/Facepunch.Steamworks/Generated/SteamEnums.cs index b5f3c26..4383f57 100644 --- a/Facepunch.Steamworks/Generated/SteamEnums.cs +++ b/Facepunch.Steamworks/Generated/SteamEnums.cs @@ -1774,7 +1774,7 @@ internal enum SteamControllerLEDFlag : int // // EUGCMatchingUGCType // - internal enum UGCMatchingUGCType : int + public enum UgcType : int { Items = 0, Items_Mtx = 1, diff --git a/Facepunch.Steamworks/Structs/SteamId.cs b/Facepunch.Steamworks/Structs/SteamId.cs index 762f7f5..62bdce3 100644 --- a/Facepunch.Steamworks/Structs/SteamId.cs +++ b/Facepunch.Steamworks/Structs/SteamId.cs @@ -21,5 +21,7 @@ public static implicit operator ulong( SteamId value ) } public override string ToString() => Value.ToString(); + + public uint AccountId => (uint) (Value & 0xFFFFFFFFul); } } \ No newline at end of file diff --git a/Facepunch.Steamworks/Structs/UgcDetails.cs b/Facepunch.Steamworks/Structs/UgcDetails.cs new file mode 100644 index 0000000..faf4815 --- /dev/null +++ b/Facepunch.Steamworks/Structs/UgcDetails.cs @@ -0,0 +1,69 @@ +using System; +using System.Linq; +using Steamworks.Data; + +namespace Steamworks.Ugc +{ + public struct Result + { + public PublishedFileId Id; + + public string Title; + public string Description; + public string[] Tags; + + + // + // TODO; + // + //internal Steamworks.Result Result; // m_eResult enum EResult + internal WorkshopFileType FileType; // m_eFileType enum EWorkshopFileType + internal uint CreatorAppID; // m_nCreatorAppID AppId_t + internal uint ConsumerAppID; // m_nConsumerAppID AppId_t + + internal ulong SteamIDOwner; // m_ulSteamIDOwner uint64 + internal uint TimeCreated; // m_rtimeCreated uint32 + internal uint TimeUpdated; // m_rtimeUpdated uint32 + internal uint TimeAddedToUserList; // m_rtimeAddedToUserList uint32 + internal RemoteStoragePublishedFileVisibility Visibility; // m_eVisibility enum ERemoteStoragePublishedFileVisibility + internal bool Banned; // m_bBanned _Bool + internal bool AcceptedForUse; // m_bAcceptedForUse _Bool + internal bool TagsTruncated; // m_bTagsTruncated _Bool + internal ulong File; // m_hFile UGCHandle_t + internal ulong PreviewFile; // m_hPreviewFile UGCHandle_t + internal string PchFileName; // m_pchFileName char [260] + internal int FileSize; // m_nFileSize int32 + internal int PreviewFileSize; // m_nPreviewFileSize int32 + internal string URL; // m_rgchURL char [256] + internal uint VotesUp; // m_unVotesUp uint32 + internal uint VotesDown; // m_unVotesDown uint32 + internal float Score; // m_flScore float + internal uint NumChildren; // m_unNumChildren uint32 + + internal static Result From( SteamUGCDetails_t details, UGCQueryHandle_t handle ) + { + var d = new Result + { + Id = details.PublishedFileId, + FileType = details.FileType, + + Title = details.Title, + Description = details.Description, + Tags = details.Tags.Split( new[] { ',' }, StringSplitOptions.RemoveEmptyEntries ) + + }; + + return d; + } + + /// + /// A case insensitive check for tag + /// + public bool HasTag( string find ) + { + if ( Tags.Length == 0 ) return false; + + return Tags.Contains( find, StringComparer.OrdinalIgnoreCase ); + } + } +} \ No newline at end of file diff --git a/Facepunch.Steamworks/Structs/UgcQuery.cs b/Facepunch.Steamworks/Structs/UgcQuery.cs index 337bb37..58a0f59 100644 --- a/Facepunch.Steamworks/Structs/UgcQuery.cs +++ b/Facepunch.Steamworks/Structs/UgcQuery.cs @@ -2,112 +2,62 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Steamworks.Data; -namespace Steamworks.Data +using QueryType = Steamworks.Ugc.Query; + +namespace Steamworks.Ugc { - public struct UgcQuery + public struct Query { - UGCMatchingUGCType matching; - - UserUGCList userGc; + UgcType matchingType; UGCQuery queryType; - AppId consumerApp; AppId creatorApp; - List requiredTags; - bool? matchAnyTag; - - List excludedTags; - - Dictionary requiredKv; - - bool? WantsReturnOnlyIDs; - bool? WantsReturnKeyValueTags; - bool? WantsReturnLongDescription; - bool? WantsReturnMetadata; - bool? WantsReturnChildren; - bool? WantsReturnAdditionalPreviews; - bool? WantsReturnTotalOnly; - bool? WantsReturnPlaytimeStats; - - string searchText; - string language; - int? trendDays; - int? maxCacheAge; - - public static UgcQuery Items() => new UgcQuery { matching = UGCMatchingUGCType.Items }; - public static UgcQuery ItemsMtx() => new UgcQuery { matching = UGCMatchingUGCType.Items_Mtx }; - public static UgcQuery ItemsReadyToUse() => new UgcQuery { matching = UGCMatchingUGCType.Items_ReadyToUse }; - public static UgcQuery Collections() => new UgcQuery { matching = UGCMatchingUGCType.Collections }; - public static UgcQuery Artwork() => new UgcQuery { matching = UGCMatchingUGCType.Artwork }; - public static UgcQuery Videos() => new UgcQuery { matching = UGCMatchingUGCType.Videos }; - public static UgcQuery Screenshots() => new UgcQuery { matching = UGCMatchingUGCType.Screenshots }; - public static UgcQuery AllGuides() => new UgcQuery { matching = UGCMatchingUGCType.AllGuides }; - public static UgcQuery WebGuides() => new UgcQuery { matching = UGCMatchingUGCType.WebGuides }; - public static UgcQuery IntegratedGuides() => new UgcQuery { matching = UGCMatchingUGCType.IntegratedGuides }; - public static UgcQuery UsableInGame() => new UgcQuery { matching = UGCMatchingUGCType.UsableInGame }; - public static UgcQuery ControllerBindings() => new UgcQuery { matching = UGCMatchingUGCType.ControllerBindings }; - public static UgcQuery GameManagedItems() => new UgcQuery { matching = UGCMatchingUGCType.GameManagedItems }; - public static UgcQuery All() => new UgcQuery { matching = UGCMatchingUGCType.All }; - - public UgcQuery RankedByVote() { queryType = UGCQuery.RankedByVote; return this; } - public UgcQuery RankedByPublicationDate() { queryType = UGCQuery.RankedByPublicationDate; return this; } - public UgcQuery RankedByAcceptanceDate() { queryType = UGCQuery.AcceptedForGameRankedByAcceptanceDate; return this; } - public UgcQuery RankedByTrend() { queryType = UGCQuery.RankedByTrend; return this; } - public UgcQuery FavoritedByFriends() { queryType = UGCQuery.FavoritedByFriendsRankedByPublicationDate; return this; } - public UgcQuery CreatedByFriends() { queryType = UGCQuery.CreatedByFriendsRankedByPublicationDate; return this; } - public UgcQuery RankedByNumTimesReported() { queryType = UGCQuery.RankedByNumTimesReported; return this; } - public UgcQuery CreatedByFollowedUsers() { queryType = UGCQuery.CreatedByFollowedUsersRankedByPublicationDate; return this; } - public UgcQuery NotYetRated() { queryType = UGCQuery.NotYetRated; return this; } - public UgcQuery RankedByTotalVotesAsc() { queryType = UGCQuery.RankedByTotalVotesAsc; return this; } - public UgcQuery RankedByVotesUp() { queryType = UGCQuery.RankedByVotesUp; return this; } - public UgcQuery RankedByTextSearch() { queryType = UGCQuery.RankedByTextSearch; return this; } - public UgcQuery RankedByTotalUniqueSubscriptions() { queryType = UGCQuery.RankedByTotalUniqueSubscriptions; return this; } - public UgcQuery RankedByPlaytimeTrend() { queryType = UGCQuery.RankedByPlaytimeTrend; return this; } - public UgcQuery RankedByTotalPlaytime() { queryType = UGCQuery.RankedByTotalPlaytime; return this; } - public UgcQuery RankedByAveragePlaytimeTrend() { queryType = UGCQuery.RankedByAveragePlaytimeTrend; return this; } - public UgcQuery RankedByLifetimeAveragePlaytime() { queryType = UGCQuery.RankedByLifetimeAveragePlaytime; return this; } - public UgcQuery RankedByPlaytimeSessionsTrend() { queryType = UGCQuery.RankedByPlaytimeSessionsTrend; return this; } - public UgcQuery RankedByLifetimePlaytimeSessions() { queryType = UGCQuery.RankedByLifetimePlaytimeSessions; return this; } - - public UgcQuery WithOnlyIDs( bool b) { WantsReturnOnlyIDs = b; return this; } - public UgcQuery WithKeyValueTag( bool b ) { WantsReturnKeyValueTags = b; return this; } - public UgcQuery WithLongDescription( bool b ) { WantsReturnLongDescription = b; return this; } - public UgcQuery WithMetadata( bool b ) { WantsReturnMetadata = b; return this; } - public UgcQuery WithChildren( bool b ) { WantsReturnChildren = b; return this; } - public UgcQuery WithAdditionalPreviews( bool b ) { WantsReturnAdditionalPreviews = b; return this; } - public UgcQuery WithTotalOnly( bool b ) { WantsReturnTotalOnly = b; return this; } - public UgcQuery WithPlaytimeStats( bool b ) { WantsReturnPlaytimeStats = b; return this; } - public UgcQuery AllowCachedResponse( int maxSecondsAge ) { maxCacheAge = maxSecondsAge; return this; } - - public UgcQuery InLanguage( string lang ) { language = lang; return this; } - - /// - /// Found items must have at least one of the defined tags - /// - public UgcQuery MatchAnyTag() { matchAnyTag = true; return this; } - - /// - /// Found items must have all defined tags - /// - public UgcQuery MatchAllTags() { matchAnyTag = false; return this; } - - public UgcQuery WithTag( string tag ) + public Query( UgcType type ) : this() { - if ( requiredTags == null ) requiredTags = new List(); - requiredTags.Add( tag ); - return this; + matchingType = type; } - public UgcQuery WithoutTag( string tag ) - { - if ( excludedTags == null ) excludedTags = new List(); - excludedTags.Add( tag ); - return this; - } + public static Query All => new Query( UgcType.All ); + public static Query Items => new Query( UgcType.Items ); + public static Query ItemsMtx => new Query( UgcType.Items_Mtx ); + public static Query ItemsReadyToUse => new Query( UgcType.Items_ReadyToUse ); + public static Query Collections => new Query( UgcType.Collections ); + public static Query Artwork => new Query( UgcType.Artwork ); + public static Query Videos => new Query( UgcType.Videos ); + public static Query Screenshots => new Query( UgcType.Screenshots ); + public static Query AllGuides => new Query( UgcType.AllGuides ); + public static Query WebGuides => new Query( UgcType.WebGuides ); + public static Query IntegratedGuides => new Query( UgcType.IntegratedGuides ); + public static Query UsableInGame => new Query( UgcType.UsableInGame ); + public static Query ControllerBindings => new Query( UgcType.ControllerBindings ); + public static Query GameManagedItems => new Query( UgcType.GameManagedItems ); - public async Task GetPageAsync( int page ) + + public Query RankedByVote() { queryType = UGCQuery.RankedByVote; return this; } + public Query RankedByPublicationDate() { queryType = UGCQuery.RankedByPublicationDate; return this; } + public Query RankedByAcceptanceDate() { queryType = UGCQuery.AcceptedForGameRankedByAcceptanceDate; return this; } + public Query RankedByTrend() { queryType = UGCQuery.RankedByTrend; return this; } + public Query FavoritedByFriends() { queryType = UGCQuery.FavoritedByFriendsRankedByPublicationDate; return this; } + public Query CreatedByFriends() { queryType = UGCQuery.CreatedByFriendsRankedByPublicationDate; return this; } + public Query RankedByNumTimesReported() { queryType = UGCQuery.RankedByNumTimesReported; return this; } + public Query CreatedByFollowedUsers() { queryType = UGCQuery.CreatedByFollowedUsersRankedByPublicationDate; return this; } + public Query NotYetRated() { queryType = UGCQuery.NotYetRated; return this; } + public Query RankedByTotalVotesAsc() { queryType = UGCQuery.RankedByTotalVotesAsc; return this; } + public Query RankedByVotesUp() { queryType = UGCQuery.RankedByVotesUp; return this; } + public Query RankedByTextSearch() { queryType = UGCQuery.RankedByTextSearch; return this; } + public Query RankedByTotalUniqueSubscriptions() { queryType = UGCQuery.RankedByTotalUniqueSubscriptions; return this; } + public Query RankedByPlaytimeTrend() { queryType = UGCQuery.RankedByPlaytimeTrend; return this; } + public Query RankedByTotalPlaytime() { queryType = UGCQuery.RankedByTotalPlaytime; return this; } + public Query RankedByAveragePlaytimeTrend() { queryType = UGCQuery.RankedByAveragePlaytimeTrend; return this; } + public Query RankedByLifetimeAveragePlaytime() { queryType = UGCQuery.RankedByLifetimeAveragePlaytime; return this; } + public Query RankedByPlaytimeSessionsTrend() { queryType = UGCQuery.RankedByPlaytimeSessionsTrend; return this; } + public Query RankedByLifetimePlaytimeSessions() { queryType = UGCQuery.RankedByLifetimePlaytimeSessions; return this; } + + + public async Task GetPageAsync( int page ) { if ( page <= 0 ) throw new System.Exception( "page should be > 0" ); @@ -115,47 +65,18 @@ public UgcQuery WithoutTag( string tag ) if ( creatorApp == 0 ) creatorApp = consumerApp; UGCQueryHandle_t handle; + handle = SteamUGC.Internal.CreateQueryAllUGCRequest1( queryType, matchingType, creatorApp.Value, consumerApp.Value, (uint)page ); - handle = SteamUGC.Internal.CreateQueryAllUGCRequest1( queryType, matching, creatorApp.Value, consumerApp.Value, (uint) page ); - - // Apply stored constraints - { - if ( requiredTags != null ) - { - foreach ( var tag in requiredTags ) - SteamUGC.Internal.AddRequiredTag( handle, tag ); - } - - if ( excludedTags != null ) - { - foreach ( var tag in excludedTags ) - SteamUGC.Internal.AddExcludedTag( handle, tag ); - } - - if ( requiredKv != null ) - { - foreach ( var tag in requiredKv ) - SteamUGC.Internal.AddRequiredKeyValueTag( handle, tag.Key, tag.Value ); - } - - if ( matchAnyTag .HasValue ) - { - SteamUGC.Internal.SetMatchAnyTag( handle, matchAnyTag.Value ); - } - - // - // TODO - add more - // - } + ApplyConstraints( handle ); var result = await SteamUGC.Internal.SendQueryUGCRequest( handle ); if ( !result.HasValue ) return null; - if ( result.Value.Result != Result.OK ) + if ( result.Value.Result != Steamworks.Result.OK ) return null; - return new UgcQueryPage + return new ResultPage { Handle = result.Value.Handle, ResultCount = (int) result.Value.NumResultsReturned, @@ -164,103 +85,86 @@ public UgcQuery WithoutTag( string tag ) }; } - } - public struct UgcQueryPage : System.IDisposable - { - internal UGCQueryHandle_t Handle; + #region SharedConstraints + public QueryType WithType( UgcType type ){ matchingType = type; return this; } + bool? WantsReturnOnlyIDs; + public QueryType WithOnlyIDs( bool b ) { WantsReturnOnlyIDs = b; return this; } + bool? WantsReturnKeyValueTags; + public QueryType WithKeyValueTag( bool b ) { WantsReturnKeyValueTags = b; return this; } + bool? WantsReturnLongDescription; + public QueryType WithLongDescription( bool b ) { WantsReturnLongDescription = b; return this; } + bool? WantsReturnMetadata; + public QueryType WithMetadata( bool b ) { WantsReturnMetadata = b; return this; } + bool? WantsReturnChildren; + public QueryType WithChildren( bool b ) { WantsReturnChildren = b; return this; } + bool? WantsReturnAdditionalPreviews; + public QueryType WithAdditionalPreviews( bool b ) { WantsReturnAdditionalPreviews = b; return this; } + bool? WantsReturnTotalOnly; + public QueryType WithTotalOnly( bool b ) { WantsReturnTotalOnly = b; return this; } + bool? WantsReturnPlaytimeStats; + public QueryType WithPlaytimeStats( bool b ) { WantsReturnPlaytimeStats = b; return this; } + int? maxCacheAge; + public QueryType AllowCachedResponse( int maxSecondsAge ) { maxCacheAge = maxSecondsAge; return this; } + string language; + public QueryType InLanguage( string lang ) { language = lang; return this; } - public int ResultCount; - public int TotalCount; - - public bool CachedData; - - public IEnumerable Entries - { - get - { - var details = default( SteamUGCDetails_t ); - for ( uint i=0; i< ResultCount; i++ ) - { - if ( SteamUGC.Internal.GetQueryUGCResult( Handle, i, ref details ) ) - { - yield return UgcDetails.From( details, Handle ); - } - } - } - } - - - public void Dispose() - { - if ( Handle > 0 ) - { - SteamUGC.Internal.ReleaseQueryUGCRequest( Handle ); - Handle = 0; - } - } - } - - public struct UgcDetails - { - public PublishedFileId Id; - - public string Title; - public string Description; - public string[] Tags; - - - // - // TODO; - // - internal Result Result; // m_eResult enum EResult - internal WorkshopFileType FileType; // m_eFileType enum EWorkshopFileType - internal uint CreatorAppID; // m_nCreatorAppID AppId_t - internal uint ConsumerAppID; // m_nConsumerAppID AppId_t - - internal ulong SteamIDOwner; // m_ulSteamIDOwner uint64 - internal uint TimeCreated; // m_rtimeCreated uint32 - internal uint TimeUpdated; // m_rtimeUpdated uint32 - internal uint TimeAddedToUserList; // m_rtimeAddedToUserList uint32 - internal RemoteStoragePublishedFileVisibility Visibility; // m_eVisibility enum ERemoteStoragePublishedFileVisibility - internal bool Banned; // m_bBanned _Bool - internal bool AcceptedForUse; // m_bAcceptedForUse _Bool - internal bool TagsTruncated; // m_bTagsTruncated _Bool - internal ulong File; // m_hFile UGCHandle_t - internal ulong PreviewFile; // m_hPreviewFile UGCHandle_t - internal string PchFileName; // m_pchFileName char [260] - internal int FileSize; // m_nFileSize int32 - internal int PreviewFileSize; // m_nPreviewFileSize int32 - internal string URL; // m_rgchURL char [256] - internal uint VotesUp; // m_unVotesUp uint32 - internal uint VotesDown; // m_unVotesDown uint32 - internal float Score; // m_flScore float - internal uint NumChildren; // m_unNumChildren uint32 - - internal static UgcDetails From( SteamUGCDetails_t details, UGCQueryHandle_t handle ) - { - var d = new UgcDetails - { - Id = details.PublishedFileId, - FileType = details.FileType, - - Title = details.Title, - Description = details.Description, - Tags = details.Tags.Split( new[] { ',' }, StringSplitOptions.RemoveEmptyEntries ) - - }; - - return d; - } + List requiredTags; + bool? matchAnyTag; + List excludedTags; + Dictionary requiredKv; /// - /// A case insensitive check for tag + /// Found items must have at least one of the defined tags /// - public bool HasTag( string find ) - { - if ( Tags.Length == 0 ) return false; + public QueryType MatchAnyTag() { matchAnyTag = true; return this; } - return Tags.Contains( find, StringComparer.OrdinalIgnoreCase ); + /// + /// Found items must have all defined tags + /// + public QueryType MatchAllTags() { matchAnyTag = false; return this; } + + public QueryType WithTag( string tag ) + { + if ( requiredTags == null ) requiredTags = new List(); + requiredTags.Add( tag ); + return this; } + + public QueryType WithoutTag( string tag ) + { + if ( excludedTags == null ) excludedTags = new List(); + excludedTags.Add( tag ); + return this; + } + + void ApplyConstraints( UGCQueryHandle_t handle ) + { + if ( requiredTags != null ) + { + foreach ( var tag in requiredTags ) + SteamUGC.Internal.AddRequiredTag( handle, tag ); + } + + if ( excludedTags != null ) + { + foreach ( var tag in excludedTags ) + SteamUGC.Internal.AddExcludedTag( handle, tag ); + } + + if ( requiredKv != null ) + { + foreach ( var tag in requiredKv ) + SteamUGC.Internal.AddRequiredKeyValueTag( handle, tag.Key, tag.Value ); + } + + if ( matchAnyTag.HasValue ) + { + SteamUGC.Internal.SetMatchAnyTag( handle, matchAnyTag.Value ); + } + } + + #endregion + } } \ No newline at end of file diff --git a/Facepunch.Steamworks/Structs/UgcQueryUser.cs b/Facepunch.Steamworks/Structs/UgcQueryUser.cs new file mode 100644 index 0000000..84ee88c --- /dev/null +++ b/Facepunch.Steamworks/Structs/UgcQueryUser.cs @@ -0,0 +1,181 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Steamworks.Data; +using QueryType = Steamworks.Ugc.UserQuery; + +namespace Steamworks.Ugc +{ + public struct UserQuery + { + public UserQuery( UgcType type, SteamId steamid = default ) : this() + { + if ( steamid == 0 ) + steamid = SteamClient.SteamId; + + this.steamid = steamid; + this.matchingType = type; + } + + SteamId steamid; + + UserUGCList userType; + UserUGCListSortOrder userSort; + UgcType matchingType; + + AppId consumerApp; + AppId creatorApp; + + public static UserQuery All => new UserQuery( UgcType.All, 0 ); + public static UserQuery Items => new UserQuery( UgcType.Items, 0 ); + /* + public static UserQuery ItemsMtx( SteamId steamid = default ) => new UserQuery( steamid ) { matchingType = UGCMatchingUGCType.Items_Mtx }; + public static UserQuery ItemsReadyToUse( SteamId steamid = default ) => new UserQuery( steamid ) { matchingType = UGCMatchingUGCType.Items_ReadyToUse }; + public static UserQuery Collections( SteamId steamid = default ) => new UserQuery( steamid ) { matchingType = UGCMatchingUGCType.Collections }; + public static UserQuery Artwork( SteamId steamid = default ) => new UserQuery( steamid ) { matchingType = UGCMatchingUGCType.Artwork }; + public static UserQuery Videos( SteamId steamid = default ) => new UserQuery( steamid ) { matchingType = UGCMatchingUGCType.Videos }; + public static UserQuery Screenshots( SteamId steamid = default ) => new UserQuery( steamid ) { matchingType = UGCMatchingUGCType.Screenshots }; + public static UserQuery AllGuides( SteamId steamid = default ) => new UserQuery( steamid ) { matchingType = UGCMatchingUGCType.AllGuides }; + public static UserQuery WebGuides( SteamId steamid = default ) => new UserQuery( steamid ) { matchingType = UGCMatchingUGCType.WebGuides }; + public static UserQuery IntegratedGuides( SteamId steamid = default ) => new UserQuery( steamid ) { matchingType = UGCMatchingUGCType.IntegratedGuides }; + public static UserQuery UsableInGame( SteamId steamid = default ) => new UserQuery( steamid ) { matchingType = UGCMatchingUGCType.UsableInGame }; + public static UserQuery ControllerBindings( SteamId steamid = default ) => new UserQuery( steamid ) { matchingType = UGCMatchingUGCType.ControllerBindings }; + public static UserQuery GameManagedItems( SteamId steamid = default ) => new UserQuery( steamid ) { matchingType = UGCMatchingUGCType.GameManagedItems }; + */ + + public UserQuery SortByCreationDate() { userSort = UserUGCListSortOrder.CreationOrderDesc; return this; } + public UserQuery SortByCreationDateAsc() { userSort = UserUGCListSortOrder.CreationOrderAsc; return this; } + public UserQuery SortByTitleAsc() { userSort = UserUGCListSortOrder.TitleAsc; return this; } + public UserQuery SortByUpdateDate() { userSort = UserUGCListSortOrder.LastUpdatedDesc; return this; } + public UserQuery SortBySubscriptionDate() { userSort = UserUGCListSortOrder.SubscriptionDateDesc; return this; } + public UserQuery SortByVoteScore() { userSort = UserUGCListSortOrder.VoteScoreDesc; return this; } + public UserQuery SortByModeration() { userSort = UserUGCListSortOrder.ForModeration; return this; } + + + public UserQuery GetPublished() { userType = UserUGCList.Published; return this; } + + public UserQuery FromUser( SteamId steamid ) + { + this.steamid = steamid; + return this; + } + + public UserQuery FromSelf() + { + this.steamid = SteamClient.SteamId; + return this; + } + + + public async Task GetPageAsync( int page ) + { + if ( page <= 0 ) throw new System.Exception( "page should be > 0" ); + + if ( consumerApp == 0 ) consumerApp = SteamClient.AppId; + if ( creatorApp == 0 ) creatorApp = consumerApp; + + UGCQueryHandle_t handle; + + handle = SteamUGC.Internal.CreateQueryUserUGCRequest( steamid.AccountId, userType, matchingType, userSort, creatorApp.Value, consumerApp.Value, (uint)page ); + + ApplyConstraints( handle ); + + var result = await SteamUGC.Internal.SendQueryUGCRequest( handle ); + if ( !result.HasValue ) + return null; + + if ( result.Value.Result != Steamworks.Result.OK ) + return null; + + return new ResultPage + { + Handle = result.Value.Handle, + ResultCount = (int) result.Value.NumResultsReturned, + TotalCount = (int)result.Value.TotalMatchingResults, + CachedData = result.Value.CachedData + }; + } + + #region SharedConstraints + public QueryType WithType( UgcType type ) { matchingType = type; return this; } + bool? WantsReturnOnlyIDs; + public QueryType WithOnlyIDs( bool b ) { WantsReturnOnlyIDs = b; return this; } + bool? WantsReturnKeyValueTags; + public QueryType WithKeyValueTag( bool b ) { WantsReturnKeyValueTags = b; return this; } + bool? WantsReturnLongDescription; + public QueryType WithLongDescription( bool b ) { WantsReturnLongDescription = b; return this; } + bool? WantsReturnMetadata; + public QueryType WithMetadata( bool b ) { WantsReturnMetadata = b; return this; } + bool? WantsReturnChildren; + public QueryType WithChildren( bool b ) { WantsReturnChildren = b; return this; } + bool? WantsReturnAdditionalPreviews; + public QueryType WithAdditionalPreviews( bool b ) { WantsReturnAdditionalPreviews = b; return this; } + bool? WantsReturnTotalOnly; + public QueryType WithTotalOnly( bool b ) { WantsReturnTotalOnly = b; return this; } + bool? WantsReturnPlaytimeStats; + public QueryType WithPlaytimeStats( bool b ) { WantsReturnPlaytimeStats = b; return this; } + int? maxCacheAge; + public QueryType AllowCachedResponse( int maxSecondsAge ) { maxCacheAge = maxSecondsAge; return this; } + string language; + public QueryType InLanguage( string lang ) { language = lang; return this; } + + List requiredTags; + bool? matchAnyTag; + List excludedTags; + Dictionary requiredKv; + + /// + /// Found items must have at least one of the defined tags + /// + public QueryType MatchAnyTag() { matchAnyTag = true; return this; } + + /// + /// Found items must have all defined tags + /// + public QueryType MatchAllTags() { matchAnyTag = false; return this; } + + public QueryType WithTag( string tag ) + { + if ( requiredTags == null ) requiredTags = new List(); + requiredTags.Add( tag ); + return this; + } + + public QueryType WithoutTag( string tag ) + { + if ( excludedTags == null ) excludedTags = new List(); + excludedTags.Add( tag ); + return this; + } + + void ApplyConstraints( UGCQueryHandle_t handle ) + { + if ( requiredTags != null ) + { + foreach ( var tag in requiredTags ) + SteamUGC.Internal.AddRequiredTag( handle, tag ); + } + + if ( excludedTags != null ) + { + foreach ( var tag in excludedTags ) + SteamUGC.Internal.AddExcludedTag( handle, tag ); + } + + if ( requiredKv != null ) + { + foreach ( var tag in requiredKv ) + SteamUGC.Internal.AddRequiredKeyValueTag( handle, tag.Key, tag.Value ); + } + + if ( matchAnyTag.HasValue ) + { + SteamUGC.Internal.SetMatchAnyTag( handle, matchAnyTag.Value ); + } + } + + #endregion + + } +} \ No newline at end of file diff --git a/Facepunch.Steamworks/Structs/UgcResultPage.cs b/Facepunch.Steamworks/Structs/UgcResultPage.cs new file mode 100644 index 0000000..eec1b31 --- /dev/null +++ b/Facepunch.Steamworks/Structs/UgcResultPage.cs @@ -0,0 +1,39 @@ +using System.Collections.Generic; +using Steamworks.Data; + +namespace Steamworks.Ugc +{ + public struct ResultPage : System.IDisposable + { + internal UGCQueryHandle_t Handle; + + public int ResultCount; + public int TotalCount; + + public bool CachedData; + + public IEnumerable Entries + { + get + { + var details = default( SteamUGCDetails_t ); + for ( uint i=0; i< ResultCount; i++ ) + { + if ( SteamUGC.Internal.GetQueryUGCResult( Handle, i, ref details ) ) + { + yield return Result.From( details, Handle ); + } + } + } + } + + public void Dispose() + { + if ( Handle > 0 ) + { + SteamUGC.Internal.ReleaseQueryUGCRequest( Handle ); + Handle = 0; + } + } + } +} \ No newline at end of file diff --git a/Generator/Cleanup.cs b/Generator/Cleanup.cs index 6d43299..3dcbb52 100644 --- a/Generator/Cleanup.cs +++ b/Generator/Cleanup.cs @@ -21,6 +21,7 @@ public static string ConvertType( string type ) type = type.Replace( "PublishedFileId_t", "PublishedFileId" ); type = type.Replace( "LeaderboardSortMethod", "LeaderboardSort" ); type = type.Replace( "LeaderboardDisplayType", "LeaderboardDisplay" ); + type = type.Replace( "UGCMatchingUGCType", "UgcType" ); return type; } @@ -51,6 +52,7 @@ internal static string Expose( string name ) if ( name == "BroadcastUploadResult" ) return "public"; if ( name == "PublishedFileId" ) return "public"; if ( name == "Result" ) return "public"; + if ( name == "UgcType" ) return "public"; return "internal"; } From 30a96ccae7f9d2a6e90e33a94780f11fa7ed6398 Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Fri, 26 Apr 2019 13:54:17 +0100 Subject: [PATCH 16/22] --- Facepunch.Steamworks/Facepunch.Steamworks.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/Facepunch.Steamworks/Facepunch.Steamworks.csproj b/Facepunch.Steamworks/Facepunch.Steamworks.csproj index a229446..899dc0e 100644 --- a/Facepunch.Steamworks/Facepunch.Steamworks.csproj +++ b/Facepunch.Steamworks/Facepunch.Steamworks.csproj @@ -50,6 +50,7 @@ https://avatars2.githubusercontent.com/u/3371040 facepunch;steam;unity;steamworks;valve 0.7.5 + latest From bab5664568d086dabdf282af501f1d033e5b9ad4 Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Fri, 26 Apr 2019 14:08:26 +0100 Subject: [PATCH 17/22] Renamed Ugc.Details to Ugc.Result --- Facepunch.Steamworks/Structs/{UgcDetails.cs => UgcResult.cs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Facepunch.Steamworks/Structs/{UgcDetails.cs => UgcResult.cs} (100%) diff --git a/Facepunch.Steamworks/Structs/UgcDetails.cs b/Facepunch.Steamworks/Structs/UgcResult.cs similarity index 100% rename from Facepunch.Steamworks/Structs/UgcDetails.cs rename to Facepunch.Steamworks/Structs/UgcResult.cs From e4663ecc68e656346c5999f070db2de168cef76f Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Fri, 26 Apr 2019 14:29:36 +0100 Subject: [PATCH 18/22] AppId_t => AppId --- .../Generated/Interfaces/ISteamApps.cs | 44 ++--- .../Generated/Interfaces/ISteamFriends.cs | 8 +- .../Generated/Interfaces/ISteamGameServer.cs | 8 +- .../Interfaces/ISteamMatchmakingServers.cs | 24 +-- .../Interfaces/ISteamParentalSettings.cs | 8 +- .../Generated/Interfaces/ISteamUGC.cs | 36 ++--- .../Generated/Interfaces/ISteamUser.cs | 4 +- .../Generated/Interfaces/ISteamVideo.cs | 12 +- .../Generated/SteamStructs.cs | 150 +++++++++--------- Facepunch.Steamworks/Generated/SteamTypes.cs | 9 -- Facepunch.Steamworks/SteamApps.cs | 2 +- Generator/Cleanup.cs | 3 +- Generator/CodeWriter/Struct.cs | 6 +- Generator/CodeWriter/Types.cs | 3 + 14 files changed, 156 insertions(+), 161 deletions(-) diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamApps.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamApps.cs index 8e3881b..6b13bc2 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamApps.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamApps.cs @@ -120,11 +120,11 @@ internal string GetAvailableGameLanguages() #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool FBIsSubscribedApp( IntPtr self, AppId_t appID ); + private delegate bool FBIsSubscribedApp( IntPtr self, AppId appID ); private FBIsSubscribedApp _BIsSubscribedApp; #endregion - internal bool BIsSubscribedApp( AppId_t appID ) + internal bool BIsSubscribedApp( AppId appID ) { return _BIsSubscribedApp( Self, appID ); } @@ -132,22 +132,22 @@ internal bool BIsSubscribedApp( AppId_t appID ) #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool FBIsDlcInstalled( IntPtr self, AppId_t appID ); + private delegate bool FBIsDlcInstalled( IntPtr self, AppId appID ); private FBIsDlcInstalled _BIsDlcInstalled; #endregion - internal bool BIsDlcInstalled( AppId_t appID ) + internal bool BIsDlcInstalled( AppId appID ) { return _BIsDlcInstalled( Self, appID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate uint FGetEarliestPurchaseUnixTime( IntPtr self, AppId_t nAppID ); + private delegate uint FGetEarliestPurchaseUnixTime( IntPtr self, AppId nAppID ); private FGetEarliestPurchaseUnixTime _GetEarliestPurchaseUnixTime; #endregion - internal uint GetEarliestPurchaseUnixTime( AppId_t nAppID ) + internal uint GetEarliestPurchaseUnixTime( AppId nAppID ) { return _GetEarliestPurchaseUnixTime( Self, nAppID ); } @@ -178,44 +178,44 @@ internal int GetDLCCount() #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool FBGetDLCDataByIndex( IntPtr self, int iDLC, ref AppId_t pAppID, [MarshalAs( UnmanagedType.U1 )] ref bool pbAvailable, StringBuilder pchName, int cchNameBufferSize ); + private delegate bool FBGetDLCDataByIndex( IntPtr self, int iDLC, ref AppId pAppID, [MarshalAs( UnmanagedType.U1 )] ref bool pbAvailable, StringBuilder pchName, int cchNameBufferSize ); private FBGetDLCDataByIndex _BGetDLCDataByIndex; #endregion - internal bool BGetDLCDataByIndex( int iDLC, ref AppId_t pAppID, [MarshalAs( UnmanagedType.U1 )] ref bool pbAvailable, StringBuilder pchName, int cchNameBufferSize ) + internal bool BGetDLCDataByIndex( int iDLC, ref AppId pAppID, [MarshalAs( UnmanagedType.U1 )] ref bool pbAvailable, StringBuilder pchName, int cchNameBufferSize ) { return _BGetDLCDataByIndex( Self, iDLC, ref pAppID, ref pbAvailable, pchName, cchNameBufferSize ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void FInstallDLC( IntPtr self, AppId_t nAppID ); + private delegate void FInstallDLC( IntPtr self, AppId nAppID ); private FInstallDLC _InstallDLC; #endregion - internal void InstallDLC( AppId_t nAppID ) + internal void InstallDLC( AppId nAppID ) { _InstallDLC( Self, nAppID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void FUninstallDLC( IntPtr self, AppId_t nAppID ); + private delegate void FUninstallDLC( IntPtr self, AppId nAppID ); private FUninstallDLC _UninstallDLC; #endregion - internal void UninstallDLC( AppId_t nAppID ) + internal void UninstallDLC( AppId nAppID ) { _UninstallDLC( Self, nAppID ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void FRequestAppProofOfPurchaseKey( IntPtr self, AppId_t nAppID ); + private delegate void FRequestAppProofOfPurchaseKey( IntPtr self, AppId nAppID ); private FRequestAppProofOfPurchaseKey _RequestAppProofOfPurchaseKey; #endregion - internal void RequestAppProofOfPurchaseKey( AppId_t nAppID ) + internal void RequestAppProofOfPurchaseKey( AppId nAppID ) { _RequestAppProofOfPurchaseKey( Self, nAppID ); } @@ -246,22 +246,22 @@ internal bool MarkContentCorrupt( [MarshalAs( UnmanagedType.U1 )] bool bMissingF #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate uint FGetInstalledDepots( IntPtr self, AppId_t appID, [In,Out] DepotId_t[] pvecDepots, uint cMaxDepots ); + private delegate uint FGetInstalledDepots( IntPtr self, AppId appID, [In,Out] DepotId_t[] pvecDepots, uint cMaxDepots ); private FGetInstalledDepots _GetInstalledDepots; #endregion - internal uint GetInstalledDepots( AppId_t appID, [In,Out] DepotId_t[] pvecDepots, uint cMaxDepots ) + internal uint GetInstalledDepots( AppId appID, [In,Out] DepotId_t[] pvecDepots, uint cMaxDepots ) { return _GetInstalledDepots( Self, appID, pvecDepots, cMaxDepots ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate uint FGetAppInstallDir( IntPtr self, AppId_t appID, StringBuilder pchFolder, uint cchFolderBufferSize ); + private delegate uint FGetAppInstallDir( IntPtr self, AppId appID, StringBuilder pchFolder, uint cchFolderBufferSize ); private FGetAppInstallDir _GetAppInstallDir; #endregion - internal uint GetAppInstallDir( AppId_t appID, StringBuilder pchFolder, uint cchFolderBufferSize ) + internal uint GetAppInstallDir( AppId appID, StringBuilder pchFolder, uint cchFolderBufferSize ) { return _GetAppInstallDir( Self, appID, pchFolder, cchFolderBufferSize ); } @@ -269,11 +269,11 @@ internal uint GetAppInstallDir( AppId_t appID, StringBuilder pchFolder, uint cch #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool FBIsAppInstalled( IntPtr self, AppId_t appID ); + private delegate bool FBIsAppInstalled( IntPtr self, AppId appID ); private FBIsAppInstalled _BIsAppInstalled; #endregion - internal bool BIsAppInstalled( AppId_t appID ) + internal bool BIsAppInstalled( AppId appID ) { return _BIsAppInstalled( Self, appID ); } @@ -305,11 +305,11 @@ internal string GetLaunchQueryParam( string pchKey ) #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool FGetDlcDownloadProgress( IntPtr self, AppId_t nAppID, ref ulong punBytesDownloaded, ref ulong punBytesTotal ); + private delegate bool FGetDlcDownloadProgress( IntPtr self, AppId nAppID, ref ulong punBytesDownloaded, ref ulong punBytesTotal ); private FGetDlcDownloadProgress _GetDlcDownloadProgress; #endregion - internal bool GetDlcDownloadProgress( AppId_t nAppID, ref ulong punBytesDownloaded, ref ulong punBytesTotal ) + internal bool GetDlcDownloadProgress( AppId nAppID, ref ulong punBytesDownloaded, ref ulong punBytesTotal ) { return _GetDlcDownloadProgress( Self, nAppID, ref punBytesDownloaded, ref punBytesTotal ); } diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamFriends.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamFriends.cs index 25d2de8..d7cdea8 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamFriends.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamFriends.cs @@ -445,11 +445,11 @@ internal void ActivateGameOverlayToWebPage( string pchURL, ActivateGameOverlayTo #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void FActivateGameOverlayToStore( IntPtr self, AppId_t nAppID, OverlayToStoreFlag eFlag ); + private delegate void FActivateGameOverlayToStore( IntPtr self, AppId nAppID, OverlayToStoreFlag eFlag ); private FActivateGameOverlayToStore _ActivateGameOverlayToStore; #endregion - internal void ActivateGameOverlayToStore( AppId_t nAppID, OverlayToStoreFlag eFlag ) + internal void ActivateGameOverlayToStore( AppId nAppID, OverlayToStoreFlag eFlag ) { _ActivateGameOverlayToStore( Self, nAppID, eFlag ); } @@ -696,11 +696,11 @@ internal int GetFriendCoplayTime( SteamId steamIDFriend ) #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate AppId_t FGetFriendCoplayGame( IntPtr self, SteamId steamIDFriend ); + private delegate AppId FGetFriendCoplayGame( IntPtr self, SteamId steamIDFriend ); private FGetFriendCoplayGame _GetFriendCoplayGame; #endregion - internal AppId_t GetFriendCoplayGame( SteamId steamIDFriend ) + internal AppId GetFriendCoplayGame( SteamId steamIDFriend ) { return _GetFriendCoplayGame( Self, steamIDFriend ); } diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamGameServer.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamGameServer.cs index 5a71bdd..db98f8b 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamGameServer.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamGameServer.cs @@ -66,11 +66,11 @@ public override void InitInternals() #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool FInitGameServer( IntPtr self, uint unIP, ushort usGamePort, ushort usQueryPort, uint unFlags, AppId_t nGameAppId, string pchVersionString ); + private delegate bool FInitGameServer( IntPtr self, uint unIP, ushort usGamePort, ushort usQueryPort, uint unFlags, AppId nGameAppId, string pchVersionString ); private FInitGameServer _InitGameServer; #endregion - internal bool InitGameServer( uint unIP, ushort usGamePort, ushort usQueryPort, uint unFlags, AppId_t nGameAppId, string pchVersionString ) + internal bool InitGameServer( uint unIP, ushort usGamePort, ushort usQueryPort, uint unFlags, AppId nGameAppId, string pchVersionString ) { return _InitGameServer( Self, unIP, usGamePort, usQueryPort, unFlags, nGameAppId, pchVersionString ); } @@ -427,11 +427,11 @@ internal void CancelAuthTicket( HAuthTicket hAuthTicket ) #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate UserHasLicenseForAppResult FUserHasLicenseForApp( IntPtr self, SteamId steamID, AppId_t appID ); + private delegate UserHasLicenseForAppResult FUserHasLicenseForApp( IntPtr self, SteamId steamID, AppId appID ); private FUserHasLicenseForApp _UserHasLicenseForApp; #endregion - internal UserHasLicenseForAppResult UserHasLicenseForApp( SteamId steamID, AppId_t appID ) + internal UserHasLicenseForAppResult UserHasLicenseForApp( SteamId steamID, AppId appID ) { return _UserHasLicenseForApp( Self, steamID, appID ); } diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingServers.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingServers.cs index 46f873b..4d89041 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingServers.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamMatchmakingServers.cs @@ -38,66 +38,66 @@ public override void InitInternals() #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate HServerListRequest FRequestInternetServerList( IntPtr self, AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ); + private delegate HServerListRequest FRequestInternetServerList( IntPtr self, AppId iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ); private FRequestInternetServerList _RequestInternetServerList; #endregion - internal HServerListRequest RequestInternetServerList( AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ) + internal HServerListRequest RequestInternetServerList( AppId iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ) { return _RequestInternetServerList( Self, iApp, ref ppchFilters, nFilters, pRequestServersResponse ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate HServerListRequest FRequestLANServerList( IntPtr self, AppId_t iApp, IntPtr pRequestServersResponse ); + private delegate HServerListRequest FRequestLANServerList( IntPtr self, AppId iApp, IntPtr pRequestServersResponse ); private FRequestLANServerList _RequestLANServerList; #endregion - internal HServerListRequest RequestLANServerList( AppId_t iApp, IntPtr pRequestServersResponse ) + internal HServerListRequest RequestLANServerList( AppId iApp, IntPtr pRequestServersResponse ) { return _RequestLANServerList( Self, iApp, pRequestServersResponse ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate HServerListRequest FRequestFriendsServerList( IntPtr self, AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ); + private delegate HServerListRequest FRequestFriendsServerList( IntPtr self, AppId iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ); private FRequestFriendsServerList _RequestFriendsServerList; #endregion - internal HServerListRequest RequestFriendsServerList( AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ) + internal HServerListRequest RequestFriendsServerList( AppId iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ) { return _RequestFriendsServerList( Self, iApp, ref ppchFilters, nFilters, pRequestServersResponse ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate HServerListRequest FRequestFavoritesServerList( IntPtr self, AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ); + private delegate HServerListRequest FRequestFavoritesServerList( IntPtr self, AppId iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ); private FRequestFavoritesServerList _RequestFavoritesServerList; #endregion - internal HServerListRequest RequestFavoritesServerList( AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ) + internal HServerListRequest RequestFavoritesServerList( AppId iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ) { return _RequestFavoritesServerList( Self, iApp, ref ppchFilters, nFilters, pRequestServersResponse ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate HServerListRequest FRequestHistoryServerList( IntPtr self, AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ); + private delegate HServerListRequest FRequestHistoryServerList( IntPtr self, AppId iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ); private FRequestHistoryServerList _RequestHistoryServerList; #endregion - internal HServerListRequest RequestHistoryServerList( AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ) + internal HServerListRequest RequestHistoryServerList( AppId iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ) { return _RequestHistoryServerList( Self, iApp, ref ppchFilters, nFilters, pRequestServersResponse ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate HServerListRequest FRequestSpectatorServerList( IntPtr self, AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ); + private delegate HServerListRequest FRequestSpectatorServerList( IntPtr self, AppId iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ); private FRequestSpectatorServerList _RequestSpectatorServerList; #endregion - internal HServerListRequest RequestSpectatorServerList( AppId_t iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ) + internal HServerListRequest RequestSpectatorServerList( AppId iApp, [In,Out] ref MatchMakingKeyValuePair_t[] ppchFilters, uint nFilters, IntPtr pRequestServersResponse ) { return _RequestSpectatorServerList( Self, iApp, ref ppchFilters, nFilters, pRequestServersResponse ); } diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamParentalSettings.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamParentalSettings.cs index ce13528..cd02329 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamParentalSettings.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamParentalSettings.cs @@ -52,11 +52,11 @@ internal bool BIsParentalLockLocked() #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool FBIsAppBlocked( IntPtr self, AppId_t nAppID ); + private delegate bool FBIsAppBlocked( IntPtr self, AppId nAppID ); private FBIsAppBlocked _BIsAppBlocked; #endregion - internal bool BIsAppBlocked( AppId_t nAppID ) + internal bool BIsAppBlocked( AppId nAppID ) { return _BIsAppBlocked( Self, nAppID ); } @@ -64,11 +64,11 @@ internal bool BIsAppBlocked( AppId_t nAppID ) #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool FBIsAppInBlockList( IntPtr self, AppId_t nAppID ); + private delegate bool FBIsAppInBlockList( IntPtr self, AppId nAppID ); private FBIsAppInBlockList _BIsAppInBlockList; #endregion - internal bool BIsAppInBlockList( AppId_t nAppID ) + internal bool BIsAppInBlockList( AppId nAppID ) { return _BIsAppInBlockList( Self, nAppID ); } diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamUGC.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamUGC.cs index 2a132e8..eb02ee5 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamUGC.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamUGC.cs @@ -97,33 +97,33 @@ public override void InitInternals() #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate UGCQueryHandle_t FCreateQueryUserUGCRequest( IntPtr self, AccountID_t unAccountID, UserUGCList eListType, UgcType eMatchingUGCType, UserUGCListSortOrder eSortOrder, AppId_t nCreatorAppID, AppId_t nConsumerAppID, uint unPage ); + private delegate UGCQueryHandle_t FCreateQueryUserUGCRequest( IntPtr self, AccountID_t unAccountID, UserUGCList eListType, UgcType eMatchingUGCType, UserUGCListSortOrder eSortOrder, AppId nCreatorAppID, AppId nConsumerAppID, uint unPage ); private FCreateQueryUserUGCRequest _CreateQueryUserUGCRequest; #endregion - internal UGCQueryHandle_t CreateQueryUserUGCRequest( AccountID_t unAccountID, UserUGCList eListType, UgcType eMatchingUGCType, UserUGCListSortOrder eSortOrder, AppId_t nCreatorAppID, AppId_t nConsumerAppID, uint unPage ) + internal UGCQueryHandle_t CreateQueryUserUGCRequest( AccountID_t unAccountID, UserUGCList eListType, UgcType eMatchingUGCType, UserUGCListSortOrder eSortOrder, AppId nCreatorAppID, AppId nConsumerAppID, uint unPage ) { return _CreateQueryUserUGCRequest( Self, unAccountID, eListType, eMatchingUGCType, eSortOrder, nCreatorAppID, nConsumerAppID, unPage ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate UGCQueryHandle_t FCreateQueryAllUGCRequest1( IntPtr self, UGCQuery eQueryType, UgcType eMatchingeMatchingUGCTypeFileType, AppId_t nCreatorAppID, AppId_t nConsumerAppID, uint unPage ); + private delegate UGCQueryHandle_t FCreateQueryAllUGCRequest1( IntPtr self, UGCQuery eQueryType, UgcType eMatchingeMatchingUGCTypeFileType, AppId nCreatorAppID, AppId nConsumerAppID, uint unPage ); private FCreateQueryAllUGCRequest1 _CreateQueryAllUGCRequest1; #endregion - internal UGCQueryHandle_t CreateQueryAllUGCRequest1( UGCQuery eQueryType, UgcType eMatchingeMatchingUGCTypeFileType, AppId_t nCreatorAppID, AppId_t nConsumerAppID, uint unPage ) + internal UGCQueryHandle_t CreateQueryAllUGCRequest1( UGCQuery eQueryType, UgcType eMatchingeMatchingUGCTypeFileType, AppId nCreatorAppID, AppId nConsumerAppID, uint unPage ) { return _CreateQueryAllUGCRequest1( Self, eQueryType, eMatchingeMatchingUGCTypeFileType, nCreatorAppID, nConsumerAppID, unPage ); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate UGCQueryHandle_t FCreateQueryAllUGCRequest2( IntPtr self, UGCQuery eQueryType, UgcType eMatchingeMatchingUGCTypeFileType, AppId_t nCreatorAppID, AppId_t nConsumerAppID, string pchCursor ); + private delegate UGCQueryHandle_t FCreateQueryAllUGCRequest2( IntPtr self, UGCQuery eQueryType, UgcType eMatchingeMatchingUGCTypeFileType, AppId nCreatorAppID, AppId nConsumerAppID, string pchCursor ); private FCreateQueryAllUGCRequest2 _CreateQueryAllUGCRequest2; #endregion - internal UGCQueryHandle_t CreateQueryAllUGCRequest2( UGCQuery eQueryType, UgcType eMatchingeMatchingUGCTypeFileType, AppId_t nCreatorAppID, AppId_t nConsumerAppID, string pchCursor ) + internal UGCQueryHandle_t CreateQueryAllUGCRequest2( UGCQuery eQueryType, UgcType eMatchingeMatchingUGCTypeFileType, AppId nCreatorAppID, AppId nConsumerAppID, string pchCursor ) { return _CreateQueryAllUGCRequest2( Self, eQueryType, eMatchingeMatchingUGCTypeFileType, nCreatorAppID, nConsumerAppID, pchCursor ); } @@ -485,22 +485,22 @@ internal bool AddRequiredKeyValueTag( UGCQueryHandle_t handle, string pKey, stri #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t FCreateItem( IntPtr self, AppId_t nConsumerAppId, WorkshopFileType eFileType ); + private delegate SteamAPICall_t FCreateItem( IntPtr self, AppId nConsumerAppId, WorkshopFileType eFileType ); private FCreateItem _CreateItem; #endregion - internal async Task CreateItem( AppId_t nConsumerAppId, WorkshopFileType eFileType ) + internal async Task CreateItem( AppId nConsumerAppId, WorkshopFileType eFileType ) { return await (new Result( _CreateItem( Self, nConsumerAppId, eFileType ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate UGCUpdateHandle_t FStartItemUpdate( IntPtr self, AppId_t nConsumerAppId, PublishedFileId nPublishedFileID ); + private delegate UGCUpdateHandle_t FStartItemUpdate( IntPtr self, AppId nConsumerAppId, PublishedFileId nPublishedFileID ); private FStartItemUpdate _StartItemUpdate; #endregion - internal UGCUpdateHandle_t StartItemUpdate( AppId_t nConsumerAppId, PublishedFileId nPublishedFileID ) + internal UGCUpdateHandle_t StartItemUpdate( AppId nConsumerAppId, PublishedFileId nPublishedFileID ) { return _StartItemUpdate( Self, nConsumerAppId, nPublishedFileID ); } @@ -743,22 +743,22 @@ internal ItemUpdateStatus GetItemUpdateProgress( UGCUpdateHandle_t handle, ref u #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t FAddItemToFavorites( IntPtr self, AppId_t nAppId, PublishedFileId nPublishedFileID ); + private delegate SteamAPICall_t FAddItemToFavorites( IntPtr self, AppId nAppId, PublishedFileId nPublishedFileID ); private FAddItemToFavorites _AddItemToFavorites; #endregion - internal async Task AddItemToFavorites( AppId_t nAppId, PublishedFileId nPublishedFileID ) + internal async Task AddItemToFavorites( AppId nAppId, PublishedFileId nPublishedFileID ) { return await (new Result( _AddItemToFavorites( Self, nAppId, nPublishedFileID ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t FRemoveItemFromFavorites( IntPtr self, AppId_t nAppId, PublishedFileId nPublishedFileID ); + private delegate SteamAPICall_t FRemoveItemFromFavorites( IntPtr self, AppId nAppId, PublishedFileId nPublishedFileID ); private FRemoveItemFromFavorites _RemoveItemFromFavorites; #endregion - internal async Task RemoveItemFromFavorites( AppId_t nAppId, PublishedFileId nPublishedFileID ) + internal async Task RemoveItemFromFavorites( AppId nAppId, PublishedFileId nPublishedFileID ) { return await (new Result( _RemoveItemFromFavorites( Self, nAppId, nPublishedFileID ) )).GetResult(); } @@ -934,22 +934,22 @@ internal void SuspendDownloads( [MarshalAs( UnmanagedType.U1 )] bool bSuspend ) #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t FAddAppDependency( IntPtr self, PublishedFileId nPublishedFileID, AppId_t nAppID ); + private delegate SteamAPICall_t FAddAppDependency( IntPtr self, PublishedFileId nPublishedFileID, AppId nAppID ); private FAddAppDependency _AddAppDependency; #endregion - internal async Task AddAppDependency( PublishedFileId nPublishedFileID, AppId_t nAppID ) + internal async Task AddAppDependency( PublishedFileId nPublishedFileID, AppId nAppID ) { return await (new Result( _AddAppDependency( Self, nPublishedFileID, nAppID ) )).GetResult(); } #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate SteamAPICall_t FRemoveAppDependency( IntPtr self, PublishedFileId nPublishedFileID, AppId_t nAppID ); + private delegate SteamAPICall_t FRemoveAppDependency( IntPtr self, PublishedFileId nPublishedFileID, AppId nAppID ); private FRemoveAppDependency _RemoveAppDependency; #endregion - internal async Task RemoveAppDependency( PublishedFileId nPublishedFileID, AppId_t nAppID ) + internal async Task RemoveAppDependency( PublishedFileId nPublishedFileID, AppId nAppID ) { return await (new Result( _RemoveAppDependency( Self, nPublishedFileID, nAppID ) )).GetResult(); } diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamUser.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamUser.cs index ce4f29c..f2ef301 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamUser.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamUser.cs @@ -242,11 +242,11 @@ internal void CancelAuthTicket( HAuthTicket hAuthTicket ) #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate UserHasLicenseForAppResult FUserHasLicenseForApp( IntPtr self, SteamId steamID, AppId_t appID ); + private delegate UserHasLicenseForAppResult FUserHasLicenseForApp( IntPtr self, SteamId steamID, AppId appID ); private FUserHasLicenseForApp _UserHasLicenseForApp; #endregion - internal UserHasLicenseForAppResult UserHasLicenseForApp( SteamId steamID, AppId_t appID ) + internal UserHasLicenseForAppResult UserHasLicenseForApp( SteamId steamID, AppId appID ) { return _UserHasLicenseForApp( Self, steamID, appID ); } diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamVideo.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamVideo.cs index 1107826..13a03f3 100644 --- a/Facepunch.Steamworks/Generated/Interfaces/ISteamVideo.cs +++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamVideo.cs @@ -25,11 +25,11 @@ public override void InitInternals() #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void FGetVideoURL( IntPtr self, AppId_t unVideoAppID ); + private delegate void FGetVideoURL( IntPtr self, AppId unVideoAppID ); private FGetVideoURL _GetVideoURL; #endregion - internal void GetVideoURL( AppId_t unVideoAppID ) + internal void GetVideoURL( AppId unVideoAppID ) { _GetVideoURL( Self, unVideoAppID ); } @@ -48,11 +48,11 @@ internal bool IsBroadcasting( ref int pnNumViewers ) #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] - private delegate void FGetOPFSettings( IntPtr self, AppId_t unVideoAppID ); + private delegate void FGetOPFSettings( IntPtr self, AppId unVideoAppID ); private FGetOPFSettings _GetOPFSettings; #endregion - internal void GetOPFSettings( AppId_t unVideoAppID ) + internal void GetOPFSettings( AppId unVideoAppID ) { _GetOPFSettings( Self, unVideoAppID ); } @@ -60,11 +60,11 @@ internal void GetOPFSettings( AppId_t unVideoAppID ) #region FunctionMeta [UnmanagedFunctionPointer( CallingConvention.ThisCall )] [return: MarshalAs( UnmanagedType.I1 )] - private delegate bool FGetOPFStringForApp( IntPtr self, AppId_t unVideoAppID, StringBuilder pchBuffer, ref int pnBufferSize ); + private delegate bool FGetOPFStringForApp( IntPtr self, AppId unVideoAppID, StringBuilder pchBuffer, ref int pnBufferSize ); private FGetOPFStringForApp _GetOPFStringForApp; #endregion - internal bool GetOPFStringForApp( AppId_t unVideoAppID, StringBuilder pchBuffer, ref int pnBufferSize ) + internal bool GetOPFStringForApp( AppId unVideoAppID, StringBuilder pchBuffer, ref int pnBufferSize ) { return _GetOPFStringForApp( Self, unVideoAppID, pchBuffer, ref pnBufferSize ); } diff --git a/Facepunch.Steamworks/Generated/SteamStructs.cs b/Facepunch.Steamworks/Generated/SteamStructs.cs index 3eee820..ff43efb 100644 --- a/Facepunch.Steamworks/Generated/SteamStructs.cs +++ b/Facepunch.Steamworks/Generated/SteamStructs.cs @@ -645,7 +645,7 @@ public struct Pack8 internal struct FriendRichPresenceUpdate_t : Steamworks.ISteamCallback { internal ulong SteamIDFriend; // m_steamIDFriend class CSteamID - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t #region ISteamCallback public int GetCallbackId() => CallbackIdentifiers.SteamFriends + 36; @@ -657,7 +657,7 @@ internal struct FriendRichPresenceUpdate_t : Steamworks.ISteamCallback public struct Pack4 { internal ulong SteamIDFriend; // m_steamIDFriend class CSteamID - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t public static implicit operator FriendRichPresenceUpdate_t ( FriendRichPresenceUpdate_t.Pack4 d ) => new FriendRichPresenceUpdate_t{ SteamIDFriend = d.SteamIDFriend,AppID = d.AppID, }; } @@ -666,7 +666,7 @@ public struct Pack4 public struct Pack8 { internal ulong SteamIDFriend; // m_steamIDFriend class CSteamID - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t public static implicit operator FriendRichPresenceUpdate_t ( FriendRichPresenceUpdate_t.Pack8 d ) => new FriendRichPresenceUpdate_t{ SteamIDFriend = d.SteamIDFriend,AppID = d.AppID, }; } @@ -2246,7 +2246,7 @@ public struct Pack8 internal struct RemoteStorageAppSyncedClient_t : Steamworks.ISteamCallback { - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t internal Result Result; // m_eResult enum EResult internal int NumDownloads; // m_unNumDownloads int @@ -2259,7 +2259,7 @@ internal struct RemoteStorageAppSyncedClient_t : Steamworks.ISteamCallback [StructLayout( LayoutKind.Sequential, Pack = 4 )] public struct Pack4 { - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t internal Result Result; // m_eResult enum EResult internal int NumDownloads; // m_unNumDownloads int @@ -2269,7 +2269,7 @@ public struct Pack4 [StructLayout( LayoutKind.Sequential, Pack = 8 )] public struct Pack8 { - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t internal Result Result; // m_eResult enum EResult internal int NumDownloads; // m_unNumDownloads int @@ -2280,7 +2280,7 @@ public struct Pack8 internal struct RemoteStorageAppSyncedServer_t : Steamworks.ISteamCallback { - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t internal Result Result; // m_eResult enum EResult internal int NumUploads; // m_unNumUploads int @@ -2293,7 +2293,7 @@ internal struct RemoteStorageAppSyncedServer_t : Steamworks.ISteamCallback [StructLayout( LayoutKind.Sequential, Pack = 4 )] public struct Pack4 { - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t internal Result Result; // m_eResult enum EResult internal int NumUploads; // m_unNumUploads int @@ -2303,7 +2303,7 @@ public struct Pack4 [StructLayout( LayoutKind.Sequential, Pack = 8 )] public struct Pack8 { - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t internal Result Result; // m_eResult enum EResult internal int NumUploads; // m_unNumUploads int @@ -2316,7 +2316,7 @@ internal struct RemoteStorageAppSyncProgress_t : Steamworks.ISteamCallback { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] internal string CurrentFile; // m_rgchCurrentFile char [260] - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t internal uint BytesTransferredThisChunk; // m_uBytesTransferredThisChunk uint32 internal double DAppPercentComplete; // m_dAppPercentComplete double [MarshalAs(UnmanagedType.I1)] @@ -2333,7 +2333,7 @@ public struct Pack4 { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] internal string CurrentFile; // m_rgchCurrentFile char [260] - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t internal uint BytesTransferredThisChunk; // m_uBytesTransferredThisChunk uint32 internal double DAppPercentComplete; // m_dAppPercentComplete double [MarshalAs(UnmanagedType.I1)] @@ -2347,7 +2347,7 @@ public struct Pack8 { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] internal string CurrentFile; // m_rgchCurrentFile char [260] - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t internal uint BytesTransferredThisChunk; // m_uBytesTransferredThisChunk uint32 internal double DAppPercentComplete; // m_dAppPercentComplete double [MarshalAs(UnmanagedType.I1)] @@ -2360,7 +2360,7 @@ public struct Pack8 internal struct RemoteStorageAppSyncStatusCheck_t : Steamworks.ISteamCallback { - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t internal Result Result; // m_eResult enum EResult #region ISteamCallback @@ -2372,7 +2372,7 @@ internal struct RemoteStorageAppSyncStatusCheck_t : Steamworks.ISteamCallback [StructLayout( LayoutKind.Sequential, Pack = 4 )] public struct Pack4 { - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t internal Result Result; // m_eResult enum EResult public static implicit operator RemoteStorageAppSyncStatusCheck_t ( RemoteStorageAppSyncStatusCheck_t.Pack4 d ) => new RemoteStorageAppSyncStatusCheck_t{ AppID = d.AppID,Result = d.Result, }; @@ -2381,7 +2381,7 @@ public struct Pack4 [StructLayout( LayoutKind.Sequential, Pack = 8 )] public struct Pack8 { - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t internal Result Result; // m_eResult enum EResult public static implicit operator RemoteStorageAppSyncStatusCheck_t ( RemoteStorageAppSyncStatusCheck_t.Pack8 d ) => new RemoteStorageAppSyncStatusCheck_t{ AppID = d.AppID,Result = d.Result, }; @@ -2683,7 +2683,7 @@ internal struct RemoteStorageDownloadUGCResult_t : Steamworks.ISteamCallback { internal Result Result; // m_eResult enum EResult internal ulong File; // m_hFile UGCHandle_t - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t internal int SizeInBytes; // m_nSizeInBytes int32 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] internal string PchFileName; // m_pchFileName char [260] @@ -2700,7 +2700,7 @@ public struct Pack4 { internal Result Result; // m_eResult enum EResult internal ulong File; // m_hFile UGCHandle_t - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t internal int SizeInBytes; // m_nSizeInBytes int32 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] internal string PchFileName; // m_pchFileName char [260] @@ -2714,7 +2714,7 @@ public struct Pack8 { internal Result Result; // m_eResult enum EResult internal ulong File; // m_hFile UGCHandle_t - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t internal int SizeInBytes; // m_nSizeInBytes int32 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] internal string PchFileName; // m_pchFileName char [260] @@ -2729,8 +2729,8 @@ internal struct RemoteStorageGetPublishedFileDetailsResult_t : Steamworks.ISteam { internal Result Result; // m_eResult enum EResult internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t - internal uint CreatorAppID; // m_nCreatorAppID AppId_t - internal uint ConsumerAppID; // m_nConsumerAppID AppId_t + internal AppId CreatorAppID; // m_nCreatorAppID AppId_t + internal AppId ConsumerAppID; // m_nConsumerAppID AppId_t [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 129)] internal string Title; // m_rgchTitle char [129] [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8000)] @@ -2768,8 +2768,8 @@ public struct Pack4 { internal Result Result; // m_eResult enum EResult internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t - internal uint CreatorAppID; // m_nCreatorAppID AppId_t - internal uint ConsumerAppID; // m_nConsumerAppID AppId_t + internal AppId CreatorAppID; // m_nCreatorAppID AppId_t + internal AppId ConsumerAppID; // m_nConsumerAppID AppId_t [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 129)] internal string Title; // m_rgchTitle char [129] [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8000)] @@ -2804,8 +2804,8 @@ public struct Pack8 { internal Result Result; // m_eResult enum EResult internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t - internal uint CreatorAppID; // m_nCreatorAppID AppId_t - internal uint ConsumerAppID; // m_nConsumerAppID AppId_t + internal AppId CreatorAppID; // m_nCreatorAppID AppId_t + internal AppId ConsumerAppID; // m_nConsumerAppID AppId_t [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 129)] internal string Title; // m_rgchTitle char [129] [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8000)] @@ -2846,7 +2846,7 @@ internal struct RemoteStorageEnumerateWorkshopFilesResult_t : Steamworks.ISteamC internal PublishedFileId[] GPublishedFileId; // m_rgPublishedFileId PublishedFileId_t [50] [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50, ArraySubType = UnmanagedType.R4)] internal float[] GScore; // m_rgScore float [50] - internal uint AppId; // m_nAppId AppId_t + internal AppId AppId; // m_nAppId AppId_t internal uint StartIndex; // m_unStartIndex uint32 #region ISteamCallback @@ -2865,7 +2865,7 @@ public struct Pack4 internal PublishedFileId[] GPublishedFileId; // m_rgPublishedFileId PublishedFileId_t [50] [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50, ArraySubType = UnmanagedType.R4)] internal float[] GScore; // m_rgScore float [50] - internal uint AppId; // m_nAppId AppId_t + internal AppId AppId; // m_nAppId AppId_t internal uint StartIndex; // m_unStartIndex uint32 public static implicit operator RemoteStorageEnumerateWorkshopFilesResult_t ( RemoteStorageEnumerateWorkshopFilesResult_t.Pack4 d ) => new RemoteStorageEnumerateWorkshopFilesResult_t{ Result = d.Result,ResultsReturned = d.ResultsReturned,TotalResultCount = d.TotalResultCount,GPublishedFileId = d.GPublishedFileId,GScore = d.GScore,AppId = d.AppId,StartIndex = d.StartIndex, }; @@ -2881,7 +2881,7 @@ public struct Pack8 internal PublishedFileId[] GPublishedFileId; // m_rgPublishedFileId PublishedFileId_t [50] [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50, ArraySubType = UnmanagedType.R4)] internal float[] GScore; // m_rgScore float [50] - internal uint AppId; // m_nAppId AppId_t + internal AppId AppId; // m_nAppId AppId_t internal uint StartIndex; // m_unStartIndex uint32 public static implicit operator RemoteStorageEnumerateWorkshopFilesResult_t ( RemoteStorageEnumerateWorkshopFilesResult_t.Pack8 d ) => new RemoteStorageEnumerateWorkshopFilesResult_t{ Result = d.Result,ResultsReturned = d.ResultsReturned,TotalResultCount = d.TotalResultCount,GPublishedFileId = d.GPublishedFileId,GScore = d.GScore,AppId = d.AppId,StartIndex = d.StartIndex, }; @@ -2935,7 +2935,7 @@ public struct Pack8 internal struct RemoteStoragePublishedFileSubscribed_t : Steamworks.ISteamCallback { internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t #region ISteamCallback public int GetCallbackId() => CallbackIdentifiers.ClientRemoteStorage + 21; @@ -2947,7 +2947,7 @@ internal struct RemoteStoragePublishedFileSubscribed_t : Steamworks.ISteamCallba public struct Pack4 { internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t public static implicit operator RemoteStoragePublishedFileSubscribed_t ( RemoteStoragePublishedFileSubscribed_t.Pack4 d ) => new RemoteStoragePublishedFileSubscribed_t{ PublishedFileId = d.PublishedFileId,AppID = d.AppID, }; } @@ -2956,7 +2956,7 @@ public struct Pack4 public struct Pack8 { internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t public static implicit operator RemoteStoragePublishedFileSubscribed_t ( RemoteStoragePublishedFileSubscribed_t.Pack8 d ) => new RemoteStoragePublishedFileSubscribed_t{ PublishedFileId = d.PublishedFileId,AppID = d.AppID, }; } @@ -2966,7 +2966,7 @@ public struct Pack8 internal struct RemoteStoragePublishedFileUnsubscribed_t : Steamworks.ISteamCallback { internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t #region ISteamCallback public int GetCallbackId() => CallbackIdentifiers.ClientRemoteStorage + 22; @@ -2978,7 +2978,7 @@ internal struct RemoteStoragePublishedFileUnsubscribed_t : Steamworks.ISteamCall public struct Pack4 { internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t public static implicit operator RemoteStoragePublishedFileUnsubscribed_t ( RemoteStoragePublishedFileUnsubscribed_t.Pack4 d ) => new RemoteStoragePublishedFileUnsubscribed_t{ PublishedFileId = d.PublishedFileId,AppID = d.AppID, }; } @@ -2987,7 +2987,7 @@ public struct Pack4 public struct Pack8 { internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t public static implicit operator RemoteStoragePublishedFileUnsubscribed_t ( RemoteStoragePublishedFileUnsubscribed_t.Pack8 d ) => new RemoteStoragePublishedFileUnsubscribed_t{ PublishedFileId = d.PublishedFileId,AppID = d.AppID, }; } @@ -2997,7 +2997,7 @@ public struct Pack8 internal struct RemoteStoragePublishedFileDeleted_t : Steamworks.ISteamCallback { internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t #region ISteamCallback public int GetCallbackId() => CallbackIdentifiers.ClientRemoteStorage + 23; @@ -3009,7 +3009,7 @@ internal struct RemoteStoragePublishedFileDeleted_t : Steamworks.ISteamCallback public struct Pack4 { internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t public static implicit operator RemoteStoragePublishedFileDeleted_t ( RemoteStoragePublishedFileDeleted_t.Pack4 d ) => new RemoteStoragePublishedFileDeleted_t{ PublishedFileId = d.PublishedFileId,AppID = d.AppID, }; } @@ -3018,7 +3018,7 @@ public struct Pack4 public struct Pack8 { internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t public static implicit operator RemoteStoragePublishedFileDeleted_t ( RemoteStoragePublishedFileDeleted_t.Pack8 d ) => new RemoteStoragePublishedFileDeleted_t{ PublishedFileId = d.PublishedFileId,AppID = d.AppID, }; } @@ -3250,7 +3250,7 @@ public struct Pack8 internal struct RemoteStoragePublishedFileUpdated_t : Steamworks.ISteamCallback { internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t internal ulong Unused; // m_ulUnused uint64 #region ISteamCallback @@ -3263,7 +3263,7 @@ internal struct RemoteStoragePublishedFileUpdated_t : Steamworks.ISteamCallback public struct Pack4 { internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t internal ulong Unused; // m_ulUnused uint64 public static implicit operator RemoteStoragePublishedFileUpdated_t ( RemoteStoragePublishedFileUpdated_t.Pack4 d ) => new RemoteStoragePublishedFileUpdated_t{ PublishedFileId = d.PublishedFileId,AppID = d.AppID,Unused = d.Unused, }; @@ -3273,7 +3273,7 @@ public struct Pack4 public struct Pack8 { internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t internal ulong Unused; // m_ulUnused uint64 public static implicit operator RemoteStoragePublishedFileUpdated_t ( RemoteStoragePublishedFileUpdated_t.Pack8 d ) => new RemoteStoragePublishedFileUpdated_t{ PublishedFileId = d.PublishedFileId,AppID = d.AppID,Unused = d.Unused, }; @@ -3835,7 +3835,7 @@ public struct Pack8 internal struct DlcInstalled_t : Steamworks.ISteamCallback { - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t #region ISteamCallback public int GetCallbackId() => CallbackIdentifiers.SteamApps + 5; @@ -3846,7 +3846,7 @@ internal struct DlcInstalled_t : Steamworks.ISteamCallback [StructLayout( LayoutKind.Sequential, Pack = 4 )] public struct Pack4 { - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t public static implicit operator DlcInstalled_t ( DlcInstalled_t.Pack4 d ) => new DlcInstalled_t{ AppID = d.AppID, }; } @@ -3854,7 +3854,7 @@ public struct Pack4 [StructLayout( LayoutKind.Sequential, Pack = 8 )] public struct Pack8 { - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t public static implicit operator DlcInstalled_t ( DlcInstalled_t.Pack8 d ) => new DlcInstalled_t{ AppID = d.AppID, }; } @@ -4465,8 +4465,8 @@ internal struct SteamUGCDetails_t internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t internal Result Result; // m_eResult enum EResult internal WorkshopFileType FileType; // m_eFileType enum EWorkshopFileType - internal uint CreatorAppID; // m_nCreatorAppID AppId_t - internal uint ConsumerAppID; // m_nConsumerAppID AppId_t + internal AppId CreatorAppID; // m_nCreatorAppID AppId_t + internal AppId ConsumerAppID; // m_nConsumerAppID AppId_t [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 129)] internal string Title; // m_rgchTitle char [129] [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8000)] @@ -4508,8 +4508,8 @@ public struct Pack4 internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t internal Result Result; // m_eResult enum EResult internal WorkshopFileType FileType; // m_eFileType enum EWorkshopFileType - internal uint CreatorAppID; // m_nCreatorAppID AppId_t - internal uint ConsumerAppID; // m_nConsumerAppID AppId_t + internal AppId CreatorAppID; // m_nCreatorAppID AppId_t + internal AppId ConsumerAppID; // m_nConsumerAppID AppId_t [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 129)] internal string Title; // m_rgchTitle char [129] [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8000)] @@ -4549,8 +4549,8 @@ public struct Pack8 internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t internal Result Result; // m_eResult enum EResult internal WorkshopFileType FileType; // m_eFileType enum EWorkshopFileType - internal uint CreatorAppID; // m_nCreatorAppID AppId_t - internal uint ConsumerAppID; // m_nConsumerAppID AppId_t + internal AppId CreatorAppID; // m_nCreatorAppID AppId_t + internal AppId ConsumerAppID; // m_nConsumerAppID AppId_t [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 129)] internal string Title; // m_rgchTitle char [129] [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8000)] @@ -4745,7 +4745,7 @@ public struct Pack8 internal struct DownloadItemResult_t : Steamworks.ISteamCallback { - internal uint AppID; // m_unAppID AppId_t + internal AppId AppID; // m_unAppID AppId_t internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t internal Result Result; // m_eResult enum EResult @@ -4758,7 +4758,7 @@ internal struct DownloadItemResult_t : Steamworks.ISteamCallback [StructLayout( LayoutKind.Sequential, Pack = 4 )] public struct Pack4 { - internal uint AppID; // m_unAppID AppId_t + internal AppId AppID; // m_unAppID AppId_t internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t internal Result Result; // m_eResult enum EResult @@ -4768,7 +4768,7 @@ public struct Pack4 [StructLayout( LayoutKind.Sequential, Pack = 8 )] public struct Pack8 { - internal uint AppID; // m_unAppID AppId_t + internal AppId AppID; // m_unAppID AppId_t internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t internal Result Result; // m_eResult enum EResult @@ -5028,7 +5028,7 @@ internal struct AddAppDependencyResult_t : Steamworks.ISteamCallback { internal Result Result; // m_eResult enum EResult internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t #region ISteamCallback public int GetCallbackId() => CallbackIdentifiers.ClientUGC + 14; @@ -5041,7 +5041,7 @@ public struct Pack4 { internal Result Result; // m_eResult enum EResult internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t public static implicit operator AddAppDependencyResult_t ( AddAppDependencyResult_t.Pack4 d ) => new AddAppDependencyResult_t{ Result = d.Result,PublishedFileId = d.PublishedFileId,AppID = d.AppID, }; } @@ -5051,7 +5051,7 @@ public struct Pack8 { internal Result Result; // m_eResult enum EResult internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t public static implicit operator AddAppDependencyResult_t ( AddAppDependencyResult_t.Pack8 d ) => new AddAppDependencyResult_t{ Result = d.Result,PublishedFileId = d.PublishedFileId,AppID = d.AppID, }; } @@ -5062,7 +5062,7 @@ internal struct RemoveAppDependencyResult_t : Steamworks.ISteamCallback { internal Result Result; // m_eResult enum EResult internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t #region ISteamCallback public int GetCallbackId() => CallbackIdentifiers.ClientUGC + 15; @@ -5075,7 +5075,7 @@ public struct Pack4 { internal Result Result; // m_eResult enum EResult internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t public static implicit operator RemoveAppDependencyResult_t ( RemoveAppDependencyResult_t.Pack4 d ) => new RemoveAppDependencyResult_t{ Result = d.Result,PublishedFileId = d.PublishedFileId,AppID = d.AppID, }; } @@ -5085,7 +5085,7 @@ public struct Pack8 { internal Result Result; // m_eResult enum EResult internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t public static implicit operator RemoveAppDependencyResult_t ( RemoveAppDependencyResult_t.Pack8 d ) => new RemoveAppDependencyResult_t{ Result = d.Result,PublishedFileId = d.PublishedFileId,AppID = d.AppID, }; } @@ -5097,7 +5097,7 @@ internal struct GetAppDependenciesResult_t : Steamworks.ISteamCallback internal Result Result; // m_eResult enum EResult internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32, ArraySubType = UnmanagedType.U4)] - internal AppId_t[] GAppIDs; // m_rgAppIDs AppId_t [32] + internal AppId[] GAppIDs; // m_rgAppIDs AppId_t [32] internal uint NumAppDependencies; // m_nNumAppDependencies uint32 internal uint TotalNumAppDependencies; // m_nTotalNumAppDependencies uint32 @@ -5113,7 +5113,7 @@ public struct Pack4 internal Result Result; // m_eResult enum EResult internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32, ArraySubType = UnmanagedType.U4)] - internal AppId_t[] GAppIDs; // m_rgAppIDs AppId_t [32] + internal AppId[] GAppIDs; // m_rgAppIDs AppId_t [32] internal uint NumAppDependencies; // m_nNumAppDependencies uint32 internal uint TotalNumAppDependencies; // m_nTotalNumAppDependencies uint32 @@ -5126,7 +5126,7 @@ public struct Pack8 internal Result Result; // m_eResult enum EResult internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32, ArraySubType = UnmanagedType.U4)] - internal AppId_t[] GAppIDs; // m_rgAppIDs AppId_t [32] + internal AppId[] GAppIDs; // m_rgAppIDs AppId_t [32] internal uint NumAppDependencies; // m_nNumAppDependencies uint32 internal uint TotalNumAppDependencies; // m_nTotalNumAppDependencies uint32 @@ -5168,7 +5168,7 @@ public struct Pack8 internal struct SteamAppInstalled_t : Steamworks.ISteamCallback { - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t #region ISteamCallback public int GetCallbackId() => CallbackIdentifiers.SteamAppList + 1; @@ -5179,7 +5179,7 @@ internal struct SteamAppInstalled_t : Steamworks.ISteamCallback [StructLayout( LayoutKind.Sequential, Pack = 4 )] public struct Pack4 { - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t public static implicit operator SteamAppInstalled_t ( SteamAppInstalled_t.Pack4 d ) => new SteamAppInstalled_t{ AppID = d.AppID, }; } @@ -5187,7 +5187,7 @@ public struct Pack4 [StructLayout( LayoutKind.Sequential, Pack = 8 )] public struct Pack8 { - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t public static implicit operator SteamAppInstalled_t ( SteamAppInstalled_t.Pack8 d ) => new SteamAppInstalled_t{ AppID = d.AppID, }; } @@ -5196,7 +5196,7 @@ public struct Pack8 internal struct SteamAppUninstalled_t : Steamworks.ISteamCallback { - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t #region ISteamCallback public int GetCallbackId() => CallbackIdentifiers.SteamAppList + 2; @@ -5207,7 +5207,7 @@ internal struct SteamAppUninstalled_t : Steamworks.ISteamCallback [StructLayout( LayoutKind.Sequential, Pack = 4 )] public struct Pack4 { - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t public static implicit operator SteamAppUninstalled_t ( SteamAppUninstalled_t.Pack4 d ) => new SteamAppUninstalled_t{ AppID = d.AppID, }; } @@ -5215,7 +5215,7 @@ public struct Pack4 [StructLayout( LayoutKind.Sequential, Pack = 8 )] public struct Pack8 { - internal uint AppID; // m_nAppID AppId_t + internal AppId AppID; // m_nAppID AppId_t public static implicit operator SteamAppUninstalled_t ( SteamAppUninstalled_t.Pack8 d ) => new SteamAppUninstalled_t{ AppID = d.AppID, }; } @@ -6298,7 +6298,7 @@ public struct Pack8 internal struct GetVideoURLResult_t : Steamworks.ISteamCallback { internal Result Result; // m_eResult enum EResult - internal uint VideoAppID; // m_unVideoAppID AppId_t + internal AppId VideoAppID; // m_unVideoAppID AppId_t [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] internal string URL; // m_rgchURL char [256] @@ -6312,7 +6312,7 @@ internal struct GetVideoURLResult_t : Steamworks.ISteamCallback public struct Pack4 { internal Result Result; // m_eResult enum EResult - internal uint VideoAppID; // m_unVideoAppID AppId_t + internal AppId VideoAppID; // m_unVideoAppID AppId_t [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] internal string URL; // m_rgchURL char [256] @@ -6323,7 +6323,7 @@ public struct Pack4 public struct Pack8 { internal Result Result; // m_eResult enum EResult - internal uint VideoAppID; // m_unVideoAppID AppId_t + internal AppId VideoAppID; // m_unVideoAppID AppId_t [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] internal string URL; // m_rgchURL char [256] @@ -6335,7 +6335,7 @@ public struct Pack8 internal struct GetOPFSettingsResult_t : Steamworks.ISteamCallback { internal Result Result; // m_eResult enum EResult - internal uint VideoAppID; // m_unVideoAppID AppId_t + internal AppId VideoAppID; // m_unVideoAppID AppId_t #region ISteamCallback public int GetCallbackId() => CallbackIdentifiers.ClientVideo + 24; @@ -6347,7 +6347,7 @@ internal struct GetOPFSettingsResult_t : Steamworks.ISteamCallback public struct Pack4 { internal Result Result; // m_eResult enum EResult - internal uint VideoAppID; // m_unVideoAppID AppId_t + internal AppId VideoAppID; // m_unVideoAppID AppId_t public static implicit operator GetOPFSettingsResult_t ( GetOPFSettingsResult_t.Pack4 d ) => new GetOPFSettingsResult_t{ Result = d.Result,VideoAppID = d.VideoAppID, }; } @@ -6356,7 +6356,7 @@ public struct Pack4 public struct Pack8 { internal Result Result; // m_eResult enum EResult - internal uint VideoAppID; // m_unVideoAppID AppId_t + internal AppId VideoAppID; // m_unVideoAppID AppId_t public static implicit operator GetOPFSettingsResult_t ( GetOPFSettingsResult_t.Pack8 d ) => new GetOPFSettingsResult_t{ Result = d.Result,VideoAppID = d.VideoAppID, }; } @@ -6894,7 +6894,7 @@ public struct Pack8 internal struct ItemInstalled_t : Steamworks.ISteamCallback { - internal uint AppID; // m_unAppID AppId_t + internal AppId AppID; // m_unAppID AppId_t internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t #region ISteamCallback @@ -6906,7 +6906,7 @@ internal struct ItemInstalled_t : Steamworks.ISteamCallback [StructLayout( LayoutKind.Sequential, Pack = 4 )] public struct Pack4 { - internal uint AppID; // m_unAppID AppId_t + internal AppId AppID; // m_unAppID AppId_t internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t public static implicit operator ItemInstalled_t ( ItemInstalled_t.Pack4 d ) => new ItemInstalled_t{ AppID = d.AppID,PublishedFileId = d.PublishedFileId, }; @@ -6915,7 +6915,7 @@ public struct Pack4 [StructLayout( LayoutKind.Sequential, Pack = 8 )] public struct Pack8 { - internal uint AppID; // m_unAppID AppId_t + internal AppId AppID; // m_unAppID AppId_t internal PublishedFileId PublishedFileId; // m_nPublishedFileId PublishedFileId_t public static implicit operator ItemInstalled_t ( ItemInstalled_t.Pack8 d ) => new ItemInstalled_t{ AppID = d.AppID,PublishedFileId = d.PublishedFileId, }; diff --git a/Facepunch.Steamworks/Generated/SteamTypes.cs b/Facepunch.Steamworks/Generated/SteamTypes.cs index 7655512..eff3079 100644 --- a/Facepunch.Steamworks/Generated/SteamTypes.cs +++ b/Facepunch.Steamworks/Generated/SteamTypes.cs @@ -50,15 +50,6 @@ internal struct BundleId_t public override string ToString() => Value.ToString(); } - internal struct AppId_t - { - public uint Value; - - public static implicit operator AppId_t( uint value ) => new AppId_t(){ Value = value }; - public static implicit operator uint( AppId_t value ) => value.Value; - public override string ToString() => Value.ToString(); - } - internal struct AssetClassId_t { public ulong Value; diff --git a/Facepunch.Steamworks/SteamApps.cs b/Facepunch.Steamworks/SteamApps.cs index aef7fb9..f273c61 100644 --- a/Facepunch.Steamworks/SteamApps.cs +++ b/Facepunch.Steamworks/SteamApps.cs @@ -109,7 +109,7 @@ internal static void InstallEvents() /// public static IEnumerable DlcInformation() { - var appid = default( AppId_t ); + var appid = default( AppId ); var available = false; for ( int i = 0; i < Internal.GetDLCCount(); i++ ) diff --git a/Generator/Cleanup.cs b/Generator/Cleanup.cs index 3dcbb52..1fcd3e4 100644 --- a/Generator/Cleanup.cs +++ b/Generator/Cleanup.cs @@ -19,6 +19,7 @@ public static string ConvertType( string type ) type = type.Replace( "BeginAuthSessionResult", "BeginAuthResult" ); type = type.Replace( "PublishedFileId_t", "PublishedFileId" ); type = type.Replace( "PublishedFileId_t", "PublishedFileId" ); + type = type.Replace( "AppId_t", "AppId" ); type = type.Replace( "LeaderboardSortMethod", "LeaderboardSort" ); type = type.Replace( "LeaderboardDisplayType", "LeaderboardDisplay" ); type = type.Replace( "UGCMatchingUGCType", "UgcType" ); @@ -31,7 +32,7 @@ public static bool ShouldCreate( string type ) if ( type == "SteamId" ) return false; if ( type == "LeaderboardSort" ) return false; if ( type == "LeaderboardDisplay" ) return false; - + if ( type == "AppId" ) return false; return true; } diff --git a/Generator/CodeWriter/Struct.cs b/Generator/CodeWriter/Struct.cs index 905aecc..f3ea11c 100644 --- a/Generator/CodeWriter/Struct.cs +++ b/Generator/CodeWriter/Struct.cs @@ -229,10 +229,10 @@ private void StructFields( SteamApiDefinition.StructDef.StructFields[] fields ) t = "IntPtr"; } - if (t.StartsWith("AppId_t ") && t.Contains("[")) + if (t.StartsWith("AppId ") && t.Contains("[")) { - var num = t.Replace("AppId_t", "").Trim('[', ']', ' '); - t = $"AppId_t[]"; + var num = t.Replace("AppId", "").Trim('[', ']', ' '); + t = $"AppId[]"; WriteLine($"[MarshalAs(UnmanagedType.ByValArray, SizeConst = {num}, ArraySubType = UnmanagedType.U4)]"); } diff --git a/Generator/CodeWriter/Types.cs b/Generator/CodeWriter/Types.cs index a024e4f..ea46083 100644 --- a/Generator/CodeWriter/Types.cs +++ b/Generator/CodeWriter/Types.cs @@ -39,6 +39,9 @@ private void Types() { var typeName = Cleanup.ConvertType( o.Name ); + if ( !Cleanup.ShouldCreate( typeName ) ) + continue; + if ( SkipTypes.Contains( o.Name ) ) continue; From f2ae791e151b8f411ba69c1a83c7a5a4f2cf73d2 Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Fri, 26 Apr 2019 14:54:47 +0100 Subject: [PATCH 19/22] UgcEditor --- .../Facepunch.Steamworks.Test.csproj | 1 + Facepunch.Steamworks.Test/UgcEditor.cs | 34 +++++ Facepunch.Steamworks/SteamUgc.cs | 5 + Facepunch.Steamworks/Structs/UgcEditor.cs | 118 ++++++++++++++++++ 4 files changed, 158 insertions(+) create mode 100644 Facepunch.Steamworks.Test/UgcEditor.cs create mode 100644 Facepunch.Steamworks/Structs/UgcEditor.cs diff --git a/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj b/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj index e5daa38..6b37a7a 100644 --- a/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj +++ b/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj @@ -89,6 +89,7 @@ + diff --git a/Facepunch.Steamworks.Test/UgcEditor.cs b/Facepunch.Steamworks.Test/UgcEditor.cs new file mode 100644 index 0000000..46da119 --- /dev/null +++ b/Facepunch.Steamworks.Test/UgcEditor.cs @@ -0,0 +1,34 @@ +using System; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Steamworks.Data; + +namespace Steamworks +{ + [TestClass] + [DeploymentItem( "steam_api64.dll" )] + public class UgcEditor + { + [TestMethod] + public async Task CreateFile() + { + var result = await Ugc.Editor.NewCommunityFile + .WithTitle( "Unit Test Created Item" ) + .WithDescription( "This item was created by Facepunch Steamworks unit tests.\n\n" + + "It should have technically been deleted so you should never get to " + + "read this unless something terrible has happened." ) + .SubmitAsync(); + + Assert.IsTrue( result.Success ); + Assert.AreNotEqual( result.FileId.Value, 0 ); + + var deleted = await SteamUGC.DeleteFileAsync( result.FileId ); + Assert.IsTrue( deleted ); + + } + } + +} diff --git a/Facepunch.Steamworks/SteamUgc.cs b/Facepunch.Steamworks/SteamUgc.cs index 7ea00ce..b9caf9f 100644 --- a/Facepunch.Steamworks/SteamUgc.cs +++ b/Facepunch.Steamworks/SteamUgc.cs @@ -28,5 +28,10 @@ internal static ISteamUGC Internal } } + public static async Task DeleteFileAsync( PublishedFileId fileId ) + { + var r = await Internal.DeleteItem( fileId ); + return r?.Result == Result.OK; + } } } \ No newline at end of file diff --git a/Facepunch.Steamworks/Structs/UgcEditor.cs b/Facepunch.Steamworks/Structs/UgcEditor.cs new file mode 100644 index 0000000..f51a15e --- /dev/null +++ b/Facepunch.Steamworks/Structs/UgcEditor.cs @@ -0,0 +1,118 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Steamworks.Data; + +using QueryType = Steamworks.Ugc.Query; + +namespace Steamworks.Ugc +{ + public struct Editor + { + PublishedFileId fileId; + + bool creatingNew; + WorkshopFileType creatingType; + AppId consumerAppId; + + internal Editor( WorkshopFileType filetype ) : this() + { + creatingNew = true; + creatingType = filetype; + } + + /// + /// Create a Normal Workshop item that can be subscribed to + /// + public static Editor NewCommunityFile => new Editor( WorkshopFileType.Community ); + + /// + /// Workshop item that is meant to be voted on for the purpose of selling in-game + /// + public static Editor NewMicrotransactionFile => new Editor( WorkshopFileType.Microtransaction ); + + public Editor ForAppId( AppId id ) { this.consumerAppId = id; return this; } + + + string Title; + public Editor WithTitle( string t ) { this.Title = t; return this; } + + string Description; + public Editor WithDescription( string t ) { this.Description = t; return this; } + + + public async Task SubmitAsync() + { + var result = default( PublishResult ); + + // + // Item Create + // + if ( creatingNew ) + { + if ( consumerAppId == 0 ) + consumerAppId = SteamClient.AppId; + + result.Result = Steamworks.Result.Fail; + + var created = await SteamUGC.Internal.CreateItem( consumerAppId, creatingType ); + if ( !created.HasValue ) return result; + + result.Result = created.Value.Result; + + if ( result.Result != Steamworks.Result.OK ) + return result; + + fileId = created.Value.PublishedFileId; + result.NeedsWorkshopAgreement = created.Value.UserNeedsToAcceptWorkshopLegalAgreement; + result.FileId = fileId; + + await Task.Delay( 500 ); + } + + result.FileId = fileId; + + // + // Item Update + // + { + var handle = SteamUGC.Internal.StartItemUpdate( consumerAppId, fileId ); + if ( handle == 0xffffffffffffffff ) + return result; + + if ( Title != null ) SteamUGC.Internal.SetItemTitle( handle, Title ); + if ( Description != null ) SteamUGC.Internal.SetItemDescription( handle, Description ); + + result.Result = Steamworks.Result.Fail; + + var updated = await SteamUGC.Internal.SubmitItemUpdate( handle, "" ); + if ( !updated.HasValue ) return result; + + result.Result = updated.Value.Result; + + if ( result.Result != Steamworks.Result.OK ) + return result; + + result.NeedsWorkshopAgreement = updated.Value.UserNeedsToAcceptWorkshopLegalAgreement; + result.FileId = fileId; + + } + + return result; + } + } + + public struct PublishResult + { + public bool Success => Result == Steamworks.Result.OK; + + public Steamworks.Result Result; + public PublishedFileId FileId; + + /// + /// https://partner.steamgames.com/doc/features/workshop/implementation#Legal + /// + public bool NeedsWorkshopAgreement; + } +} \ No newline at end of file From e275b209b31ee9d1d839199c3083a583a91fe59c Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Fri, 26 Apr 2019 15:23:05 +0100 Subject: [PATCH 20/22] UgcEditor ContentFolder --- Facepunch.Steamworks.Test/UgcEditor.cs | 47 +++++++++++++++++++++++ Facepunch.Steamworks/Structs/UgcEditor.cs | 13 +++++++ 2 files changed, 60 insertions(+) diff --git a/Facepunch.Steamworks.Test/UgcEditor.cs b/Facepunch.Steamworks.Test/UgcEditor.cs index 46da119..4031a78 100644 --- a/Facepunch.Steamworks.Test/UgcEditor.cs +++ b/Facepunch.Steamworks.Test/UgcEditor.cs @@ -29,6 +29,53 @@ public async Task CreateFile() Assert.IsTrue( deleted ); } + + [TestMethod] + public async Task UploadBigFile() + { + + var created = Ugc.Editor.NewCommunityFile + .WithTitle( "Unit Test Upload Item" ) + .WithDescription( "This item was created by Facepunch Steamworks unit tests.\n\n" + + "It should have technically been deleted so you should never get to " + + "read this unless something terrible has happened." ) + //.WithTag( "Apple" ) + //.WithTag( "Banana" ) + ; + + + // Make a folder + var testFolder = new System.IO.DirectoryInfo( "WorkshopUpload" ); + if ( !testFolder.Exists ) testFolder.Create(); + + created = created.WithContent( testFolder.FullName ); + + // Upload a file of random bytes + var rand = new Random(); + var testFile = new byte[1024 * 1024 * 256]; + rand.NextBytes( testFile ); + System.IO.File.WriteAllBytes( testFolder.FullName + "/testfile1.bin", testFile ); + + Console.WriteLine( testFolder.FullName ); + + try + { + var done = await created.SubmitAsync(); + + // TODO - Upload Progress + + Assert.IsTrue( done.Success ); + Console.WriteLine( "item.Id: {0}", done.FileId ); + + var deleted = await SteamUGC.DeleteFileAsync( done.FileId ); + Assert.IsTrue( deleted ); + } + finally + { + System.IO.File.Delete( testFolder.FullName + "/testfile.bin" ); + } + + } } } diff --git a/Facepunch.Steamworks/Structs/UgcEditor.cs b/Facepunch.Steamworks/Structs/UgcEditor.cs index f51a15e..fc22829 100644 --- a/Facepunch.Steamworks/Structs/UgcEditor.cs +++ b/Facepunch.Steamworks/Structs/UgcEditor.cs @@ -41,6 +41,16 @@ internal Editor( WorkshopFileType filetype ) : this() string Description; public Editor WithDescription( string t ) { this.Description = t; return this; } + string MetaData; + public Editor WithMetaData( string t ) { this.MetaData = t; return this; } + + string Language; + public Editor InLanguage( string t ) { this.Language = t; return this; } + + System.IO.DirectoryInfo ContentFolder; + public Editor WithContent( System.IO.DirectoryInfo t ) { this.ContentFolder = t; return this; } + public Editor WithContent( string folderName ) { return WithContent( new System.IO.DirectoryInfo( folderName ) ); } + public async Task SubmitAsync() { @@ -83,6 +93,9 @@ public async Task SubmitAsync() if ( Title != null ) SteamUGC.Internal.SetItemTitle( handle, Title ); if ( Description != null ) SteamUGC.Internal.SetItemDescription( handle, Description ); + if ( MetaData != null ) SteamUGC.Internal.SetItemMetadata( handle, MetaData ); + if ( Language != null ) SteamUGC.Internal.SetItemUpdateLanguage( handle, Language ); + if ( ContentFolder != null ) SteamUGC.Internal.SetItemContent( handle, ContentFolder.FullName ); result.Result = Steamworks.Result.Fail; From 39705d5a2a0aeeb04e1fae9fabe8e466da794f18 Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Fri, 26 Apr 2019 15:40:27 +0100 Subject: [PATCH 21/22] Progress - will do for now --- Facepunch.Steamworks.Test/UgcEditor.cs | 19 +++++-- Facepunch.Steamworks/Structs/UgcEditor.cs | 60 +++++++++++++++++++++-- 2 files changed, 70 insertions(+), 9 deletions(-) diff --git a/Facepunch.Steamworks.Test/UgcEditor.cs b/Facepunch.Steamworks.Test/UgcEditor.cs index 4031a78..1548721 100644 --- a/Facepunch.Steamworks.Test/UgcEditor.cs +++ b/Facepunch.Steamworks.Test/UgcEditor.cs @@ -30,10 +30,23 @@ public async Task CreateFile() } + class ProgressBar : IProgress + { + float Value = 0; + + public void Report( float value ) + { + if ( Value >= value ) return; + + Value = value; + + Console.WriteLine( value ); + } + } + [TestMethod] public async Task UploadBigFile() { - var created = Ugc.Editor.NewCommunityFile .WithTitle( "Unit Test Upload Item" ) .WithDescription( "This item was created by Facepunch Steamworks unit tests.\n\n" + @@ -60,9 +73,7 @@ public async Task UploadBigFile() try { - var done = await created.SubmitAsync(); - - // TODO - Upload Progress + var done = await created.SubmitAsync( new ProgressBar() ); Assert.IsTrue( done.Success ); Console.WriteLine( "item.Id: {0}", done.FileId ); diff --git a/Facepunch.Steamworks/Structs/UgcEditor.cs b/Facepunch.Steamworks/Structs/UgcEditor.cs index fc22829..40c33ac 100644 --- a/Facepunch.Steamworks/Structs/UgcEditor.cs +++ b/Facepunch.Steamworks/Structs/UgcEditor.cs @@ -52,10 +52,12 @@ internal Editor( WorkshopFileType filetype ) : this() public Editor WithContent( string folderName ) { return WithContent( new System.IO.DirectoryInfo( folderName ) ); } - public async Task SubmitAsync() + public async Task SubmitAsync( IProgress progress = null ) { var result = default( PublishResult ); - + + progress?.Report( 0 ); + // // Item Create // @@ -77,10 +79,9 @@ public async Task SubmitAsync() fileId = created.Value.PublishedFileId; result.NeedsWorkshopAgreement = created.Value.UserNeedsToAcceptWorkshopLegalAgreement; result.FileId = fileId; - - await Task.Delay( 500 ); } + result.FileId = fileId; // @@ -99,7 +100,56 @@ public async Task SubmitAsync() result.Result = Steamworks.Result.Fail; - var updated = await SteamUGC.Internal.SubmitItemUpdate( handle, "" ); + var updating = SteamUGC.Internal.SubmitItemUpdate( handle, "" ); + + while ( !updating.IsCompleted ) + { + if ( progress != null ) + { + ulong total = 0; + ulong processed = 0; + + var r = SteamUGC.Internal.GetItemUpdateProgress( handle, ref processed, ref total ); + + switch ( r ) + { + case ItemUpdateStatus.PreparingConfig: + { + progress?.Report( 0.1f ); + break; + } + + case ItemUpdateStatus.PreparingContent: + { + progress?.Report( 0.2f ); + break; + } + case ItemUpdateStatus.UploadingContent: + { + var uploaded = total > 0 ? ((float)processed / (float)total) : 0.0f; + progress?.Report( 0.2f + uploaded * 0.7f ); + break; + } + case ItemUpdateStatus.UploadingPreviewFile: + { + progress?.Report( 8f ); + break; + } + case ItemUpdateStatus.CommittingChanges: + { + progress?.Report( 1 ); + break; + } + } + } + + await Task.Delay( 1000 / 60 ); + } + + progress?.Report( 1 ); + + var updated = updating.Result; + if ( !updated.HasValue ) return result; result.Result = updated.Value.Result; From 4625e22a55165c314495f23e17eac183b6324e1e Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Fri, 26 Apr 2019 16:42:46 +0100 Subject: [PATCH 22/22] Ugc.Item change --- .../Facepunch.Steamworks.Test.csproj | 1 + Facepunch.Steamworks.Test/UgcTest.cs | 37 +++++++++ Facepunch.Steamworks/SteamUgc.cs | 5 ++ Facepunch.Steamworks/Structs/UgcItem.cs | 78 +++++++++++++++++++ Facepunch.Steamworks/Structs/UgcResult.cs | 69 ---------------- Facepunch.Steamworks/Structs/UgcResultPage.cs | 4 +- 6 files changed, 123 insertions(+), 71 deletions(-) create mode 100644 Facepunch.Steamworks.Test/UgcTest.cs create mode 100644 Facepunch.Steamworks/Structs/UgcItem.cs delete mode 100644 Facepunch.Steamworks/Structs/UgcResult.cs diff --git a/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj b/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj index 6b37a7a..f91329f 100644 --- a/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj +++ b/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj @@ -89,6 +89,7 @@ + diff --git a/Facepunch.Steamworks.Test/UgcTest.cs b/Facepunch.Steamworks.Test/UgcTest.cs new file mode 100644 index 0000000..65e1d18 --- /dev/null +++ b/Facepunch.Steamworks.Test/UgcTest.cs @@ -0,0 +1,37 @@ +using System; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Steamworks.Data; + +namespace Steamworks +{ + [TestClass] + [DeploymentItem( "steam_api64.dll" )] + public class UgcTest + { + [TestMethod] + public async Task Download() + { + SteamUGC.Download( 1717844711 ); + } + + [TestMethod] + public async Task GetInformation() + { + var itemInfo = await Ugc.Item.Get( 1720164672 ); + + Assert.IsTrue( itemInfo.HasValue ); + + Console.WriteLine( $"Title: {itemInfo?.Title}" ); + Console.WriteLine( $"IsInstalled: {itemInfo?.IsInstalled}" ); + Console.WriteLine( $"IsDownloading: {itemInfo?.IsDownloading}" ); + Console.WriteLine( $"IsDownloadPending: {itemInfo?.IsDownloadPending}" ); + Console.WriteLine( $"IsSubscribed: {itemInfo?.IsSubscribed}" ); + Console.WriteLine( $"NeedsUpdate: {itemInfo?.NeedsUpdate}" ); + Console.WriteLine( $"Description: {itemInfo?.Description}" ); + } + } +} diff --git a/Facepunch.Steamworks/SteamUgc.cs b/Facepunch.Steamworks/SteamUgc.cs index b9caf9f..5484eeb 100644 --- a/Facepunch.Steamworks/SteamUgc.cs +++ b/Facepunch.Steamworks/SteamUgc.cs @@ -33,5 +33,10 @@ public static async Task DeleteFileAsync( PublishedFileId fileId ) var r = await Internal.DeleteItem( fileId ); return r?.Result == Result.OK; } + + public static bool Download( PublishedFileId fileId, bool highPriority = false ) + { + return Internal.DownloadItem( fileId, highPriority ); + } } } \ No newline at end of file diff --git a/Facepunch.Steamworks/Structs/UgcItem.cs b/Facepunch.Steamworks/Structs/UgcItem.cs new file mode 100644 index 0000000..857eb33 --- /dev/null +++ b/Facepunch.Steamworks/Structs/UgcItem.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Steamworks.Data; + +using QueryType = Steamworks.Ugc.Query; + +namespace Steamworks.Ugc +{ + public struct Item + { + internal enum ItemState : int + { + None = 0, + Subscribed = 1, + LegacyItem = 2, + Installed = 4, + NeedsUpdate = 8, + Downloading = 16, + DownloadPending = 32, + } + + public PublishedFileId Id { get; internal set; } + + public string Title { get; internal set; } + public string Description { get; internal set; } + public string[] Tags { get; internal set; } + + public bool IsInstalled => (State & ItemState.Installed) == ItemState.Installed; + public bool IsDownloading => (State & ItemState.Downloading) == ItemState.Downloading; + public bool IsDownloadPending => (State & ItemState.DownloadPending) == ItemState.DownloadPending; + public bool IsSubscribed => (State & ItemState.Subscribed) == ItemState.Subscribed; + public bool NeedsUpdate => (State & ItemState.NeedsUpdate) == ItemState.NeedsUpdate; + + public bool Download( bool highPriority = false ) + { + return SteamUGC.Internal.DownloadItem( Id, highPriority ); + } + + private ItemState State => (ItemState) SteamUGC.Internal.GetItemState( Id ); + + public static async Task Get( PublishedFileId id, int maxageseconds = 60 * 30 ) + { + var result = await SteamUGC.Internal.RequestUGCDetails( id, (uint) maxageseconds ); + if ( !result.HasValue ) return null; + + return From( result.Value.Details ); + } + + internal static Item From( SteamUGCDetails_t details ) + { + var d = new Item + { + Id = details.PublishedFileId, + // FileType = details.FileType, + + Title = details.Title, + Description = details.Description, + Tags = details.Tags.Split( new[] { ',' }, StringSplitOptions.RemoveEmptyEntries ) + + }; + + return d; + } + + /// + /// A case insensitive check for tag + /// + public bool HasTag( string find ) + { + if ( Tags.Length == 0 ) return false; + + return Tags.Contains( find, StringComparer.OrdinalIgnoreCase ); + } + + } +} \ No newline at end of file diff --git a/Facepunch.Steamworks/Structs/UgcResult.cs b/Facepunch.Steamworks/Structs/UgcResult.cs deleted file mode 100644 index faf4815..0000000 --- a/Facepunch.Steamworks/Structs/UgcResult.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using System.Linq; -using Steamworks.Data; - -namespace Steamworks.Ugc -{ - public struct Result - { - public PublishedFileId Id; - - public string Title; - public string Description; - public string[] Tags; - - - // - // TODO; - // - //internal Steamworks.Result Result; // m_eResult enum EResult - internal WorkshopFileType FileType; // m_eFileType enum EWorkshopFileType - internal uint CreatorAppID; // m_nCreatorAppID AppId_t - internal uint ConsumerAppID; // m_nConsumerAppID AppId_t - - internal ulong SteamIDOwner; // m_ulSteamIDOwner uint64 - internal uint TimeCreated; // m_rtimeCreated uint32 - internal uint TimeUpdated; // m_rtimeUpdated uint32 - internal uint TimeAddedToUserList; // m_rtimeAddedToUserList uint32 - internal RemoteStoragePublishedFileVisibility Visibility; // m_eVisibility enum ERemoteStoragePublishedFileVisibility - internal bool Banned; // m_bBanned _Bool - internal bool AcceptedForUse; // m_bAcceptedForUse _Bool - internal bool TagsTruncated; // m_bTagsTruncated _Bool - internal ulong File; // m_hFile UGCHandle_t - internal ulong PreviewFile; // m_hPreviewFile UGCHandle_t - internal string PchFileName; // m_pchFileName char [260] - internal int FileSize; // m_nFileSize int32 - internal int PreviewFileSize; // m_nPreviewFileSize int32 - internal string URL; // m_rgchURL char [256] - internal uint VotesUp; // m_unVotesUp uint32 - internal uint VotesDown; // m_unVotesDown uint32 - internal float Score; // m_flScore float - internal uint NumChildren; // m_unNumChildren uint32 - - internal static Result From( SteamUGCDetails_t details, UGCQueryHandle_t handle ) - { - var d = new Result - { - Id = details.PublishedFileId, - FileType = details.FileType, - - Title = details.Title, - Description = details.Description, - Tags = details.Tags.Split( new[] { ',' }, StringSplitOptions.RemoveEmptyEntries ) - - }; - - return d; - } - - /// - /// A case insensitive check for tag - /// - public bool HasTag( string find ) - { - if ( Tags.Length == 0 ) return false; - - return Tags.Contains( find, StringComparer.OrdinalIgnoreCase ); - } - } -} \ No newline at end of file diff --git a/Facepunch.Steamworks/Structs/UgcResultPage.cs b/Facepunch.Steamworks/Structs/UgcResultPage.cs index eec1b31..06f4f5f 100644 --- a/Facepunch.Steamworks/Structs/UgcResultPage.cs +++ b/Facepunch.Steamworks/Structs/UgcResultPage.cs @@ -12,7 +12,7 @@ public struct ResultPage : System.IDisposable public bool CachedData; - public IEnumerable Entries + public IEnumerable Entries { get { @@ -21,7 +21,7 @@ public IEnumerable Entries { if ( SteamUGC.Internal.GetQueryUGCResult( Handle, i, ref details ) ) { - yield return Result.From( details, Handle ); + yield return Item.From( details ); } } }

      0vAI9TanO)5Ck}*H(0zV`ZRSYE{yaLf zxB2Y%Qcn5V$9!Ef=HIZ)zGgqk1sb-uXmc3qYuJ9GO+0^`N8?Ad8BcPIKP1QgAjD`- zh%vpYJ280{Ns9+F((!v1`yc>$T`H^WTNW)WY2 z=eH5#?J(0IW^KjzJj^Ucyse*@&ki?B6aNMb_d}bNh)2Nu8SaNRA0bWyhWnw-T9Va# zcBGjl8NR2_g85cvjJb~ZDVSfpl{v;-xkct5`x@piGc(7UHMSy)`ygj##+jYAAy0wb ztdBF}%@f4Gg8zk?31;aXDEGnqV_{~pY3>m`p54^~ey=Js-5e-c?Js1Qi+)1=oiHC+ zo0((g{*3%Pl;5t*N#^#w$fCbGlKGBVZa;>%0_xL^%$ep;$#7rmK*+DGx#r$qP=D2a z*zd`jXU;!>{1EI%SI+vxjL1j+806KmJ~ML;As0-8`+BoJHzyuO{;>KNdVH4E%tkq_QpE!@b&GeiW;RX05 z;Nrk0aeb(7P1ts`81bvX#evHZWB%U@g{cL_F+0R6M^t$((xsuiU^Zn+)KZLz`bf4OObE0HFn+ofTCJf|fFh8$7gB*Pp z`I9u{mFJLOxGeUE_nRfpBR>PYJ8QrB2=NK1zdIZLVm2hsg#DynvVJjhE~0+NNEa)} zI$*9Nel}j%n{OVygz{6wB`+gK!uq>HxqP$Q73A5lpVTnwpgELyD7^nES?-Xznb`BQ zuMH6#-VFA)8XYztA$}O%*TC=Bnhl62+zt0_+iY@{XMI|bYBzkxfXF5>n>g*`{i zdx`r2N3tU(zMoP1fk(}XC}&&B!}ly%M@{?pq`zk!H(!);Jpb>>K5llEtj+@+H~XT0 z+D|xcjoQ2-W}P$nRCLz`_23$EWF>$l{PK~`a6;7edI}Vzhr!0 z`Fqw$vw-A9&WZG&G*1zi0ghxR&5OiUpglKXr_39~PXZSQ=GSHZ%Jkfy{kvHTnP2D% zzlWavhj~A7WH;D92Ciz;uaSMme2U~vXTg2n+2_n>iQ57{3*4MIYmbnhH`@}w1N>ZA~G@@xWt!Eg8?ROwRIH z8;SA!N`$qaSe!p8l^tQ7mYl#|l;eljO1XjQ6X!#kF`t!3jOS0dwTl?fpK$AlO+Sip zONZMPME>CU63x2b#>I;2Rtp;!DQZ~VY+S0SX-%}Tr>JFpWaH}A9o9-47iUGRoiEM72yimGum^fRl~+j8s23!v+*+xi&+|6DwIc$g)4^0rFN6B0v1>PtYHh{eZPxvKqgtIP$-WwNA3PJuL_DkuGK&=U z;rg-lh)1j_$?Er-AG01L#_vHNvl>Xo^C@p-SF@rePiFODyq}(3-CF7s;f-hS!~ASc zb`7f>ms~P?6`cPpTho!=n${92Pk=Au;QaurY5gb}?depkmUT#Sfz}VgTX$D&>ooC3 zs9hadZOha|_ywBi&jnW@e*6sb0AyDR>^C$4`55A3upjFJPL-_6qqf7o+SVi~PheHO za2~r@Z3`lU9s}*uBc3G2`(XAJs}p2#-|;8ePX}4t2eT}@zO@L$ll9|=;teeP-Z+mP znFsGH8$aWSzoE5`;@=ASv#(e~hrE%sm*fRf-pCGCeOi^4?8Q^v>c z+#%#`t&5T;vujX4)@Qf19u4>LtlG;P4*fT*JktLJrUgG|zhV7AoDvE5|7CXy z@?puHt({@vb#a8(#X3m-`$Dq+aj#R})uG?jIz{?pV0`(Fh4_IY$l>E*SBu>t@-ukO~ERhs10AiR&ucDMRUR_X8Ih`)z5g7hOq%Wu-d%8-oxMYje$tq+m;mR4fC z>tlURTmT%!`dG_|6J8MVzSe5uw}7KqUuz?AE9pPl+D6<>`j2+l)6d!~T1Wgfv}Y?P z!QnsAs#FxyUmNoObatXco@8|=c?0NAhPaZfal{`$`3!LdthXg&eJ_@iY<(da*T;vO zq*$vZtMze;wL!AVpA<)YDb`LYPhi;*u>Un8#Dk$eW{*g<@=4wd#^=g8X;#FYX#Y+r zPq%(1o(cJNF+0OLP23&&pMU0LI^xT^iA&yv;e8GH`Nv?Ve7rS{$(;=T=9VPii2tUU&!6Bb$T_E{a;J*%==#WpciWEcpeg^+_*d&L1vQ?hs zbD_NEj+*R{PqFHgd_Bl>M@_N1NQV1rw!wH7HPz}x{AeR_9{62{|LM2offRlK^5@B% z=~jYdRo?G8{J&@6@53dq!BC!CV?wM$ecc)}!@~1$39JMpyFt!O3(s>Uu!At3Kc6$p z5#IY&4#h9NRQ~8jvwVLF8%ZmGzKejfId^qsF z=#Q;!D980i&U{CFpISGhJb|5t_y**BYTYR^E|~t$9QvPGWu-iUO@jVtc+O|R{9X_F zk>gq5(Er@3O!`}(e~Qid+LW~5{Ld0 zYYFK;2>sK{$Cp^SVfsrQ`b(|Nq<;nU({q+uyCq|P8Ogq~&PmR9o#`&tC(EqpyG42B z)B0tZRk4&{Kl|}cl-DQjR|2`CD)wU=d%^enS>NqGXBA@ggQbxg8K&(~JOJ!n6sXSr2}7}sOV ztxJ+sdX`(o?v?sv|8j@@%dOHRNBfss4V(Vi97HDa`9 zg%w@Kp1&)s6k^QZ71kWd`C206?^FI24*NoKv~PvA0QKp6&=uAVVzh6Caif21>^CxLB?=QnD(aTu1rjT8UDgz#f6|Zh20w zm0|NA$-c9uNmlhO&)QCm`H^Sk+-J{^JZrw>e68eZ_?4NQJV*NTtVJZp^ygWtB;)uW zm6T^~M!5^qpJ(kRx!7NC;Lo%2iSd5PwbpTBykByyb)I??4I`w6Be zZm`NA)BRx^X?#%kPj0lTl0M#txzVacjQ3$~vKkWOeV9L3ttdRafAdGBuZjB?E+=kw z0|u6EKdb{{JR|ShvXRlF3UuHihq~Yk{ILPWxXO<#lOoD|88q2>0|u6 ztw9wr{*utXe`C8H@$a@qksRaSZKWW)K7ju7LDz0;BQeIm+u9~s#lPDT{~qf!>0|tR zEO%v$e>=qAk?nEBAChDIdn^<6UA>^c-jcJ&dW{(4-(z)?oX3X4dHkP1zMc5@DbQ+i z_FBWMi1^Sx_{Cjotc@dqr$|=)L%wA`DD9*1DBoIFRj}&6^R2_g*k9&bu7@x^*k9&5 z(i4(ndLVq%r}E6VdJ}*IN{sd$wBDDj>^o?!Bsto5$ht&~_8qb|Rkz!B$T})n*>lKY zPe_jT9I{TMKG}1~YW5GA-_*Yzvf4;i_8hVXk{sdk$OMYuN2MY@H^?{5ot| zkIV3B{5$NhFC<6%4qGKrpX@tq4I#$-I&8&AR^!)UM}K zSZ_&I_7zx*NRIX$v7&0*?K@(bPulG}VpSnV`;J(RBrE%lIP43_(Y_;AE7T|Zj#wWP zqkTuLFC;7bj#!&Xj`kh3Dn4bm@2K_g({}rgT1_P@dyYEn3CYo(qgE@_Cwq=s?-8Rt zN3FS%1Mowa@cX1WN3G9@O8{R64&Sdkc3WO5{U@-Auz$hEJN1uS>qwp?<;Sg`F+RC| z`X%c(>$qf9A5S>qI}uzDb%6Cwj^{*h{aFUqJL`*`48E^v59`%C`kk^aP<-uR|G_u@ zcPpZ<$j<~81M8_`<4;?bWK|x2SfwSa{`QR3mKf{v8LMPHdwHC(YDk9rL}5O5|M)YG z@;GDFAvu=E8S6R8Dt%`h={sY+B;^UL1w``@gx68BvhS>8{5oevWB4>4oU^_~rvBla z!=8{F?Kua#G%ofcz;YP3$&kI+@>t>H%5$qwo2!?u*4!w~6UkeX@ol}OZ{N2uV zQ@l>SfB*T~Md9f~_ORWzEC&^zo24d&`-|Qe&M5aV=kvvz!}Sun3HC7ObLHRpTaQ3jHS5Z&7gW&9zNXH=Z|8pX8 zVd+rieY<)RE{6$(tS=F41?**s(}nw|V?3%Jt8l~F!+OA3CSl*L>p?_NuKb6`>tfFO z8y>!kh4WvJudw|2|N3*)Zz~u3BX@9IQ~9a->%YdKa!~yi`YY_Yo7wf;&|mxvyKS*C!7rvA!E6Ff_8=Lg`S7&7w$hn+U278NGQEEhl}|B^Zw@l_Ij%7hf2o{Ic~UE zLN6?j$**BPtty9nMa~~Qtms9-5$uiQ!i{8KpA)W&m8fTT-K=P3womq(ZdL)_1qpjK>aWpt zvwLN@9@dlkRTaK+o%X4Cl&kb^=VHBfv7c%D3yvGa_}tAVwnsZLJa=$>QQ<#3%Pv>- z*-hoA_ty@)ko$e9JA2nW;z7PG!&P3N)zm@#O?@+Gz-*vt9gnu_n zTY=#yyTZe9Gc~^ne-7u$rJZippli5)70%yvRecI~L-k1I2fA(+OZ6Y?pXz@@^O$fw z4|}_Zus4Ej+mCju@KitRbXC2cMDeKls@%Vu&i_~aIopYvXR7th*@mKAJi+}Q^<3qb zvz!-vj^(K8i;}D7s{EYo@~_SlRlCG>kea``n6eAyq4^@tZ{4&W3Oz@C=&u(Dd)=(5 zoX>iK<4*ifw|;Id!sp+9AzT*=XAgS;#s^WKt4kMtKjxBPH`^xLH?o))DHg6^)PvLb z@C~B~cT^hsQ>@xSR405M`-X7g_X)z-!|tZ`|D7C9L+vk|J?wFr4i_6Q%U9`zo-2Ld zk0PGXbF|0JHpq7CVoDF|Lr70O?=fEZcQFjd%|1F8&S^IUdswTy@aIm(^n2J7GGA1@ zAy>ttT->L0v!`jDqMoaI>vXaFT~rTLeuT!k!sO0)oZ&jT))h>ra7DTIeG@tF`OtHb zU#(=laWSQ@!YPs}^xP~-?k~95{c?Xn%|AT<^0}CQt8i}R?{;!w7y5UzyJY%=sQ_FQSrP{AH#i@;#c`tmgXBOf0R4(Rn$k<&3YgIR}A|_Qs2!E zl|#Kxx1w8g8@ehVx{elBd006)@5cRNVYlKI)Gvs96q-U`l+zKpK8uj^T(N#r`v0yT zhU1}dB5n$&FuAZ_*m*ysN7yg&L)2H5pZ_X-esvavlozGP`ewt4?k`jH{VB4G*R<5(( zRnPx*e1*lM-fO9O0ND2orVCv+JN2nx4{HSdhNyR{U$e_azTE1$@Hcu(;r@iYvK(hs zyed8?quzf-{C~~9P(N)?x3E80elp+CetUi_ohO(Y@K;kD814RC!`O5b6E` z#__1ANY<$-+EbX`Q*!*gy`Bh9q^q!Slw9ot^z0<`J#6(x;YP5FG;des5bnBJy;Z0` z>6&n1KZo{3&<)AwbU^tpv+b^u!+82WK1cWV&kGBut$feoV#8#+gz-;~XRtn=iQzk+ zWBv35<@jDGv@TWa66LCXMD@37UZDD?Pjf{)ZZ^CT#<%EBtX+p^P313nT&GP zK5pl#bhP>q{e^R=J}NoR58dq22Gm#l{I`NV!RM;HRQ%t``5Vli9qwgXubg`h{kI=1 z+=$>j6!qN<^*rnl%~N~K5qkJswEJVN1*`q2P`e1PSE}8^{*tUu9_E$(LX( zRXqr=KQ5-8tNumIi=*KCnbm&uullK}a-A1yw<;h0ce(4_qCZpZ0@gXQ-Fw)#)URVY z)br51e!g6*r$PV7v+=> z`>|p?xwZo1SMnTLFFfoasTV;%8_FmZzKidB|Tx@En4({;B*@^{BA= zh3hUC8#4>znN98e8QI=l>~@?@`j3$Q`J*BncW~TO?Ocr~;p|}_$^Jcpp+8q}p5Y7! z_1rh$8j5T`_OlNb}!V8J=1nx|pB( zf93w&d{^b7+--1Yv1n&KVLc#R)!)5*P_QRBe^AeH+;*|{FNEtCD`)3WIJbVTyu&?-(Bo3B{x4HA;@_UKevRo~v`Sv-8n^B~!RAT1PscN3dzK|G1qzl08ZN%dNv# z;V3;X^WA;xcvZiNcDvXjxQjyAhv{_(#~-!dIeC=`$HS@)#_*Is<)T03-?>kEGvj;< z##g!C4Y_aB$M97@sOr&wkLzXyEwP{IN$Vbr7oUs#QLNLvU5%fCHfXo9(^>CN%6Wqu zE?~j%ReQMSQ}p*&_4gbQ`Y?`cK!57JL1E9wcSijtFwYbA7uNn%`zp-+lJ@6S`qa4v zRZfbPeDSXsuj*fwT)FV`Jn#qm;_HR$V&7<@{<+yZG!7~~G2aq$3{Sc4;QU&|C;InI zNy7E8_y>d=!5)?S4v}nwWH0MT^EDjjoa2)#c-}$9`|rAig^T03o9&SEF%QH3JA%c? zelU`)rh26E4P8jdJD6^je`Sk)WFC=ZR7>bcVU1IkpCE4BkT_d@Fd_58242NmAB z473N`o8MoldaCA$${(_eO*kU_yJ@`l1kZUTQoT|7f7k6z^VcJ=zY~+^{@On z=lTDj^){x<#lrcouNR#DRC(U|c?7LPB5zt>6lNcmo2}iD-Qmyw-Ec$c#r2NoCVT#B z{{CG(RW9NA6te5q<#Ic@hpGHuL+f_s{#`qjKV`4lr&rIFtJ;-vl|JsXL4Vc`$0Mb0 ze=g=x>bW}Kf#Vyz*Olvy(7F)yLi-zv@tlEE@4uf_x|OTa^`E-V@SOaghW~$ye|7Fc z_513*jasj&aa!~bVjiUA_}tB&>xAQ?I&ZJWAvON1^UP|TQ*u=w2g&(<1f5%sq;b(3 zJkO`XRrOenU&>zf9OqLW*5EAKqn@jI9kTPBEPVg)tI&_2b`i-s9v19n>*opAN8bym z`5Trb_oBNkh|Ewqc6@$ zUmPIvnX@vK-|s{Ha5J6hw2oEjo>>Ls5APR3`yVP^C0G7Ldc?Zp;x}mDUwQto`hOKZ zjyo`4llw!Vc7XLYGML}$+|cdx>~@Lxv7N(vSz6cq-EgoUi3r-G&aYwn58188HK!d; z|4uokH-h1QK`7nVWPJ(c54OLEV1I!14Axz;eS0V$BZBKZXFO3dyik3AOZGD!>St6x zf$@uVl`8L_XUj+9A1J$3|BP~2FG_hN&09nLS-2j&KPtqY z;VGhiMpFCnvc7Wt=3@&6h1XkUU-5O}&xgx(kcVM7uHg4s;okv-z7J6KSiPS>zBzwX zf3Esrr+%?R!j7B!f2FVTOWA#n^pzarh4X`QAKb%Kc&HZ{?EgQdb781=^SKm!9_qjT zwcSqtYF>u(IMH9IeKTizF+Cyw$f5b7(l6|JVfl>d^#;?c!YNE&q*v7QTF?$eKZ^Mi zva2wEg~g-#1N0XP2cL)XN9{MGUa0?dva%oh0hK?Y@+r&?bv_gGFI2DotM#$nc!TFQ zmHma;^RMgI&F!c#`~PY=sq*bC_xnThDAhlsJ)!n;JNpZ>2iHqzzu2c!-&d&cRR5w_ zwOcj*7xrA$tN+*ByXgJV?~B9xYqfu=#ut@;&i=YnSM;aWSL%I~YL{x?48wD?gS}B- z>BZCj@^_o@`5_sen<@Sv8lS81Zs)4_@V$xZ7vP?3xxaVwzTSBn?{J?rbY4N7FDh)m zL)l;0KAW-w^G(fT)qb6ec`4sjeLG0`ulRqutG*{t@2}K8Mz|aLZsl2ekFQ+yUPygc zV`nkGwOEVgZhtQ3@8RrWFVZ=x|LOVlf7(85$D#RY^m5E!RUYWNnR<@>WN4gK&y}mv z6AV|*2jTtDeHgAf*Hxh)oYnKc>N?xIir49?bx8R4DmQ=k94_|+_vxMAV>`p2RTk3` zZciw`@VT4Se$K9^Co{rpqmDmxV`SEX0&)2Vu@-lwVgjcTXLpK_I4rMC*b2Uc>m?}vJx;JH($KNYXK zm%urW*8c?aU45q=&V|1(!E~#B{&p^$gP`|~;r?!ZuIyE=%HLc255=qcsqpYa=MB_3 zlsMX#RIaKA!TwQ>_o4d%oc*r4M*!b%gx*`I`*2kLtNUe?-ROqq7lnN{rRodX7qUY= zM}MLHUlop$E4Q%k0F>MrzRGWvPdGntGnG%bW_53jZT#7X{a|6~E-ar_{D0L|cB*>o zbk%p2_tUv1l@3h5n;lC&jR?*g4} zsGci-%5~<4dVafdSLt`^g_no2BNV@iPwA13rJUOu7rr1C|j8#z?&x2`v#@_UHhcPLlQ_m#cqhVlu=6Bm6)A9`L` zd;L%QMQ41qXx*X4HNj$iq4G^VSFF-u4@bNgQ*xDm%2oBi`Q5ACzi5v?Zo+cSr1Lt8 z+tkPBAJTV#Djuh+%2n03@bYs7-`gpN8vj+fh08VK7?ie^svZlv`MMYF^gunuyQC#>~O|yPdzkD#!0L;l3R?{<~R} z>~G*a0^J)hU@pd2!r`j-%Idk=S5@i2ekhbLDtwf~y>9Y5v4~*4DSyuVL_O7idgvaQ zP`N07s^4>_+xh%o%i+6#!GA4(RlH7no#8v>s@8&zOPn|Pih=2 zEZp0L^S{gge;SVZUheOvL!}e%-w5Ta$|n`RvQy==a{q3;D!kkISL-}wC;Gd&Tvd3= zyfQvbsV5i?^`|_~ucK&SrKb4c+F6{i; z{6D=s?0nkkwe#CvpMTH4w-ft%$8HyPIGextcXzhkE@wOZ_U+MjXP>v*r>(c=-}PhL zolci2()s)4|DOKWc&6Q3^zRU_pP}<*$NP8Zwf(RC|Nr~>#T2^T{1uO$=bYkN?r+-T zn(a>89lX!${4;-l=T46swmX-2R*lU zw*47G*R!3^zx>(t@^|sKpYQE>>~hihvct8QFUQ}OhmOxqpCM%aF139dcTzYdrP~&*}C06^?SN35qmsPPnE>?sFdEmAOEGF>zD5EexVKjPTOv$ z$EGd^^UrktuXX!=woUB!u-)12ZQUN%?fBnhJF@d_>+Pw(<6*xq;Hb~|XV+wG$Lc%sM6zn%yCIz`vNoj?6MuK${EyWV>8`sVLwx1ULibhvhT+qzBr zJ!!I^%l+uTdyl1^etX~4E+;!2dtcM$-|a`+=k5EB|E}Bnq&ENBXKcSOV#oWR_}|T6 z`}cePr*Q4}f&HC3yS(gjw`tFpcKO+~>)qCE+Ts7J-d!9Ny+wxTgTKBw9xDbLW5sCv zWg6o|tQaRc;7=YmfrG)(hF=unPcqZU7TrX)=!w7H_>;Q8UlIOB8|NUz3&cj_A~8@b z5lzNY(PAuvzFZtOE)lK9rTF`YSZUq{{SNWIaVPYRNXH|H^AUvgs5nVHDo(}U>G;bu zwnN_zeLM8+O5b5_7ti8vFwTv}UxT?r%o97{e+SO*5c9?3Vgdfn$KQqc%QPMrKbnt= z&+vD`+$F9QyAakc*moh`T_VcbCB8OxiyOo<(4Q4I<1fK_R`~F@0ms?K$D+deSX5b` zh>iHGvLg68WCUy$mH4Z&KE>Z5{I%fkGyHvyzr%2I7(4aYEcHPJl5+XAx&CHsXwl_&-EUG%}5u#&}U^OvhiQQD{s758`j4F(0=1u+4{U zK5X-0JJ&c}oD18z#+l$j{7p0#pwt)Ocma+V8YhW`#;N!_9e#q!uw4M#BBO&?1luCxYVaWbCL-nk5Q|}3Y+MT-#NR~Y zBKW-swu|8RBG@j1tpv6b*h*k4fvp6#C9o}lZ3%2kU|Ry)#jsrr+r_Y54BN%9ErV?t zY|CI<2HP^&mczCjw&k!bhiy4*m%w%jY?r`x32c|Zw$>OS*5Y_Aj&Fed1{~jj<0!GN zUe2KjicXP4JykJU3|EX7nY3q9&n5H8xnvQ!m|RY-RO}?msjnl~)4qv%ts>res@P35 zP#Zdi!Yt6Z){1SRLI0RQo zGeG%e^^?KeTZNbf$}gX1i^b-a&GH3Ji_OCR(%oV+;Yaz!>IPHBA1~@vJXeC!Ul5f3 zq%PBO9jN24XFT<0RYZszVITjx{$75Od!=~?#0GF{U!KSAne_h%&LjWM zYpR5}3;GNA^LKWze01ub&}hd{~G3hpSTK7`K&PZ30dB+gR;EeH}*4s`%x@#|X`cs0sda^-FzqQL`rYB(O8uF~7! z9Jf!1&d^go5h9uF1AdNQxePK}nC>W-uGeF#J}xp3S|y(gak-h`I%S?L$2Pi4XZ{?9 zZYN$t*LRX@J+4~EigNRd93k#A%graS3Vr~*4ZDHcz?O@Jcmj-CD#SD3$Rr`^!Oq|- z;OveC5#l582CxNu>twV`a5?xrc>4|baxr-QToi{@Zmtg?|5iQwXO8jp zGFdM<#sSp-SD?(_5+jfHJlgYUFQC1E_5#|E7*}D{b)~i2_@!8gYpjFf($%uOliZRw zTGdLw)k;pcXh!*`iQ?(;BS+z-3< zSLBxcsMgZtsV{}-iiL@uuo=kf(?a8#K z)1FRyI_(+e)iY&(8l~p@3k)yk(=1cB(;WKCBMZnvvY0F(OBvolHJ@jpf5>|3>P{3g zp2MC(#$U+z3#b=R&!L_}J&$@G^O~4oTc;zx12w^MC*3mBRau& z80|9+la(frdfa{0s$~7PFuyHKcMJ2~s`O}w;n{?F_R|={Q~fjMb+7hs zApJ63BfZBMui?o-`!n^jZ`}ZQdOh35a2=Mc4;g;jVIf}jdM({w zyp|rnirnv`evWw)EuH^lORsMl4Vj;>#0hsJ+C@L#3HRI=CFi>3`ZvQDrP|YQa3ZO@X^_>!iB|HUAd+(k;CnOt<7Zx5QUxYQ0Xa$6q%xn4SzvmvaWw)!>%vo0oh= zD!w;-S(YAmvMjD^sOM16qn<~-fO-M-Lh6Ooi>Vh=FQHySy_9+>^(MB@CbrKO>Mhh; zskc%uqyIAcuVDRG*yDn#mnB9iSwI$&C1e(vL*|id*pA9_GcIlha9IJ@m_~^-(X04N9ekJC-S;&G5dM4L$|MFo-Z;} zFdo!7ip=)-ipE*T{rSa*Gn=xLNgZoe}H^e9NIwqOdG0D7+ zN#=D-ve5A-^Li$k*E5Fa8(df2f^aTAN6ydbOiwz~lkRx-bF6o9USId6tND6`k?zpf zf9Z~%xc=Q5ujlhe<3~AkJyeV4`9l0NKEb1zs>bog_yb}z=8G@l*QxS58lR=gBif<+ zt(BnZA)UBFmE%Ml^+Ym>?3s|{k>}&#POf(b!7e$9oIp-VXmAfN#5yBEuP<(MR0}z; zlq6J(AsBy36OvRs2v0E{SIjcpRS5^wdVF=ldh;<{Pc4pHZ$1v*0DX^YH|x#kz&jI$ zd!E8N`~HL+$0W=H4&+O>g9DgB<@$M(Dc4IcBm6_33GqWh5z{@2?O~KE_Yz+o%Ogk8 z*Wsv`hx#vxTI^YXc9Gg)vB!b@^@Bb5mJmZhna+{mb~O(j6?Nnyq-PrJvYqCF=i>Tn zT8C6a`%6{%TLfK~uU^Mp&G2plZ$S8Wg6lDk-UG^XZ|-2I^gj-NKh$8}ljqS---cbz z=U+jW?fD1jGTdL`?l<(OxQ?mD=eSOmEWHQUzu?y>kJ~XH%XT!mqrM*7jeCExykvTx z+b8=0@`dYE$%he7odfYAygG*-_h%xU4-jshqrmYvu8S6REO4}99*T`CaIAs8q~mf` z&W0#-=<$6N?*kM%G0dGLXbS?q@g%q7UzD;=BF{CtjRR`c>XqFB{)i7$)&w1oXGi~Y5p_ffLg zZ;KszelK?Dd0np)KSDhE{!6JN#f9?kSn7DI8?JK_OC1BDCnT2H?TYsc3LJ7?%}!jS z?197r_T%N2yk5B~F;|Vd*Ctjvy5QFfw}W3{oVgcv8SgowM)|{t?zrZF5PK499CDXq zpLBnl5Djp5a0~9UKz|O`o$ulNTT!@wkhqQMsC4vg72=!3oeXCu!`Z3AN$#}MA+K9g zJLOs~tRwq&s&u@Ka7MuXxeBM!(S~trVy8O#ucQAu<-ZvI3K0KdoZmzDCn3Ixo%YfF zKDyth+^>QAaR_f6&Oa0*)48AS_S4;dIt~-iSTzruVMIyewXQMRQ_J? zv`zJY8O~R+GQ3JhD&l{qQxn5&Vz^Bz+&^Hq!|jgo-O;(pvA`q!wa|SF-M1+BX`NgC zbU%Hj5dERAQtn&nzLoAzeuI~7~LPE`(w)eg`IP)>)~!` z=VOl3mAf{&Yooh1gZ4UXBHCZ0_wP7BC{;euM2k%QdoVtBDoU(m9+S%dM?j26M zejDKLiO!V{S$=zQ-t@|Rd+Fax|6b+)P-idw=UT^b9da1@K^0%3vxgzXZ=DmJvfW2_ zNp$vu-my!v3Mbl;Z(WLY$Jj2p)@ip3F||v+wG#E63vNWc6oB{b#Qn7{>5MnSspsWN zhdjRl{^WR8-KEHy6HxQN_5J&p_vn8|7d@}-f_~;rLOc%!G0wdW#$nuU>4JW7P`Y1k zZN$3er!J$MTu)dJVV#@Yb(B-zZ_QWzFSBc<>fc|9T&~x0ty>q!c$ZuIsxV%5U2Z)B zp47F<@#(8bf7b&dF%Q=}T{o$8o=2|edcykn9O-Y9m5lVS>$=W7hH>|fuC-Qn1^Q*z zTF+Fpi;ti$L-~9P{c@zo*1v@A>8fXF^YrgXs`cE2dXer< zLHMyr)z&PWpCPKP(iF*Bs|4lIDd~VXaGBH(hb%G3spI>&$6xXFK)4Ai zKAp~f(4*<@TkX#Ch2jY-3+3Q4*O_u2IT~NWm|ou6Sz>r7p* z2gKc{OaGg!Nm#da61ARAUhV$SZ<0E{{-k^OIwHR_L?PQxgO#yd z-v2Ljwt-vY3!T@aoi0x*V0&z^%fqv1(qHMg9QnFf=?zxf*)rT(&&zQ-{xa>(bE#sz zHCe@`R-IkO|cbRmTNq0xBM);Hc zqH7`UJ0%^pI-%UAc7Yw^u(Zqeya(ZYg8F+El>NaFJKU!qLpx8>*Fz17CCq=RYTu6d zGN)VzmH4VHSs#?Vo_~1pf<8CLc;C|d+=vG1ZhNm9+n+eD|Z`li0>L}n={7}qI>skYCIVLUIcwa_nrS1-=*F!f5?9qMmha=vv+Pt1qO2Rw&S-d7~2bAKV< z8i975+%@0&67_U2Im4yLy?o1$e*7i;$?@!G($PbYXNf&BTsj}47*3W;muC*spZ8}t za{SBbQ9ySEF1bs8IrOq$@3n_w_v4KXm$jgu5@04>_K{iFKp5XTCK6{ZZ!YILfI@&tjKshy8k<@O=3c)&V_J z9r8YVPR|1(7W*sSO;!rhi)Out&%kxvv zZsj-=bFa+b8pdyUjv`%`dJl-+FTvikg7!+Lqmt!a<*IJQdaqZN>+<_?|EE_C&)4w$ zHq!9)!aV5jwUhN$$9mKK824?>IY{T#y>it!x;t(k!`bJ`Lpf~iwa@hp`s;SEcNE5p zUU_WC`&^A!?>yOSKi%(VeeY*|?|1F0k^c6xz8mST(e(-J@AYbQ>2b1&_9mD7dR$Ad zCfZwQZ=t=#b!QCr<9Zb{{#KrEWq7STukTxmlmvA>o{*C2miuEl@rxC^rWCmktP!FI znFh-Hhy7FP)wne-r9p8@$^p^z8rDy+%ke)SoUFLcOh50bv z%wW{p8k}E?QB%%)&1e^EQlg@M3dnk{w=Qmy_Z#Zfys^Be-v7DH(O}8@0N6iP+=6uI zakAdpmMYs%y>;0l$u{P@&22^*iMq^E}iZ&+`8Xqxb--3Kostj@$2?Eo8$7ssr5pR&rg!ikqzYA zh6T`VrzVG+Fbg+Rh?Vk ze?Fo5@juh|(Y@iBiTe8@-S8aZ_$u%Jjq9_Y?W2+HA>Y*N%6#+Nhp>;{XSw6$sWM+p zDqohfh4EEex;$H%&Q`XoW7LmPZ((|xXm6su$vx+Mxvpws`VNRp%p3ClWK6akR~+ho zhU~|k(2w8fyV9Z4wbEhsmFZdO==_+xAF|SM5aY%SQLe5d&JkYvJ7LNDLH|rYAkLkH z{hNM?9w(7R438eavUom+=d*Y|i|6w^G93eq0uR?^tnWhVg&sbqLw6;#mw7%%J$~JP4OzkR zt7Q3AQLmw1$#N+3+=cmnUh+1NO#kWuHMFmxeW$W-9iZ=L)(z16>%9inG5&pwe|^+- zpUZJ-zeo3*{VE>3lgFd)TQzw0p}bagD^d3kt++Z*`a8Iu8Cb&mRVBR7Rp-(7mFid? zaF717YG4z?ZDhGMvK(7H`u={Ritn@7mBx3dKl{0f?t}FG>+(T*|Gd{gz3<*@px$Ti zHL#WGZ1w2e2gVtscE!R<7D*enz<=$GdqM$CSTlM;mE)zO4}0k8(uG^&9qq zqjY`OF+8toUzRg5O4q9+iu=b=dLO6Gqo0pTjMDY%RpH<_1d7p)bkguF#C^t%gELfk z?+zZN!uw`$R+PR^mldV&(~YvjQT4aN$cWPQ(E8`~fF7sv)ILqGf$PmFSdW}Nq>klV z$oqCV3^#}2wmS9m14ZUxjO#hrACT9bpA0E7KT!H6raRSH-AjnO9p&mdi9d!6P}e=q zp~Ka6&pBeaQ}@pSPVUoj{>Y2EeTfj44J{xG$>J#8Z%d-|JX6B*sEv}(Jw=9=^85~E z?=!4E>KBYR*iTk^#xTv1!!n(heMKA}SvB z|CKl@a(=})Ijkb8EA%Bsg{qHL!zx+7n~eRqFJ1v%=dX(XlZ-q23$bIEem>_`tA^ok zBX`>EMiKK2{q2j=<*w(A+1&;h!>+||5{4JKKfpZd0k8cL_g6uAoi<~*ex4(L_`WDT z4((I*A29Z_9X2wZO|0K0)^8o#Nh8x;7p41i3*EKY?SSd6i_-VGkI`M5vdj5GUT0tG zbwulS>5bOc@7`$HFG_rgic5^dXkD(!(K?;U(K?^`&g-jXKTcQvq8%C0dR!b8t@}?_ zw7!1MVYqobU%>N)v=>L~c3#GDri|lE3F9xNzcTt;6Rq>RCR+EG3Z}1u>8qf>3UxkU z6w-Ym-B+sc-W^<}!uw`$4b!oW<*-eq`}~+X^_*sjuPR!%j|%0_a_(e0cG6y~{MU@C zWH=S1)*nyPx-+Iu+3k5cJgSV(P3@z7XOu37Y9a4WOc=eN;p}IA8tJZy`E6l-TUkEG zn69?yWD_qi8r>Ex?|W_p`#`TA?TFFWtzJASAkTYaRf6HfB^z zNQIY0_gQqGr}dat_JdaTr-B&Wo~qUS-8g2G;-_P36~7x(#r=>1`ro0h_ePD~t(Zm5 zB`+IWWa{V0^gilUW6PC0d{fc+>|wcoQK-Uc9a|V9+y4rqIA-2SGC##Ja{nWKTrtyA z@TYzZ_XAVM86J5)1LtM=I%9PFH;pS%dbFcewdV_rR;IU=*2ZBhLZ`_tU7iBk4> zaYE&@d0YZ@L*1`9GH$s_cWmZzbw8+c<^iXSzenbJwa;$gNieDR&MZ~&56fJv+-GMd zMeFfADY^~yREKoQ^wx|ji_!gPO^nQsfpiwVE63%s7`-kki_zmpS&Z&?Whz`Nu2r19 zUOo?879+<6M|>;O-zxOFp;aW|yc6N*^#aZ-_o>WxSxi+#h@#B07`dOe1k~e9nJVXZ z2Uo<%apW72{m;pI%klN(`|&%xdY%I8^sqdk5?gIhlL+67F#7W=CcqWJus-WQG+m8x9u z?RJ)XkvRhCduqY~@lT{TOVlX46O{WOA57S$^d-i&7`@Ke7Ngf01JrYPVJpgz_ajDS z>E~J|fbzMP30Voso|83K-KRJ?D_ilZtRnZDSifDHRj%~4S=fh#|C_Q5<^Hy;B*nY3 z>SE-2Yzw%)Scu27QkDIgtSGe)I|k3m$mgyk`(a%t*$4N9#`qG{`GI&oOWGx+ePHxX zrhg~Xzmxe&b<5|@>m2)79{Uxs-cl*ngo@<|! ztH#gaBHQ(|x=)kK`zG0Hd|f#yTaCZLN!hNoSeM*0Dc`jL>+sFcKYkC-`9hcN|FKDP zT^(o3`7qn|?{c0ZpF_xY&Br?Aok??5cpt)@?026+m*dP4=mXD|*VFkf*$?Msv^w>5 zP`>MhFJ(W>SMI)>bU<9PP`YblzS~$%UawwvC3^Mvo=kcbeH~it`_1fk>0aI64MRQ` z@Z@B}_#D^iFM{&p>Ul^`7hd9WI@}BI8};dwuq9+IQ1l@47>kcfD&Su3KDY zy(=G#7rK0L9pOsBeTK)g3%q*WQ0Ud`&<1ti@?`wtPS=xu-p3FJ8U8_re^8ar8%VFN z$KBCSs_~%NwHNjDQ+6@KEn&EMO1GS))Jwg3o@!>e%?!7h;nu5iNuJW|lI<`J)a|f= z{ql$^pOI7Yyn3EH;(7_~56`o@lHeZCLAxIOO}5{I(alJgHT+<-d`^42vrM%w%-3Gd z&#Halxgjs-Qp_ z<2g@;SHF0eaUY9)cv{pbLyBr!>!X($9kyqp4KeWRmc8S z$8iAeu-iP%b$8&)0 z(O9R9$N3DbPwE_o`?fCfIWWWh62hGXyMgpinYNGd?PI&$$8>&LN>R%DdIPv$J>buM?Ju@qKA)axCDvm8oE~MJ zr}U#{&QH=lz#0mDF_=G7@`O2LiexJFBj$S;hvrSsw(bH?ot|KAYm?`PTknD^ryG_- z>505v$nxp^`vi3#)n(?W{2C(1C$FalbkFl~KhyV%7weDd1$TJ@3D@XQ}TS%ro12mHP5fUR!&WG2Akr-Y;9@)B9r;KD{4SNmkLWpTFKP zqrp0Tk?hwsKE402&BuKJpWcVqsp{kT8Featv`?R0pB|jC(1^lfSy2AGO1si1z(Z^r*_RLn_yjZ!8ZuR}3t~XnKbI_hjV4neh%fRo? z)Ba?8bRrymecI~N*Qc$%kDnLf=9$Nso?|LKr;TZ2dfJ$dHpbuP)A6@4{x-(f#(3IP zI8M>Vc-k1gBUbl^CSLD*V|9MLu{xjLSbaUr5|KKBuGCEDwgNf{ic6V>y3xPKX|=e@*OJs)}1bIz7Cnf7Gb>zL0v=C4lW z>y_Mey365pX`RaF7rAxJr$>0i-6wg3SA-xF)p1vKoT84?)p3S89;S{*i3i{^OIiHN zlA|m$#lx`AQuYF6pQG%B%3iGOi3T0_k$KR>rW9sa2{G2#4i?^jJPfuhrpXOT=4UaGYp$gIs3Gl$TmE#w#otLYXDg z5VT|nYg7npRR|R-gj*4U2fvr^1-a2mhpe&&K!&U#kTupw$Su}5$Zgg{$nDk?$eq>< z$asg0E72k2>gtejr6^0fvh-J$VahT}S+dlzUmed>$9d{_mU1~qSqhaUpe)4>neq~4 zU#9G(%3h`{L1kH^ENhj^Ta~?1*{jrXNFCQGH`|nDyRz(5mR-tMokNz)K6UmLb#}ix z`=&bEsLsCckR{*bkR=~+WeKD^Wt#gtWtbUG>1&u%`Woew z^)=2ZOFPRcOWW_1rJduHr9IOrOFPdgOM8}6mUe+tmi8Q{EbT(4EbV~vOvqyA*^rBz z0mu^Pd63JT7ebagmqK3QEQKs{u7nIauZCRXTn)L_xfZg*c@yNV&JB>2&O0GDI;$Y7 zoYjya=YxGU4zAdQHJ+#0Q@4H7pHn~R^c*L6?*(w@6vQ@nAk*%W1 zBU?qpBU?p_N4AQ?9@#2dJ+f7N=jniuH%5;`m{rk}Aw$tKA#0*%LvD!NsxzQ&Vp=> zIUn-7n3a&nVs3>z9&-<5Tg;=7!uu?w!}|iH$9oXc>uovHBf?%;KKs0~d|vU&^4af| zCG)0N_KrrcZ1eAXWy@^xehc>z?=i^ll&@pT*Ky^`;gjKbd@`JPb)2YbTA) z!w>sp`S0_|SYGkT^55^1<^QHnmVcv9#{0fc_R1!o?3EFp?3FD(*((qGWUp-X$zJ)L zPxi`VKAFPfKG`c%Vr3fAV`Uop$I7@eVr5*Tlzp7CFH*-P>Uf!QQ>xrt5i8SE7Aw;e zjFstG6D!lRHddymBDNP=#kSZJD7Wpg{m;U?RuB$qFm~)&sKHo2kp8$=AamjlLe7l)2{JFvHwQf^E(@|C zZrU8DSQPizNlsA`w-Lw7;_iYhjjMvZBJN(uvbYdrFz)_27)j!4<~W2mej{Xj{9TZV z@l}vr9j*5Q*a$NkAkXi9hL;B-)L*~Tq zft(rtEM#8%^N_RR>mdu`_d?Eze{qh9-!DCelJq9Xx`!NFdtc&CXS>_j8wTsMYau=D? zlr9}k9)in;7_4+8JBsStCA*7<71Kn6;vn&s;z+uiAR zr-GZs=-L4F%}O_F4TnCTN@kNqWI0()ZU*-V-{vs&2wCpb;cNzFImqAJ+=z1XlT$%y z4^giMWjWQ8dqG*h&D7UncG@GB)`meD&LL2qPs2iTq;Xp90C10}t=$Yt`@SgrUPAf@ zWw=H(^F^kE@_aV+si5>10QZQDyNhTKD!u9MkmAOw)iK)LAyCGPB|qHHzsCZl{}iQn zxi=M*@ut!4SN0F?&89t9>9w^1#ar(yqJ1GK!zrg;O@_fe;>^$y#oudlaosG-qc~RQ zBLeObgQ^{IS`UIU{t#InuXVhlNZC_JKN%o5<2rJ)m|Hs)_f2FvBxU_BB!i#~cQy48 z_0817)b~=4P(MT+7e~s!1e33Wet1p9G&#MXz4dTMtAaDR7?IBRRJ;?rA;KpFmGrFY%7PVusBwTka-i}1Wi z(e9$aJz~fsDb&+QKbcKVB?II_GDxl_HUefB#c)>m5ibrx4pMPW_?TeLe zKDwHEh}=wu$-U$u(n{0erjb+0h2&~-Gr5;ML|WzRHbTml4;~rax)nw_mUAZI828VBEw{aJVaW< znNHGAP9+0mkPMMxg!Y$0`pE#9Jw~4|BFo8YvYt#Gr`=_fMPxZyP1cjmq>-uprIOiX zvtQfsYDZO$sbn@;M20~*uQyW{Q?yzR+IH)1XTX08&eq%=?CTcZ0hx7Gil_| zJy}mi$YxSZ)9wtioNTu3(-{t#O_t|sdo@{4Hj{XvqAnLQn=B&B$!h!j$=ZF843YI@ zGil^$clBg5X`G_%QQ#ht`)DflY_fzAH83tuLsHZMwYdu7Y0&a$P%+>x4GKEYfv&kZ|oUA76$!5~PzNXAa zDw$0dk>zAHSx+{T2Af~zhzx=;2)~+oJt+#cJ%#j>0WwI2$S_$Q(D8-IdNM*b zlcI>_M5d6{WIfqT8Vi^YGMg+S%gJi8o@^$Kh4fEmlSO1XSxwfH&7@IG|712!x+$ID%HJ(AgE5m`=Flg(stsa`jigR&h|ll5c- zl<8=uZd}Uv$&|~r?k59ekPMMwQe2_k8)OQZO8UuwZC|O~*I%jGOd6}SUJmXN30tZa z7j7vp)AkTqO@_$`DX!A)Qb<1;AcJIx43iO3TuuL^pA3*eGDKFBHK4ps2~)2pBc!-S zhwA{PyCUl4WHnh&Hj^T#>&XCRJ*H4krS7L5AcJIx%vr7D3tq3o36bSD=qYFty)hZ{bYa)k|8o>y>=faBc%L2mTZqfGDL>S2q|u3e59WY zkU=s;hRFyiD(Ro}lL0bl>vuB$WQYut^<;!>CdEeW53jt|^+o#002w61;2v@I{USv7 zHmkMnCj(@VEGI)`H5n!&q`05ql72Ek2FVav1FCjRJwoE9gUXMnVR)pU43OeMo+tfe zfDDo$GE7ED@euu!Au?=pi#{JAMJ?TvelkD?$q*UYs@>z&x+*^bGDwEVFc~57>T;d` z#~2^!Cj(@7yFMQw@yc@LFNO4z0WwI2$S@fp1CML}K{DkDt^3IU86-nb>GNT-o=ka~ z{>T6sBtvAF6uY(i6w*%yNW4m2Y&9?*NuuBS$q*SPQ}*yY86bmXhzyevQq(bi(ocrS zFc~578h2gJq@N6sK{7;!$p|T))BeL`gcQ#+T+&Yl$RHUa!(@aMVfrWiWPl8kAu>!x zNKsG!WPl8kAu>!xNbv&wk$y7tPuOL>9n=g-qW;2U;E*04CFOm)AazNphp0JdXVWP}u7&_C%X z17wg4kzq1Iio^6z`pEzpBtvAFjF938{gZw&KnBSW873p7_>%rfKN%o{WQYut5fTr- z>Hb9e$p9H7Lu8nYkfN3TNk17RLu8nYkb&>CzaSYR!(@cSPvvyGB_m|;n6`(=Fc~4m zk4zWoCj(@V43S|nLW-a0pY)RfGDwEVFc~4m&-73F$p9H7Lu8nYkocU0t{2iz2FM^8 zBEw{a#4EV9f6`9|$RHUa!(@aMztBG!{#EM{60daE;gfzcKnBSW873p7_>KNaKN+y~ z-}U(b84`wCH-^awi5~?idkX0%17wg4kzq1I3KPE%Hm=_+Dc7Ybq@N6^^L3jg<@q2P zBEzJ^WeB;RO7Y6@zTX_|jNh3-50POqLI#qhyTLUny$rD$&sF(Jk*f7zU(FU!hP$S} zW*A&$6xT!)H`U;wJLs>~)C|(+i!(HXpuEo#A|s@Ku(k)ulp$L8lVLJK28S^mGB}(% z85}{K43iNuFjAinlA&=jy}#Fl6-Pgio~hH@lBMaNME7LMWa^|pTkFMB=#Pxd)a5O5 zH65U;4{()n;R89;13VujL+bqF4@9VoleGU7(oY7+AQ=Kz8RmoHWV$E);40(f2ZPi@ zWLVj6eo*AmJsCPx>tQnGG_Cu|5E&*Tq?o1M1<4Q@23Hve9}ML4JQ)I48OaX?&(`)3 z873oS`T|{U;q$e-2$`~6>wYpo2FVZ^CQ~k@dop|(!y|*Mv>qbEWW?65qI*(Yt@RW# zKnBS$86m|rbWaA!5E&*Tq*$%nm7k2*`WkJI{6mK)u4lNUpA3*eGDL>S2#Jq|sBs}& zsTm=~?F^UnlL0bxm#n|}4@E-Sov5aJ(oaTe46zyOKJkENkPMMwGD3<6>5dGM;vsEM zA^l{443Z%-O!~KIe*rQ`hRCqZTJ0`E`X8o0vKW;8H%L7MVw`&@v`xDUlj0Grr;vU! zKnBSW879S}^hf&102w4hWSA6>(I4q217wg4kzrD7r$5q92FM^8BEuv;4W#Nbh4hmF zGDwQY>5dGMVKPFBC+Lp!lL0b9ik);v`pEzpBtxWllI}@A86bmXhzyhdr?kHS86-nw znDjqQcVvVVyBII&Cj(@V43R0jwR=AqAcJIx43iPk{|w_NgJg&dlMzr|7wyrE)M zS^6h~WQa_8j_D$UWQYuthHwe_B_l&bgI9uHa1|I2mVt?&{8e;U@MpE+v^``Zq)oguk9k)h1COOV^EOlJw zxX$r_<7r3O(d-!Hoaj8od9HJb^D^g^&UMb)oDVr)a5gxYin=l?81;{++oSG@+7|Uh)bmlVM77+5@}ieTmqp(leP8tE z=;xwKW3G$|#%zeWFDB8u-utUJ$#;@(uCLU0jc<+bY2UNH_kADvddJ=!J0$LuxTSGr zaj(Ti;=YbciXRo98=oKlRQxmXAIGOB%ubk>@KD0mgf|mDNN7pu)?q@2><;-ImUg(l z!^<5$>R@$@>e##E(2l2coZa#HjH)OCDPVbZ3g_mUz>hm*Q?JHOkmZfACXw)^q!-sDlq^OLVmu1KEOdn+@4qT+|l#vp1pcq)N6UKb-ixuwW-&$y<90VDMM4vN-0XYJmrRz4JjK_ z?oHXAQkQZ`YA|(e>g}mho=%@qMTFUC?)V-^=@6)wiPWoqg}=ThsU9zDN81 z-1qmsbNemsx3b^${kHV`qTe6=GWw6`@9#ge|7rcN=zn|v+Ws%~KW{+AfTsrhG+^Ao z+<})4TtD#sfwcpl8~ED5#(^IX{Cr^Rz#j&t4ay#rJ80RU8wOPlx_8j7L9YyYW6;-w z(lVxG1TrqlxISap;F*J6L(+z13>iIS`jCPlfg$$}**)aVA)gKTc1X<70Ygt6dfw2o zp*Ib!8T#1J4~Bj}be7|{q0z&73>!bJXxPQWHVoT1?15ohhdn*)`C-2diydAueADpf zhrd7k+u^PeT}Jpv%o?$A#3Lj2jMzJ3+{k$&uNZm5$VW!LGV<$@eMXHQHDlBlqkb9H zWptm>#bd4>vt~@imiCTD6UNUR zf5!O0_=mL&d>sl((clNV0DeDbxE*G|5D z^0vu)CZCw>^QZd9`ltKz{O9^t`)~07YY;`p1ODHn^QlW`t8&uIgjT&le0JHgPgXUKGRC3eK+mr zX+5T=O|P6DnqEKs%o*p*_+f@QbLPxzXKtJM#LVYszB;pc=8>7-&irwvm79>;JvTMC zU+$3HNx3<>1-bKb&(AH%y()Kg?uOirxtnuqb9d%Gg9oe((MOo#Ry-BIT{y(!!i|yX z>SysgL~uOrpUQWJ*t$0z@9~HJDy~}(fG?!s_w8Ug?7x9?FuWO748rsxJUmA(;xKZ? z<8izM(GhRZ?IgP3e>Z$Nu)7$5v2&d0h38XKuJ5Z#O$MR(&Sd|&cb zG2Yl9<`}n$v#|kDXxuG|jViIuxEEhRyieR@gv71J{o)~`Mm%b45sw*Gj@mr#^d5G;|X!l*eO0Vo)n)LPl-duF7dhXj5uc0iQ~qz;uqsN@taXE{xDv^ z$5i$T!`vqv=8M8Yvi6|4_qcdL@_-c{xneT~M^L-I#Hi-`A$0E`E zM07GE_=a4wNHRYaJO>+M3xaW|&`# zlgw|#DdxBMjnj8xj(Jp^V}36dn#aWX=8xh6^C$ee>1T0~d0bpUr;d{-{gT*2@UGW>t^()NqU zZ#D^04EJC35#mDdKc(laGW>24?w$nYH_5tPt<%v1=~)H6k?FD1n~r@FSstDH>hPbR zqx0Q9{dT_6knVE0pLSfQ^QG@KPk9LM_ksPCEAiY1IDQp=XAV9F-VVOAT8I10T6|{_ z`bX!YY(V*ai!ETyIl5e5#(9~ZU;m-qcRLU7H-_H6-t6;J_u%*XIRECOLhJ&ap!{}5 z#*_GN0N7zC#u(7f_vBCE7J6k6zn2CJuEFnXLA#u;MR|P+y?r^_<@Y(xAIAAx%JE(c zFz^w+ivT9p32_`u!FcvNc-3`ypUnm#!U#VK{JV1LiFCx`{0k_zj-XvmcE0WM8t{WI z=l1Ee)73t`GF?ds&(5Ene>>gn%fZfHkmVVV8s5UhML)%fZh7^*7^v7l@~QdpLo5_rq?VPeH$t?Z|GI^=zMUr|WXG+g#y}!;ZF89+uzD! z-S57{xOD;Co$A6B1cLd{Zy>xFH;$^VM?O0EM zUG{5Edsy=oGIp=lv*zP{&~SJDY|SZ`Ywkt8O8<7ah4<<5tn%pc+=Owm8Rum=d=9Qc zx}@IyH|;KiU*t8g#tWvyTHrNx>{k^Y&mZ+HstLx;Pgy|rET zr{AEj`9jy%OtddqFLu4p@1xzFeOTL{I)Ps!-iB{opx$IWJ73kb!@claUCx*Mq3s*7 zvXbsfAJ=+^%QQbnyt3Q}Jg0dGx^(yCjhY7!VLU@T^<>XosAK4Ien!s6u9p;Gw=x1P@mb`1BPS0KEXm@v? zvApHHF6Y_Vr|WriDaP+0!g&ef)jz<6#X8@1Jv_#G%)~lC*7v(JHCLacd0vU8d=5^w zLwmho*QcC+DiE$*ciaKWc}lheIX~S8%K4`+`23|K`}xnF_x^4?x7R~GgL=MiKhL!v z-|czRp7-Q_G>^$~Q`Vb3pS7Q_+OL0Q{mOo7I&r58lw*