From 842fc591b9cb2a833c7cd58d09b1a4bde617f5d9 Mon Sep 17 00:00:00 2001 From: Matthew Struble Date: Tue, 24 Dec 2013 11:52:53 -0800 Subject: [PATCH 01/11] Added a greenhouse condition for plants. --- .../listener/GrowListener.java | 44 ++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/src/com/untamedears/realisticbiomes/listener/GrowListener.java b/src/com/untamedears/realisticbiomes/listener/GrowListener.java index d8685a1e..5c8c84ad 100644 --- a/src/com/untamedears/realisticbiomes/listener/GrowListener.java +++ b/src/com/untamedears/realisticbiomes/listener/GrowListener.java @@ -1,9 +1,12 @@ package com.untamedears.realisticbiomes.listener; +import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.logging.Logger; import org.bukkit.Chunk; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.TreeType; import org.bukkit.block.Block; @@ -132,12 +135,49 @@ public void onPlayerInteract(PlayerInteractEvent event) { */ private boolean willGrow(Object m, Block b) { if(growthMap.containsKey(m)) { - boolean willGrow = Math.random() < growthMap.get(m).getRate(b); - return willGrow; + if (isUnderGreenhouse(b)){ + return Math.random() < 0.25; // If it's in a greenhouse, hamper to 25% under any conditions. + } else { + boolean willGrow = Math.random() < growthMap.get(m).getRate(b); + return willGrow; + } } return true; } + /** + * Determines if a plant of any {@link Material} is under greenhouse conditions. + * @param b The block the crop is growing on. + * @return Whether the crop is in greenhouse conditions or not. + */ + private boolean isUnderGreenhouse(Block b){ + boolean is = false; + Location loc = b.getLocation(); + loc.add(0,3,0); + b=loc.getBlock(); + /* + * Check if the crop is two blocks below a valid light. In this case GLOWSTONE or REDSTONE_LAMP_ON. + * If not, check its adjacents. + */ + if (b.getType().equals(Material.GLOWSTONE) || b.getType().equals(Material.REDSTONE_LAMP_ON)){ + is=true; // Returned if directly under a light. + } else { + List adjacents = Arrays.asList( + b.getLocation().add(0,0,1), + b.getLocation().add(0,0,-1), + b.getLocation().add(1,0,0), + b.getLocation().add(-1,0,0)); + for (Location l : adjacents){ + Block bl = l.getBlock(); + if (bl.getType().equals(Material.GLOWSTONE) || bl.getType().equals(Material.REDSTONE_LAMP_ON)){ + is=true; // Returned if next to a crop directly under a light. + } + } + } + + return is; + } + @EventHandler public void onChunkUnload(ChunkUnloadEvent e) { if (!plugin.persistConfig.enabled) From cd6611863a08373069baeb643d40696595fac66d Mon Sep 17 00:00:00 2001 From: Matthew Struble Date: Mon, 30 Dec 2013 10:47:01 -0800 Subject: [PATCH 02/11] Had to fix an issue from the migration. --- .classpath | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.classpath b/.classpath index 0f49c3ee..11dd3c2f 100644 --- a/.classpath +++ b/.classpath @@ -3,6 +3,6 @@ - + From 52fbb93f4132efc8ab090e0203369efeb06ca43b Mon Sep 17 00:00:00 2001 From: Matthew Struble Date: Mon, 30 Dec 2013 10:48:19 -0800 Subject: [PATCH 03/11] Created a gitignore for clearing BIN classes. --- .gitignore | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..0f182a03 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +*.class + +# Package Files # +*.jar +*.war +*.ear From 1c382c1ee47a55cefb422dc276667beb80887ba8 Mon Sep 17 00:00:00 2001 From: Matthew Struble Date: Mon, 30 Dec 2013 10:49:22 -0800 Subject: [PATCH 04/11] Nerfed greenhouse grow rates. (25>8) --- src/com/untamedears/realisticbiomes/listener/GrowListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/untamedears/realisticbiomes/listener/GrowListener.java b/src/com/untamedears/realisticbiomes/listener/GrowListener.java index 5c8c84ad..8398ea82 100644 --- a/src/com/untamedears/realisticbiomes/listener/GrowListener.java +++ b/src/com/untamedears/realisticbiomes/listener/GrowListener.java @@ -136,7 +136,7 @@ public void onPlayerInteract(PlayerInteractEvent event) { private boolean willGrow(Object m, Block b) { if(growthMap.containsKey(m)) { if (isUnderGreenhouse(b)){ - return Math.random() < 0.25; // If it's in a greenhouse, hamper to 25% under any conditions. + return Math.random() < 0.08; // If it's in a greenhouse, hamper to 8% under any conditions. } else { boolean willGrow = Math.random() < growthMap.get(m).getRate(b); return willGrow; From ef14e890ee5a827e9dbf58f7e74d5429b5d47d02 Mon Sep 17 00:00:00 2001 From: Matthew Struble Date: Mon, 30 Dec 2013 10:49:44 -0800 Subject: [PATCH 05/11] Overrwrite from gitignore. --- .../realisticbiomes/GrowthConfig.class | Bin 8783 -> 8782 bytes .../realisticbiomes/RealisticBiomes.class | Bin 12258 -> 12256 bytes .../listener/GrowListener.class | Bin 7046 -> 8148 bytes .../listener/PlayerListener.class | Bin 7437 -> 7436 bytes .../realisticbiomes/persist/PlantChunk.class | Bin 6260 -> 6259 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/com/untamedears/realisticbiomes/GrowthConfig.class b/bin/com/untamedears/realisticbiomes/GrowthConfig.class index 5ee3b74bb80e7e49362b0a472e4ad97186503887..bc73aba1b38bb17f95c98736215dc8c58a7d039a 100644 GIT binary patch delta 28 kcmX@_a?WMLBUwhz&5vahnVFw6h)i}@e8ea*SzAd30IT5&E&u=k delta 29 lcmX@-a^7XbBUwhT&5vahnVDZOh)#A_e8eQmG+9eY1pu`)3NQcw diff --git a/bin/com/untamedears/realisticbiomes/RealisticBiomes.class b/bin/com/untamedears/realisticbiomes/RealisticBiomes.class index 631efbc2fb608b6cb664a70191030693db635b17..0e6eab23cb9225b5f738c59eeccec16bfb206870 100644 GIT binary patch delta 31 ncmaD9{~&(DbzR1Tn{VhYXXKG&;Nbbo;KazzxQBUiuYM>1)b9&B delta 33 pcmaD5|0sULbzR28n{VhYXXKM+;NzxIC;;kO3xEIs diff --git a/bin/com/untamedears/realisticbiomes/listener/GrowListener.class b/bin/com/untamedears/realisticbiomes/listener/GrowListener.class index e543f0455dd425a29180f5074e2501069dbf502b..7e6ad791d046aaf902be6e365c32ef26f3743319 100644 GIT binary patch delta 2148 zcmZuyc~F#f7=E7JZ};Q)TyAwyL<|%J1eHq^1Va(zP*D(%bd^m&4rLebT1%&!X{NuOX{PCq%q|-HxBK4j^Zef5yHDkRJu~w2 zdneBVn97|hEJUvEQpO(3Uf~!;+|ckNZW2)~p2Zza?ymAKx4Wacv)iLzaf~Tl8it?o ztBPL;N2_b2E33`bu{NvP}lWXFFj{O)Im{JhAn9`TMck!r;Ll8t&jv z{k)?nB^*6CZZ8Ru7UUBKKP?)qR3ysP)I`LmmX($1S>eNdp*TRhMiqOA(DJI%r3A4oy>hHh7z$8gj%4l^7h7tSs-{Z>|$R?lBqTVwzD=1?g{F-B#y_?X>y zdt2JFO1rvTTRa+L87Jvno~jm)mq0dsC{Zz_mkbF^R5^x-{;yTzSSArlhkLU$5F5-8;J9{mt9y;nLINMs zn2cS7+U)Ywn7)=4k8s!4xrT_-v%}-23tO(HR@WMLhgU3-e{01ALa>dntd?WKzicy% zcoysT9Hn8*<`k8a#Yw*wHNmEFDs%Mih-7;n3smOo2P5LF(^#nYiE0LmRTk;jMKzNp z`t69Z_E{`b`LLcCnPZ*JIeL9$k}{W=r0B z?HV_6v%Vl^v~vTu8trWp0I8MI8yonTF~*PU&&S+isJ=7yQto(!ARW=jL?R|316i1c zY|O!A)L{x%VJg~@gRRKL)5yaf4ygfm!-jaaWQm<)zF+1gbC^ zHR4^1Sy+H_EJP(1VL9sc)5E_@S_xJ1YH(o~nxt~Gc(-5z)=BL)$=0r49C5?BQF3iU zEVf{xRL{XS>1n%U-=SX_IoEeYYAf<$N++JcqI5rw?nnN_j6VFZA5s1IDHgx)>w!(_ zwf2fM-x9}Z^E2cCqJv_%i2D(u6dlH1)prK|Mr$D6;fRpfx<(}^ z#?nYu*JukUA{+tH9uUPEQ1mmhP;n{)98MJ452L_oAK+->9Q=hgr%hTZRGsQSnu!U@ zJ_g#cDMd!qIO4$I#nA?ripgcATq|%ufWImO(j&lM!$`a#Bk?8*@D`@ykkI!w=Hsx8 z!8=%wcd-laiRTgV=*0yb#U~a&WtDe&D4Z}U-27} zGiT0>&Q257NOhM3^Z4DsE!={-3gUc5Z6apo6(8>?yN5>DK8Y5*buA=(8Ew zgx)TLdCXTYdqSF*s9k%jzV_JKNT0zC_?FPd$5M~wk}NbBSX+49K@T4^P|jjPkMzn> zJ?y{&g9b}krV6}+_Hu@GZX_C43pZ1a8 z(qI#2#6(f;oSHo_`S6r^U~DuOi?n8fFB4h}ZdoH4$t)D=Y$f8WLhfKYx9RK}8+qkU2W4mVCEqQy*-&*0d2eMBqUU zN)bg&&KAV66SWvZ0#Bk2)7XUPQIA*9fVa?y3o;cK{awzj(9jAy+TcRFy5;{W)C~uE z;6^Wsu?x-EjZO@p8-wV>9_+)A`mXTD&_3wc4+BrY2~(8EB>QPpVM6o{VjB*rp90qd z^HM8?0xSsGv!eQ(FddPqFRB|wJx5;?ZB6DhTJs4Wji&M8S%jAH^Xk*==a`SBar4X~ zbnSg;*0z$%+GR<%qFhf11Gy7-Zz<>Ux@YVnT diff --git a/bin/com/untamedears/realisticbiomes/listener/PlayerListener.class b/bin/com/untamedears/realisticbiomes/listener/PlayerListener.class index ad411e278d3a72776e61f2a0c49a023bd55e3280..e90e9e66b95e1da060eee6e9afc5833674300aa7 100644 GIT binary patch delta 29 lcmeCR>ap7JS&VW1<}YFqEX-~U!jt`_Wf(0t=SnYN1OTEY35x&# delta 30 mcmeCN>b2VNS&VVP<}YFqEX?i`X!A#~Gn{8(U}ThKU|?Wklmh_%ObJ2& delta 39 vcmext@Wo)mH&Mpo&EG}snV5|kI3`<4XbXrsu``@!VPIsGWnf@nVw3{_28{_t From f48b7e3d8d2bc53f03f80f54ff6812dc2053fb1b Mon Sep 17 00:00:00 2001 From: Matthew Struble Date: Mon, 30 Dec 2013 11:24:48 -0800 Subject: [PATCH 06/11] Added the compiles classes to gitignore. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 0f182a03..9783897c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +/bin *.class # Package Files # From 83b4b27ddd82178cd8357d31bae4eeabdd01e160 Mon Sep 17 00:00:00 2001 From: Matthew Struble Date: Mon, 30 Dec 2013 11:24:59 -0800 Subject: [PATCH 07/11] Added authors to description file. --- plugin.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugin.yml b/plugin.yml index dd0981b6..5fd0cc5c 100644 --- a/plugin.yml +++ b/plugin.yml @@ -1,3 +1,4 @@ name: RealisticBiomes main: com.untamedears.realisticbiomes.RealisticBiomes -version: 0.6 \ No newline at end of file +version: 0.06.02 +authors: [ttk2, Wehttam664, nrfs] # Not sure who the authors are here. Assuming ttk2, myself, and latest contributor. From 6a96da8d53bc96e46cdcdd6b23508f2067750e1e Mon Sep 17 00:00:00 2001 From: Matthew Struble Date: Mon, 30 Dec 2013 11:25:44 -0800 Subject: [PATCH 08/11] Added a thread for chat managing. Chat managing should prevent multiple chats from spamming the user. --- src/com/untamedears/realisticbiomes/RealisticBiomes.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/com/untamedears/realisticbiomes/RealisticBiomes.java b/src/com/untamedears/realisticbiomes/RealisticBiomes.java index 3ddf4917..88045f5c 100644 --- a/src/com/untamedears/realisticbiomes/RealisticBiomes.java +++ b/src/com/untamedears/realisticbiomes/RealisticBiomes.java @@ -15,6 +15,7 @@ import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; +import com.untamedears.realisticbiomes.async.ChatBufferThread; import com.untamedears.realisticbiomes.listener.GrowListener; import com.untamedears.realisticbiomes.listener.PlayerListener; import com.untamedears.realisticbiomes.listener.SpawnListener; @@ -27,13 +28,16 @@ public class RealisticBiomes extends JavaPlugin implements Listener { private static final Logger LOG = Logger.getLogger("RealisticBiomes"); + public static boolean isEnabled = false; public HashMap materialGrowth; public BlockGrower blockGrower; public PersistConfig persistConfig; + public ChatBufferThread chatBuffer; private PlantManager plantManager; public void onEnable() { + isEnabled=true; WorldID.init(this); @@ -51,6 +55,9 @@ public void onEnable() { registerEvents(); + chatBuffer = new ChatBufferThread(); + new Thread(chatBuffer).start(); + if (persistConfig.enabled) { plantManager = new PlantManager(this, persistConfig); blockGrower = new BlockGrower(plantManager); @@ -206,6 +213,7 @@ else if (materialName.startsWith("entity_")) { } public void onDisable() { + isEnabled=false; if (persistConfig.enabled) { LOG.info("[RealisticBiomes] saving plant growth data."); plantManager.saveAllAndStop(); From 6eaa17fb410d7c671c46f05b1a75359748aea194 Mon Sep 17 00:00:00 2001 From: Matthew Struble Date: Mon, 30 Dec 2013 11:26:02 -0800 Subject: [PATCH 09/11] Tweaked message sending to new chat buffer. --- .../realisticbiomes/listener/PlayerListener.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/com/untamedears/realisticbiomes/listener/PlayerListener.java b/src/com/untamedears/realisticbiomes/listener/PlayerListener.java index 22577d7d..6531dac3 100644 --- a/src/com/untamedears/realisticbiomes/listener/PlayerListener.java +++ b/src/com/untamedears/realisticbiomes/listener/PlayerListener.java @@ -19,6 +19,7 @@ import com.untamedears.realisticbiomes.GrowthConfig; import com.untamedears.realisticbiomes.RealisticBiomes; +import com.untamedears.realisticbiomes.async.ChatBufferThread; public class PlayerListener implements Listener { @@ -151,12 +152,12 @@ else if (material == Material.PUMPKIN || material == Material.MELON_BLOCK || mat if (plantGrowth == 1.0) { String amount = new DecimalFormat("#0.00").format(growthAmount); - event.getPlayer().sendMessage("§7[Realistic Biomes] \""+material.toString()+"\": "+amount+" hours to maturity"); + ChatBufferThread.sendMsg(event.getPlayer(), "§7[Realistic Biomes] \""+material.toString()+"\": "+amount+" hours to maturity"); } else { String amount = new DecimalFormat("#0.00").format(growthAmount); String pAmount = new DecimalFormat("#0.00").format(growthAmount*(1.0-plantGrowth)); - event.getPlayer().sendMessage("§7[Realistic Biomes] \""+material.toString()+"\": "+pAmount+" of "+amount+" hours to maturity"); + ChatBufferThread.sendMsg(event.getPlayer(), "§7[Realistic Biomes] \""+material.toString()+"\": "+pAmount+" of "+amount+" hours to maturity"); } return; @@ -171,7 +172,7 @@ else if (growthAmount < 0.0) growthAmount = 0.0; String amount = new DecimalFormat("#0.00").format(growthAmount*100.0)+"%"; // send the message out to the user! - event.getPlayer().sendMessage("§7[Realistic Biomes] Growth rate \""+material.toString()+"\" = "+amount); + ChatBufferThread.sendMsg(event.getPlayer(), "§7[Realistic Biomes] Growth rate \""+material.toString()+"\" = "+amount); } } } @@ -195,7 +196,7 @@ else if (growthAmount < 0.0) growthAmount = 0.0; String amount = new DecimalFormat("#0.00").format(growthAmount*100.0)+"%"; // send the message out to the user! - event.getPlayer().sendMessage("§7[Realistic Biomes] Spawn rate \""+entity.getType().toString()+"\" = "+amount); + ChatBufferThread.sendMsg(event.getPlayer(), "§7[Realistic Biomes] Spawn rate \""+entity.getType().toString()+"\" = "+amount); } } } From 83befe8f60d2803e78e14482793f47c967df90b3 Mon Sep 17 00:00:00 2001 From: Matthew Struble Date: Mon, 30 Dec 2013 11:26:20 -0800 Subject: [PATCH 10/11] Created a chat buffer thread. --- .../async/ChatBufferThread.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/com/untamedears/realisticbiomes/async/ChatBufferThread.java diff --git a/src/com/untamedears/realisticbiomes/async/ChatBufferThread.java b/src/com/untamedears/realisticbiomes/async/ChatBufferThread.java new file mode 100644 index 00000000..2ed93f82 --- /dev/null +++ b/src/com/untamedears/realisticbiomes/async/ChatBufferThread.java @@ -0,0 +1,53 @@ +package com.untamedears.realisticbiomes.async; + +import java.util.HashMap; + +import org.bukkit.entity.Player; + +import com.untamedears.realisticbiomes.RealisticBiomes; + +public class ChatBufferThread implements Runnable{ + + public static HashMap> buffer = new HashMap>(); + public static final int delay = 20; // Delay before chat refresh. + + @Override + public void run() { + while(RealisticBiomes.isEnabled){ + for (Player p : buffer.keySet()){ + HashMap msgBuffer = buffer.get(p); + for (String msg : msgBuffer.keySet()){ + if (msgBuffer.get(msg)<=1){ + msgBuffer.remove(msg); + } else { + msgBuffer.put(msg, buffer.get(p).get(msg)-1); + } + } + buffer.put(p, msgBuffer); + } + } + } + + /** + * Send a message with a check to prevent message multiplying. + * @param p The player to send the message to. + * @param msg The message. + */ + public static void sendMsg(Player p, String msg){ + if (!buffer.containsKey(p)){ + HashMap msgBuffer = new HashMap(); + msgBuffer.put(msg, delay); + buffer.put(p, msgBuffer); + p.sendMessage(msg); + } else { + HashMap msgBuffer = buffer.get(p); + if (msgBuffer.containsKey(msg)){ + msgBuffer.put(msg, delay); + } else { + msgBuffer.put(msg, delay); + p.sendMessage(msg); + } + } + } + +} From 1ce47287ef5da8ed0534a3f72ce4efd29bda8cc3 Mon Sep 17 00:00:00 2001 From: Matthew Struble Date: Mon, 30 Dec 2013 11:26:41 -0800 Subject: [PATCH 11/11] Raw class commits. --- .../realisticbiomes/RealisticBiomes.class | Bin 12256 -> 12576 bytes .../listener/PlayerListener.class | Bin 7436 -> 7534 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/com/untamedears/realisticbiomes/RealisticBiomes.class b/bin/com/untamedears/realisticbiomes/RealisticBiomes.class index 0e6eab23cb9225b5f738c59eeccec16bfb206870..31b500e630f6618103b65e1a4c5b6793bf23dc01 100644 GIT binary patch literal 12576 zcmbVS3t$x0)&9=pF`LaGBmra*Wr>0zKvIiROcVtI0)|Hof*>?bvO}`6*$w+3pubxC zuGQ8)5vpKq`^WlQwJHgbY9Cr?ZR=m{)0VdOUHh{BecGb*yLVf2LY^|@r$?s8&|ozB#!9Xk=vWaI5^@l=!&w6nRiBe?Qph>P5zgw3tiwq5JAXB(SGlYzV8(o}L=yrXdu_b6{m zq}sQuVa3Y@qax^b(iyT|zhrP3v5fPEUBo<#QSq#E@pzO7!tI@Qc1dpAHbut5QJ349 z-O2X)rTI1MJ9*kMQet&e9@*7)(x&JI3r5A{Gqf(Sj(9>BwI|}qcy`?6rt8a4W^KtY-c

3}IG@CY5xxIgEOoXW|WGusvVO8&l~-Y-N*$H)1}CP-F?ttZ5F|muH5q^)=4k z5GKDDSXh8JxdQZcY<|t`;IekD)48;rji-|J+u{kQemVcR(B5!k2p0+_P*q&V(CT`I zFdA{OiHpcbfR3>sw6F-52uk9a7Ke;X8tzOtD+U%@Sfa#Uk+F9=P0ltum&m%LsaeV+ zie-XnWN9Q7BJFfD4ep|7EFOy{Q`xAqi^dpDrK3G|CK^xfBxA9;(U`kI)MX*6_Kejj zHC<_86)qQ;J$5=tjT?bvE%VhD)+my#w3A5LF`wE-th4ZDTp>7}+U$;c;%%V|qVNSv zhm*s|hcz6MMkSZ^7On(suR;+};4uVmEKnMkQ~&gbMd)hMRTehoQ3kzXMs0Ytg)NHb z)6!0da`5S8%Gqa3yoIi0G~YVBPYPozYL(5}7OF7OL_0N5AF_7buHy=$4UV$RZ4_%z zcvs|-I&f$^XhWxkxT3ElleN=Xg>}1y3RIS%3n>#6{k+krED)oGZskTy$Bj-V=rYeA z4TEpXL5~^64rCPrIYE2PDLa)>7ZgxUVJOynEKI^=6T1cT$4YY`Y=yB4*DI3$OK{=n zBoD{6N63v9#$$rgpSN1L8E>@$DOqBZoG$D zLi=*PU_P9kU5Kl|ReC_gd<$+h@jk)y0OsL9m9pQ)Xj@=Oh3QRW&}s{CkoOQizzpi@ zArWG0G@hYv>WO+vr5(=)Eqq8h9(w$3DM6`guPRXp&^QJoW~$MWwcEEdLDI3!#2)JW zDd7myR%%1o$5T>KqP5%3c9!E~xYNR2*zcX4j>m#oL0c>g(%O2xA!UAdTlfU-p}UOP zS-Z{7IBS@Qs(3tT>mGCnpJK-6>64RecUnD3DJuTkLaz!bVIKaHR4U=v$q+t6_*_ys z!PYiA+uqsA#qm^3!T*ni`|(*yl<+H)BgLSVioypiJcQ3t;apTp6eijg5iu)W6~ZIb z)q-8R>|L$dc$cFVAGFY?7FPxqueNus=X3~%1d}_MLbhtpCfCE#K$Zg#^+tZ zHl=bpO&K;)HmQxCuUaSr%g0~N2*AYBx;W>Pp*-|#;p1WY8AKn8?7}mc_Y$p@dWW#>|9=+#g1?e5((jI{a!qi~$kNlKDX2yhf2Z~h zQnWaows)(UF#e{*^NQm7U(68(LEPEnc+JGCWH;cBbahp)3r-6ssJ}3oqvf2n4D@q{ zrDpiW6xJ(ZSW+a#EJ*AaHL$>hJdw=a91@nR=O_zgdgmp8nFgkY(E>GSh*pOrM8&Ii zy>&KfM|JY(f<=>bUUfVm30qPw7Rm0kGi&r&upDAadrVHVWV}ouHQhOimO(_zL#wu5 zjh-|TG#URCrIMl;Eq(_xwXjs^j7lb1D2El2)0O+vm2^lVBsHGwq+81>O}JQ5I?a+Z zmE6i1V6t{RnW0Xr@#&UCg=JY0)ntgT_vLvqQw;NRwk7AtOsW7EuJ%fK;v9m*bN9pW zOb+B+`WC4XWJXUtg3K2LLfc<4}#~qG9-2M({;61 zFP^t~YhA5^dxItCseoj%XVKp2WJ1EiZK}I-)bC?xeW8|Rlv-Ut!>f*V#WR_1C&8Y_ zC8n@+s~%K_l^pG`6N}Rwxh|&H%XYOp-EQGfp_O#8a#i_a!WtZN=!r_SBO{f1m@?+r zgaDV?hRK$m=3K~!<5K;|GCi1d1T2)btuSPt6FBsdNG0evugY4g3r`mGqb9Kh=STa4qd4Z91ZR!6;Tr#m(%0$={Veg&7VItwZX#EUkBc6)0iI8-9 zf}~Luwku_xT-Zw3-R-v%-W(9Or&PgSl&ALrAay1ejU@C%x)0?EJ@1BxL8#hQwPVLR zYR}B4^Hh8fX*K1_g0SPtF(exqt$0qY%4jxOvRP+wx=zb%jAuJTvV|H*fGw>dVL1r} zca0^swCNg~eXDk7c|5J+RDm<~$sDvFZzSkgyrGaVFqCA|j>AnDVoKGc+K~3mA}<@y z?&iz2v$z+_4_w78rt7nV&ON{TFz}6G*&!KIsCPkht34lS zNmf`OmIvJC7?As`iM&U4o3e{xE3miAN&Pa-olo?2x%gT2!4!IO&;^mMbz$ih6+K|j%U_WwkpwNb6sgRAJsag z0?dwr?nVKsVb#3kVd>WU5Rkl*(PO%@aPgcK#N$o`RE-GBQpu)xMm1YQa))5f$(cOc zZz>nljp?ZC^P{RrWMRBR_F3|A-EmS)y2Xja;$*BPo9Yh9T@0Bg(dM)0;8KAeMV4s3z|26uSglepp(p_rCO`z zQ!puDZlW4l8dwKu|Ih^+hZ_&ZZ!gn0wfsm$dzD`YI(9sJZZ+D$d5x7JH&i;YqH%e( zzQ!t8RnYqKQbBdIb&5A>n`bwb%NOKJrm%A{O#P=&TJmLik`9PG>01!Dstv>=J=$0< zUy-Ax9N`fRowMYt!VZRN^<25KNfqV61G$o8>^#)V*Dd*meA9(nr{JoB)}+B^uQY|- zjJmPPa%n1+j%5^!&sy@FDjSMP#8qnGJC=OcAK0V@zHiA7{DIA3c}9MyjP6HFKx$U< zKUN>|WBI8mKk-Xwt^tjjC?lA-_>o-*4HEKlSxv);--CXQueOF*M|TBK4ZE{6YR?${!0d%$D8s z*j<*qBy4z8wCB=k1|rpYTOCi(muf++3d@VazDJGxg@;qKN)>s#7c+#5?3w)rxpc(00l~JVhBQb*V658KU@5 z4XG;_z)7D`WEsUq3G1*7&7qqC)lnjGnP08|Ov?xvWn>`Fyq45*3dSh649gg&<`@w@ zXV5&NK*mh7r)aK_jPaH+!KhFQ?R2GflC=Ma%JTNBMEj-T%U12HSU)H>{IZd{qrVz( zKQGWNR2H^9{I`;{v};oqyx~-tqOeq3X{oY75~b4_)xaOC4{>cGPwV2Y6hGEr?BeO@ zsr)6!!c%ba!Icac;g(b`t;#5M6+UrD2(MGY3p3b*E8@Qr-lb1f_v!qEq)gqW^Or6L z7XOapvw_q2#Csh*&O0{!%NsmB$BQTaT3mfPrVuW|xAXX`{u@_0^$?~#g6g72aL(sA zU|<&ihWQJe#U;~mt{znz@-p6AUe8~Jprp1Rvj>-z>cMGxiK2}Fn1i|erEl>U%XE$^ z^mi0<&)P$%tL?-2l?(gOun!aXd@27etz6!R6?|y+C)YOD&gn;s`m>R{ZmvCyt(*GM zdJxwfM%$*^M{!L*Vtwe~)3uKxu@}_@*|Disz4s$?5Igz4O9Afe$8`sB12Nw;fVZUl2bVJ7DD=>nY3+x`o&5Er8X zD|k7-flt@)s=XVR;3i(Ae*jI`gJoJKlU=?&nbh-s^uzcFW%E()SO#Opacni&2sG49 zGKbYc{gaz3VckvQyU6by2XU?9Xinwc0esxRK^$;jKRJL;tJj44dhY=4Gw{xXc))#s z*nfZ2eeWN@fC7Kqef^TR`bi4mFpg}h{Axd*R#TK@AHLCtZ&5J*+;{SG2m0_mcWzJ# zYPEW^z5)jJWo>0iCClo_ne!EgA-b0n4 zqRW$WDxV*~j|{9njAN9>Pu9#W8o*Bt4B!_mBTIU5bEISdFABbhml}%aMv4dUvVn%u z!}uG)|IuJZN(b;yf|m7SX{0O<8j6Gt;olA6h#3hFh#1(|i?bWT9>-NuLY5;Ta$6;) z&+`hd7y9gdCkEz4iX jN8cF-J$CbOU0&sscI+^YG5x`xi3ly8p-UriPDLN3mG(G!t%xJj1btyt*nu11I#o2PwF;y;?X0T(2jk21v<>Yd$tkGj@$xkhJ z&=ku$QtZJdp{3_I^r`!Q3kcnSCyX1t2a)tjuh zPSA_J9$tRS$;%bjNfj-pOv@;%`-?6vT2!>4m`1*#Pp;aFDn4CZC0qNXwYm7>UR=QU z_WX?F&n)W28Jy|RGZlP_`!mFKNVY5Y7HTLJx{pKB-B8NEI~zY+FsN|N{@gJ z<)OThUQZ*Pqiyttyp5iz0812L$#8%-22ay>AfA6O7Nd&y_qx%Wa`eZlO2opoi(^ zuN(Ux)_IH4pF8N4_F@|LF(LXmWB;A>0(UX$@2A}yV8p+h(ft!xN6TyB_YhlfFa6bh z#P(U{01wa)J&fJ-Q8(gI+{}QxAN_H)Ri=k$t@4KY(w^J$P1n@toYp)yh*{N1s6*%zLW) zwZ~wWMedW^bYfR5_saYER0LB#Eg#@hF(ptWx621^O#F9@il%wDiS$;1#S8`icLwJV1jCD`+JEq957{vHhDeW zQ$DSHnl)|CtXZ>61tlNzb47mkWYD^Rc`85k@{zrmLJg~uJxobBw6jn4)(X=*J$Pq9 z0(TY(1%5yVpC<)BWCHvn9^x^aji2y%f2sxMCaUv1fvHrCDfijjmtWVpmW{7bE-DFI zpHCT^=Ny*(Dz}u0{c^XPKXT}kOfS{Qr}HEC`at)&L%pbI)`WhR`R$xOc~HeeFi%`Y zU34{XmhvL_1<&P|{0#C}%rbw?`QK2>ev9RFxoh!zYT6$)@lmcJT^{jaER;tn3L)G$ zo?RcGyxj61SZ2yY<0#yI1~$Vj8)N_~#~jS&N&G_`aEkypoBwk_Ncn7@QSY!Po4{h+ zFm&->hh6-6dE8wrU!qE>V&(b-_LT5rou?NRAC_k}O)BQ-x7e~C zkZ7W>R)f~lYhEUD*ZX$i)nLtPA4KJ!TJp2w(S>&BIcBk2X@08 zCR}EpQQBuPdF1bHRm1(x{?@ zDOY169f(rh7mP{VvxxgWWlT0sr$t)W&4-LXu4Z#>%>OVnR#ZM5o_@yAO2ZlF{U_JP?O?L?-&g_!Mxoe~taoO7n& zs2060n~BBia1_!Z#&f}IIPFY*r}KmKQoowl<5*w`k>FU(p}4~UV@di#yS&L zCY!Pa=N}Alnllu)i29uNOYM$KW6NkfI~y)eCN{)68y9eo^7eSLqgxFt+D{%8L9d-k zlhyh~L(7O|oIC6wrtC+>v(mxiQX(*W$wy|nm9Qux!Msrsc!aFmg@L@cv_ z2T@(KT2Q<=8MT8rLNI>Vfrk*r(FTqZ968cinV5p9Jcv#^;~bt~PPI?$t(g=Lwz0-{ zIKvLR41!}#7zmPpmRQ1Gk?m=>Q>(1@I8U{rCD~!cS6kEtzPp2^r)dU4D8h6TRXChX zWV&K$!3m>EWf+S}Aj!m%gu)&|4eAWkj=?fK*{(^Z;?d?N6SFXzL@2TZQ>$Bi+V2{P zV;hY%t3%|s-o*QGf+IFhBj#4u_?LBP4a}yjOe~qG-w=!2^-KA~fp&)*gP1FrkTcsh z$8JM78K)SS$9;Tsj0K^I`8ZWj5=*z*WMopIlU%15Xf$z}68prowb5>}H(1$t#vx73 zE>K$We!G?Lr zXLOEI&c!C0utZ>NvQi1^*$5QQ?#mYFykErKJc!_KHH-c~vc z3SY3ekQ_!ntU^c{m0VVsI0q{!HAO(4eG5*^QyPa;@AL~IbTsKa6RkOve&3Z=8=h}s zwc`1(l-;S^Z)%Bh#c5@77nm5231wJ^^#(2!%pT1#=Fw~7B3w+l+uCrV0$FF^62VEM zVet&d@03DlL%Xu$4nartAzSdM3-TzZ1uFJ!6BAKkfGRV0tTg*PdI%d3QzTz1ICXTA z3vuld5;rjphpEF#m`I}6aSE+=YNPVT+?h0y#YQ>>DzoEq zauMUWd|Y{c$ps?j&A80K7P@2~=0c!Kvpy)8pQpC@k-pJyB6&E-dk`OHGI8NBcYIMK zmZl@v6mb_Q0f?milIIl$6zsx!mSyrqno*d4kQMyrrsYCju7o- zdJrGyDJhrS)@xFz}jMZ+X z?G?<)RPZ|pI*41D47vJbCpzplS5k_KPnoz~`R@=9e^D|Sx2;4FcM?9EP#&kP-O6-y zwQ+GQ8CCFGO>D#6lqlhw6C*kNW<}w>Cbr`~Dx8CAk-|i~A|l%UvLGIyuIBC1V{LBB z#CmMC_#qRYR*NfqikT22!S_i;-~l-{YApw zOr_43oLdJN_&J^A@UvF*?=$gB{ECE;en`X5e=_h#vg>n4y6~viwU>!M<1dsc6QZnr&IZA(g47gVOkur& zznSj!f=)C5r1A5EEfAKcS?y}M=^jWatVE(uV`%S!qcS%iemZD`489E8CP&;VEZ!+E~ z(x@?OwD|2$i$XYn=}Z8m$V3@JK`Bx0PZya%F-U4G(M7kGQJQcHDV2~Z#@JG$(2P^Pi)cXp0=CBD`dYFV0UCCAb5sv*}YCrh8Gm2{zURk_UF92&FfiAuC1Bb9oXGUnI>AD7yO z$(EkxT+oB#QvJwE*q?OxER=<$Fl0~n9r{S55_Ftf(k#|h9&6@Nli0j-qyu(z)>*%T z1w5(MQ7_Zwj17svle3dkjB}))n;z#XyhlmMeW!4kNVqRrKmFN=tBb7I6ZR%QX;g)7 zrOcD_>-H_ZUhRIaPu#9j`P($E-ur;mnVdF~&==?yjVtt=8!muQb#iLQj&;;_l1JyE z_#V<~$l|=P|&qJM=tfJla-)GjhI;<{cI-u`tC zS7TX88$Zk;+4aJtn>y4`6|s8SW1ZP#Ha&}pKsFwYwA(ojW<_$8%~H)8-+ts`qvrd) z)~hu+3|z694)DEqJb0JOSpOAXlfyiG5w$y(rb1A)W9e0ttx7c0&e`)(ty3z%?8xtK z6rdWW0}1l5bXR&9NKVP?19?gTr z>3>z|$EVi*BEE8$bdjGhguEp}=M{~f|=xk|R_Zs2HG-h*Ftal!6~+#|T;;3Mj=vYlPb zrxWaix`|C>Qx`i85i66idzk4^88XR;*UyXSqB$Me#2^vLblH)-o=-@&%l(G1@^(rR zokr#|CQ}|z$}_%~9eP$eY>cc*F^mWTy*+Hr_;ok0dE@nplo1R$$sAg$wQ4^3lLF=@ zs*$CEb&&QBU9hImxIcconZ}{zM=IK@{My&C88o z)|ZlP3&e=b}LUr%;;mq&!6jM4t4OgHzS|;*lP0ESE3HPD6I^ z2!_v@(l6{_s8-MU%}uH(_aDgl9AoF9Mg~p!qU?6yRw}qkzcp#Fnr1`T&6qP*SuRc{ zQ_-|y@k^#WugZpE5^;eV_=+iC^#<0effr4A$s1S~l4s;=%IIEU0#e<~Kde6F>+(%Q zzTuV7TBYfKyG;3(e4BKqtVA?P{bfbcq`F@P)j z{%*=Yu(o_s)k83*mEA@WM2I|ql4jd04AS!pQFcl zzoy4{(Zt^-p(}AX=O^*4hQHOHvWm&OaO4+o%u{>`Ai|%edTJ^+QzL2v-f+9i>iJtO zEU6v9al@A!t(PbY2!I)wsTUugTl^+R6~YhJ?m~5KKju`N*pHL8VFI5U`2X~ZGy1WJ z4@*=7pU7+MlW;2L zVKGkOE$4i+qmegXr{gj#(5y~&*l}5{!%AF`4_Ze2O7K8z#ns7pKw<{MaFky$J&bi0qjy!lwLo+*pKHZ3~%l$xw#wr@q#lqbhfqBE?^<` zYcX}MiQ-y9p)5r+&cp@0((c4EGJH1fLyJ!+_q#$Nr>;-}>Y~_@LhBAM_l0m#CypGu0P&_MKJcwTe&``P?uM_+? z4MwaBvrX-w+BL;m{!d8o-)9Olt^v9RHIXhl6Cc;@=*}i_~g5 z+-(PT&kh%djeh)ZjoMoeeRwwxtQ`<(DCV(gLU&5QeQGGFs}#~jE*eV1rGEN@eRwS# z%n?Om!-fM`7A_`nWtCDoD8T@>Vwv-zRG^_eToNwtm$I#>aGuQPaiAg8hZ(iu@&TF9 zVAk%CK-knE6TN2#ND&$)=Gg;sctd$@*wFA{^JR+1=$9k5V^-Lxl%xA)>Q+p1w&QsIJeT@^9&fl? zF$d?>BF`1 zD6W%!bj$O&L96H*fQig^kEh}nk^Ww(#?9nzK0|Mf)Y3mL z#6?oaCxiT)NJ?&|YrO;^nJsg;CW$FhFYn{iQ!+tLkQ2G~MeLWk94R4Bf0vWEM=3e` znw-qF2Kjqd=5efyTn@@9ToEFljWVCJ<>c@vIaL~9lD{?5$k}pod5)Z>$4;lTYq^7_ zSQe0ChtBus=sbfv=>26O_or_n?(ze4>ZJyR{z?DaL!cjlmlHI1|FD6*oG|bP|9K$C zjtt^}6Rk`?KzBMSs*1uyEJj&A5eE$HQLfY_vISE1#1(siw=wMI4-JaDP>wlSv_8KdeMTSdBrsHrhZwv6_tEyu9UO;WqC{S>3ukv@8{-b zTD_SCeK?vk=j)k?d|Knp5Z5kQtDIY~p;YKTcFDyJrTiIfFw|I38jLAhQ5`OQ33Mn= z=8QB(Bdyam+MTmeT5)x_L;;o*0_@2FPAXQAhJrK-K_+vMYF|2zmoP&ij^wugKyLf= z5G)~Ps0D?0^2kMrm>9xwq*#+6^zHX$CW%u%Wb7iu9xZbB0aR+>29=t znjgr4-#8e!g7yQig@=gk z5%i*u-?lu4EqEN4^Pc}oe4bwGNjylO)yE9uQQqah%nN2Kn)WMvm zdR%)9wn*er`5-PPzs2$y`4FFqV93MrVLla80!4B;JzxneIoo|Ag!W3M{N!kfd_=B9 zDJ4`SAC-?$Dp`6R=PBjF1$7p41`dB0(?leE#96fI{U|nM-2vv8hPJ=GoZ)~$&!kLV zPut~F%BPr9>SoTIX(%YUDwhEEl3tY@*0`C-Rvby~s+6mljBqI0FW1%zlQ}(jeO|hD z6v+j}8sf!$CBDy09O`!mO)@e1XkQm<9HZzY^N+YTQia zJ@_3!2tT7E+{>);=bZlqwQC=fr(ZE8e4QHh8%=zKYe<(%d-3Dekh=xo0OB&L?{daW?~JX6QMfci#WsnxzffI(lW z?!G{gHuWiZAy6DBp{bwBw7)c9P_2__G1WGf)o+T5>@9HmdpwQyk``xIakty;^3}HZ zT+XIw7P5#?{Vq>arN5c5&)3E*ma5eq&K{R9zoN~#!)fnudYbJuUA|UNbN+%l151bq zo7ZjA7jBfR<%#4T-0sIvt)er>7|r-(f0}ZhE8nGPi4PbGF{k zZk1iyuz4PLXgAF%20wR2vxmF2U(D(Hz1**IpO$1vnB9x734_!t?(jCY8+b6V!ZM_^ zJ_Q48FymP~gXfTi6f8$7s*r|yEI;95nmd!1`${bBWmyjYPI*{>*ftYMHHY+nj9HH ze0mAjK1577x;3H%0_HhZa!^~C;7Y!2)dv|fi0f9pbykpZxvD8aeUjF8Z>~DuG;j)~ zS|A}`Kf$GE;naRlaKse{nQb-7VqvbVLFP+RtFvbJmbM3(Ji!;oxyZuua4yf75oGE$ zrf;;cQWDmPAnl>U)v|`_ge#1R>^hv5^?Ts}*Z>8a5sxiM64sKjRoH645;S2MTqr>c zs?my0v|%?q!lf6zC$Jp@@Zl8vxQuSx#4g-J4}K83f5v`1L@(oTfXO(-6dYkHjxh_z znS&E7#7S1;RW{=_`tb()@FtH!<1xI&A-v7A7~mKNIgV4jhj)1&@9_bK6eEU}x%fb- z!|7gSJw}vmIIlEgRO!S=N*69DJ8@AN#>dKC1aLha?u#*mmlftEfJoMO2V&zAEeC(zi#0aKw znZ^ms!Bv^PYgmNqGIKXjfLmCB&ryyqWP)yE9qwQsCed~dUxvgg5W=OQf5pOi5vxyn zo+A!9%p<}?I`)S|&`Ghj5Tg-NA|u48o(*!^f{4FhSLs(VJ%vP_@qye$z9K1w{r>>P C_CWCf delta 1352 zcmZuwZBSHY6n>t&>)u^Hg4hstKwK!04`DIN0ul&D0{K)F0t8xNU2t)iFO@_^!bU}F zvRf)R!Ayo4XvRlNNFQ2_F-bH1sekpWAI&t=pQfo1jSfrZpYF^(bMAZ2d+s^U^PJx@ zPGH6MJOCI{E4+)ZrIel&0J{l7VYE!y=Ei_yW>0Pdw*`z|ES(8dmx?b27M z7G?G`bQ0G11g*gk<>${f?hD|49?&YyiME&7qw*kO_H;OHyY{(UEnT)^Pour7#p4d( zA>1L1PDfX6tEbUrW_*S zxcsdxtWF6mhaOvD!ZtjD3QY~GTss04{u2H+s4&Tkk0voUiog}`)+J?j>QI=49MR5( zJ7VT71}_5#anoY3tnxB6T@4CXAEU+PNmt{8&J7`7TVu&I&hj}0m(i%zTMEOT_cG05 z5@Tk%ST8euVeJ!3T5q1q%b1V3d4?%wZdr+Dn3BAVn`2_NnZ**Y=)JW0u9u4SReDfk zLZ;H;qSznswAd<{v<9nDi%9Ggla-%C9(#MI2!$dKrU0#^M;`aDu5g$&DCb4o>lPIE=S>8D}|x^PIsT=P|@Tae;U7j^dAD#flN7rWfxjwHQ^Ja7A(9eWe{^N;k%p z9$Zx};sa#?lRhTTBWRf)T*Wn+QaqM(t8l9*cesreGIgZ#A-8jfa2unHv659-C9@Xr zMOMQg1J$s`=PhC#Yq=9D`(9Ooz&nl98NzVMF&E}On zX)a+UO1pL~!WP}8TSUWM;2uJCrX`d^r-CZHI_Z|&#YXLZM0jqw2u+ofaUr;AmQKRU zJ(Kw35-!Mzt0Zw6W9w(>A!f0l;3k$zlfQ<3B3TZ*mXo`+s>qc87mZ=L=89+zi)dEL zc-i|pH)QSRV8f@#k`^}O7K-qNtjm|!fv-dnt+z2I zh%RqfmS8L6Jm3Z6!pl+NB@7z-_=@n7h@(Edb&}ia15Ym{l6~MAXqVe&=