From 743054f2c99ef9cefaf3cd8aea40174943d515b6 Mon Sep 17 00:00:00 2001 From: FaceDeer Date: Thu, 7 Jan 2021 01:12:54 -0700 Subject: [PATCH] added a way to completely destroy a pocket - no delete/undelete. Made it dramatic, just for fun. --- api.lua | 36 ++++++--- mapgen.lua | 85 +++++++++++++++++++++- textures/pocket_dimensions_pit_plasma.png | Bin 0 -> 22671 bytes 3 files changed, 111 insertions(+), 10 deletions(-) create mode 100644 textures/pocket_dimensions_pit_plasma.png diff --git a/api.lua b/api.lua index 95062e8..57f192b 100644 --- a/api.lua +++ b/api.lua @@ -85,6 +85,8 @@ local save_data = function() file:close() end +pocket_dimensions.save_data = save_data + load_data() @@ -258,12 +260,20 @@ end -- returns a place to put players if they have no origin recorded local get_fallback_origin = function() local spawnpoint = minetest.setting_get_pos("static_spawnpoint") - if not spawnpoint then + local count = 0 + spawnpoint = {} + while not spawnpoint.y and count < 20 do local x = math.random()*1000 - 500 local z = math.random()*1000 - 500 - local y =minetest.get_spawn_level(x,z) + local y = minetest.get_spawn_level(x,z) -- returns nil when unsuitable spawnpoint = {x=x,y=y,z=z} + count = count + 1 + end + if not spawnpoint.y then + minetest.log("error", "[pocket_dimensions] Unable to find a fallback origin point to teleport the player, to sending them to 0,0,0") + return {x=0,y=0,z=0} end + return spawnpoint end pocket_dimensions.return_player_to_origin = function(player_name) @@ -277,10 +287,10 @@ pocket_dimensions.return_player_to_origin = function(player_name) end -- If the player's lost their origin data somehow, dump them somewhere using the spawn system to find an adequate place. local spawnpoint = get_fallback_origin() - minetest.log("error", "[pocket_dimensions] Somehow "..name.." was at "..minetest.pos_to_string(clicker:get_pos()).. + minetest.log("error", "[pocket_dimensions] Somehow "..player_name.." was at "..minetest.pos_to_string(player:get_pos()).. " inside a pocket dimension but they had no origin point recorded when they tried to leave. Sending them to ".. minetest.pos_to_string(spawnpoint).." as a fallback.") - teleport_player(clicker, spawnpoint) + teleport_player(player, spawnpoint) end ------------------------------------------------------------------------------------- @@ -341,10 +351,16 @@ pocket_dimensions.create_pocket = function(pocket_name, pocket_data_override) return false, S("Failed to find a new location for this pocket dimension.") end -pocket_dimensions.delete_pocket = function(pocket_data) +pocket_dimensions.delete_pocket = function(pocket_data, permanent) local pocket_name_lower = string.lower(pocket_data.name) local pocket_hash = minetest.hash_node_position(pocket_data.minp) - pockets_deleted[pocket_hash] = pocket_data + if not permanent then + pockets_deleted[pocket_hash] = pocket_data + else + -- you can permanently delete a pocket that's already been deleted + -- this removes it from the undelete cache + pockets_deleted[pocket_hash] = nil + end pockets_by_name[pocket_name_lower] = nil for name, personal_pocket_data in pairs(personal_pockets) do if pocket_data == personal_pocket_data then @@ -355,8 +371,10 @@ pocket_dimensions.delete_pocket = function(pocket_data) end save_data() - minetest.log("action", "[pocket_dimensions] Deleted the pocket dimension " .. pocket_data.name .. " at " .. minetest.pos_to_string(pocket_data.minp)) - return true, S("Deleted pocket dimension @1 at @2. Note that this doesn't affect the map, just moves this pocket dimension out of regular access and into the deleted list.", pocket_data.name, minetest.pos_to_string(pocket_data.minp)) + local permanency_log = function(permanent) if permanent then return " Deletion was permanent." else return "" end end + local permanency_message = function(permanent) if permanent then return " " .. S("Deletion was permanent.") else return "" end end + minetest.log("action", "[pocket_dimensions] Deleted the pocket dimension " .. pocket_data.name .. " at " .. minetest.pos_to_string(pocket_data.minp).. "." .. permanency_log()) + return true, S("Deleted pocket dimension @1 at @2. Note that this doesn't affect the map.", pocket_data.name, minetest.pos_to_string(pocket_data.minp)) .. permanency_message() end pocket_dimensions.undelete_pocket = function(pocket_data) @@ -401,4 +419,4 @@ end pocket_dimensions.set_owner = function(pocket_data, player_name) pocket_data.owner = player_name save_data() -end \ No newline at end of file +end diff --git a/mapgen.lua b/mapgen.lua index 8db22b0..97ed69d 100644 --- a/mapgen.lua +++ b/mapgen.lua @@ -36,7 +36,7 @@ end local get_border_def = function(override) local def = { description = S("Boundary of a pocket dimension"), - groups = {not_in_creative_inventory = 1}, + groups = {not_in_creative_inventory = 1, dimensional_boundary = 1}, is_ground_content = false, -- If false, the cave generator and dungeon generator will not carve through this node. diggable = false, -- If false, can never be dug sounds = { @@ -216,3 +216,86 @@ end register_pocket_type("cave", cave_mapgen) + +----------------------------------------------------------------------------------------------------- + +minetest.register_node("pocket_dimensions:border_collapsing", get_border_def({ + light_source = minetest.LIGHT_MAX, + paramtype = "light", + tiles = {{name="pocket_dimensions_pit_plasma.png", + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 1.0, + }, + tileable_vertical=true, + tileable_horizontal=true, + align_style="world", + scale=2, + }}, + damage_per_second = 100, +})) + +local c_border_collapsing = minetest.get_content_id("pocket_dimensions:border_collapsing") + +function collapse_pocket(pocket_data) + local collapse = pocket_data.collapse + if not collapse then + return + end + local tick = collapse.tick + if tick >= pocket_size/2 then + -- done + minetest.delete_area(pocket_data.minp, vector.add(pocket_data.minp, pocket_size)) + pocket_dimensions.delete_pocket(pocket_data, true) + return + end + local minp = vector.add(pocket_data.minp, tick) + local maxp = vector.add(minp, pocket_size-tick*2) + local vm = minetest.get_voxel_manip(minp, maxp) + local emin, emax = vm:get_emerged_area() + local data = vm:get_data() + local area = VoxelArea:new{MinEdge = emin, MaxEdge = emax} + for vi, x, y, z in area:iterp_xyz(minp, maxp) do + if x == minp.x or x == maxp.x or y == minp.y or y == maxp.y or z == minp.z or z == maxp.z then + data[vi] = c_border_collapsing + end + end + vm:set_data(data) + vm:write_to_map() + + collapse.tick = tick + 1 + pocket_dimensions.save_data() + minetest.after(collapse.seconds_per_tick, collapse_pocket, pocket_data) +end + +local destroy_pocket_dramatically = function(pocket_data, seconds_per_tick) + pocket_data.collapse = {seconds_per_tick = seconds_per_tick, tick = 0} + pocket_dimensions.save_data() + collapse_pocket(pocket_data) +end + +minetest.register_chatcommand("pocket_destroy", { + params = "pocketname", + privs = {server=true}, + description = S("Destroy a named pocket dramatically"), + func = function(player_name, param) + local pocket_data = pocket_dimensions.get_pocket(param) + if not pocket_data then + minetest.chat_send_player(player_name, S("Unable to find a pocket dimension with that name.")) + return + end + destroy_pocket_dramatically(pocket_data, 10) + end +}) + +local test_collapse = function() + for _, def in pairs(pocket_dimensions.get_all_pockets()) do + if def.collapse then + collapse_pocket(def) + end + end +end + +minetest.after(1, test_collapse) diff --git a/textures/pocket_dimensions_pit_plasma.png b/textures/pocket_dimensions_pit_plasma.png new file mode 100644 index 0000000000000000000000000000000000000000..d21c158d57be3563df1f566f73e85e6fb600be70 GIT binary patch literal 22671 zcmcGVQ*dR`x9;O~+_BZ2j&0kv&5oTN_D(vsZS2@i$F^-_r(-*}&$%zB>ehYxpSfz* zST!Ej)2y$?`hDLFS5}llK_ozgfPg@ekrr3|SIHnCpdh|L{d=>cd+zvG5S*lSTp=Kk zF#l^qLS$s&{cFOz$tXy`?;+ztQ`7vOCW!ynf-{wq5{LNwuP3jwBoP8an@C1nMBQ^O zx$_=iuH(V({aI!8>NA87n7)&D716?F`|njDO)HX|2Ew9CE;B!x7>|11)4X5V_U_Ks zF*H;1iDtdsa{V?HPRz$?(V-p3l2Z`_p8MmZ>q+94cR-*}z}? zeZ`~4^V)CvRtOLbu%gpCDc7x%ReXloY+;|dyVc(A5C-FDy%rwNSMJX743%pnlpv1z z1iQc~{7tr8E}inX6vSkEjlBGYcUAcX9#9;(K36BuwkN;|Xe3iA&+kuP+8!4Aa*JoY%&B=_>?PS)~-8wWPNEgLy=3?og|~n!Rm=P?=cn6dVmwpAqVzW zKGB~5&SpN`&E%@A!+~+tXBf<_`1F;pm>CqCHEg+0Hhl?u<*a3_Ev*yR1*?wo^s#Q! zkJo50AkE@R%Fc}1>?95BY?~$<_~;w^X4~YNtGH$#_v<>mwe;|_$s$zTK)t!^exBzT ziVbwOlCip5o-UE{h1wKjTbWIC`)b7#om0o$eUu9YGYx7C}4qo5bbCMZf^D4Ly;f}IR<6*5W<0{o+;*{kcd80=-W_#vd4=hy(#5!iBT zLT@c^sB@xE$b>UO5kalNcAIzE;yM2;(M zk9eq?hvyF`&T2NDzG>&*y?H*>^vJ`pA4_&Kt#rSiq&e3c%QdU&HD1sOyLIUWOrsDs zvlfWgaN0p5&GKN@$m42&wQQnl+n5x@%Hd{pN3?rEOzQli}5SGI}J`?an^+aTB^ci9yGCSg7!8eu0#rCwbGx?MRySx z9;pW-qwaJY$21>2Ogyc3`st^mfmJo{7NuSnLGzB$j$yWF?1w4l92GIcIa^u2ul+rD zLuuKp3f;Y%79gsQXO*TuZs)<@e6b{A)j7(OK2$Kb|kyEcDN{qQzo(fMrxkhNq7DCH0Y9wBT^lWQOPavf*WUDK>NYZ?jlD$?S+& zE?tf$x%hUh+fK#!Jw6(sa?z9G7%3J_SK3#Vcj>Hy^FE>j`~UAs8O(<;z)-u zeJk_%slm!lX9muk8r3}~A7`}<}<*E!p%(`P+`%L>eOQJvI9Z#Lo7)YI)sW;w!^Pj7fRg!4XD=9~B&!{Krcb4aOV*obK zF#`_H0nniFti@`xRPj2MmZI9gxna2@crm}C1EnMgWZl9eb9!g>B`FS;;vFhQhv=3! z!P&a8^@ahVM((06^(rM^Pcx>qL zSV~LWmk@ITU(=V`Bywo_2*lZT69R2Xji5lfoM44?9@#nFeeV6R9P@`q?EUurxgVRh zk>wm>BlNC(?-x`KHZYRZkRV}eY_ZhBJL=@a?#j?b*mhQh_$vK1SJtMpyrq1@!1<^3)$_JbX)h>1Yx^E@l}&2A z%YC#AIvi|JHgNqd$7R|V_~x7M8;MRDvG#qne7QW)NU*=0R>9>=KfY?W$xvg^OUfgN zlLb&Yu=#aD(%`d5yrnq3!R|vpy*vcv@{jqUprf~YlZFB*^^W}44Y(yn>}lrU`Q$!) zU0_+-yY4QLKo{%9X7-8h?t6z*rCD8z&#L*8G9@7Ycd8vtGiPyylKFLv`Eq&iKIrN~ zUZY$!L~FR7L&*B#mZRLJJ)>KH%8(X!nzfIu%q6gYyXmHQu_BeJ9@7>x2fKF&wvhA} z$;(yZ@ol9F(R)NH9yoqP-!#g)pMaSbqC%`~^#1z8BLA+8AA3ucF}HsU@H|hWqdALn zD*ghQ%ALkFJaOZm0_@vo52NC&r_2yk#ULFwh%C;qiVb}%ihN9u+3xJ!w0>^-W`KDh z6=7Hs&J=Xe_SSO>Ug9xh;9lL0q;sBB%rsgq&1MHd2DeQPp;?`CeynOpN@QY0rHT;d_t#9XvjzM6I#WM23uJy?W&gy2~ZlK3m|| z>vo3VH2$SNw+6BMkk;^>R4ZwiWuOg^wf)HJFOYbOgdQonfTv)6Kjc~jvRTg{T+Wj?)WWId)oY4Rtct>Lzi|m#seVv^oM6K#eb%+*$ zwJq};_-zoN`thG>XK8saR%p3$`tQyHo9~#AwVQZ>MnQ-(59>izI;Fnls*Bwt7$)zN z)6mnO?G*&<_auuA6la@BBP4W|(;8WoIvUv@5`y$EQrnGRxCT!Bv3cTaQ1O!3Y)sq5 zJeg0E(1biUwinB7au@p)2u^!WGOkvNf9^Tut4>qpVCfylpxLEAY()~DOTPWg@tWG_ ztzj!>Df8hPZpVE#9lnWXlT1^q{7|tVbhW{(_PG-_>g{HBfs}oaphS}wo zh;%Xe#6?x?LGgQie$+4cshJ-uv}g7@!KfruAbMk9;DP?vmz^n(x6Q{z$3NTmFf z4&^hwgIwOkxOR(5tum>Hi!gi=1usSg`v?I2?b76(u>w42k<)l#7Rx*&`sqcL?x}L^ zLK3`7TW(^Axz&Vnj?9?_V=YfIziyf?>0@gcNkNFk+D_QG&=s=Zay zd$4gT)AQc%^44+f@{ z-GwIr#b_J37@DNN))w)~_|T0J+gvwRWchx09rU9GE;I-M+$SH40jYcIuBTykbxU_g z;pg9!sCP0z-u5~q`zFd_@_0Af-k*#wUcFoVVih~B9{GVwIaUy1BE~b`M2frms(1o z`nPu0k8>J-bvH-B4u(u_U1|fXRl1JV0x`r9Vn$pNO;rG5p--QHoZq{x-)~v_15n1@M!qBnsJEDU zT1a6B-Tz$kK_`44Cm*Q0ZC-(OR*%S@sN;g|6pJLL)|SEKYj8;<)yFz=9M83i;ris{ z=@QiKm~NiRKt7kLAXPsvj*>tqKFGP5-3KeNg$PcP$mG(h0r}OAW7o3?vi=Mx&&(dz(AlX6DFEN{2!bUr{Fk5sM}xu|Jyh#tlcf zCP-d7M#j63X!uaZS}Hz0y<%+k7c7gSZu|rR`9W&(kG_sgd&o7&5`d#2&Vf7lgv18g z*wxqu$+yhC2WG>1>j&_V&*JG!lcmPFhLdsFh0MSI#6eVS>M8|GqZ?J_CXMwF^Qm>s zC4u!~#RIW*HWW4~!4K9nA+2yy#si0$>v!10;*(RkbIr%Mvf}hYh|&YF=!dV4cLg3t z1aXUet@6ymnnst56H~yG{BCn8p!`m5ie~j8sdqcEh>BHH{lN}=>u9$80YatCxzR*D zpVVdIxQ;OAhX;-X7=SY_Uwwd&dv6IFMmD*-*<0zAS)lHmr^>i8pz^&)^nXx+{~vW{ zC82xpY06-qWZ7TMU35fhU3V$`GGi~t1B8@|ntM*jvA;3-;3zClIM8!()sI^eT*obHwjz z^bQ$G7IXdxSq_on3f9AkL9s`mtUgEw5JjBGs%l6zK6UwyM_q6I2pB^`MUyR$kA^cQ zzkr{&)M&YeR2)P-pHiQy^A@+_@6fEkn@%3%AUT}xSz4HxQ#O^#;hDVE3VJ(~UEZMi z1e?D&t5~Zvs$i>1op>&_aHR7Y4c+_w)LChu_%}+pItk6>$Ufvi9F@~M2j4{2qQKf~$-Ev;dQLXB1wJ`Kb#!PTCF z=z4K>Am8^mtL&s&|HY06n8~PL8st%w&q`w$eEwC~DX;8l*LS-f{J4!K_*&htn`&}d zjCZJ)Te-1^+3xbvO6z@aHL3qVxyfRMsKo!;_?w{ZPBh|tRLLPiY*83tJ@~OwhhGi# zeEJ6}Zk^co(1x4Z0tuAs-~wOGMakgKA2?G<@9mgPLdYu5k#--#JoOxWoiy29X-Yyg zN|(|xRne$5F+mR&-}oA+%SD^PIv8;_SXopXH*99*xk*aVvx)}_xXn^5$%j=ej#h+NsdmKwx$A+#Z+9B1);YAe(5RsbGLg_2Lz{!n#QwO&!r8BoLr=punOuh}_hP>_r0^Mx8B~qrF6QveC#_NF z1@;)?c1LjvcoltJjaML{8AihnO_6Y_md#?UkM(*EhjGCr9qY3Vusxtc8+ciI4dH_8 zqniIpGAJ{cLJU%3$S!UukyX=6$Z;3BEM7Rd!L#5T)%c6%FTSY^-IYtXYcS|xsS_2qDFi2M%hhIz4H7<9e@q~^caO}n%Fi|D4t(^hvbWCm0i?{OQdS6X3h%E zUxQQPb-ZQ1d!X_Wu9FmKb3{+r?jkvjJCP~Jya|rOtCnozkgQBwLHEMg!q=?BeQ2fU z6k-E$Jo z#aVs&oXAe22#)x)o@TwV{A5$tlWxvsZ?t1Nsdf-SA)HpGR5x*cJ<2PI)RKXc$`Y|> zBX^9C-S1^uzO=Dbk(5fQzJv*V?z0!c6@w%?*w0Vn%16RH?sdwo+Pg;KH-1F+_CzoA zx%phCR=(F7Nx9cHCA@#=5qknmq-r#t)(bqfeoNDBVAi=Cy*14@xV_AuIhQPE=;o?l z(v2~!`WA>kSmZO^Pi4xI(hNV~tXq1AYKF++{$#V`l~~W=R6CZHFBJZd;EVsyM|5i3 zz#(>iOBMT;{Yrrf-BARW`o6Km3=nvxB@v}Vjgyb4)rcIEM8MD6ox;zbnYx6rcGGJh zrbGEdppnd*e6iny_#~5G%SS_*#Y5|xq#}`jnP*R}kxh&#&%Wk5|H^RjrjJgdZtIXZ z>cN}deknuqC+F^F%8Aa7R5d}iu}3ZLAGEVi6Lp% z=VkP&8uqYR@0wKG))afWOw4K_YL)+oT0(}nK!gp5ehcH0NqTglY*Kg#}h2yuUqe>&|M$j&v#)@+c7XZ+we6K%rH%%@oCQ% z!nDyf)^|?}FZsGPc3(ILXKE$M=8_W50X3i7xZDK3+g<~3oqK$E|Lh*7F6mr!T>jl? z8(VU`!t7SteBR<2$n>~_2ApiSWSs=N|JQ%_7lh61u9 z^KZ5+-prYu+Nx4mJr;*muO(G9n1buYMowCG-LF8wdH=sXDR!oSU*2ZCjZFCMhF^>( zL?pq6XJ}{A$=j}`74)46V^*uZKk^4gML!dI?qZ@?Op+M2_J$G5_75l8FdkLnR6sR} z6RpiDg~XB0CU%yV1FxV1Y+6{*_JA5NF#6B#;pcYiupb*z+9*xnGI-PY$d6x-ih zel>C`eQFN*WYaaDh2x-^j~$sXig2=P3=7=Bk{ggP*Q_ zKe)elVzp(8`YNgTeK%|G(Z=75zce}{-NJe1w&MQ7^ax&NvHR7gnc@(3V*tzH04>*t2NuUx#!BzBhgfZM z1%9+tB)_`3DM|jK5xoei5({;{<1uR0xORlb4>~KAuy{yj1&r-bhH1kos@I!^M88eC zoJlWndV80Ya^6uIKgU&Tpx<-{;T>Azzgt@+duy zLYKtvO1{}_TuCqZE~g4eYZ*2iu16vFJ|sigZ_er`D4+gVnVv-#c5c}aN?K7#I)&M- zt6UJ1NhF?i&pB31UIXU(e%KGs%vq0UJk!Zv3#Rg`t6xfM77pp}?y&ja<0xJ%^t!y# zUtX0nN41TW+GhE;Gy@&{+ox3icc}9JmF2QdiQW3V4b=%NS!2NIqLGh5_o^BKpRc(F zb;M??(;wR{EOoMl1jCP&*N^s((Z#xf<}AI|9`}Yl>S@@8a~msER0gzSMh(VywaxR- z7np8R!C1#Qnv!uhj^Y+tS|0t(rz@egr{jdxYHY`P|I|FaguAAxpiqW&j^X9Eb?r~M z&&=+7MMt?2Qi@R5^2WhzGb+si|MT|>s5iO8!Cc!cP?$RI11=oJ3BjsX zhn(}B6T^G;X$=dwtbjx`d+4r`VlGOv_4?Js2K(~oh4rc1B5i})pwPuWI2oAcP^_U{M(UkzjJtdzKsC2-KLlNSiU=q z{=hjbfT==-Mm&<_P`ed8AZ6+Ns^Dmroj)0aL6su|Z3dUA|Os4S-cQn|+}4i!-q+ zB1`&%3ZYI#$9ekHwjX>jYWjht)-@zT`5TfDF7mFe;7W6DyL8dAaO@+%E!_5bmbiDI z?Aup)Pn!B%n0Z@f0M82nJg(=FGPze79^V6~eHq)D43d%obG%y$lu;O#+Nuto z*PM9qhOGOXvD99V()sCwu{|EgXAHt2mD$6j0d}dj_MD(utea6jV#8|&34U;@b2;J> zTdo{mCwlFM=kdocq()pT2A2lbd*5D~{fu+Fgf~q*aDXah?Lfgs2$jsNTN$^zGlqM~ zPi!n&c6swu@g2}0-wjf@AQEcgSZp#bKW~v~Q=t*6Omfg%DXDyrWzFQcPlsX>yU?|^ zv9+_)7$D%F&Vs`LL}VzL`{x5Am82hnNwrq2wiC)brT!0AIJW+rS% z2-Y#pb1ZB9>9_ecS()Y%id+%7Sqx^#m@5;uq7x`P`1`X;F5kFkGK(7a0kl&&D1w>% zt4)NnkkT)hSer-~m*{G zQ@1o+=03tT-dR)IWObo%xQbMdSn#PKyFltJ+Es~mS-zz(5+OCGCdB_8T>Rg#qO|8D z>P=bYa!fNiML_e{tys6!E<4aDLp$*#>+=3w7OuItv%+kKr1oI@V_}=y6>m<_+=zs$ ziisRb!*)#ijG8P_)U$%~gWvbi$kxbrd!5@BOTb{!x zj+yEFVpwOP^CI77Sw^}gR_7k`tT2AmiZmiARSj;c^-W=cM?sou)bj5T^#q_=ikaIV z#AvPjb024w4a>jV7Piqfa+Zw?HmUYw8_u|}-H_6=pO0{0uxErf)%6aNALfe&bC%3J z9j5%bW?D?&NWe3~6w}~yZ&3H0pq$2qYG;KW|9xeBG^N?6H=CO^MM^KmLMLEZWLS2U zFttHFo9n5rW1uakv!TG)!6DH0W2@P?eE(6V+-x@~s>&&C*0-D$^nzC8>!X&lxLZ~w zgT*m;{4Fb<`N%Z7z$qpX0tRwBh2k3w;v+sdFo`=kHfQAULUVy+a;!}j4bi6-Y2mHu z@;Z0@;=L@m{B>|&hj1j9R>>hu4Af%{0UT*z;ArM0;LdFsfuJBZd*>8WVL1*C1O*j+x5v1s!*W~;&AXLlRyQR zv~m!yB+(k|%-nNy(ZG>%ybWKQc?JD+vhpfaY!NVeX*DMJk`dnNWuh#Ssn(V}y}@{+ zP{3OnK5gD9(+?jwF*_y&K96|Pe6iUH9#U`Bo-(ATLQV0%`A{gk)|fp5VdznnGh{&e zUJlK<+0R}eC7!)4%07AWy4F(wXx+ZYmY92-OemzZQ$aA&De*i9%12kl0tEuOdDi8% zslVemYC83Z9%o+(!*$8k`~Y|MZ5`Ahnou>jvj?>a&#DY-aPxWNdbv`KKZ(U{`ZviI z?lFdb2aVY>HVY;4s^xtQ1Hd?WuCGe9`Vu;T`HsDXavk5hsDt~uD_hhIUDfMxP>!GliX z7Q)w2R;ycvTS>xWCA?0=U{H3eQ4$<>Zy}zF7@CdcY=Yqz>!475^8qW>7h&{cNmuRR z0L3<@@XN*CVDg8Ym49TxTufZfM%OTvS3fjh)$*jXe5+<$K=s8<(3_Ty%ee4-I*EyO zMH$YfMS$Q_K8P&?IN=Hqzx*TKU(@dhydcyg38)8k#feJQ6C?TNpX;3G(+l9leeQ1K zalNpAWPkCKsd+A73db4IuhPonvfYP+H8mr-;qEcMHmz}SFHm!OpNnq*cfqPD+zwTL zs=d#Q89(Fj)iV1Fq^)YXy;9Hg$nwqhxBbcGPoyjKZ<}3Y*$#={mME2h#l1HvahQSR*N@#zWu!W7zJeKTE>$1i2#dLbCON&Q@$CZFSbYA z>ke96P8z)=6Quim%X`9G%aus3@jAjQFFUb6)!jSS*%zbG*^ySYQS+CeG(%ttnmwE? zCY5rIMm`^1`0z6}?!{s(d&morq$u}IZF*(DZ9Bz~-l7#S+xoPR1JW7O?F=CWe7Qk( zAyoB2N*BW($RyvlCu-U?Pyrb>V^ULDGZ*!FM&Pj6*{xeyIHs%}DSZ>~ORxW~=WKVa zGgW#a-xmFCF)CS5B}<#Mg5Q$N_-E{oBZAlr3v)S~r>Pv=jj5~>*}bpg`9ZT*+A?C} zrz15t#0tWQQ2MTq+?@vSGIx_GrO_F0!bLN&m#h|ZZy9I(+s7qK6bq0jIhsi^;0B@_ zuyN`{HcjD|NJh3J_Ea9--yjqRIcH&0U6>aJtEa9!uJZ#Xjl7L$hv?rwq*6lkd8q1t z>}MDUTpB?L+az5-&-uxC(*04~8fWj54Oy1#X?c$6d%U=)b`r+3 z%PG)sAQQI&X{KM|0ImreTvw1T`qB+}ghU`tYGp%Xf4@8X;r;H$ zt&bL^B*Jjd;-D822s+o6gYD!yM>!FLzCluwG4MP1B){+J54AtZrC3G$F0Y3>%#b4S z$SY^@L8{Gze%Vb#e^=l!gl%lwq?pmag{8koi^X7GMKkXNf8QixjYwSbN^f=IK z`hZ-inLaw{tj?Q=(UBuinW@#5yzkaTzmT)c zrRh#qVLLNqmjF-N97qRLITKQDZq?WxURBGxS#kQ5NBzWVMLw90xRX(tX}i-c^RWKv zLO;30BgSx={7P>`H#e=#QKHvjAIwlB{RIF6#{Z@X(GIAzgF*IDgY0aQ@JgcAaQX=oW^W{j*6Z`t7PqEYII=&Z=S6uc>tNS)GM2lwz5f6>iytsLZI08(3o ztRGtOx3$Jds+g5lHqO6IC7#PsqGxK0=8d{TdT3SYVcURiBzT?anS`(dxitn9afmjb zjX(&dOGUceD&ZI7N!9hI6gVLS0{U@=H?`q=D0&98i0|BKJ2l_=i+T@B!_QU=Ze&I6 z@jNu_Wrv4D(ab41hY5b+7ZBBqa(>A}|DM)aVFqSP(}!o{6O9ASM}FZ;l&%ahm8f_pd80DpvD`d$HG0tD_V_c82E+_jnPL z#@Am~3WUb8jmdxB$jSVr#Gs7Y;s?w8WjARpr&Hjyg6q&~OAxj2U4`9!js|FH=NDKZ zrqCVJ#E|wgjbo#wN6DxFl7dk;j|jWv;8FEb_Orw&M8%^0!!a80Q2~Be5(_i^9huNq z#oty@x}}x8Ua(kNUW0X@RrsZE182sKR4}gJy$hHx1Plz%nezC!sCX_Ty->a!qRvp- zU=tn;Dnx?(V&BmD{cqtYQZm)&;`PJpR-X)kJ*`KH%%BoZJVUf1(|L}~qP0ini}jN7 zXJ6h@X)czySf{J?)#G8QH>r|qNnK41!VtB%+NTou;kP)LfyhHYf=)2|iy;dViQ z;vgI%dF|B3Ya+E-+iYENI-9Ln#cTej^WDsH*@bBiYo@rcTeCJgzi8mW+=O!?Pu%yn z#3-UTdl&6*x>j_LL(%~>d7>Ctw4%6S|MoJ>I;qs)mt)wkxgY^G>Iwr_y{m6a%Y@CV zRmfGMd)g}53nmuOYTqOvaz>sm_+Q4;FK+^oKwD?Fqg!26gQU@=Hic66f4dC@{zP%Zt~K}%ap z@#n`}iBrs>qhiEq8}>c*rtxOf^HltfiJy)oIX98TwD`{cb~1gg^x1ws)eUrbw@*;b zyuXPra6==9bohWNAW<$O)+3h5p*Cmi(H?~!**U+vl#8uIns4C|r#GW2`8S}$yM`Uc z5WBtCNp84h`Z!rts}1V$-^y0LT3^i?tvk~cZ;`j#mI<}DB&{TB!5`d+dAqq{JueDG z?iyYNI_?igIC;(;^R$y9KWo50CjbG=O4}A!gM%ip?Zgar!W1vO6^k^wm>4(%InP}H zAyj40`{~cQK;@ddx&*Y{+;LIihdJ!226pyZ_LKE=TK$Tj|6(@fVKRWG9;P=FXPi&T z5knEpP-`WyXXIE~1mgFE17sNLHN3M1MJ@=(VP#Wm7_~RB3yzm#9AQ_Wr%8m7|IE}J7 z(u}VE{cp*v*ht6Tpe4egccI?C!`0mnRKKh@B*8`&8IV#6t)o{LVaNrO7d!sH+~O{@ zv0tO4e49={l7`@Pniv7{c39yMlo-jxlO+*7)n6;}7B8X*mxrG+t>Kk2=!gt=$`71@ z&HTGGp&f$duHj5Be||o(zgc^7##;pR>%Q2aQ+=y~wMojH|Kb`tsOz!9oHKf=z|)Gp znwF0yl#k$exB2)^+WolG8U}-W4vM13*tF_t>i|*dyr7iZ?3c35UiS)eM zp?FHo+D)v|JqNcA?~Q}Sr(i|UvEF{FD7y(#Hf5N3+cwM!64?6gh?YJu-*=qekM$ZB z+2fS+=A!y46~`3g9vnG%@tk<>N=fqB)?|N#*GEf6ic*CjHXzZ+UXPJh z-u8(2j$hKQE~PDFHLhf5Py=41e_C;NP=$WLPG~#9ho!}MY7rTc*gm_vc#0*}sOVZL z=|2fwI)3`NZbt0}SU~Q#MeK~&f$`|JlT_GQPt6N;F0KV4%S8!KSFVfiJ z1=S+5ChB9KMyl=B->%0LB&{`xD2@j!2QHxgjFDMGlsTaTAK!aINndBzt2YkH192$z z2D1&J36(l4Y+|vW$*(w38gR41=LmV+Adu+8RP8Q)!p1tgX~2jWxwC~(qKY@7V`pL| zsGJ79LQ;n*R!6mCH*)dQ^3W{gzRI_rQx|Fh{4c4+fRdYEG=31b=}&(y=yXk{XY=|5 z#-5FaG@D+@=i3IL+1vWbL1AVVCfb_mCPv^;6q=uIo}L6ao&7{5<~~z1l*6AXn%RcM zhoUjSS~F2zlK7Ork0hUnAvh#tcWFeAj_&)~4E0C(+iRS2d{B6uQ|a$0q@eGyj#1bb ztS+e&%{LGWZ|xE4OvWPfT4~HjyF_CilaD4U7O2TIC8LdkWe#ZT%O7N9JN71aIxw&| zHd}Ca$BIc2xOm(U!l5V7a>PuO0GxjoW6-1OktL6FVUO?8p~v7z8nsUOCN1k&?kDK= zn#=z2qoU0$KlR1|wgnrKV5s)xkV;*SYc)RE)h%Scr+zDNq<>iPEin$1-7$oMivWHh@xZBTwb5r z4qDGwG`@#+4QQv2TU3Wgfz;X;j!WreE5EHo7JUI5AobS_pM z>-jnO$SZvaZDWd{TRd;_Pt`qA#8Wo>o2c+#N;UT3&74*H>nIL)-_2RV&|eC!Z4nUag5{&@W7>_`u4M5DxG zNubymj$6vzDwI!bOTTn<;?DVjgOkUG(`2r_E|>`E8qcxj$kFd#%+}b#;lr=MEk$y< zGQfYg@jCmIo8Rs)z1Wwy_F#B3wx#0 z!63`D2)<8`zpqpLDfIXK(uz#krNDlRB1Y1?%7$Mhf1uo5_CwX#+_tBIe}>;S3knL? zVWzZhjk{z))?v-77w#FQ=1afU?Zh@%HJ%1XjfPqiJljy zyZ=JCAV_}wfTEmEMS`b`n_9gk zns~G9e7L^szx$55h1Fu!yv-iZU)094>*Q{RvBVxi@;}7!KQ6q{j^XoKp7%Lte~{P| zUp$`=jeIcHBiE?X+lC?>568+7b(_%lA&`!jFT76V@O+PdUce<7Njo`lym7DHjGOOq zyM>ZZEX$M7fjo`}GJW00@+mo~qJ~Fyagx^)KCl>!Oy{%WXWi>|HS(XfM5ljScR0D} zKF5ME9+4D#kA@HH=+Na$dj#fAwLqF)o@(aaK8PHO{$|gR^UP)|-GU~*PG-5giAAc% z1hvGAoRiejr&dWp-9rj>Kl2Nl!IXAi4GG1JV5{R?Z@K#}WhRZ_WRI^>Z3XnM5o zSMo2V(yHR`J&-^pw+`>IU_b zmVscO7lqf`ZjZ%jQqV!H?k}SN0XpBw8p&w(#~=~|^r34gmSM#eRa^6kPkaM(i8StV z!xI~MB0BMwL)BE-r=5`x{ht6t9^w%U%}@;#HPM)M6*OuQp=Y(f6^=fo8QphERZ3I< zTqweM7t&@B_G+d>ItwHzeF5gT^*GX=;>YCL-9Y#TZ56!dZ(TTcYmz#+n_}K0#%n=0 zdeu)*O(r^BOoSwAo`D_gz3qZafs(nq$v-_}QQo|c% zvm7cDJj6zX<0OpM47{@I7dZ2FFZfDA$4_u72sVsBmGfK-% zBKxvP28h}`vfUFF^&@HM!?MWgM<0ponGRTNcB@<0WKTYmMA zt|=ZtpNS*G>%&`YV)Ot~tU@t0AB#G*DAKV;Mm$HIgFK* zp)||Bu@@2AE|VFcWbfb^0i&Y&fdhhHQ1z;ra@o7HzfTRB(d%4y2k=hewVjl|Nyz6b zcZ^I`;$IBzq`zo`HnY37t&c*;lySD_Q_GFn=;PJ%-Kwyxd}IJEhnfGl%>GXakCI(; zRcQOZHkmPR=`nr1=QjX264jeayH@@)o}!pSu1Jl?*G93>xv4I658Qbhv@oG^dm-#)y0X~8lhtLEOfj)0EdTbgn z{5LZ}!#kg9+QL5|ZmI8UxcAO(1=B=5!C6;OYLu~BXfYzR#o_GQC+-9b?Mj z;{khnX>F}4Y47O^z$#WAP@Cn#t5Y1>kgSwnxGG9jHFwP@A3CF*ab9UusluU$DQ2m8 z26R7KOedXN62J5A3Z(Zmvu7j?X^GboU1jnf`JhW;x5iCyX$DPWyhl`}&|Bz>fsoEA z%+?D#Ba1^*g92uxk)%EY^{{d?E^HF#d8NUlBEs#i0C-~@)GGj;op|JC+5)98g|{;P&Xxl_@ee8$L# zWK^fLJ~iN7Fu22>UAs+Xq=c6FOAKRVUW}gLR8nl+V80ufKkzQ7C&ukURVG`x zrzz&A9wwYBhp~|4`}6ZQFUbesZ##Zq(#F3CDjf#pu#bA7sjPEyMY0pL1g6o03I2!C z7sfD@fMh3cAE+|D>g9(JGJ*KCb_e&)yQFBMNmdCGKX?S(?mk_fB{*T@P&dveE-`S#Xa%IgjEFYaHHU-3Jl&m!Iq zF?i9@GnBh}@f;t~>%9_#(`}m} zOYP$>@muZ1Mz5uT<^0H9Ws4J`_f+>;m`j$uKt_L89MbU*-@*vKOtHkli86md!>G&bCn8Rr-(*s6ySCLQY zjggWyxDzJv4m;$y$Cb4KSo``B9l3f+Q2~a9rIe+UmJ^;un*X?iL3wU8;Qcla^V$h~ zu{AymTsw1h?oVOHFVqe}?t_fm#}TP?$?Nn}Zdavi@3j7%UPt0iN}8=v*SxDa!GgkH za%j)6q$fNEL7WDGJEv?#a6Etp{-z(iT|6S>l+f+akatfp8dD;=0(aVNhUV1`wYA;P z`7IwMkh^VP^zKiFsP_zwBPG1nz_Y#53PQ0*HR}H7sP?_`5XQBV3fk)EXH^{3^;#0L z&97m_Tt$6)uIZ7=cHpygL{XS)L0_r;FFGABK*6r3Ei>M>LW`_Np!PvO36y{(lx+>i4 z(IR%H(-nF}Fswq12p4KA!%BgDip1|#Y#RcKmgM^LHK}V06k$0HRRi?7nG*tD*&(~8 zYO6aII`Ebbvy;%=7%ci$WL{FJ&u@J&`>U2*3I8UVVF6&|TZqw#<+$&5fgt}e+@b4- z_N~!q7WI;iar!^|{Jbwq?Km$zkRxMNxw|4yP>rPG$%mK1*QfKuMOvLp_T3J}DE4!n zYz;m?4e;0s2Bp5i5h*$gqf{dI**;hw&0GyRUAW6+I?)aE`Iz`hZFF;> zl%&KnQ>94GOyn=+i5GwK*^^_!>d3|i3`D1MRlzm6Mz;VBgdLYmMCEg7%o4oqlql=@ zGWnDlv&<=%2ST`DhnuB3sLT#Em$EpSi{WW3OGO(1ZDo_A7l&OT+frmM!7Ua}N}zJ| z^>Bj4#?1JtS!$dAQ_ER*H32wkSU|d^2ZBnMz-Smua-_6$$mo)gjv+BRq(h_`2+}1f zAdQ45F-DK>5Jvwz_x^J~!2NxQ_nh}U?|Yt@Xf0+_mVQ5GjZjr^B$`R1FguY$ zxC+Y#@J79_vTv!lZm5ZG_E`~8Lg&}A^ZmQiEn}#_!_wI%;_&7lTE$EY0)+%2X2MHq z95FNR1t;cckWr2npU0b_Z~Bk&62pO7vig2lzV31f1&{Z@{2~bbT=i(Y4$+s<)qeY^7WdMZK^X($b{2uv_CAjDvM7#lI z9d?Oyk&rMdAopr|nuMvMMM+#zo)kS^E6YNjeKn!Vdvz9G+UiNn@Tn>8HF=t{Z>Qu- z*pR>GHmx>ehO})XX1*DR^HEu4t)WD`@o+xRtLAWb6?TEN5@kxj`UBcPAGS^t% z(&HPzc7_N$y`~l8))kRcQ5Zxv_Ua*rI{7Y8Z@9r9z3bsCY18ujIo_&}ppXK+k~NTM zN`I5U**+fJ+&(K(Oq-D>ZFuG+QR`TiJM@Qr4fZso&MTF0ZW_xjKqV@SUgej#ykbpx{av{BaG=@lX9#g3 z7TcX_l7EyEE)Dd(zKi%LI*$OJo zg`Zku?6eTu%q1>JPmKkd5na6CY|YR7&pa7vEFEUcnfugrB*rn9cFGw_kr3c1e;X~P z63di9{}IH}sc$lb!V|IX`%Jt)kV_WNm+Zc8dt~T*fch?a_1%d?sENP0J$Zv&aTKMn z@xIZ@LGGR}J!f#$BOM{%a5-UC3p}$u`la-4iw_$6<4rE&Rd_#jP^=L&lXWuh<;A{EH>-ORZ*+Q5~ zv>3FXxQvLs%uWIa#zIB}3swgpt4?qaW`ncQw%6Iec{5KnJX9YB389Cg8H ztGIDvyGbNn{{mHOL;XbWrii^M%R0;|UQB>ePS|m~ z>`E*h&o3yU&U3Y|Rw2WCo|N*ne`Q63v3y}%sc>K+L7wjItLoDn--SfLpWdDN^Vh)6 z99S?sXDQY5HY2Zr@>zoM2CI7S&wGG&s5a2^)`v#8wptQN ztoUcxsQ$O4?9=BK)DnLlvNa-~H2&t_6i5$;)KdsY$VIzI!IB17=pJWATy7=@@P}kn z+_S$mEUfDqi+s!1sRvz-cJF-gN+&>o^Ma<4c0S`N#21Z+wP5;(a@Sc${Klw%TQ(lufQ8lPO#<_vSVD5+ReT{^ujZop|Ch$oc@H_Jd}isO-f!g;RJ zrm$Lvcx>wI>#KZ7|8w?O*T?|TG*{@dtt;liM|?%WiC?T*d{jR*y;FU)l(9Tu@-d}S zl-F$`&B>H|G}7{qheX`BAIg`A6XG$Qrw4vR?|u9AF`@-mGd%Qxv0N7y{d!Hpc)NCf z0fsjo641liYbsp6viDqBC&Hb)QzFoE=;urzMBhg~r53V8pxe1mkeE9=_bijyD|u<3 zgSE3I3;EG|(C5!y>AJ=aWf5_)td09b?yj-$T}T;c@VDrZm#|D6$f{o`NTIQgHa`=e z94{~B(v)Gxa~bE=AuOrmibgwrm?=UMajS?g}<|~sX=LXB3?`i zsqQbaQGKOJ!&=YCOWOKO!q+SEn#^+4v*vlz=Q^3#c&v129ODk>7q7wz4kD__9RreH z$|mE{;V$3JJsb|o(tAzC6VPzAN+#H-S0SBR5*w@!CKOc8#NqEJ{jOdbg3QG_@K(r? z-g`g+y3GHQfZ=~n2Y)+fK+v$x?+ZVj(i`H$vvRsGIh$#A7)4S{JxIs%s;vAjSDZ+) zSnfcu+iBFt7*QR1Npqx%>2~~ajn>VZQhY<)J=jS>hZ)!zGXnl2HUS9dO=xF-OGC4& zlJ-t*M3Yc_;Z%~A)S;XlD)SvA+ROoJVx2!;7aaN2+T4d@aHhwC{GndMVAL>aUfRs- z&?_hFGpz;v*`44edWs(Zk^XRrQ)JSYtIJUqmrxxiC4+amQ$^=Q6Em@nyvYxM%qs4S z;Us7qt=wx8hWg)Yv%}&C9)#K?Q4K?JGfz?1ixhu#f^7^iXJdrtYb`%>6#sYzd6RfJ zbe+WD^Js@kB26H>RfXKV9gJAMxGMdz+wVO2YA#< z^)#&1N0h>_Jv&@}s~~)T#BEJ+u-bVnG75g|NhokdJG1U3c!HF@d&^@lW-UA~UP^cH zgw1ZS@!vJ1NL$3RaA_QAXjLUx*H|e-0$`NN-#=^=?w7_&6`tJb?hqEobNTek^P3K$ zPUyl!an)@eA8_piE5%B_p>*RND8Cl{mF*wrN;zPr*k)|C8}Z|+1BMU8f@ZymO&^g# z@8FwVV9PXu#yVF^u_Q0cAp3+>;#KOjc;-tA=%1>8igv! zxK-G=Wy*vk-CYz!e7KVIWl$DEV~>5XycHYfz==nAu6D0O#U%bVq)6l@<^RkC*CNYD z9fpXxmh7Y-;K} zQym0hjT_P_uH=PDymVl_2oFIYP$ooHtg1w_=r`Yb&qzLXiInqVJ&aiX3!G0u5X&?m zA1)`kq)DjqnZiy`m3nh~GLbJZThAnYUni%VTb=`BvW?5hx`bP-w%(#XzwrKqol)kq z(mqc7ph;(S7ln|-&Th%qmZQFNicn%l*giR z?+FgH3Jaax??m34<5lcDWM=Je8nVJa`1jhsr2Qj?yRJ$31up1UJieXBvTe!4WJJNV zz{FxqrR+y)H-GKRx#(YunEtj`x>gZ8S6HB_w__-bAa?aqe!e_()NMo5Hbpy^N?^M6 zR3m~%rcl^0R$Fo-3YaK9Q_H=GZr}Vzl?g*n>UOag>ggqn&&(&{-nH+B{C!{Z31GCr zYlhg!1ilCUP5mUB?VKYWALQ~olv}zAXZhRfI(!y;*-(JXB-Hd^}G~b4y?&S1-VRzO2?_BjV@N z29m;J#XUWjGiskJmP z&#O}uw&#{F18=}e@tI`GnM;rI#(h#?P_uR$9uzkMWj;0n_2i9WwhO53#a#LzAWmtr7UB9{gL5C(<{;{q6%OA zu{0gGVOp_kXBrf+_Ju@~WFkbo9@$?tCHfX)+P-xK{s{;?xn$P=qQ>IDTE3pCL{_51 zAg84?dqkfqxns=We{Fei`S6wS+ml__lHX3$w}{uv51Z3FM@nqnGvnt4mv}z~lC7{8 z^!j-Fgj)YjUN*f9Gk(r$+M9}B41muFi&+Y29H^rcGb!10KuU2nY+b4W4+;+yRW(g* zGETZ5ygg=%uXQ}63eAnUq&KQF_qIshnzT=qTOWn;tW4hkmz9&NN9jLPEu<@O64;r3 ze>-{+JLHl)V7p*%Jsg~kw%@AG=z*U*&YT)m-yw3~uygh6r!&4Sv8$izy!_9x=0n0| zlZf4ABd#)~e^DfAuLT_SZ*;)ktHpARD@wXkAog=9|1B@ zTsWN3$(`WS%BBdRCfUR|p57X>u{N^-m$cPClq6w;zq3Z3(kiw8*m?1yVM=B2ckK#t z-@we+wGq+dil1sbVcji#^xm67ZY`RsuoWQWTadM=*Q4&GG)NAr9~+#7u;SPExH^`H zp4%pNjSL0nSX@IQg=|a7Hc+`|U7%x{E-a(t6*_9cv{R0xr?Z&Rq0R@V;8WLyaF}c1 z(!*k^jCM~0Jjut}nPi?~eGl4Y&h4j<6D90Og6JlMu@#G{&VV;{*WMP967(CNb9`a> zyk*^=n zP;*Z89&eOnJN14q_P4frunp{`?OQHE%dqT?89JzWS;#n4=|_F> zRdrBa)31ym1@xh6m*{Xz0wG%D_XML;miSDoOO^8u`a2#Btq4%dIaUt6$9}N)v*c(K z*poBxjqLWjBHpRQU3V6HTtfaHSaeA|4|_H8qep&Km#}AiUwG%N23qTBHA0G7aP^uR zlr%pJe%R~2XcWkG$QDflr6Q*MwseG^6RHO8=v^&s=zVbIo_+o|UF!ZB_fv15c1-es z;>_F!mqF_z%nX+aGPG00w+glSPq@0tD*25!&Vi|wbm>lt;NIbr5U7_g9IvXOL5DDDE>$vH__2E>_1WI;_lB{FzSx#vTj9o0ks(hXoe7hicmldVja|*Dlf%}*-zT6-*avocgG0C3% eZ&ulRa0Jl(ajGa(_MbWUk*d;b#cFx0u>SyTlubhb literal 0 HcmV?d00001