From 1d9b1a3d5e33bed7682821d31e1556bc63456b9c Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Tue, 17 Aug 2021 22:13:51 +0100 Subject: [PATCH] Remove hardcoding of world limits (#1199) * Remove hardcoding of world limits - seems to be working fine without the datapack for world height changing - particular attention should be given to LocalBlockVectorSet and MathMan changes * update adapters * Override getMinY in various classes and ensure selections have a world attached to them * no message * Address comments - Fix for lighting mode 1 * A few more changes * Fix LocalBlockVectorSet * Fix range statement * Various fixes/comment-addressing - There's not much point in having a different file name now for history. We've broken it before... - Fix history read/write - Fix range on for loops in CharBlocks * undo bad CharBlocks change * Fix history y level * Fix biome history * Fix lighting * Fix /up * Make regen fail not because of these changes * Fixes for y < 0 * Fix isEmpty where only the uppermost chunksection is edited * Fix javadocs/FAWE annotations * Better explain why BiomeMath is removed * If history task throws an error, it should only be caught and printed if not completing now. * Min|max world heights for new patterns * Load biomes from NMS instead of bukkit (#1200) * Update adapters * Update adapters * Don't initialise BlockTypes when biomes aren't set up yet so all BiomeTypes.BIOME are no longer null thanks. * Address some comments. * rename layer -> sectionIndex to imply inclusivity * Javadoctored. Co-authored-by: NotMyFault Co-authored-by: Hannes Greule --- .../bukkit/adapter/Regenerator.java | 4 +- .../bukkit/util/MinecraftVersion.java | 1 + .../worldedit/bukkit/WorldEditPlugin.java | 31 +++- .../bukkit/adapter/BukkitImplAdapter.java | 16 ++ .../src/main/resources/worldedit-adapters.jar | Bin 816784 -> 819854 bytes .../com/fastasyncworldedit/core/FaweAPI.java | 9 +- .../fastasyncworldedit/core/FaweCache.java | 3 - .../core/command/tool/brush/BlendBall.java | 5 +- .../core/command/tool/brush/CommandBrush.java | 3 +- .../command/tool/brush/CopyPastaBrush.java | 3 +- .../command/tool/brush/FallingSphere.java | 5 +- .../core/command/tool/brush/FlattenBrush.java | 6 +- .../core/command/tool/brush/HeightBrush.java | 15 +- .../core/command/tool/brush/ImageBrush.java | 2 +- .../core/command/tool/brush/LayerBrush.java | 8 +- .../core/command/tool/brush/RecurseBrush.java | 2 +- .../core/command/tool/brush/ScatterBrush.java | 3 +- .../command/tool/brush/SplatterBrush.java | 2 +- .../core/command/tool/brush/StencilBrush.java | 14 +- .../tool/brush/SurfaceSphereBrush.java | 2 +- .../command/tool/brush/SurfaceSpline.java | 7 +- .../parser/mask/AdjacentMaskParser.java | 6 +- .../parser/mask/RichOffsetMaskParser.java | 2 +- .../parser/pattern/OffsetPatternParser.java | 5 +- .../pattern/RandomOffsetPatternParser.java | 3 +- .../parser/pattern/RelativePatternParser.java | 3 +- .../SolidRandomOffsetPatternParser.java | 3 +- .../SurfaceRandomOffsetPatternParser.java | 3 +- .../core/extent/ExtentHeightCacher.java | 2 +- .../core/extent/NullExtent.java | 20 +-- .../extent/filter/block/ChunkFilterBlock.java | 4 +- .../core/extent/processor/LimitExtent.java | 32 ++-- .../processor/heightmap/ArrayHeightMap.java | 10 +- .../heightmap/FlatScalableHeightMap.java | 13 +- .../extent/processor/heightmap/HeightMap.java | 28 ++-- .../heightmap/ScalableHeightMap.java | 54 ++++--- .../processor/lighting/NMSRelighter.java | 85 +++++----- .../processor/lighting/RelightProcessor.java | 7 +- .../core/function/generator/CavesGen.java | 10 +- .../core/function/generator/OreGen.java | 4 +- .../core/function/generator/SchemGen.java | 2 +- .../core/function/mask/AdjacentAnyMask.java | 12 +- .../core/function/mask/AngleMask.java | 12 +- .../core/function/mask/CachedMask.java | 7 +- .../core/function/mask/MaskedTargetBlock.java | 4 +- .../core/function/mask/SurfaceMask.java | 2 +- .../function/pattern/AngleColorPattern.java | 4 +- .../core/function/pattern/AnglePattern.java | 22 +-- .../core/function/pattern/OffsetPattern.java | 8 +- .../function/pattern/RandomOffsetPattern.java | 10 +- .../function/pattern/RelativePattern.java | 8 +- .../pattern/SolidRandomOffsetPattern.java | 10 +- .../pattern/SurfaceRandomOffsetPattern.java | 7 + .../core/function/visitor/AboveVisitor.java | 11 +- .../function/visitor/DirectionalVisitor.java | 22 ++- .../core/history/DiskStorageHistory.java | 3 + .../history/changeset/AbstractChangeSet.java | 34 ++-- .../changeset/FaweStreamChangeSet.java | 42 +++-- .../core/math/BlockVector3ChunkMap.java | 20 +-- .../core/math/BlockVectorSet.java | 10 +- .../core/math/LocalBlockVectorSet.java | 133 +++++++++------- .../core/queue/IBatchProcessor.java | 11 +- .../core/queue/IBlocks.java | 29 +++- .../core/queue/IChunkExtent.java | 3 +- .../core/queue/IChunkGet.java | 32 +++- .../core/queue/IChunkSet.java | 8 + .../core/queue/implementation/Flood.java | 14 +- .../SingleThreadQueueExtent.java | 26 +++- .../implementation/blocks/BitSetBlocks.java | 38 ++++- .../implementation/blocks/CharBlocks.java | 73 +++++---- .../implementation/blocks/CharGetBlocks.java | 15 +- .../implementation/blocks/CharSetBlocks.java | 146 ++++++++++++++++-- .../implementation/blocks/NullChunkGet.java | 29 +++- .../implementation/chunk/ChunkHolder.java | 83 +++++++--- .../queue/implementation/chunk/NullChunk.java | 34 +++- .../core/regions/FuzzyRegion.java | 2 +- .../core/regions/RegionWrapper.java | 19 ++- .../fastasyncworldedit/core/util/MathMan.java | 53 ++++--- .../core/util/collection/MemBlockSet.java | 89 ++++++----- .../core/world/SimpleWorld.java | 5 + .../core/wrappers/AsyncPlayer.java | 10 +- .../core/wrappers/WorldWrapper.java | 5 + .../java/com/sk89q/worldedit/EditSession.java | 59 ++++--- .../com/sk89q/worldedit/LocalSession.java | 7 + .../worldedit/command/BrushCommands.java | 27 ++-- .../worldedit/command/GenerationCommands.java | 10 +- .../worldedit/command/HistorySubCommands.java | 12 +- .../worldedit/command/RegionCommands.java | 17 +- .../worldedit/command/SelectionCommands.java | 12 +- .../worldedit/command/UtilityCommands.java | 4 +- .../worldedit/command/tool/BrushTool.java | 2 +- .../worldedit/command/tool/FloodFillTool.java | 3 +- .../command/tool/RecursivePickaxe.java | 9 +- .../command/tool/brush/GravityBrush.java | 4 +- .../factory/parser/mask/OffsetMaskParser.java | 2 +- .../extension/input/ParserContext.java | 67 ++++++++ .../extent/AbstractDelegateExtent.java | 7 +- .../com/sk89q/worldedit/extent/Extent.java | 144 ++++++++++++++--- .../worldedit/extent/clipboard/Clipboard.java | 2 +- .../worldedit/function/mask/OffsetMask.java | 30 +++- .../function/visitor/BreadthFirstSearch.java | 26 ++-- .../function/visitor/DownwardVisitor.java | 21 ++- .../function/visitor/NonRisingVisitor.java | 25 +-- .../function/visitor/RecursiveVisitor.java | 18 ++- .../worldedit/internal/util/BiomeMath.java | 91 +++++------ .../worldedit/math/convolution/HeightMap.java | 8 +- .../sk89q/worldedit/regions/CuboidRegion.java | 5 +- .../com/sk89q/worldedit/regions/Region.java | 6 +- .../com/sk89q/worldedit/util/TargetBlock.java | 2 +- .../src/main/resources/lang/strings.json | 4 + 110 files changed, 1489 insertions(+), 677 deletions(-) diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java index df7d65949..208c27dd0 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java @@ -266,8 +266,8 @@ public abstract class Regenerator { public static final MinecraftVersion NETHER = new MinecraftVersion(1, 16); + public static final MinecraftVersion CAVES_17 = new MinecraftVersion(1, 17); private final int major; private final int minor; diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java index af8b3f0b3..0a14b0d94 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/WorldEditPlugin.java @@ -49,6 +49,7 @@ import com.sk89q.worldedit.util.lifecycle.Lifecycled; import com.sk89q.worldedit.util.lifecycle.SimpleLifecycled; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.biome.BiomeType; +import com.sk89q.worldedit.world.biome.BiomeTypes; import com.sk89q.worldedit.world.block.BlockCategory; import com.sk89q.worldedit.world.entity.EntityType; import com.sk89q.worldedit.world.gamemode.GameModes; @@ -59,6 +60,7 @@ import org.apache.logging.log4j.Logger; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.NamespacedKey; import org.bukkit.Tag; import org.bukkit.block.Biome; import org.bukkit.command.BlockCommandSender; @@ -234,17 +236,18 @@ public class WorldEditPlugin extends JavaPlugin { // datapacks aren't loaded until just before the world is, and bukkit has no event for this // so the earliest we can do this is in WorldInit setupTags(); + setupBiomes(); // FAWE - load biomes later WorldEdit.getInstance().getEventBus().post(new PlatformReadyEvent(platform)); } @SuppressWarnings({"deprecation", "unchecked"}) private void initializeRegistries() { - // Biome + /* // FAWE start - move Biomes to their own method for (Biome biome : Biome.values()) { String lowerCaseBiomeName = biome.name().toLowerCase(Locale.ROOT); BiomeType.REGISTRY.register("minecraft:" + lowerCaseBiomeName, new BiomeType("minecraft:" + lowerCaseBiomeName)); } - /* + // FAWE end // Block & Item for (Material material : Material.values()) { @@ -304,6 +307,30 @@ public class WorldEditPlugin extends JavaPlugin { "The version of Spigot/Paper you are using doesn't support Tags. The usage of tags with WorldEdit will not work until you update."); } } + + // FAWE start + private void setupBiomes() { + if (this.adapter.value().isPresent()) { + // We don't know which world is the one with the data packs + // so we just loop over them. Doesn't hurt + for (org.bukkit.World world : Bukkit.getWorlds()) { + // cast is needed, thanks to raw types <3 + for (final NamespacedKey biome : ((BukkitImplAdapter) adapter.value().get()).getRegisteredBiomes(world)) { + if (BiomeType.REGISTRY.get(biome.toString()) == null) { // only register once + BiomeType.REGISTRY.register(biome.toString(), new BiomeType(biome.toString())); + } + } + } + } else { + LOGGER.warn("Failed to load biomes via adapter (not present). Will load via bukkit"); + for (Biome biome : Biome.values()) { + if (BiomeType.REGISTRY.get(biome.toString()) == null) { // only register once + BiomeType.REGISTRY.register(biome.getKey().toString(), new BiomeType(biome.getKey().toString())); + } + } + } + } + // FAWE end private void loadAdapter() { WorldEdit worldEdit = WorldEdit.getInstance(); diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java index 32297718d..fdffeea0e 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/adapter/BukkitImplAdapter.java @@ -50,7 +50,9 @@ import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.registry.BlockMaterial; +import org.bukkit.Keyed; import org.bukkit.Location; +import org.bukkit.NamespacedKey; import org.bukkit.World; import org.bukkit.WorldCreator; import org.bukkit.block.Biome; @@ -60,9 +62,11 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import javax.annotation.Nullable; +import java.util.Arrays; import java.util.Map; import java.util.OptionalInt; import java.util.Set; +import java.util.stream.Collectors; /** * An interface for adapters of various Bukkit implementations. @@ -304,6 +308,18 @@ public interface BukkitImplAdapter extends IBukkitAdapter { return Biome.BADLANDS.ordinal(); } + /** + * Returns an iterable of all biomes known to the server. + * + * @param world the world to load the registered biomes from. + * @return all biomes known to the server. + */ + default Iterable getRegisteredBiomes(World world) { + return Arrays.stream(Biome.values()) + .map(Keyed::getKey) + .collect(Collectors.toList()); + } + default RelighterFactory getRelighterFactory() { return new NMSRelighterFactory(); // TODO implement in adapters instead } diff --git a/worldedit-bukkit/src/main/resources/worldedit-adapters.jar b/worldedit-bukkit/src/main/resources/worldedit-adapters.jar index 1dd840f1c9235ac7ebc95f8c2f9f7300ce06eec9..737a3f354dfdd813a0cf4d8932f5bd5c0083d7f6 100644 GIT binary patch delta 183076 zcmY)VV{~TC^F0p7ykgtQ#I|$A#>Do-Hm=wy9NY^W9=jGzt@tUMFFc*O8$u$Plo&l-cmNT#p#d@x;$IM7 zk2W4Fow@J-1#5fZ01dS;BvAh`%pvH*{D&-PjFA7KAtvcRKM-F967E0d0pdll^xjnn z$p%tlyniYDWTc4yrRp;*LH*;WbM+z0ODDO2kZ1^C9fSBUCdbkFj~<@40s23`TPPgz zU#_&lMRaI7^T+?wLOPC!ke=`Xf!#19=Jl^qL_&z*zls2(AO9Hsm`(k|HY+@M{B~D0*hF>i~n+z|n^HZ&E{#WtXUF$1sBFf;)%^Euk#n zi~p%h*X08L?>lb!%>^!j@ZZC=2zWd3zb}BiGEPH1eVhPFF8#w090g?OfFXtIzwFhv zN;nk4g{cZrZ1snSHX2B)93EizGhw_HD>CRgsH2&Cg!)AP$(}j?D@xWXL8olr1@wK1 z_YE#oS^B#!-^|6u1^dk8#e^Z~>ysvcpfyht0f-!?A7hkaTx`xKu-WZ(ZrN=E(Zjeg zerM6xr6ATQu`(V|p$J+z$u`lvb9OM1Sg&``*)T4g{if%@Adgdm2q=6kLohWj=0cq` zfiaclA8q9UPbcf3a)){feSAilVqB}obXKu4Psa^&ZXiGwGRat(zl)o%$BIyx0ODOJ z*X9r(4?xtUudIY>vgTAry7C7nOP4y~A0SV+KI7)Ge24A-PzP~VqwkWItH>WP2)Q{< z4|&P6eTNAc+oh}y@eoLwD3)3p*3tAD=1N*;Qtn_f8t;?9Nx$J8czEMiS<+ZD#0>-1 zQQ+ksT92IRIX!w_;rRwy!5X$_^l1W$zj7D{GC19g)#X1Q(MHoHzD52$@6~O$;&o!+ z%P{BpS{|f7J_IG?L-L=P5F4_`MA)yCmT$c&5Bhtdz`o-!K_3HfOkrnmXVQNz#?5ug ze1CB+($&D5y799YIq`B2Ue{-}D_MfYf0RS$B=KDk4Xlf)~nfB5yeH8YNG5 z4OAwH+UzQ`NfUHee-1kcT&bv~bPLOMyWvwGiKX8b8}&DVsd3o_=x{ct^;x4-nUWeW zzMOSxDWJM`z@;CCs?U~smAUe*1nzhOQxRqt)uKeLEtmh(DJ@~aHB@y{lgK){SCO>E zol8&Pkzwyksw6GL?AN!K08XdahsbW6?mo9)rLhmk+P*^Y?8C2-W-&s4VHJh^1JzLO ze2jcXuZ&IX{YmmJ5ANg+b4hkbU1F0Z|2i+_uJLT_2+iZ)0?ocF!*fX2HE#~ogk$!67aCkN_FL*XVbwA zcwCcZlJ_C@<&ru*1+2A2TB+u?y^>+IT5bTr3SL0=baBZd zuewv4{WsdJy+{`8IvKH?7;jsPA6f=iQ#_j*pay{|CxjkdZny0LWg;8A^xDvTC*D|E z_JLHP3Kr8gi>s6@ltS>D@rZ&%vW%7IR_j*Gl@hH9glpg*dGZK5KzCi;VIrKth&w#L zS!WgH8p?kn9q_24hnWEmpn%Cna@+NHVI{MTMwuMAFlX2< zQ@BC7ftBVK>ayjG?)IT`miXpF{!A&3NqeX5gbT->xD?XSYJK{U_4Vbf)$8q^%vb;e#WdENnSw+*1J@kd(y?NldE{tWSqjj{>lm*y2g}K=N6$p?@OR;++tZ&C zt;`@e{fo_nV{7-UM^91dR`KWWCS;MqEBofb(xHAbwt>GrB$7L)Cyv z@-0?3lRuTf_~~|R0l*F3V)aIWM%E1m(Le>Yy`U{XML8XuCGg9%>)+f zDswB@ZZ{W|_xYCxB@E?E||?$Ggz713kDz=nf#(=iwl~= z+^pmP@Zt=8PO=?ht~VJ{^>3gNuvYYyICxG3SldO9iS!XR{o@C`Yu^Qe)PNjMuOkls zP-S-F8c;v+hZ!0uyyNgU;a_HxU8eVL*r&WtC&AGxVf~w=Td%Q)UtvLl$dSdUCIhZ! zO22YrjbQmBk-4Hc67QK!}1YS1w;Mi*Ri>G01#Fb_61&83R3E%L(G;lOve1Y!zmr&)^F{m5w;N>o%_aZ75a?13Qn?O(iY?`tB}MWR@}gl) z&wZ0#{00UJ=^Mf21%?p#h17lDK%ZuLC;fI2h=rZS00dL0`ekTJ+vF|X8Wca;u4W>s za>qI)bgShoiItc3e2*8Kw;&AHjJKWLQ{;kV=y~AgdxmueW4}kB z+B5wBKSsK~dB1iGf`R2ErlXNUu&4KuKw+d`?IFU0ru^W2zb`F4^FD2lWy>2R$&7+Q z8e_2%gm8+H!)XVIz)3^kDmx_sSdz?4*hEFD2&y_(H7bm%uyGpIqv3!e&_meP70d0{ z%T-Ow#Z~L&(09To-Q3ACaN6Y`{$JPhUQb;f*KH@cK38iy&mDz6PvE^{f0SV0LMn|G z$~XUj(l~7(@;9@ncg7R84EX(rp2z61V`mum!{ve%+?tp~l&N`0k;(j1g*ir6lyy&} zaFY|Ymv>Q)mSOSV@x|>MdaSB?%80^<4f08_TYKSeVOr&-!7%cFQ)}gIbXtrry12|7 z7<}qvZ4UQop4$M>ev0^+>R-w3czte)eV8X5V|%uDQ13z^`ocD? zV`c2;tPRyLnW3b@pgT#5@OD}Ag#n~G9t|3?n(%^JS}XN*vjGVrm`rx0;`r7P!={m- z;Vu&WUJM@vT&Q5QdAJ0L7S(>=5(%{s+AUzr>}N(IGz>sAW3ALKo72T=EGlZax7_GQ zXcq>?ek4j*CJUh?DQ-8MhD29inNM%XE<9Z3R)eV5ulDw7;fAuYmRvO6xsW+W^dPxw z3vHvNKd55Ucf_8wFw)?_F%Gime4cF3O63a6vvC}}sS!h9wbk95*k^&!fj5-iaLsTg z3vq;xdaOTBi-XPeD?{ZjJO@{@e8wb3X(fPb>3JeZ$m9**V$H(erygGI*-ngzqP?{) z&GF#mg&MP$cCZ&8GUP(&Ck?UiR*0H0OwMT55+jn0Vrg;O-GLZJ)H=z+A2}mX8hC?3 z24t}-OM6~nQGRi^$&`1OVt-|=t>~PqZI2bud&B7z7bQ?z}M;8~)O2eg3Rr*+XLV*Wzx@e)Ho>r@8 z)Pq&0|V1+gi_NKR?>DA9s zKI~=7C!e}=%tfcUdB;@$3*ax1+GVD@8bkS zg=b z;_Hg`pVBukx9ce7+Od{#rH3B$YPMZ#jOsueAA#*UAY+H&8gMH9B z(sMq%a1co{?QF7np?R12&T7GsJ`uPEUZc~uKV!dsI^(3T8pF>cq5yNXgl8xS&^HtY791x6x?XNUi^TLik(t`cZG9ppeE~vqObY_DfWh zC&AR8zjyUfmhjV3^~Cc8v8*AZ;MWFoU*r?BoPA*mqn6m{OmFns->%=`IcLv? zNsr_%d58-gIrB!>6TOciv!}M+TEff9*jO7rXcw&~ycFQM9%8wRGT3v;CrKd_u2(k( z3>Px>GA7#qF@Y!ts$uJfH*m=!5pzRN)_~rD#wj}03P_!1{S!A)#f)^2Zl6hE%B145 z)#Xx|c!-@+-Yvn@NYD8F7ebk1NK5&fY&&6pCHh{6jpTrK#SW=vqOLSNLIe`0OhQmiPMzFcQSd`rdz|xgUl69l`9AVqCS_OE9Z%By<#A-TO zEqYlEQOekhtdjdf05nVShXHZ#l2E@V_j#^MVM3q(vF!==+?vUOhkJuE%($U?kG35d zHgW-Z`Q3*UH@=eT@9|C8|A0N9$LKy*sSbO!7)}Xm+ZA?P4WOVV4CM;xyaLE0wNXc@ zRTo>^G_hin{H}3;e`%C+)Rrt&_lVYNVXnIT!!OntO@U^Gqw<3wR)=_q;nz1wWJ6elXFDZyz46)V&t+a++vR)v^t= zTBih&8&QZPFg6I76vv%AfRhtUge4%y9v4s?9VPCQbWAZ@%P`%=#TYSR>W}Qgm$1w_ zrmJbzPt7N?;156Yi~(4hVvl6=fYazSHXD6kgtpeQ{!5{N->_wiG`mk@nj1)y%>!MU zWVLk5S;ZleH6Y~=C-#LbR8HZ!GtW$SmY!85w#} zF&{kLU4FU9>VcK571U6fv9ll6+s61gZvwFc4nI}L^fR~^W}4H9IL%E9qNjvnSGZ+J zQ|kQ5^+<)u6d@(M6$}SmaY|<^fm4j;m|f4z1X@Fqvawl`PuAc2yU{K>zxXSNvG9B0 zaEBvn?sRxNg0c3n2ignWH$jUL-sSzlBkJ5h%lUa})78Bw3?D3bR!52W>540>XkhN7 zr3vSs+VfX=4DkfA^_hKX!rkc%(6NY^FCsu%#61ANmJSPdFD!oO<(vVQP`|T(K z;vPQ6d4dQ}*85cFP#fMBJq2a$XC1;)T=KlHh)dpLpLb9k<|=gi@Uz194jg1ai+8}8>d z6@gw1%SlJnRQnBiXA0gI8?xgAxV{bSj8ZSj?h%ZE@qQ{paQ$1YAEglpa;o9?^}A7( zFmcVW4WM&*@Z1rjKjdn65sE+qMx%*C8xJK26M>_0Ux6t{DalN=g<8wvxWg>-z{X(emU9ynBYfo7nM&nGW6J6Rk2mI-9oeGG)x3;7F1+-8Pz#}YDG#AEXFnSq z_OV%HhRbh8c0@o*3$7J}eN4^Ef4H|qR<({GcWc+x-fG-bWuJnQutN8H)`dv-Zdim& zb_=Pm4$3+v-Q5Hi=id>ttRa!Q`3&w&sfDI(EPT@(IhK2AP}#iC3)*hLK8FW`JxAxu zF7rz_b0IT{eASxSayf22o_+RXsPE>MUrhzKh!WSFEs<}!d;`pvR~+iP zaqGkyi>99D;EU@y+v_4l?%g+P|A0gIj_kssEIfo|SZmNK{U40BPfb5LUdqEk6oq&C zq&LEyf_tY1Z8PDQEnKOtdDky?9R_B)CfmArg?A`nDn(jd79aO9a%a&-;DODd-*gpX zHMyl5mLW|}vaX~@<5pR~vj@gk;FmbA^0n>(GXmG*vzQ!Y{?g(;lve~UD1fRuPG*I2 z7w5S+@auoNcb>8OYl$r=9-p{5>xiz;=$;xVb63v@FusDr$7HndZdR5wV62yC`4uk7 zofUsfbh1)pztgWZ%;XIDMH0lDWRvxVPzSp5m{@2L+0HYGNrX$>EI_0uh~f1cNAZXn zd<7hc(D+rxwkNmO!gt)jJZD6CsyqC934^x%r< zS>^E0^Xo`ju|E6kQ8~x~_E!h)$k82qRVDcF=1n4sMbmGr!!k{HHcZWo6Wy>#mwzij zlYu0&_Mup#FnHw+L)Nd4IV{}?9QR|16z(*ChB&HATDACnp-4Ec5+<5Q*(RDw zSh~8GYg^)`KT)NI;zZV!jA9)~Lt0Z|f~Ra$gy>VMjkP~Wvi5~!4~gekoC_js6}@pq zj+KmJ&`7aGxpO4~iTDaVH}wpz)p9hW%0MNfIMC}0F_iKy+Hj9ThHW9-rdhNlE~9C| z&vS=P4P+LM*7+%3U9*@H1sS%x$I|ityRMom+mw3YZLME)DV*RqZb6u`Phd6-5l-AR zOgIt_;;j>-xhSwIrD%KW^-#9i9PAw;#HkWUx6xv=pxWWD74ryua;P!v-+p9m&O)=dlgh*Di1B$Q0v4d>aY%7w2bt>-N7Zn`F|aMYBtTaW^G|Hk^Ga zn|nmf4${TL1=$`(Hptfnt)!u9>-O&aL_pp%ovc8!e~)v#icmD%+&C~cut5-J|Gl87 zfV%Evf>qdszgKciXy?A;Eg;?{_6{Oct2CAxEgmAQ^S;me&LS>YsHk_B`~_s9)nCR+ z(l@z6kKNY;a%9#ja%{9!91vY=hv4-8CJvI`lnb_F9nx{i#i|yJ1!8DG)8gr}`(TCt z`R;{>7?cvNR>?gC<0Q1Q@WQjGhwl4? zwT@!qM9ZO;_*Ja&{FEC&EwOxHxpbP%T0*zBB5%f$8!{ivQ$|CP*?*(fh$bPOG~D*k z8B7_{dFP|Ec8sJSObu%t$JA`-<9OlpLwjkx-Iu(@0B)M?yX{->56o?W&n{!E9Si1SZq)_! zIj{~f?w7jiRfd4(er85%$m4T!#$&mlZTu8wAF|tb=L&ewkC+>yrZtVRjI1hY1#Vhp zYrAW?i^bofD0VYEEWH59dQuT6)1@};qU|mSQMvgxE_GkJ@XXJ*v4nno?Dzg6W9f#Bbno? zz*MJu!8tU5@7hF0d|B5>3j-Ant-p^}w*q~(&#ETCgiJ~aU2Y>6O&{$3W8w}c%F_j8 z7qt@+d}zV+Q(Hq-8>C%d;M|9xzgqr;mtU(Sb5Ow7qa?>zVGvG8X-GuWxD!Q#bjzP~ zNGO+mYX^?MUkbkue%lD29%Z>I%5+&SsUomp`m6doJN80cRsD(lZKr48W`$9RbgW>` ztUDO=j%b%BwbO(gQIwZ<O?cDPI@UHXE5}XDkcLvO;_sic5@WC&f1BpihaXq3`Sl51sBDVPc+k zdqi}zk6>8qA@e>E_`ZZm64|rnHrj=6b#`m=C2J_BPYLwxoWYDEVa3kN*jKyFR6nyI z!JzJ$mdC!;2EB&Ue$ooj(3Z9|u>I(|WHrJcpa57FJtsxOtLhc4eA-3T46eB10u=(i z<&6H^YyjWySb7Bd?MK++#uL-**{Qs$F9vk^nkfrmF$zqfubsYEAzBx46q|s@HQl=6 zSjqy^4_8_^!pDR25q5NhpQ5;nqYEi-|8|#f4h5FXf?hp4b+St2Q)JAr(^IE&)wFel zvTY;2s6ps>2B^$iY(oiUCI7oxy+ZFmV9%wn(*Wj7$3HuNH|{6ZXR6ah&xoHc z!e49CAh&$xwwnM#^Kp!|&j=I_T>}F~oHzj)LK=4YOxlJ~$CLh7XPpBblgpTx=_NS5 z(AiX|6kfr!pXoRn^QWUhKa=1>&h?ys5;}~+50*Nc#D{KUN2tbeADca7jKw@MIgZ)# zu3!I@yRmrQW36^qs zWEBe910=LX#2cZ23L`Zc{f4}`TXrUT9~F)=#Qtw0#n z@eoCO`NJLEZX=1gpip&s*>QTgHkRgEkn>RGd{VthL0gB5LIF8yn zot!k%W8*eH1A>RD=U*rI3?hqD*9wt6lz%&$8K3+yD|WZa3p2!?d7 z@-Z?=+cRI@y=j4e=XjmAnJpeKbahGGS*g^|C>X*@MLedEr+vE?aXjnjTun(I1?XL_ifqz3CqZ<1M{``IWt#zhvXK5yOWYly6f5o z>JdRQ>={_iDH?wN)Sk%OU3hH-2~~ZXRp`hq%N_JX{SqG0?N}Cu!naN!UB(>~a66i% z&4V^nk&Lmwn!L7L^d48t#lt0MzO>Va`Ha5{tnbUtB35SJqm<7x7o4ab43zfk@R_sD zRHZg8*5*-WLibO_heE1`jC1*8f7){v#5!vOarx{YFtqAJ{z$4nynLqSxAKV}yq4rL zJp~!e+EXGf7mOe)i>6mq9m$AU4(W+o*E5VnzN&^K@G)^;{&iDOR+`?m?#iu9!RKxg zJ0cpom4o@RM{*gdXH&b-5=h$)lz?~J;{ErpMW96COShZ4JN>Lk)%SDlk%NR*W+OSE3H$tp$&{IuOILWV0&HU{c+*U#6(6oc`*+(QR3;2X>u^x@w?v0y1lF{^26nW~dY;`{SVW-FVcfxSABa5~Rhf{ikN@^S%L+`iryma65 z&zDNwiD%DW7*ZF>guP^y^pdnN)OvgKtT?6EkObi;kyBB`K_El5WVhBdot_Fu_otY} zwww0shb^alxyq-;&V<@D#iK3+?fQPWCGNDdJJDdo z1p_O_Tkr@yLf7n;Xkb4ZOkL11v2q zexoPn@474Y!Jy)iZ}Qb+N{uo^w7gEv-F53Dr=@O9Drm^Z02U(ZEhd|ni9= zlg3MfdXb;2Ced-iq$>Fez*6B?!Gh#7)fxq}!u9cTc96%@5sSoQFcgAHM?U@Xr{SMQ zEPbVCqNTYTz(U8)lv+C$A>dazeeoL+8FxVg;HpTsbtXe-{A~OyG|}j{JTNCh86<1& z@9#m$UtFKmuJnaW$p?TxA7l2YsZFPhV`#MFLBSlTOAtj2m0^6xF3eib1Ga+R($ z-GkRG8jwW|X)kzN?*6yL7?ut(6$bD6Qqz(`C+eBT*`4qIyY|8_&HY55x^4~}F4C78 zR_-`|Ad;ioDOXo`kPm;GIX$@ZLC0l1`)09P+y%QsGa6P-%3kmAo8XRp{XxXdZl+pn zQm=^r0YwgN=DW7AmpS-BO)vTdQLTJ4Wi-E>Z7gVpB(}zyRHNFwjo2?k>!hNl`fsd> zKA$y0KjW9M#`WN;#;bB$!TW;k?{#F}!_#aO&RfWBk!~sxQVzL`kpS7)xel!v=VbyHi1{^!9~*r z##a!cL{8Fe)jV<$g>pq1=WllBxk{`J9kcp#14#a-`ecpGQd-=3zuJsu2SE_nOdcvf zK4d;Vc^%xt{>X+&y#&ZTD6o-(zWk}n4P46XKvvOl`QRtLsh+iGfIG57~i z#!BC>TEXFiPhwH{*v^M9XghCys8)z4WdYO?vH=TbpN;J9Xt^l$FBcoNan)RQH9dI{wC|zmZsd?g? z-RglYQ?Gkz?bNqy;Qa^T4;r%1>P)cCPCRS&m!tG#9MT|RVNH8v>q)U}J6_rL3n z92MkDMR91Jc_5qoJ`KAXOD_CvkLw)PaLRr)=-5 zHrl*Y-B=V1YhM`z{Wc_x;j>VUhFb* z)g?-zl&&1sFC#nrD61f_AITp^UI8!no$TA=8~iCuxK%5()~mT`-7(EJgxifoCS3Z! zmX5=_gj~O1`Eu&Hh>QXauQwWm3BCz$B2l03ev2Kd;1=1Qa;5WPA76&Q)aD9$V%ZTi zDOb1V+`2sI_$axnNNr?{zuy8^t5UY?SgPT-M2qLF{uwnvj>BDP1(&&S3(iT;u*OaYQ_S;#zBpej4Ttxi@HVTadpkhP&>k`8lfU z5r(!KLMh^fLODSC`H2n&bL+r7*I=luJ8C%pvBLWFBue+i#@v($nieyh>1BTz7e=Y5 zDeVXNG1k`M7`9!iRO_q6|{9FV#p}(iQsV0rq8xjyW0*N8W`dFa*Kc(SJS zB;ah2CLh?mm5{N7P-cw#j9YXal&@|7RLJ6t6BEV3R)5GeI^D0IkX`KFC*D0ZF}@A0 z*6{nQv68IA$bvr!;|D${K!^O1{HFJe1+zQ?bAl8$4FhdDK!7JX;)JG1Lkzw$sI8XI zg7v;2I4T%f1D8 z2FSPxe0jMG`7=q!-Zp$OP=zLD8&6jaM;&0Gn+bL7Dn?o^J>mkCR;3S^-rBah39E*= zmoj?X)s3J;ZZEMU2@&m-XyoVr#RG6@38XjlQpd#>k}f=aA_X>Wn4 zSc&j52J~>9W6y!c4amGX$sCco+Tyl961MHh2dinsLGN2+I+Rg%;@s;rPMZU@jpIal zLA37vX zdnc8L;jxc9*4S;HmsX<(^gSpq5uyCG_Z1Z`5*zl20u0bbW}AKN9txIu^^W++@v5nI zfg9n=eMTZV-<^@`A+Ar6D~$)Sx8|fW9+CHNoaF6|qoSV6JMozdf#**ql=n4OJJ zMMaB@ffR^dZv}zd7BY0>ZxE>XX4fvP4Xj(bTtyeWZCDL><}K&~T$c}33q1veS! zhkt&CZ86tnNIim1P++f6r|ptCxkAoFteD)Bu7uW-q0E$*HZyCTssARriFRt)n;P~$ zpe*Hl2LOI1rhRr2nxTnMqT))PD@23o!nE|yjDsSR)CL@-aIcn}_cTo(dlkWb_mRaS zg(3{pQ?Geu5q!9S5P1V18@*#IG zA)v}+8>6P~ZD>#k&gm;eXL-#sF(bJO_zjfG?FtKmKV+t3!t^{D{)g_jP#R;}_c+XX zwOW|mK+<<`rU1)5$)HB)+~AE}ub@|mi%^`hC%MG~EKf*-6(28{OJ&-kF&sEa!oRgT ziuj;rUzKigJx_|sH0BA-huj{#t$XgH3eaP253M1E{Ie$N=QqPrw4|F2ik)9*ve&L; z8B+PP0UH2Zt5NP~q?boy>5`tEgd<7xa{`vQ{)>a2uPAYXap5tKi)1GflB9meayGKnTWd=K=zChM2)Xzw`I*5yeIB3zGpyD9f?pu@=S)I z{DWif1?S^5An~;T=BYFTu@Obqt6X<$P$FB_QT*-0 z>hopru8Lqz2#|$o2tJ{K!`z9y+~W7~7oX`BJt)*O8SzjtU?A#$tyeQQ(U7-?L;b>r%T4RzVO zO-hK19lCu~f@2D`@#U?I)@Ei%n+p2)fm&^APEa8SG;Aq~)lf(>(PPR;aS@lroahND za#G?~Hi_aW#RDP>I07r$F~|u0yAfMuKjx1?|61gQg86(@#TeBFa@nc(Z=Bo`Wo@*w zQwl29_ED<$bkSM0$S|YvhdZ`{zs}mrA@zmR@>ZojRPl#ljl@=lWpR^_rI50JZk;lb z0Ar=}j4xK~y{YF810cuL@5Eq`qgV~7#nJMN2$+LUSAFS(DF)elu|TW_v-Dr~*Dk45 z$<@aSW5@>qFTAjQ$r!_ZN2WSXgT#cPsKb?)-aAfuFByJbvd6pv$non4awDFE7z|Ua z69g@=G;>$;?$>?3*x(p#Zgl;o8M)V!k9-4Kn8Rz?#-!Y^$=wn0IYzo0$pl2LRhPuJ z=~!N7PT?O z3;js=P}pir;V{~Xo>-$7?xpQLsJR&Ic$C>ZXZyCIFr-80Q|?ojpgn!O=67C%ENR8p z%Aw5-6H0jN0Lx_WLt%p1r~_(zFDWDqfmXs3XGG19>_pIPFDNZp>NHp3$cu|;;;``| zu90wEabnPw`q($5q0}m=Gr7wF5&pY?ozLq-xRaCma>B({Yh#Z5`f6X~?x4&r`5rgn z{jRtGo^zQX-aQ!!q7k1WMUp~1UEp2<1Ik8p9u8K!#9hQY3gZ$qyHlXW6W$>d$rAPp zY;!`hBs$*3C&;c@ni#4)){YeNr#y-RMnIo9d?{5?q$u>4Z_1Px6%<)+uEV5-P4HQg z3r@`B_*&>h{qThk=FEDiWjtA1faL`1n@%DnN^V1n14>_SHNWx%26tb@RZyRXu1YE0 znL3uSttTMZ8Dh-R_HNLN2&;K+->h&*MlzZ-t1|c=9+Y=4QD4mP$m=n@H? z9RZzf%o4Usd8g-mBajhszKf}+w14dTdk`@nnK=l%Gehe(=^Md3e&IzE+OkSC^tdEZ ztx;gT3fb~aW=Wc|2AENy>VBz?w!@;>ut__nBViaJ8!b$pvi%y~prLTm%6h*!KDb2y zGT*2TKd5a|Iu65MSaON4fQOf(Fxh-Y*vBeZ#|V}@#x`x_od2cEQzB-TwIBd+R0|0y z$-!c@8W@OX5**c_80^I?NF;q9cj!4Z$nZGM4ICfvRKb$V-|~bfxF=lr)p1wJY71Wn zjVXDDSO2v8q}~3o5vX}NcsFntZaq?B@mV`+_CRA_!lEg3%xt>Ejqqy6UvC z?r!FzmkSl&20IWXzP8;-sWfjfY8LQ@_Z;|cR&z%ke!F7)Ue%Vi+Q zf1urkXKN4$xubt6S)!P;k##WfiPux=NZ{4_}RMqTZ(9Ux<+0EJ)l_DD33V)Wn$Ll!)oKs5LDcc0!F29_7}h>Wz1bD;3mXAyD0;a8i382p&W2=NtyJEM{-g4WD#$U1_jJmbiH( zMI4}a(HgUwo1)uu$jAwFu_k_Afi^NkKqSA;l=9E?4Kx8KG@cl?(=+>NQ!f^2D~;O1 zy^P1&PS#qJo6C=S*nN9Sm|J7UD&ySum)W5ic}Be7yh@IK&gQRD(EUiGbeI>#-BVbn zNW0l1Kz;hHHLk{=5hCLwfh7X%CYap*rzz)Dp}7P3k(w~bGknX?+$(wH0)%C$yJhp6 zpYe+{hrY$HGW_gn{EDfe(?0%8rihH*DuTuy(X;b5yjS7$$c_wyT-cmI{&CO_rj*8> zpaJ7>&I0umEC`#V?EPB}N&cD4--n4c`aja|rJfkb{m&X`fN0c9M=^h42Vn=H}e1cM|1NoRd&r3&)P5C|~bPHv8OMhGB8FiJ14mzZ#F0))rH$&_!`Yfw4 zEO&TD7+7RSrb($tAC)et=q4HcIL$4tS=d`%35*lR|cXp3FL8vu-Ku^TaG*Y3+j$03oKeXO&99>>8JA;D&A5Qnc4!|>CP_H&?CBnaE>IlmR^i;ing zYTw{pt8u?{pVXh)pf`Nbh7xIehj5iF}+ira&#k<_8KSBxkfrIJ__@NAdxN)+v-kY zFY!A1^Nxa5*`I3o8>*>#{iwQ?$xnPr>hk2lGdj)hWoIUtbm$Z6Wju0>6d&!9KWnD3 zaLUgIpB9n!LF8`Xtr}Yt)oL3<)Jc3`#68>Zsq>wdy4o` z6MvT)M23ynLWb4P*(a0gTs@P<>>#xFKF&WEX-CGWs(cHLo*YFnPGCFqIlSG3vPn@J zN)~-`xuM0e^2OPNocInwkWdSWO_!`g-Po^ZH%-|;@xPyCa!WPP^^i`+nAOQMlP&uN z=^{Hnc`C#58~5{qBEfNgZ7#}E`qQh>nh|I2qi0yOAdCH6BHwNkEmjrAahh!^Cuu^D zFg&i{@Xn6N8{i)=dZpm6pgB|=pm^Fj|~!md96Rm zCCMlk2!guBBOTixAux)9hUjuMDTRttQ4*CBUH?l^Z7%R71w&D}Jah zAth8wCVcHE*@e$p7x4w=UWO!Er|>1_5|QdjRwR=m3Epw$%sEGSNED1KXNHua)Tn8T zn@IpHyuqSpcHwIY`)2k^qMd|1EXZJqh{BasQ4(`_pxDg{QQ(MqZ7Q%`WqsL=!_ zfcxJobs)QF)-{+}HZNfbx=USnKQ z&1B};{VS3@fnczwQezC&^;O+V1V8{$jU7cG)_`GW67<8&qh4w9$t!-h?VIFREeHee zuqq-pm}att2{xanwER854FfyfAq-$`IKUjHtSi+02XAst{yA9p+j7rshIPb<-x9sE^nf)p)*A9{lYfWd=2M7?pqLNDD z(R)scGjLAIysyF5KQwb6OSI2agNFSiKz%jkafRB`=s--WwuOhiF?Liq0epcc485-n zK2lhXz4}?Z+O|mW)w@o|$_yE=kWYHgZ3Y#%yFsI*_y zN$Jiba2R(nBUb{Od&szM33BsH!m+9N7$S7o#Mt<2oeLKYjE~$oq4Ab?BjEkIK=Pcd zV&RK^2WKnKLpRI)3fv1FBDqiMihRiWMTwT8>1HWtXB9_dmE@l-Ks$5k^n}5@gFMgy zwYN;V87*k<%&wlxFSTP8(9wKmWqv}&5q*^{?iabQLa2s|sbC)a334R>%qWp{WKCMV znV0)#jx&!r%tu>*1Q-l_v^uBvjBk(q>uV2kZyq<4^t>`QlSU#@h(~Ci5zKGUv~6m7 zOP`y&r$dx(5WPQXyC*b#QF@l2G_)=ZSzdzM(qw%HL8?g3ujAGd*GH20I*^JyHG)!J?vr!tRH{9dn)u-oD0q@C2IQ?zWP5!hd4LE%8L5~O z5I*Ju-R2`t#ytUvNNs_ydeq4`7H7k{<_OzNZ+lzy!uIKqpxV^xw;~*p((?t^FLHgu z(zljFQeP$HVH7hyfAPl?9B14-Zr1^$)||=&F*~=*sODVC=qhQf4%zd!PdFWm@^|wmm)$6< z2r5T}(iFPuX{3ww4Q`9xKVO|9&TDl<>cx{JUpA48uyzmDuUy0j(yIylF|)+(D3^#MGHV!;dhvMgeH59pTDkrN*T$OiC6Qy*Fi`$T7#A+Ev`N5+7=I;Yd_$$YLIoj23x^MlJRO;Z z5AAHQg9P}d$drC92t-xh%&~e?GL}otFPb!opC@wYqgYt6@JY*vkDZ7M^DqCjvbk6a z<{p5j9HO=lbEQZBx_BoiwpmP;^RN|1yi6ay1 zDzN>rp}q}&rz=`>69fykyoqW9i-P(EQ;+nWiQ!a@CfTrFURjH>tQx$Hf{bBr-l>FCI(#g#Tq5 zu2GdCI(4-Tg072@;~qFCZhC?ntuY6?q*wCcWDEhYWX;SN$Nf0LRBGVNvpMK3AXRtZ z+OdQqGBMd205g* zwJO3n<;851A8db6kghDub@^9O_!ZQlAD=9A3Z(|A(C4c(#QUs>F{-Nfn`%kHHDQ`h zkSPL)(gwBuxLPJp8rJ9{q>ZucVSAC=mOk43v2D*A5g@H9T0hQ+uevXAs?YUNN!^Bk z3z6eysr=e9T5Lf?7(5qp>x?~NQ6rgZVbLCGQBf1BnAV*n3?M^%rdn*)Wn5wgm1a~% zy^#(f-P=h=m++(93zHhCG!=2#$*>o+svJ4<%`&~U0g8AN?ihw3itqi z`IXDb{7g?LTl9$fq}_%X;&r-k58V`a86&lC-M|5NQi|$~`<;g<5Nv09vjwE{@K?QE z#ek0F92ZmcmzGFaeJp|@A6`EMCT$R-F8iS6I+%$W3+emO_K`qJ329U)htW>KH zqV|!PV?j4&ZDQIW;<1?{DA%jb(Xk_-svG$xd9|P23vG+0F7z6Vg0^lEr#^AX7bSya zlB*vmO+p9FF_Sw;7F_J0OcMtRVQ|f^uP2TDuPie#YE7wlj##ChFobTIRtiTmTW3Md z23WtlTirf=^dR4~{DK0|>eBayxk1{AQR_n4TCnn@&i{SZY@>2@h>fc4ZPYkJ%q{ z$=K$_RzV;2m-u?z{uF!q#4g!nNFHk_Cuq)JC40zecXhr)mUp0IKQ#IQo=#-4KQu;F zS>fy& zt;^)0!UvtuMe5+JiSCKgl1b!o3ti{^+1iS`!UXIItzQD(2jg&FMTVN{9~RyKB9CN& z67?M3QW;TWZJ1jgBE27m-2ek(%*Gl4q)R#zKoHJWFSRrTUkKa^h$OVdh^be|hE<3l z_tX#G!aXZA30!@#Wi8VWI~ex=gR4*%gZ)eh8!0*=INwsb+B+s zu@K;*_<6Z>OhW4w4v!dM0r@dq^*GT1 zB_@bpH_FefZ-0)qeERQSsn=_mS-faLTOJ1;ZC3X?#0a7+W;!RKmp>1!j&t|B``BM2 zulWT#iO&y!VKSZ+$&YdJghPHT@kn0o4~ii;CUErd3dhtj3W**d>|s_-iqfIs1J!on zDgVo1*>)||LAyfC8w|2~k*UBQWA-Zympv;bn7r_g-y!LcpXm4d<&>kM4M33LVw{qy zmhA9J8GoU#O>?Y?`Tnp@EyHC&c<;;V(apz!Eu~cgGBBrv%&+s*BwLVPr~T8GwcYSz zbb$KQF3XRD-AtWh)Gn>Q)*)F(sMcitXu6`}HKOhK^cpxz&#tKUp;1fVOU^@f_40a> z_oe;sj1G&q{6SIby1}R#!`6!8zcE#tS!7YdGl*@Y8ED zg!+&G-nI=}IbL|WP+Ha_+7|*rX&kFdzirn9Wfx4Ae zpDeuWi}(bo8cGUYc*5wrx_vcveJi6JZ7%76+CM+^mDz)&`btGYF@<&6lfiZw)9FHo zjF~`YkVpm?#D#J=6To(*=7fD`F|_8X^VZ{QxJYuJ3N-af*%x*YLrN}QFCaHUy9ue& z>BB3_VO={zZQ^EB4!@SR)HLqSbeL%pM!G_b)%td=`nf<(cE4yhe8>sHCF%MaqH1FS z{f;7uE=rD=Le8GTCnp-eWDE?iVw!6Q(Q*3Ma z`Gh!hu_*G6*pz=sa;4ujxAQ4b+BLV!?F%2dB~>|+YP_>L^|lLch`Y|yUOxQ(`oE;~ z0u*-zirp6ks#8={RHn(bqOt&Jftk`&CLRP&MyYm&Z zID4Ca){lOD2HPw2H19JV8mp^~wv%theu*=Dr#_#z?>V=+y)WCVy_l~7>^;?&7_yI#BFb5N3bNPCopH8kv+i($aP?Ep^1WgM~!Id{wGgB=hLesQXg`MXTEo9TqXf*YS ziUnoU!5Ngndo^%QkOj7kw5@gO^Zw#1o{|&&*ofM&9+jF=I%f8z8RJu3^n#susTT}E{+SD7_&7ivcc7@36La3zM_u^_HBuBbW}1*!DklP-dG>6 zPsn6+KHpDgw+>UM8~wCL`zIm_V6PH7gQhjyvpRLvB#y%#u~bI9V>Bxk5z$sh6mvmA z84rGV)xT1it00bsgqDN7I<-_${y8C;y$p>Afga2t=Kty_So~M$1m7{_U6LLT!`?mM zFP#vW9t^(nd<_2J0+!bZMCMpSfcpkz?VmX&Z*op=>3jiNTi^8h1}MoN0Az3p=&CYb zUt!OMV=)0^&eD8^VUj&byIcxtQ}&zFh@tTur69DPaeMIxUo9xXK7hixCjw-wg6N0AM z&(Gh->(0DIrTg`(G1-qCFcce7sW|XRhB=%b7#xX$NnzWC*X0Pz5u-mX3*`kWc34KJ zs0nhCEvy|-U<^WG5$vjJ+9iQ=BHdevx#3SZUCEeWvI3ndc=#fsi3QcUKxsV7Qnbif zWT-r>#Vb~x(-Y$2Ej#&mVIixf0tq(!ufh{?rU7Tc`KMRDB(mxrpr?C(tzj(44|kx6 zI(O(Ex7Ufp&N{;Nk;u1EFsM93s#rn`wBZv{t=s?K@zC~G+PGzsa0KxyBnixpf+jm% zr{TpRa)i#?>8RIRI3*du5ewtoGTK#De_W&0uTp#x8yI_m(u2`ElxixMOZJ5#7s(a1 zfIL!Fm`;SM+lRbCRdo{w!= zM3J$;Wgl1{ee81^rtk~v)u_Wk8|qtYWZk~U31?|kk<&IayphAEg@PvEJk%;29ZyEA z!s2L5G(LC6qRUT8V(n(h%&wGJuGa~yt3OYTa;Gd0fXgkaw0?5lRGBye)KN(@R;J9A zDcw-;*y--vEBb~SI^J$wJ^4}mnVr@Qjnr+}YX<|$5|X~ zSy>$EKeBdhKUNccwaJNcuchj^QupT0s7r>a&izJ-HO$wMI~{W=<)SQyLLN#9i}cr)cyE z2!~TMP|iXP8BD^%xSRYJk*tXu4#s8szHw$5`c7UK&W|5KY29?Y4~u)U67dV7!Z>N; zYA9PVI$xS%-KDVt3+^-q;BQm8okeT=7HA)2Hl-~me`$;b+e9VcE zB9mXKtwvJ^m7w)blDLNKc(eC-7|@Qa+-1_`K0WH~K|4}5lj|WQ0%3ehQ9Vd14-s3r zQJjj6y|TiSv;HC%93a+1talV~6^Gp+t1CeGT2$(VJ>p&fnkSbNYGghg%|2h0WisN} zTA3aDLM6=<5?iq(5r=e>sm_tWZx(%7U|)f*Vo8!|x$!ING5PhJ?w<{87GTWSQBnrc zWp*qkl_@vtEdAZxgkBgcwXManAv=$q)0=H-fI!ZXUHuSO$IRcsoV8q;nD*VSB<}~rYB}>8 zzd&8T^yxF=lM8s=pLX@PGC<6mUKII953GLahse&e#G5NJ{th%)R$V}*gYbD@=tR}; z`})kV77e9UUA=eiuS!~9mr1p1FR{T-CP1Ay7od%C3j*DgL;%u}L;JZ4e)lLP1)Xtc zByUU@I~l|gWMARVg8h{?irC%G?gQkFPDPU=#Jf6={nBF5&9*1v74V{?F9PX^hp0RB zfx~$;K(ZLP#7tTrA+|Pk#bE^dnT2jxMbfYS#`O`1h4O(67`74ikN1J_5%!-%Fzv|R zA~I6734%At_*dt3ABA$ICB#Lvm!5V5GjH>vT{EAA4F+;4av z`n9Y31fHto5}#uvh=7mr(szrGcZ?5J|5Oovue-V@j?H+5O=7TG67GlAA5CkXe^9;ExT{ecglXLj+!$8FKHXLj@B&Dm#f%lp!o-@9}xw97i=8@#h&S7m$-Fu*CKXB{!{5d>-=a%wq&fq9R|El}*Ld~d@#nPP7{O};%XbT_XH0AWyJq0)cMAD!-8uHK7U_;U0jg4*^0vQj?|~_d^cOWnq_PCq^4gEd8ey+P0C(V84BV zn$9_qFuk!+gHjzV4g-#K;kePOs9eZZjDVa&9HsGHhTn^?oF=nH5Vxl+zd?0r z0pSWG_dbNa;gjcKC2O0s0k{ouTw|GE?eBx~6nBR)3aNuhlH+ zsybtDv?<^CnI)dKzo?novs^TT4xo0;1CM{|%E~zeE`(`Z<|fYY8&@VtYXxBy>lxY0 ze**~HHCYL>qQFeu3JCM)k>mBP3wW*4nh6M!uf|_OS1gSPeM95w({v|PIlo?|6?;=( zZDfn$*X;Ha2o-7?zbB`CCKUFobVMCB4|m&j`%ld1Kl41e{8EO@Qx2chVh=UeV+~*g zLM%}%Am+_CjPojb-e}y_q*7YDp+jcz0d=kkqh=Wzdgn^V^;M0{i3z{9R~C9mU&FZ_ zk%L+rU0U7d-8OSn^&?PPvj7eL~sB^77mwHUbXcNVS;(78BH;%@bj?fD(EJN{Gp`u^)u z={80(x_myUF1@Eq)9XQKT;*pCAAHEiLzAzanW(LsPN;f4_s@xgJV&Y$L8G1(rYY@FMjN}Kr+RIO7@f3=G)0U!pGHzXQ`qJq_7z)-?rY}d>O|FRjDK8^ zLna|gP1~3X`yQ|{t?OzUs$Ob)SB3f!PmFl2D`!x%eA4d^n0!PkIcJKCxae^B8zqY+?N^#6p_E#QX#VAO4q;2@6w0fN)spgQTk7@i2}0s9|O3p2Mc8FKhw4}JP_M&ci@B|6W_u-F$n9o4J0K< z2G}=F7~lH`!t@u`c?LQy{ti+kjgbiiy6uG)l2bE<+8YfGsHK}Y(}qNW?f3-~{QvKQo=9^FPc022Pcpm$uy zs7}5Z$P=(>zokHx+mJ>;z8TPMNK+uR-+}Ybf>3_v)N&a_@mtfm24eOt5N&}FzdCwqW-$Rt| zAdmmuRtq60?|<;@HhmmW3$Sl|_v8BJTGDS*@ifIJSmGp2GlVt~LQtjual4Jx2p|fR z`mMyir%Xej2ZczxA%lZTyCsA`Z^I-5P5qB+-BwQrI`KV?57Yk@B-ub0zBRa9pzq)L z#Nh=!_!d6-L0Q1RZ_4>MN(lRZeCRYrT~L*@x;I#)q`3%$wt7)e=I`*2q(J|dtRn@` z|7Ao*1$6CuN-|y0_ir0gW6 zIOH~@B+&f-4a{tX9@-||ZTx=&si0xsA!MY3zJB{i%?7pljs>^?l=EA|Qw+-dEjW~c ze*90U0wwz2Q@PJe!w8(TasPka{jLSY{=OKl2^9W2Hk@`)*6*iXsSnhS=D!>1zW{ZF z`2L)@+Qrw=eKF%jaMR{qL0Quj;NY;@qV7OBV7`YPoyR>jh=70&RQ?-Q2mJeL7ba&g zrGO)9gvx{`<{^b5B@!egWr7~?k4!R6jFvTD7!MvU(Z1a2T-9Du*VV3c3kWCjhgGjy z(bn0tZfRB5xi;3Y(Yc(s^}h8^l1(IHY54rSz5m=C?7Hpsp5^wWust1OIw zq;PmcoC12mwGk^>FhaJh83554xw*|p-daZzlWS)4SPKb}04%zVJ3LN0#g4#{Ws(He?(bF-1^!dpXBn%I5evbDKA%-_~m zv{p^4$I)r+D)(Vd0XSZO=9Xi##Fn$5{_QP{xo~R*-?=F=%$K|84&~C7sQvzS5ILj& z*$VOS0P%L>I^i3zV#gOhzC?M20-H6-+^F(eKd!C@d%5NM znh$>}VpYm2+g1_(I7=kN!rQrd{Uok-u_B&IL5;?&8RD&`2QZL7NhdhQs;+nARWS+2S9OeNbyH*>a-xNZ9J#k@u=Jxqz@=3I(CfX1hA?SB>&Y=maLq`p8Bc@zdCH{ z>CN8W;}^bjXrHvONxIIDS2$FDhoCK&1;0V;eT=}QzpTG+fBn#`=H_OkxYp>9X6scd zWD#Snh3D87W7&~8!#*ZASC2=RQo4s&5HDCy(yfiEq3#t2%CPM$1nunBIk{3-dXM`*vWToIYnCOp3SEZq~W3JwP!p;IL~Ij zFMP?m@w6z=^icK>g!rpC_TXT%{lT6m@zVChdYOOSEK-&Oab4(=5os)5BdDockOcf2Tbi9!lMm!d=2#?^lN2z zB^^{-$iQUg<|UjH(8`vpnAA23TcuQ!UMl|k;;#du?LDf4BAr~ySHI388@Ha#oSQ43 z3cv|hr5p+@&`#|`F=rFjY@>6TMCd2@uW6if8t!e=IgN93+GD0shy`YwjG6F~xgRVB z7?ZLj8zzzN8+LPat~8 zr3&?7F4sDt-GbMAa;O^edeB;G7~b$sOnk#kd>1&1ZG~634F%tN;=D4vUdw}etQBh2 zy+@;KmYmz-unL2+APD$5qWrV@>vU0|Qci)|WgZ_eskd;UxUoH`J;n89ybZF;RzL|! zj^|c>(F536dCbrZKToZh0BgpK>$SG7pSyw%4apF^1v64|A7IK znuAeO(5%J7XEN9H;2X@}XEExC>!+r##%fg83R9v(%}y{o9S77(PL7$%lrn-AO{>4e z{25^S;MLyH{X{6;UKgaFPjLQV0>GNpH_b$Y#iug=K|cy-6azf)wD?!o3ieI+G}4E6D? zs#2u@tGPPVMfAEvyWzgKC!3(1cmjAAarhXsn3VqXzJ#9DaR>*jhgMrgBLHJU3jF-h zzcI(KYV(?|G8Fl3sXh`p>N~uk4^e=*v^}^2QCvzpQ%-JM$;69+Sn&L~=WhcntrXmc zI_J4QCc9bKxF3`CpNLJr>EA`l{=vOayu*5F%97cCwMwv73vOearJw!-4p}#RnA>=L zAjsj5Pkr0JYmyd&`cb^SIS;^b%|bv{ethAHS7g9k#4q|sodOE5ouhc5Vzk!twKK63 zv-`Ue8sp~H@;63DLj!pI-kjpYI45KPd(#k81YcqX62En_XAve<4ME;i&!TGp!F>cw zgSyT_y0T7JWqD3>x4Q)EcUZu-&r7{IhcJ)2jFAIRYkUU@Q4)tuc zw62!Kg@9!;3*5{Rt>BeA!PY->1xCV_X6n8Pb+3eV)6871S+NM4tn-SW^eQR~l&(`Y24y16x#}Qc1 zD<@~*y!`v@bRZVvvQq4rtpV4CC)A+RKfH`r;!wNbvRN2t^N6)_6tgGb%3!b=^f72P z5*vbQZ{AWVJYB%1YT39+d2i%77^AFZP=gC3rAaXgPJf8$6IcLLW}Ww+0U5v2OM{%B zRfE#*VXCj$mRpX^mPM3m8U5U)-RNP%ppNl?e0U{6T43Ywcuw}zbSv(ygI0fQW2!de zX{k}$Cj>I`i5%A2E5xC-pfuzQ<6}Nv(Jec<*~ecSsa<;Z%q&AV>|y)gJ#`sF0}Ble zc?If6C}Z^d#q9!kEGyJBYC%`L2;$Q0r3j3ZiR# zT4(HobTFa4ADuP^D5~(bEni#bTiM7+@PjtVNJ5Q&9q0o5&RExYei;S*(~V2g_`@FL zy9M6YxqW^4cd2!fw3HgzRi_oU0=!-4bQTLYd4S9d(WFwd!GBxS11w&-?~XR&z1#Ea#uJy`0gT_L zW{S{YG!31AbaPR;UgAzE3(p^m%}~J4N2#rKaJr8VaCQ(R^m?|xF`kjfO1CeEI;BMW zm9<>y4ajp2j>%7yw7VAes*0Vbw%?X}^&PU1b6JxaaD3PdOr)C&SddgBPAva&q$k(1 zJpGiiDlA+&v)hL7DT+4ukt}D=`b5(x)oQJb^1I3h;N+QAhwXEZByzkXm?i54m8&QC=+_be#f;Sh^Od8QQ(0189y2tZ0lg?xoGkOcG2n!~+58?}6!ZxgX zxv!`^zlj3ln!^2L|4}-#%k0Sjz^S5|*^va>>N4i}_^F_f&#`u)b-NzIwKKUp|I8nB zdkSd`kaqyfOV@{8)M_|9n)7s$F;-#OX~;?2J&3PQY3Xc$UtCSA-`Dn3wH|)Iv*3T)QsW0`&LWxE4w0e zrUQ(BE0{$lpQ%vbG+vMe8Jy&a;P6a=hH74tIeUysRXwW(0f_$9h|a1@-K0T$MjA)} z-Ufg1rhLS69Hn&1VG;87ovxX%hgw}T56J4}kJ{V-p^ZL}PcVe? zl-J+!1Oe*U(Svep``yuWKP`XrBh@R%RG-YgVdQ*L2VL)m3Jv`c6tp*%OzY)R z2B`C$Jkx)Qoc@FRD1+;2Dy*2CDk04R$Y}-#?7fA9o-C3D0C3)VulO`KX>9};pN5QD zvd9RZ*7g)kYql>D*`#FmM2WqpkVw~fd8v2RewAg{)DqimZu( z1kw*?G}Dxt?*(ZB5e1HMjx2`EunLT*mv*^jbyVqZ!X|IlC3()!2&XchL$Bp%;E&H zSm@-ad3}8bXLn^Ug0Np~%`}Y!SR97CPZsm7eDLsB5?#lW)HHhNz;cQ|8pw`QNfI13Oe{hRK$j6Dp3`5v zyw6ai+;B@OA7$yJj2OQeli_!7fb*ZbM4cRl(W_<^&7cee#mBB6JWY+))W6j{w))!< zl*>+Im5s+X7ncwfsTNv}T9vRoK#`@nS!Hf1qG;W?sOPQ(Zq9ve%!gkCt)9_19;17 z-5b{73==4(5S&6eRWK~DjH@`k*JAD61Ow@HOkDKHPL%kBZ%ULI=t3>g;ytv3VWv45TWl7FrD#`vY$bQ|tMMNsZbZqUt-v(zjv_QtS~ZVBWU_Iwb;H`&)PHtzHvA zC2V+`wAsKhfahzXX0eDV1&!2odw{5ZzN1&kmUxZknZmJ4Ul(Guy2i4$=k?9d$NzKbqNi8Ju{z`~pG3#NIfw$u@Qu_t z`NiA=kC>Ukp*^k!Xq+?)ZTBgcN$HzzY7#1R*VE;))zW|n3dq;@-7Wq?_ZXYbM!4)d;UL3-2)hwWI2}%mKU*aS7+t!<#z(@Xx))GqB}) z8A|bq_6r-Xsw0*^P4a{N#Gpuc`?-)()CSN0`AtR*~pjd{HLtRLYaM&rW4RcD? z#wy#9N(B1Y%B+{cL2viAYps*gr*++4&M~!mv%VgKftcz(?|DYZpv+_Ashz;cWSAk{ z*r^RQYbv!;Faue+ETlNe`LA;X@QR#G_Nbj^vM9b?Hav=c>1SQd$amph$?MGI;GXV6 z75-^Wfz-4MXd1e5-!kcLph!Xcdr%_HL5s=g)UIXXs|CYplFg!r4j^vC#oQY(vhsbJ zsoV$dg!ws@73d^*b*Fd61k5?Ly1Q(mH=KcHkru4pyjk<=H`+1J^U{d; zQeGgBh*AG1b$H!Ni`0c2c2YN~aC~x+bU%u!M^YuHBf#)r=LyuM=i;(U-x*ujj?^_r5MBZ2>odHquI# z*P%9b^a`W0h>q=i>ZSh}Y<^&2AmW^Xa0uJA{``oSFnv-|m;VX1WgGq;^gULTa5QyX1 zGKA{cT!0sQKWA_7MX+ZS>)R+)*H;SI0g9b9(?eu=Zb51%;um2`=mjBpRw8_vo~JBs zJ}17rnD4}G&MB(xJdcTZD^%E{_vst_n*oEK>v(*Rx}}k`A2iuejyYxtu~P@;xghx+ z)yo#|2pnD08#uUsFH^@ycd?S<7kF86ncs|G>+^6YEI|#a`4DAWgtlQduTy$-0rT#< zCz8^C5IhKxKnmSFvV#5=lUlQ6Z$xa!>SdW(Qdm)dn#XRWSE-|jA$oM_)cSfQZ=gLt z`sin8MHc<5h+S0zFPwdt-w?!Ya!B4Dg=w2z-5ZXSBoioB-XrZ&x3pY022h76GD)bT z;%KL`Go`#JQ~hweH`@jgX|jn`1#}{!MdfTD+f~%2U>f(RW8VWg$8=4qV8AttIKW@j zX8qHJZZrO9E-USBnBOK+IS{Ptv*R5ttk9-f)1_b6HJa1gnBWx083n$A8c}XZso0AA zVsQznVP}@EE4Q%8mYuwFBv7kWanFQwlSjAc$Ew*`VriRKs*}tU{qfJMj2>h>ziR(&R#kpKFn{O#WP=_kfV zG1;a5hYA2!mP=(?Zjtz$th0OJOFpf9y{mMa@#{|>G$A_2UJa&0w1x11(7`(;loQE^ zylM*B0nO7UBTjhMFO9qAD8SbrY1K2Ug?hxfP0kG0B)%F1WCj=dwv#<6jn1(6T}jFi zlr4sZHTC6rY zZbkxh{K90@A&^$hcEDDTGhziz{sa_m3QC{)XU^qg0{pBaKgF#hA+zBxBSKkt5A-bN(rqULu zsmpk0C7ase5G=bUw-B01_Osq-OIt~Yf2ml1!S@p|IrFudLCvbk(=I7}8TU>GA%j+? z$lJ8w$M~nj0EJ(AAO3QFFL8e0o32IDqP&@3Z9@qPxCOTHP{iJr(sIR!zR5}-Xsc)J zm7`eX(~SOC_zv)}WZG6RdjR?(t1}%uVqT>OzgjL{?*cORML;jr;#5N1(ze6Gg zpp!*{9vI2?;Z=!F@BpLARM*8M)4dD}nf<{SlTn!9rbhx@>FgB56_$d#7`6qhF<%KU z2!t}99UzV)5vagOQ;k|isxDcF!qBgrfCCiZ_hR%G-Js?&l()LPxstn&gGh@jNpbPjWbAs0fgGV#?38H zbEzOK*a7A^X!joZU(5xzU6OBZ%OGWtjV!yUwo}Sw_lT@OAf=J@BHmp+IbJ3Pix?x2 z@zf6%^w>3o?FWp0%C^4NKDd_pPN~fNv3iaYsE)AMkIxGl|MZVM^YZZqe*A4xS%_hU z_m0~6jO8|`6T}YW2Wd9PMHwV71JUT3%pU^3b`G$;3x1+6J}K1xYVU_hq#eZm$o0g& zw=b4mn-wWW-0*+C##&pxmL}L3Wfdyp%bVlPsa-iY;!%CC{yGNcuT?(z-~IHd5EXO8 zxy4uU_B#*MA#ih&V*#m@8}wa`UAzOXdMed($OA9NtN1=&F!*?dGg68*@&t_sxOED| zITyg|%UKxY8O8gicNBxj~%rUdpMFElCRxuq5V*)aj^$|S`(%DbpLYg2bT1ZC?aUP!yG zzj|e&hWZHUQc1a-YpYKH&C*H<41%j)J_PBiCIau=6lRm~c42j!l65U0xG>EN_K_eAB+ZN)$FN+7`-r9@K45s>aA>deIFkT`fqfG9=XsjupQXzW z{L2fFOM(Q6Y5WDVL!1moLK;otZ4EJx&cu9U?iUu2eB%)B;YsIg@&z1RDIb7eRuA;K z1kU6f~C?AbIYV1v<+eq}Kqp4pQg z-Y`T*CV|kGGEe@#e%L28{V|7oV!u3$dx>sQPERiLHd)y{m0?nSD(80DBj=9vVKnCw zCoVY=%DG>NQXjC=4n&HyB2<8s9L)oUaDsv*|2lyav}EXvP#KQJ@dL5utTFE&Ab!Mt z((67zH;)zvWSPG-lq(7o$;k6-<-6ekotXy60%Zn*sV#5ao*@RK((k;0ZR~%@y;|Lo ziNMc#Bz^%F%%tjc`XW{!N3F_l$R((fd?mIvgD}*-XYDZ-mq@q1&e9odpY^Je|_(UJ{BGgQ*`$)Hu0L`~H zlNIL1;(vE?;O}oOMLv`K`Ifyg|0;ImEl&m|_kd$4m@MzbHBFPSy@@F?p+Xlf%<^3C za-S$LTjM`}>cs$_8SWfxrZ$fR!a`3Y2SvV^nEbs}dA9?5i1va|S=@zxj2gmleYX&g zrd}goo)h>#>;(jP`Wdcpa_fJiLmk0Q2qUwlwTVNSg?JjgNkE%{_tEkLMOm>*_)zi( zDw0NxGy7p&zMVR7yLl^N`v zKSToT{6E1UV;t*&p_dQdrBT6Iy^-2-2p91l{U_ZsCvsH#H!az{tq}4=?$@cc%tV_XJ~CMZh1; z2H|od=BxmvKm|_30U0ZhG(&j05ELC`BDS=QxUt04{0zZiGW{i2WXz>nu4VN@$pU8y2H6%y;tT-0K62#j zptS=OirM#=^^FIOZ~AL;BK!3s75qIC>dxj3PfL>Ph8tYpH$}!um(pzeGyH=TQ7nE5 zGKtzZz8GI#q*-b|2cZFstoif}u7On~`7ug`-~hppK&P)C^KQe!89BewMU>| zP4Z_5*1@3PT}arTit71-N||g!i?1Jt94B$DLs}*58rTYE9 zuKj~~&M>dRJh{_Y&WRme@D&R02d2RR*`Vz#DfD2v&x3}cFqxS$Sr*%I! zT$hfmp0yLyGHY@QrCnOQo=9Y1Tf{b)t6VG9OQnysLt3>{R;(|Z;nge9OMaq}m1}=CPa5hHA?uRJyjKaeoTi*+B>af_lKZKd8Nd7KDgKX-)3`pM zt&t&8WK2iKGh?VBI2riEd&m2kZ494HFntyFl;gjaE=j?bk*z7f8h)FHv%{@N!!y4U zn*n08tn5SDwW(cdU0fMiQ%rE1ZfGMD$|Vfx<@uJO)JaP%TSMQovOptlbMmN`s^ zl*hbEQuGWl$7Jico&t^3WhQ+~%t(-C=@8B8#Rgir)8kG(TiQFRwaE_KPAlHP{_C;UCF%E5CCU4Rl@0hl`#hQ@`Q_{E^9Nn%TT4<5*uG>N8oOoY z)>aK2>s4@B&i1nd+8(Xnks1O!$-Gxfj&yXiJG4no+7Js6tP~Ai*TpA8EYo;2vpqlEcE71Ax4tTfK7b0 z>wz+2_epQYy-!CfMvHb#p5|yPuf(Jaoasx^6bA85qm+3#0rMBv+_Kg3ZL-DU$eePd zd+VcBvwG?ad@XUBQlf6QALX7~EC?fE;YJ+-VBsKYis$a48ly}5Fp?TkXmp`f5}OWi zr}z@Vdy{Nv)DtE7Ee*uRzgHTZzw8r0>Z)H*)vG_% zdb|DKp1ucr8^?l|bVzmNK5Z+-C6xw#-uKc$M-7+JoH#tvAl*($9*M zC#O66LJZ7}y11#hmlMt2}Oe!y`1ld|e*T{_=X>z`FH5 zoqPKqdJgv!twpR%q#8O8Sr`hri?_0jXW5xyT4)mSb(muV7sihXmKKUp<|)SEe+ym?sm6=jL(GhKt4 zZYP?K}TI_e?CMi`$~BtLyLWA6HW%*#Em%ksoAI>k|0MK z#KEMIk4~py^|fPAa9?UD_R)fP5H309BqGanLex3^!v||sT~uJUs>ITF;qXl@<2+-t zwoaS3bImbA-9v8&Ebe}!QHVN6r@u&O$vr6Z;D{ihV?lw<*kh?=qGws!D|XaHxQ$Zg zK#Jrv`9{MKitLT>&Dczp#@2`mQK>S)Ch?B+D^(Q71fx2Zip521W@b^*({}3Euf@v! z^r2>quJU^P{rKX#$=>Pttj(BGO-)o7Gw>YjALKc*ShymPaw4zonXn^n-xjSZ*Ee1f zTSDwHMf_o&dlOUQ-(ACrPuMkY6La)UA&v#kFJCIrK7Ha{9LJH&Iv| zs8bdGN1h}74|%Q$|NkY=H+TPU^86P0e(C>+=V#f#|B~m$|3jW9{vYx@{(s5y)E9FD zjWj0CIgtwH>TPyvFCA$PK=Vg;cfcqOais2i z_7X`>HYt}vRON0b#yK(ZJWwIeTg5?&%KWn2| zvYYk!OG%a_0#{f8Y)|+F@jSyXR@$gIl}39>nuh%fp%*wjw(Q;gE5)^7DT3b}D(XKJ z%Hi8ltx<&?BjSE!0~`ud7hLKibHw%~zA}Oa4Yp@zLrX9}5?JUrrCXSFuNQhSj(VMQ zEk|Uwq|DUxUd4Vkqo7eVIRN3(>t>68rEduJe^`BQ?DGLB-ZoKF`TN1+Tv-M<%{)6V4T1 zYpuKCfIqp#^IACUfi9ILD_i3*8 zwoCQTrm@>koflI7xvy@{R#u-0Ur=5P^GkmqSz7TB21Irtf2)(2Y{$N$(Uy&z$QxX>sI>a3b0 zX}=|ap10i)$Dj>d3Ag(R3f47^j*6nbof|rWvadf11Jr8V#t7-`X#CUetZb@313$Pc2t5bZvo7HugVsP-J`h=C4@)?-fL%&$dToTdw1E$0y$ z$7*Q{_#Z)XeOU^fHdXOI|p0!7!Xtm2V#K z*Wx?7e4<4)K%})F(nC;Qg-K==jU zCWkMjtn|8u%iBg8Ta5yZST2Kb!3y|LVi?Fy@RdQi+lzw6qE|fNgb(z*yr;f?m|GD2 z%F$RnmfHk6`}_7{ht951Q#%5MuMW0hBt+tjvSemFFs5uuv|>N|fu1)b6mE+{8Q@%b zXZgY0qY$Ax)AtZM^yA~pg;mH3XD@U#ee=gny@e*sx~7%ij!4p4hO6+Sxi>U@Ww2b8 z4Dd}vzqA37CD?4*%qDdDU6FmW6!_v{7<33$k2{ZP-@T-jIy5)h)i59$GX#}G*IlI!0Hxw=jZr`ZJWv{SZG(x0LI z6f`RRsT0z^V*b;y>@RmFBq>S>d|3{xjR2FyyCR8$z7&Uqsd8H2Wu_>XG$9l1vcA8 z6hfNC>RS&Ow7r9CZdTn=vdRt6^hZY*nn+QZN?AW&&m!BQXj}FB{MgH#4dfU^Y!rs4 zqCCnl@`fc@eM^uMX5VI78zxnpA$A2~5rjkBY$Q13@>?RFL@c89xkeC(cC2W#(eP$v z?robh2JF>f@G_k-^yRJVU#?bGULwyb{Lh#b7XNm(f74O(@9h|uy6b^v;oN4&VhLj` z$h{lQ#~nGP6R=~WU(A&k7+4=|Foe+}a*jdh`TpT7R5SJ2R(AZ1*qJ54V2K7SO&ZNG ziuag|a#**EhZJi~QD-i7$<8ztX+AZ5wKLo$Y2O4BZA&JWiSJXi3@{V&8T#vQ7xLyuHQAXCUN^&1E~~^8C*@M{(rdM#Z`SSF3RP zf<;B0L(DgWzW&t(IE6E3zW|gWu;A+DjvdlZ7o7Pp7h?DecJS~K;HYIj2@msvXP+P$ z@o)32LaZ*(CN~fQ*1ck#COy%SGI;3d%i`;evF$ZS(y3nDPf!weGWKatL|N%wGRK0* z>&RZ}~jZXyqghrU=QV^hGBUK9Ot>V?G04LJ%2);++IiKuO+XCbKm!}SDTej$4Y z+BbfNifCaI$D|YZm?76S+_DdRZthHG@EQVZ?QqJirM=quNq8u{)2gcCs1zGeUzOcC z!YL4*dw_MiFeg1y6nJSiV~7w>?TAjZ&MGFlD($bcMM?i;RcQfnAXdV03~6o3ZyNr8 zD+tMSNSd0?XA_R6>Fpe?%dXFY|KWBz^zzeoB3)7-N6hDO0i$L2OUtj^^N_5Q;fURI z@NcN^qeKsMnSxaPxw@6_!iSyy;ZjH`wTdMA$6NXVcJTShYe!0x+#JwID2E)e4~XmB^r&YWi489_^nPLX-q zREs&#JQF-JeR`&BXR5q5l{ah7U=GgF2EiP3`W zUxn1wnAy_cuT0H(Sm0}(zFvJSCDXoiS9iSKBVcKBSk+af?UEYn7L@l_*=KeYt%-!| zaEP8(aVV*JcC&!*U&d7TuIT>|=Ua-|v0spxKy~O*d`y8x3xU@;tLN4E_Z=NKxM}P# zmKi)mQ3$1y)sdsB`M39I*>2v!jjVbzp z`Dik#-V`Ih#aK6K8r%s5eQ=bGO_9R6^5C^#q$~bYQdw;I2XQW&YhNBQaixxWAA+-6 zX1&udjo&y_y65^yD}CQXD->CfvGr%*0m?lt0VGZUW9tpDmVuYa+CL z@5-oNcG6teZavic5LeJ-Rpp%1b~!DO+voSEtfIVj@0ff!T{~+3VMu+=#j(v^2eQF4 zIKs+xP)_qzCd?=#hL+3Ziw(DtftlM^DYDhu&zBZn-C?g%eC7{vIQ$;Fx*NU39SMb~ zU0+uy{mle&gM~S-^s#2lb`qA5+LO%hxTlM{Z%-@zUA%-0jkjsBSO=rfhdtqd(u!`! zVnD;KcU&61h!*(Gu$i;#jf6h@t>e)kZtCa+aNMQwqW|-cJ}MG7fq49t6#`|&3}NHI zDqJ;cK$@IpbT^GpD(ueW9f8+vgXPP}@N zMEz34-5wn>f8Ir*-Lys+XfFXEkOsUqCM(S3!nTP8xvx@{e{w^cdSS#xjAUJNVL2VC z^_!%(39;wpjqodMRD`e!z90y*$gR``tZN6^-3vh^r?Nzh&cs(%8Kic;41!l zY!VvYDq`t*Pesp|q9zcwW-(>wz8JtJiusu;`OaKO!qlA* z$-4ZF4okRKctP`&28@Q#Mlykj-&J{4OZ$!@Of6P7-NNE33DyNJ8t=4kDwA?QU%9## z2P=>+9UPZ!Af)wVJ)ym&bNytKuQ*Y-Z+d3{%dz`N)cn)fGDS5U+7(uK!xpBRwqBO$ z)u{^0eRYve$RQ9LhJ%sv;i?&hUbEj5FST3xYAjwYm0jRNLd@o3~H zO;=<}E854YZ-^8{6v+sXJ3j_6*al8tzI$qq^DzbG%>$ps1_>#ru@y0tH>Rd0}G74%vszKx+uvR7D*X(W)uOIYQesGA|sF9)MONGVsdFj^pa3yctlxY_6VvKC7dHvITm|4|}1N6kz4UxGr7D|^Y@=a=W&eZVi3cG_-C9M)0<1{}E zr%$&s>#8bY9-daw#6HjWR#F0`yy(Ulx?jsy-MbAoOv3pU>NGY&KnHMB!{rEsp&(AG z@y3y_c9w2xZr^`tLJtalsO`9L5d}ko7P~@V?+G8JC?H(cG0G?`Z0aM3O^({WawFH&$j7_cS!-;{sz-9#adkK zcszQ~NKLVG_G{6)b;V_mk$-DoK9B6B3S1aD>~Uitzer9%~V^yz~BJ2%&bbO-f9 ztj1v$c>sMbwo={wxgDZ6)AJ75=a!XAEy#Yp>p(o$ZYdfzwUe zP(z7V?B4^PKdebicGO|G%Y?fU^FQWxt|4G=>*)g~jO9^=bBEAtB^7>2kqi1FLWTnc0~&L2%xRtT% z>k{wx@`9c~SU_^_3Gpo4pN2sdp@!=5SH*2pdFNh6YY`4qu2jD6Ub~csx3C0F;Bneo0(u- znB%6m5QSGywZ6ypte8QLg_2<|n` zT2%Qp9rWzsnwuT%zPgh9w`=geX8vp;kkDBHvpLTihfpF#zd+nev(SHWf>1Q^>$}c77h*d6ip$v8JEX> z(Wq^)+0#^De?aC@Mw7MrvugPe*z zlWAb6&le>h_m38ffH0Sg&h0=32+g)0mw8i=eMkE)!Er!LEjG!0U~Z_cYoaoC7kPkG zf;Y*`U}UJNt}FdF{MfaEUMY3q*9FB?jT&ju12S*$^jsa1F|v+VbU)!)A^PUaP$S%Z zpo^l;_is0O9nVTgX$n2Ng9fg#^hfopm`6^H8$Gr)jXn{)HH*o&2T=8oz;j1}>i-XP zhvC%^U-$sskqQG;RQL+BCBtyB87Cs(miZ4%+Xmx>DTGpRRK(D5!%b0Lt*peW5#S$7 zZUZ9qEfGrvG{Vy2BIm{7%!e3!ez9uiD%!21GiuFRP+@h?4~ALbn2~UnECqnQf6NTF z9LRz#x>V4*R^dV==0_&lrQ0kb)+J$Ak#)AC1#AuDSAKi2DDDeJ# z9(z3C3vnn$Pm?Z-hm!AVTp3SI_RBI8juoBl)A^$wCHgZ6*iuck_1-CJ%M&pr0&=+y zI^iMrQ+)43sge{uZ{_qeDMud|=wzmkQ_{U-iCRs<(XA?Am*bk$IUA41wr4=R6xtw4 z+uS{N%s#!s@_1<1G%_6CDQ;*xIw9}P3mhhW>{#m8Pd`a;#t2Cs$qpY>kR~(R5%rW7 z$GO}PJ|l@4+Kr!4w+&LYW0IR|yg-2!6~!ed)c64JzBd@0i745Ls5TCN$>*DlAqkog z>J)>VJw+h2v(D@wu>_H&J`O%!e z9n~&OtUc#KmKYU6R#5fcMKbGn8uD{JJ-}#0K~GqXyecZ8MX~N78Z@-MG^e@#tk-B5 za6hNlXl>AwP+RAF#SexgsmP&{x2i4fVSKX5-x!<1I8=2^>DF zt`V75r%ZZ2D}pe)I|}vH`>&lOz~bR(o$b%q`f2MivQc588`hGy%D1eX0HG4;X0ZL= z3h(`_nj08=m`y27-~7zLz4MB@iwS)B=LCAi`2Bpe>0_b5EGUERyb|!||5@ds&I==+t*vY{g-SJ| zEt_S>=pX3HD3?}1g%s5V*@McZji#|+D~wTd{893G_P;WH;9s@?sPdVh@GT0^-8UQCLT9OdqMpwg?|ZjtWgORN&+-O){UHd2DL@AelU z+nlVgaygG=P;)JBA*pGW`Pj_gH_s`-F87;%$nTpK6~-Z-Wfukd<+E6{f!F%v2MYCM z;}9ZAsp>!H>KR|DAM}(9|1yY%i9#2^0``)T-6I)#Yvyw0>rn_6>wtjWA~B6FgpsI zi!$(IQvPgWN!&Md>KqbJr%Y*Kmz7 z`5W3CCd>KrQFh&*AkUOnH6J1`2+D7*SbtMz$6>6Q-xnQ#?YGH{@s}zGWZtwJa{qy> zmhF)%XJYg4f9Bd$IDDS7n1=;WIdZg4s&1>1j?ig5wyW6ipYRBQ}7Vmio*vu9^I>=Rhj*{y5?8nS8Mv(sZ0e(BC+8Wa&~*)GARlONGGA z?CcC;>!#|u8swAfUA(gSe<)oJ=*uHMwpy(OFud4-O3CCBHWXRis?%3o-n zg1$%AaNNf=Hs|NSc+m|F`b*xcj;8%%WkM3uAh6{X{j-15*?A$&)z+EauJjjU5%Pni ze`br4ljZ|fPO)(Hu$qha&NA)NxV29_`LaCi*urA#zVH9lb&R=iFo4c_4L~iGKuQ8L zkZV7J>%uL;Qu0!JljGrpaJtGCJb1FV9riyk4xk1o%YJ*TWgPtYwp0NjxL{ME=G*pW zO~*l*){op#bhPaYv#Puz{`aB!%W3F%fx@Gfrqm>Pq%(GD5^vEku!&54C?7(ESi(Yn&m0bfmYG`?2=i7gAL$(;98A9sQpnn{M zwsv7_VOJj@eO8&>e8AV3-CacprTL!YE3s2fyoQ*gVnLp|Zy0i(g&vwM*>I&&w{Gc3 zt?dAv`aO<;5EYYPbH(4CSTi{GLrVFvWAo*^#Bh44qpLgaQ@)uagW@iwupV8tO2BHr zzg)R_e{^%D>&4^3!b-GF=|{KBW1r|+H_DqF9Z%9W_fu9y_+bB5aNbI^v6HA zrnNR}=Ull#{~ws|sP6bPJv^>=wMsutoB*x!`i^zTqMg0F8N<8X$1)%9&ZP5aLLG5U z6tXB#$BHoEAs;x4@RVMd8-19r!m1`An8Mhanmn^#LHHV$lVkDnDL-Rvopja%`VA1@ zB$#(7?jA1j7K-gkn*8VQ1X!GF3tRM`eVZz)b+WZb^ddTZ&eUAd;-(!cYson!xv$CJ z{Ic|V8fQM%NG1#XUVGu}&c;;WAlxxHIXI{jR44L&G&Oe!6dcX$o%f6xkUKqF;o#o? z=CU2frkr*AZ%NK>{9+_l;Dxz^#R70&yfsKyQh#p1GF>u~zwh+vD}EoQ_+xm()%P@7 z{$BHLQWmH1rt2RBdMlG*rqtd#oJLl;E%_(N`R5|xK?$#CX)S}j?o(1$N?~%cAlN)o*k|Jj8x@W)*r%4lGjkM;v=|sXA2y5!;69EhRMp2EWne z?olb$LuV_biW?4?m5GJh9_ohhJm@?s>*l&AR;n! zULk_X7vL_S_b_56@a|S*_8|P?AsA`Q@@(!?jmB%g|6|3tIaq;C(2Gu+WgeEl5inl6 zJumhp<>gkR6KTlF9GZ;ZFFCl}je>d63s32gG8c<=Z~hv%A3Un^%y4Vx8Q+ zG4H`l@@}R)>orp&s#G^2V!yAr<$Wm?+fENir2N9-! zYQl)hATpfPS1?_yo;5uT#ii=$GxcSY7ri(b^}{X^z?P(v6t)Lue<)N2qYxgn?9%&Q zsY6YCH)DsJ#pG9OCm{Z*DRyjjk4S}A_?SYQx+P+V7jEt$X>OJl?#GJe$;M-)SK4>v z$(b(P*a){JPwg_xDQG8rcf?%qdlfZABz*yDTHruMMEeRJ*oPd8hb<=OJQp#Z-BJ*L zKsuQky1P*Id36JH&uBmpEGurYbgll@)Bi@re0=8zu%*+&>J-hAS>k@JC$X%1`L*RUt$z!VL`3TX4#$mM!9?76Fv74y(=L@Q>iU$#Q1HVH#p~OEEB@W zLSRCto*X-l+CM)@p8ft=-4e#cgK_as5G~}Z@m?8uHVGKGUE}>M5!VwkeOkTP9mDnX z@%w{}MAE5Il!n8nFa^65%LlQVJW|o#>Tr#)kBniEY#csrs(A!) z)qB4SgG$27+}>;d^9NB+<3alJbx@grlyD_j23R^Mnr2bDyPFPf`R0ME-ibKYT>C_3 zn19B;SxOGrkE^90N#lL{T9Tcp_}Ypy?6n9nGVDGw92grT^5mU6u=fj%jd^>OT3v4a z)u2n^2E>x2yEBff+^SIfgw&Ox_|lQoTA!l4CXwBir9MjP^NwG=>yjAKAu}tC(6D0@ z^PrB@balv@bTAlJrdPV&*(P5z%g%y|TLGOSeQpZ$`=u1=Z_mDEBC>^1EPa{}UiQU>sUez0PI6IC>TJ^&*f*DcU~7N+7mWk6dWxN9D+`tZo8A%905; z@o6dG=rthj!>1p{!pa4eP|m8W)fub5P>dGS$a2Bf_LQ5T{(UT8jtrpd_tO>JDPEQ$$$ zyXUyD_X^%0&-w`yfYvfV27jv880CZo{sxpi`d+cT$y^?kH;N6#m#A*rtS$ZaWK12d zRW4_U`E})!Uc6Bew|V>6@B5y6YIphUTR~<*3E!Y)LpEC(( z5&Ar~2D8uP09%Oj-W{VpTDrayr3pOQX5oJSlkTs0^)69*gH$ix9j&}CW;1WsLChLqo2-!sp*HHk1!DAq}Gojome|LsgQ`5F~Ii<^%qYWZ{Wl zD|?wKQrn?z^NU{j)_bD$e| z)7z!BHonNf4h11o1RUWK=gK*21VVy3^Ax}lvZe!yg5t{qYj?l6! z;h{|^kI${P&LE3c#C;Mei*1#E?lXx*%t*F~doxjH1P9GFxob467%XZ8NMks3j>ImD z;qOVbc?FXw_or+MH5dbi_00uDJxGJ$yBS2&-OlsB+ta9~vL|Jl=Pdxzm>}}5%laMZ z-srrF(mq4RnKS=}Eh7`bfoF8n;-I|JBnxp!uU-ez$h9}wNOc7KD~OYoYXXaCa7-k- znc&6cOGvVq{ysFb!;FKgvD~`TQJhAOaBn7aOexV?xUTS7I2u zEAh2CVji@SUYNTJOk$uGfj#Si0|s;Pvj-(JFGNH;j@0y&a!R4(Li7HBJ*T8$?c;Mj zXop43Y>CHVIk$FLO&9~0yS*n9g3Tu_?CT^2zP<4&hBSvd%dW|>6S>U5b=y|(_CoZV z8d+CTT_Y(DAB1zC{PZTpz^p@1N``w_fw&G&dgr~rVNbgiErBTNP92D!K$G8>JD z!DvWqDW+?d-o@4DV_S#6S~P&gB*|4y@5PX3W2>M+cb3#CqkyGkJ!Kz(8+DS{=K^0p z7J%=pUv8m}4*W?F(QB2b=tZ6tfotnd3XV=oTdVz*$6-#UhKN4S~lOq#^?^#-^QTfzmMX z3z8xW*S$6mt(vhk-)E7ab?W=H^aI6>kVm8-l7;zZ!3mN}uHOh9S80(&t5j_=7e!Ob zeGtLOept)4qcP^n(}q)U-Ajg8e;pW_(A zff?9qi6{YDIHIRHMrH>XcJ5Sz@2#cQO;0|#YKOxedj>VtPtX*Yl1OCEBMjf(UT$5@ z?)QY_ak-KVuF|Pk`^;pOf{KXzoxOq*GA^FTyR*`)@1<|3WtCKYA{-vUh{fREfcc?qdXHx;0>i$VL3(b8R;R6?q{o>iJAI^1E+iII(CB`;^ z)bNe&)`2j&Me+pLj+rN<(hI8JXIUDyVvA``m&$(}TQRq26gg3>sp=s+2AYQo1NL7A zbV4$E(V-g|q`BmK8FmlAbV*}xWT1i%!X>-3{A)?4U zcOzLGXmOJL(W8fuQVfnfVWU!12%_r~;>_5nS5h!7p_>!p3UFlWiCPFU^_E+=%YZIL zP8S31))T=2e|yfRe-R7 zHWf74y=i?Ifam+N%XE=-@v(@xuz6a+E#$o9Iou1Uz1Rg2U&=JUqRsv#@%+fX%aAtd zWjlHF#J87vsXh!yD@8K%!=C+z)qfGBzYzb1iSo>g;xgh0*+TaY(P~Z7rZ=iSCg%`{ zaPeyj{VdkOgcPj5CIaOT5Cq|>y{Ob=&AOMi{a)=DN-45b6-0P7k*{o}{p?8IEIsPx zyOFzSue9b^7h?E$UF7`&J>=l+FX*Cl)>~70$)&`gAa|&1`@rJD{pp*Jsz=ld=-Yi^ zW$BjTWK@IXpaUZb4j3lAw92=MdB&_sz?VWK8Y2%O@oE?8I;Ptah!87?sc}%f#wq1@ zB`Hl<%sthvs4eAXct#99@&1%Nf4k(j^mudFRuaiJ=K+hOv6VYnh!I@?gRqqP5mFN--=fZg2+hL5hiSl|)>Vle09^C@~>C}gJE#wzL-WAz#%}IFA??+%X z^6d)c4S$Qe@DS|@r#ob8Z@oX{GE)652|pUZpt@5E3-~+?Y)et%{bNxa2Er-dv?u$N z21VaWwPW)lm!2}LduN7bu8npH-$d<)fvELs#%oXjGwG1ipc%DdZvW+AhnKQnP}tz3 zmo{Om7A<_TBZWDTzpuO#Pe3Udi&5uV5uVflR%1cGc8vfXlv9e-;6&U&`FQeny~5nL z$+RAj6vP33l6NVWkpVYx{Z#+xUnVXk+6Aa#>1kjY)rd=B!*^_d;^)WW5!g23SJOta z*{0%G$`0~0DeqU{nAYer%P#V)XA4CC~%8F8h%yB+u?S3=jN>gODRk*HvbL zUVU}qo#$5(TYQ=eue$AA;abF2ky<2EyPP9FKAxxsGlgeEyC}_a;)L?wm5gH*}yul;^V95ouMQDo91(-xe4uafCV#j9FWh1-F=FJmu=jIMX!7PZ`ON zy!Zh4MThY+snVURT2sZEnBB+{6=39Magq8-M}MV~Oh*hlgVIA4;iRV%L=D+$=-pgz zTcIumOsegVbZ8C~OLmmfiTB=t?u`~M176W6O?>sZIxqDEFG$QcmxY%^aqitRkr-`h z4Nf7RE>MfvH2XkVyA-!l9CYwy|AuWk!WIBgSJIg8cPwU^_x=;t_*(G-yJ1ToBdr!T z8gC?-+pzx8S6QaEWD|cV9cFUs-jtndp&ExXj^yv$EIUuYNq4=DtWjP8zrgQYS`n(j zu}-01;>STLLeHeeNPuUttKSsKrh(=1Q@8pJ+-LiwpCeLj?m=~~W@l|5NkuBlR0SBf z7K*ROVh;0`SPy9T`Hd)Rh&}Ocb4XQG6l1Xc?B7xKXr%mfy9BMFy5N0_SmVCNI-7H+S0zvtL9-8E>+^u0U?0D}kGy774>c>_q<#)%D&5=D}dNUKS!)& zF#EqZnHkJ3GiY#q8}ssOrWc-M)gdzrj&{1627Xvg=yFOEEf=Lz; z`E#9mMQ<8s@Kk&MYpr~8?1r$4m99dE?2`od2-6UE#M)K3#u}k#G@1*7KclpenKfuwPCyY`! z(?2Gnp$~LZL}0-Y{G3VheiI`x?+C+;Nl0kz0z}msJyF`Tm*lop-(-5 z^n>zwqS;T`$cez5&NGz2?iT2)pM=$+-6+OZuh%s|vY%APZa@sq*cDb5Ri2P$tRnBO zPJxC|TK-VV^+f~{JRV9s>G!O?89Uyqc5=Y=E=S^5}ZPF_Z`dXlF zvW@`T1FixWiC9-M?WFN^JGbusNf%qCXGSOQRJ<7f=;?N>*wK2DpUttAc7nrL@F5

fCajb7%A}vXvBQ<%|v}^y(-v7m` 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 z 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νD?JL10+a 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%0AWI!6gwJc$HnP(tZpL>5&C{{8oFP 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 z z-8pBIxbb27i2@lg6Gm0~sW4TnEyRS&@$9u(9o0^?`;>nG;b!KBiV~vCxLQ+>$LTW1 z8b1Hn!HTWs1k|-G>@d@Z{3K$@=EB31bgl};axYpBW#tjSZ-_u3}!yiu%z zgf~jkkU3G%)Y)FVI<4`xB~Bze@SBm<(c&!}b#deoHp5;%>)6AIrjbPoi9L@X-FaAb_Vn&ZVf?UPHnNJSGsuC}m~TcROK7?gC! zvNAU!!{r5MdxRm}9}pREs4}>wPPVH4C>0jEyc2~2L>3}4G@$2yfwSfIH^_R{j!D3D z?D=*418T`BVSV|u)FxR&R>c|3PJ-!Vsh22=8-9!QQ`9ksQ9u=kRDiaAaECrvs|oD> zPN0OJR4Kcxz{)A7ht*Am%X;t?Qm+T|=hJ3XUGkVR_rO6hrZlY&!+kQ;2Y!~#QZ_yN zi&cjTuq{TQ2DA+_1&c)}BApz5w@7+bLHKTTt+5)--PIYd^rH_<$My!@o9tx%;!!XH zWj9?}Giy*y%E>(nyPI;#hUJB8^n1O!-s$-RI~Ay;L2K_$^?ek%$~il@KQ%5sC8!H| zp&gcYeITo(VA(T!6S1lSbuP#lQ8Uhm45x7e5T}lIM@_1tykTE>jXhmyI8wz_LpzT5FiZsJ$c2& zvSkO?SRb*{5%6|moG9kN-&5-caY%$rFABbJNP>@vzJlcmZg;3$Znz($*Wu@bG9;ii zz%6+-gU;pSQhAyAAM}XM?vt7JcOX)Q-s!|<#)nHRw9)52Yxj)Fyjf(yQhM_32Ce9opbX#DsW5W>Xd2a#f% z+r;?_MMCtbZ-LPnh|MkQJmxP#K@l@$z}QMlccK`*F~~o^^yXeeAiHTNRi0*Bz<9w2 z)wo~LziOwd$KLwQY730UTZGBEh^+XNNMEq$J6^Ee;k+?Dxz{$CJCcS@*uH|Mx>;Y; zA}<`CnEL#_v;8(2H!9G&q7ECjJN&|w#J%AT*#2Qi@m2|;Gxz#Dqwanu+ub~=1zcI! zRq^XoWUJ<1Ao?7Jo98lcM(G~46M}fbKb0ysR6agPzsCOXZFmib?uRL25eNV30WQ1> zowoA*ZOoYj0m@vT(o`!)Hg=}g^T+yTxNgHcQ^S`1k#S8p-HP*+{Ht8B`G!Jzaadg` z!T`)z^Um!nWGV;eLyjs{$q+)!6bM5~Q3Wak+M7@i9WWgW@?~>l=ICm7ZMpg$)En~l zP!&h;#SclC-050ll;nIT>k7jjh?MT}q_m_$U~UDnB%>1g!*noZS1_OY2Wy;usBm6? zLZ8^^OwuUqFyZt)BIpIy(sEFMh3&S5d;i2z-;@4#G;_FAN4=Jf%@xbPnS)l`MdInh zVtw@SJ262-Qp-XIP0stSOnpdH#OUARCa!SWCdx?tyPt^KYYmdCmGZ^K21t9( z**-A|A?XaoWW)@~etrmh#KlT0Vq3# zmP}hn8hbzP1BHFcZkj>ZAdnZ10iC>2r<@v~`^ z@j+a2l%mr(*pTOY?xPE%(q{NzN(G@VXkAIUV9|GeAB1|yg9O7aB3X1;{ZM`1N#TL=C$j(sZIcqHi=V1&n!8{kK}6I= z0W#+@swrOnJC-%$Q^4m{5%i(Pl|e}!-PDon(z=9f7@3^ zmOVupRXM%yP;bA-_ zAgeY?b&R{`PXbgb`;f_|bBU6d)X`oL`$O&DD=iFp}wvSzwJL=2Z^A# zG6p6?kQV0;I=&F~7DhD#v)lTuLbxcnP5#IwKZGMnzw{dQzszCU0fF?USET~n5tNk2@wuB|0ReK@~H zXmO`}5j)&%<*>-8V-*@4mAlfb!~(3UY|kjb<<@EFrrKxB2>!k*sI~N>U^7Fw=jz#- z9cua$h8t+8K^W!HsZa!-{7$f_Hj!tCL6RQQx#-a^hkDc>#*f4a8}9fb9Sr3lKVzgj zZB+ISvup)9j`@A|s|n%UeMxUoPtQohfa!U%j;!@JEO%rmDI0b>aPl&; z=}^|(aaG@>Fdo`cx$*`*EYZ(#sX#vCTol%(Z3<>iF?@wx_I9} z=j5x6zqK|D`91gTWqrWGeff#yJ||C)sMnIrQ!%yeOV~FciKB3xbzl#2-5*k$#05dE%?%mSI7iB>o>?CGf8Es_! zbr}aFA;kxOrWTYqVT`GT33kebD(rxlx#jKuK7=SJ`_L*oK>`aWDYjF$_0!Eq$jqs} za6dFwgGh_;R$4-#K%W;k-x2zUh7%gs#0j5Drx>NuF4UKW%x6VwWE9RqZ5jfL0YR?G zHJ&jS2g~OPlQTPE#&n2exC1L;DOoDyg?_%}2dayM04Cvg_8+D)hHVUAS*^YH z?+h7n4f1~ym`mZoqKCdybiRS+NhFgkY}GRrv&0aHh?b0#wf1xJCFCV?+EEHRE(y z<-I>WUP-gs`{pd7d^sTaQNY!ezk~dN0jJT zqb_SCR1dcZ^OP9tEXjDPagga9W!sFmWii*^Ww)j%dQ!64CDL_&mo6ZfCFm89`6fq! z>+72pe=3S2!!dj7T(4mM z%7M8@mjos5KcOe=aA8YkA^Mvx`*IEp^u>u{*v4R`(B-A z?9kjIHftZ%g2_tikTa<0bo99sR=7huhhTIHo>k|3Ym+4kJU1+kM&N?$>AN6XvRE>Z zu*xaG`Kj zm5W+fkUBR3Ci>;XfHn?OMiG=quK`NWhY+#@i+MyS43C`GqHcLvGoBQwF2Oc)ibWpa zzF(HOJmBT>%1t`|(mc)G>xHrZ9>qN1HXxMy!6k`?7$H{kY5F^?&<*rEhL+yBMT5IC zPqFbA=?Wxx_sHZu*8y%^J$%Jo8wu_Ew8gps_lk`b;3_t5q!l+0pYKA z97V|dhkLSzuE;GyKh5fgvtx6|aEd`*%K_oq@wLf;txaiGw}4jqTQnU52~6uLgI{$T z;)IdVKsoh`roa-AnoF$JObUmOV&j(xV=qHO8!cYj58F1dk6`ePMVaT2)85Yq@l*mD z*}z>6wpZw2;=e) z2+|(e^8tcdOjaj_s1=IrAzj$-gxl!TzbqaT5l%fqA9MkX-Mwv;YefmJp`s_w&nc{b zv!uB$>jI$u2JXxx*gE0p2bQB41^0Q5+v}^-@xZcJ0uzJ_^giPtxQI{72dCJal)?LC z;72ATDOm!(5hw6tfxxqre}n;jgvTkiZmdwVISlNqU8v*NChX!{_77-U{JRtinF>_) zSk#5@aY{GDtHVz-G~Df{6zwON25*zTZ#oYCo?i2wQp$FA<;~Be+_z7DkCV1uYZ@0T zVuV#&GC*qAqi%6}HGi5}6E{v6?J3$6U}eacc49-oP-K+zvDh0wm82tQgN2A_v4PcD z9uSSpZT`6Zcb&NE9+9!c43fB8%CtJQyD(5-Ikm-*Uve4`tF|2#^uA2qn!C|?+l=#u)arXn%k*(4k6bjTNOY~+z5ia^QIBFJB`Pq|%c6;fiN#5C zmQwBK(Qmk_ipwLBv;tGK7}qESpwpyp73}@k9#d6Z6_b~HW9~e|-dpnRsdlD?j- zDR)v`2Yj}0W2UqVkAFv|DCV7bTcX%3JAsVb4c1z((WwK0oWWH7-xPcPqp$}pzU-~N z(FbI?Jh_{XOegiNb-8^|g30-pAKB5_*gPR-ci!29fKEs1XS*w=fGzL1{`z#C%UAk6#fmhkO;vJVE`F+KZ6`x}@G+g7aJk}xK1hM`-@ zxWV!PG(H_moD>E2j|g&I(${L{PATjU5Y5t+Jo+vM-(RZuU0nl*tnnPrO}0g-gNRJF zXv)3~?ixMm_w*|`oc%PoaFvMV8JurzbV%I-G!V*lrS2q2F#$y{WW=L*24=5We#NTBhSfCR>2_ML3yi_(&5Qk(KXav5!`PY@#k(R}>4u@FCgdPgl{>?olKt?mZ(*jwZKi-C}UkMP5S~Bpx z7n!dp0zAh=uL~*`joj{4J|nqvu+d+|BHM+&U}6rPc|brQXIgB#ngn3)A2+>~dRH=( z_mlk{>KsVZFLE zgc02!1~eJ!Fl#?`zo_|Y_Y(9d`J;D;fSB7(xMcedz*NEw*=>Py1O3|<0$<4)-z^O# z`&jz;95;t)n+D{Zr=Zs~6Q!Jeuyu>eg->q*--&f#|Mt9iFeg;0qAcS5v)7B52;emh zVDJ?NXQbW4`{5*5HNg9UTYSlym!UVUw(i5iVu08Uao--0IoKvOywv`>$>aVTG4b$I zsS9w+P;APWz^{sdJ;PQP0ybdKo(J#j1d70mFq3%Y|#Bs`hZ=?7RHPKMoj;D zMXh1P(t4jIHeAz6&SZ7hv(qGY;c)DZ`^O>vt@N9M?LI)u9T!fW=Vj8ur6e~LeF za$4o$H7S==FseH)f@T&9x7`UGb?;tx-#p*@GXhshYBDb$NQikQhnBSAOO%C3+_4*4 zA&(lkBr9}G+sL%!(OE`a!w4;rHvigqRFC+=A&s-JT;wy*%WBs85fR7u9BQ0mQwQgmcifW(XdeVGEV8uU(`6dPp^anp;FgfM;GPL_v%vEa zKs|{$d5?8GAu;9x77spz{d8wSN)@Is2h@}SUgC?%EZZax%an~J%g9J{ROzr;VHTP9 zwJ5U6R@p+5YFA9?yVNmVt>;V0{(k?^HaaiGbxTQ)!bWtEG&q+b5*qF4<>xDh{QMb| zm|4+F3!+`eZuom=3#{e&{Z|6k6GTdWk>*aa<`Hcx2h=4p#UrA-Ud*1Yquox<2JQ<* zh95sjiHM^iX*{|9rli-q9}gCU;x+vEqi(DxX~x_f2|BJrKp9t$uvustc0Q1j)|7v= zGPKFsz#;sMT1Dp^De=)Ysk90{bV?ahu3j`OXwxw7LUMWxDPkel%3zj+H$r7vrsgs( zo2={@1Iq)|)uqsi+qxFVnNf(g-bZahqtYef(8ZwE(t_Y^`60Bvr+A3sbc{fw)Yx&1*C~%Mt47mqRn3YI z-#3d)%tQ5R#v02^2Yvy4(v!pZzL{&RQEJG6!4X|86*8!cj;>*;Yt3WI60aN3n$8bu zs-S6(*O8KbviV2sF|W)R&#|T?TG>>vM=P6FM2T(Rt{GnnmnRh*maF=)qXSLONp0HL z*DWV!k4l%Q*1Ri~8^;=9Y-$%Z{Z*sptT1E@vzj8c|JQ#94F&`R8XDxk!ckU_F?glF zSwladQ)U66EdMpn#YpKPhk*nBaZ(aN`lJ1J$hJ$AXNgQ*gf_q`68#G%Ra3@L@htFU zMi&3G*Igpo{&HN$`&xJQ4~&^*+AMZR&SwGMlkU$(y&A>@9hOpMsN+x6!}PAcQcNOWBXx}6;=GX88c^FbMK8S#bWR`|}b zu7=u%lkxKMw}v^!6)UXT=`^DSVfhGC`D5G)ttn$rLr7$d(hYW`YOvsQT2Wo2D4I z8+suZQg=Pm9dc|u5y)_$MP|Pj!PI-pFOA?aXlrJ7p+ycz4H_Rco2qA(<&`5@!%Kra zkBD$*WG4dp*VJK?;Blz?oRvdGEfe73VjyFrn4uW+g5zUCxQaH923Y`2%h@g%;quLH zhUw``E>>}c1#~&y#9tnzWD!!pcK21&1}G7Yr@C>Az4hLV2 z1Y6}fG?b{bs!em{N8!h60n8)nS?33i$7{Dx<4+{!b8>|Bx?*j3vlxb9_>f41pDN8@ zs8pLi-!F~kZ*S4d7G%QrFqdX#(njI?BP(HE*5qY%i*cBNbaV8qt*j%nm0Bd`KpkibTeE}%BZeNA(N zVr~Jk_Nb#=PL<;9S(Q1VT<1=}y@%&%`y)YLOl!$N0mu!ZyBewY|1pIeQs???)EN~c^N`X@{GPMaYLtkW` z^lzth$GMD?#TSYGFB@lNz))sNl0e4(V2wrd^ck5& z@$+R?$Yiwox=8qy5hRTI=sYvF5QF)kg+#7$YWih(vLbFCWKlYHiQfqdF_6JSho`96 zA?rZP?KfOS%BEuNMNV-c65#iCV%Y#UzohwTuX|eYo)lDRj`4Io~=BD0FjdUf& zI#bP%4^1dz`K_}{aA#yVxX#RVi(q2pc^15qj+Cjt@|WM2>ZCZiaS@*HMi&m-UJm}IXzeWcbZE~ta-DYQqSV4G6lb#mXeb*<2n^24yNWB3%RaC`tOFylB1DCFW_}vj`n~qIxsyJN@y2@182YkymrEgg zffn*B=M0U0$KUE;I5`cDD7GxlmHk8sw`5(^zJxquCtD)PJjgzF*yM3g^@2cq`4n z)F7XiZFB~#RKAO}UsJi}#Jrt7(eA*bRFV=H0oy~_=LkX}v+?7~V!&|&qUPLAVjyt> zpw@+EXR3eTz|;9(C0*{CyCaKXT^Yq-xiC6Cg9LF zfLt8F!c37kE_j~;lC2y}BbF#1=X1zzg+I}+PS0uM`OP>{tBe0k3giStp)`3-Z=zH& zmrd)fP!rMT(LGU=eSJ@n*4{KnRoKOo5X`3oy`eY(hUeW2w>Zf$##`zPcm!WV1o77N z^~Faa3#6extSd@Z5};J=3f)~LrYbCW3m3%jCTkB3OAVy#yQMN0rHcz@rcTfBYrLO4~Xh_rU^xbD&fIqa*oW_y(jmvNmvX zn)CtaD=(s-a6WI1W=Q`fnC=4sGth&R_+E!aM2iv+(u))ejwEjo4`=Xwbb!`cbufHs zt*y~^N3+Zjoh~2loAL%sBYowPPr1}$+k&M{Ws$%a=W}P8^wYrFA7Hu1bEn&N>v6W% z)#~<3J1P_b#4ja$Y)I(92YsN9iK@nan~Ps?#U0o78Dx8>@5k6}NtHG$A59D)J^Yf2 zN(+c!+RiVmz!gbgzqX!?NK%eKVH8!_Er+oRl;sDGuxe+wZD%)q`B?XsUQ*F;@(G2K z&Q72@m^S%~T_hwn^Cw323${&kg>5zIt-_;XTif2d0wD!v*z6X7u$8v^wVCpgYsdpj>5O`>>8X9R&HejpOS7=-~`Ye!^4C$tA+ zk$bhrDZyhctm9{7wKwRSNZ8~uuhcM4$kR{^prFDr8BoFrF?t(xzEiG4+d?GnvQ> zS@6t0+hlNH_$OEmXd_8>4qbfp0{9u!+X3HF?#mNounK->fuw3`m`y9u{Jr=U@dXVrIu{wU`h2&E@w|G znv+>eGUUPUkx|s3%E}&s)wzd;EeFFpvi))D2Yx|7Q(5_(`)H_irH@t2vAOiZ^Z6h6 z8~*4I6rmMBu{sB3gC~RUx^pRV>2l;}s9y*i>=1pxu0aDDD5^0RuPxV*TdC#>-p?Dx zgSdPJ-?90kv`gt@!j%`NdNLf|2- zSq)IFMMLc#lhGja#7e$mO7a_Hc`lj8V<27BU*H9E+0WM!oxL__{d-^gCMk-0LRYB))En9)OJ45tt<)7)a zwu^G9--Dbt+H)napX-OF?-p6A)_2LlY}t1)S{k#AFQuJPmn|W!xf95RcZq=}zl>*# zJBHqZ_1R`WTwj8|aZA6DZTQ8mEh2&MlJo*O%iuS-fIc;G%8EWq#O*F^K-67d%nQ~X z+a;LppIBSG^w9U~%r?Wh?Yb*-Z31B9j(t12D<(ZYNsOkFrr=EuUL4sU(8ammQbc%QWy=~!r>A^u=Annjly9Qtc z2CWa~!`}MqOyGPyYJqcAfoktmYgwhyxo7%zDL(!(c3tobk4S28tfB%EvpnKM_{e~dP529ZLJZrYrZkdt5EWa&bTHFa%$mg}?Pmx>JD`Q$ zyf7tP@G1P2ZO<=wV4-Dv*20%2d8Y$pvqrR(-3GNalf=f>b8Q|C2cLi}(`8IFL3s%<#8*3^`eU-L{lnemhur2m4ge6^Zb7$CCBC#?U ztgQ0W3ahI*7C-_ztE92Ewkn_x`oH0*0sk@K7#t@uchjFX$EfyK2LqewOy{R{e+#}R z2z(9Av~Q%^VQ5;EJ-WKFMzeYpFy2uVCQ4LfyGHM5z)zSZg>C+5dlq9%G?>|mr3j&PlA zH`vF-WD`?(l&hw?o-w6iF7#kue*^oO*dM(J*UzfV&G5`h&ZgB^zKd|BAnl2>D?1C z*()izoEhy?9KooM3`>)F{Ae^kI*BFUyfKBO{&5W1fSAq?3i-jOn8^=Lf8y3S6SKH4 zmNRk2^T-KdVASvn{7>@3qP{3JWAmATiU z0cr!$7HD{GcmU^+9f)%ge@<&<)V0R3W3#SxpE#U{ryE#g;(RQob#yzz(qknJz6QVL zYIiY$E!qgZ7UCHOE;6wMOKmr<+fgI{Xs+Ti+n*iWYPPj3{i7uRR0Efg`P8zPY!JlZ zVm#BtWw@O14v_Znkqd^c zL48#uV?7;35|;C7gC^GExr9@_)-+^<6tdi|H_88N3=3y%gtQj=^oS_9!H$vtmjTL= z<6XEOH}T;lcY1l+fAhbCT(TR8+A(Ro?j2a=ro*uc>dW z)8TD)Pukh{U8R6}%n83hnEQRj=3RI@{*t->4up&zV{7f+&2hLB?>6vPCf>tRD5Do! zM*=fYKb!i_e-BppV{sSWXW;!N{1kspeq>j0%7Znl1C@<+R?>?gu~|VIJgG~@>3Gys zp7;S1_uzxXJZCH}SWF5s=Q{uzsmBtyy%;iZpNUPJ%$WRL0nsrlUa+#XFz@u0vvW&I z=P$@FFz`UDXy064{TdFZ;(mOXx9<^_(rs+SF-zDse?Da5W0pLvX{cj)8i!BdnFc=D zD)vjy4g5_wtq=w=vVh0L;Zu0T#NYA}<3P&k{!MKB{LaK@wEU(=XYzyROng54U>QI7 zgNZMMA1r5P`J;(1;mfr5q?&92W7$>u?W-ofhOgT(M=OLi-ikSP5%jTwL;P23dJ+k5 z;#&s3e{JGBJavc3&W?v#I($K0MWDu4#cO`o#P@j3jL#BI2^jc6ml=glTr>keL^!qA z!)Ez?#3TlO+-g^}`N}%Qg&#p8>(Nh5{ET(5^i@=_Nc*daU*O+J7S)jxx884oK{)%n zIF~(?N$d)|k6)Sicl_Ei9$KPdBRh`dwsynWf9d$>S&>($?M~6(6kaia_@-#VoH+%H$a&JP zn6H+1J*z5MS;?+BT_>&0Dxy2u{A56pe`<pwG2Rpt#6((ZC(udmYSZ6Iitp##jp;J>#l)Y-67zI~ zpQaUd+4ujd@Jt3NQdvn9n__`jXvKYWDyv>sU9IR%-is8+B2$!zQqo&mafAVl@1Dn6 zWwcobJ|LEu@Q_%lvvNI0qKoX{y<(XumWvhP1f`vv`el632&Is6lEM^=Hx@9!l2#|6`ThtWY%A8ib}DDtoQnG4?2mZL9K00 zPwUd#=xIsJRIasQY}T4$ov5-*R=aY{LEK~688xN|idsuM7uf+>8;=;SK(av8nWCOS zXp_gT9OKcArdZFTQ|eoue}@6E85(1VP2otC7I}*rYic-poeWBxXNn()^GR0LHP*CL zmqf)!irSCUM$?6+*uvh6I}!(7q^-kx_F`g^!67bY&|4AKeou*$S6;gl31hyTpxRn<2KFuu0rxXWqK1 z@v*$6?s{pkx0vEqahnyZKZ9c{R{b;CP`Nz{qP3|Wjs`*6C|3N!6g$K(xf;~RdD>gj zR&=z$9zXl<5Q^67f8@-TH`dj$T+AcXY&zd5?lQzqQ`{|ng)sfUnvEmUGz?)zS~t^n zg4XQDhDNfp;>1RAFL5X&#X^F(&%}$x{Rs0{^qv+`rQH_Cj*J*%Vz+p}5PMAVAV=Wl zeSe@yCj{zeH&#^<@^~#9P9an56HV+|`)exf@b$P}1UPldf9*qYz=XeugIeX}<*|SA zWATV79uv6rDEQ;_&O%?6zoEfzB_`Q5`JE}AVb>&9yCx)`>dAM24Tg9gVPI>B znpGGG_u{dCe=x-hJl51>ZP14JV-L#4qi|tJFPq{OhLjY+VxhlI$L|dBS~zy7Pi0|E zgP*)Emv~jYVTw0dusQ=ZR*1_bp2JBlSR&prF-QE#+9tB=4e?%=p|5r*6;U@|ogqFz z$m+!~j%&t=7sZF1V?Eaesp4Z({6&0%kPs-VD9kSnf7$^$%azdF@tG+;XVx(4Xw%6u zW0v~D6n_(6l0&&Lx2T}Bv|wfFf|aw17UZ3-xeH-dud?8I1Xl|(tMZ6EHeVH;y}ygE z4e<{W?i?kY`QHLG#35e!zf4#xzGYXqu%n7waTMX??!sC19M8-u)GW%xW&7=zDUOR1 zM5SPue}J32kBhYhH1&J=EMiQaA)!?XJIfzmISrNo&CQ0Cq%5Ntwu%pPl~wCou(8}< z%S1G!17UD$wyvvd+LDufz=q^ zaLE-Ka->x^VSgtjN1O5_Nuo|Q)CHb02K*zx%;1-q?Ds6^FrT)Pcdb-{*I-(vA&@=*ihnI@8^z_O*w@{ zRBW}cZe4z$u3=Lw?vhhYIZaL{>04AdXKra>@f9z#rf2a=q~4&a;_|7yNN6V9oZ&w z81i&FT%A`z7;=6m)fLvKC(H*+Xd8lc6J4?hf5(5G<3E4kQrItD_`WPLWht9Iv4MKa zE3DwsnSU}HE;Z$uav6CH{6R`Ft#Q5f@Y_~pa5Y9-tpnl&XYBq7*kGJO9onDg(2yH_isa33rQO4l(bm6 zFj#NM^$302bYtgVciKp&U{TOAe@c_VB{!R5kUWn+I_Rp9rsL4FJl~WTaNOBZ;V)~f zbje1!#grGxA6oWaey~y3)Uo}L&o8%{@)CKe%lEVnzaNVFW<#qPwk70M@@hj~V@my5M{@fvWQhgqe+sJV{fx`C zjL3Bev%3LEdP{ZKm8V$xR*I(V+~mb|pNrqQd{);sq=77A#!0vY@!M zkPCokm9Cs!SWuK-g5Yi&;xXhct;U3j}}GUa}GARHkMV?4Sie;9L|@GSW-?HVMp z_|_Psk^&gQd9q#cepXD=rc%DUA)BWM;KI`25l&lHK5u6xRhp(^pX4_Vl zPSWSo-v*ujt*hf3PM{-|OE3=p?$V=V*(S#W8vI_vvP!J}>IC{CLuP(f9nltkvpGog^Vb z(;zL!)1e1TW>S@vDT>!$i*rgTynO99&i;Ny`0jnN^fZ~fUu$vWbLkv;jo zgQ#Akzu?eA#`fxS4`y=y{*J3PcywYLEXWG9U>j;^D=XCs1sMF5n_;KS$RcUG#qFdJ zacDzSfBjll9NL+Xv&zJEj*k4M*5ZjMZJ*KAt&?p%5!}5;g=OlJwjW+i>!AkdPFTm) zwCoefDROjho)xSrs17ucDP-rd&FBQXc8R|iu{35yAu(1}u%^<+K&+Uj^BV0wwdr!Z zW6Q$d%ODKs{6iPwKRFQ78JYeKA@&Qb>Y4tXRpwYUw|hCttZSDc?{@kT1I!5)al^Gtre;XXZ{klm*~cjJ z@sj#@d$@7z`?f8f*p%ZxQbf^}kOa4F5nUqW@5LFcbl*7*3R zwuW?*ZRW38?8RsHrXGyT?IVRroW5;ANt7|SmGRHO_@j$!TK{THiMAk}{>VqTjs{CB zIhj7y+M;&pGiPfnqb$5FMwwNu!TP#4hb_EaByVUlsyaFa|2tK;vg7H#r$Q~Bf1#j9 z0S?7pIbD%# zT4^bDpYc8D4FZHv^nF%>kVLQ62hCX(vAN@F8mm{>io~@UN5!#gV`=^$!zND%|zd64nuA0vJRl*sJn4z+Un7V?kpziYeTGvEI##i~Of6FR-BU!(X zoPu!E|Br=eQ3jtrgRaP8>f5YfGQ!LrR{D2VXt<;e$Wsxfwf*$37d4kl*jV&cwzp3^ z2(YpXZUtU=Kx%g`5i~7GkdxNN%;^o)lH2F@^asE? z|L3dJUaBKdp-DBMEoPDYe<+)EE#YGTRnU>y;;HR|tMpf5Wb5J&*fBmaZM?Z8x zZ~Z#g*f;8JOO9(Qdob;X_0%Dq+9A-Mj&8NMNeC(J%i5Q)(Qbc$f9bZn+hL@U6Fc~Y zqMjIjJxGL*{ccajLOf7Dast8`-~GphIz8fTW*Oh^$;tW?haM!NdMX}pJ!yw&ABk$vQQ%FM<`|BI#`#I)cZ>V>A`wLE;{d@#3+C3{6Y^ZOj^VQDx zH>?R()F;NM_gw0IfAxW({%oob)kh>c(=S$|o*xs!vVz zf_l-dKJVz`;10N%#(m*Ze^Xx?>MK(WQh%p$?IyAoZhfUVe>+UU8~^tdw7W+eB^~@; zYFlbJ)jtr%m#hoa*3#&q^qPF#ilH@)RaHan5ZAb&+7`&cOdP6X*EvJc4Vx1Uq1@_Q zo#bj)(mQp`iae(}N~&PCkB&se(1sv^Yp@`N0k?seMC3ir+j7EG&#T`j8V;a42b$`z zIzo4n@06+bf2t7O#qgbBs$J?nx{KvIm#OYi_a??TOumaZ)m>_*+mYBdq1oPCaypX8 za9>=rt|qvlW~e26hLR~lXc4p&hStYaFRK^nt}oy9Gu12VRkwPT9t_|I15Ncu^^#k? zM2fetrp8~FSLLg(XBRnZmAWPQz`o^kRk zn(^;+f43YI{U0D9J>xOJ5XjU)`@ncW9Hciqa!&d_h)-{Ve95g5J~Mur<{>2fb* zq~l)5N>_VfBHw1GXY7S3>C}IE`k=j#+k)T(f0_cIl7KIPBsdEOz}YYY&Ve*oNrYHM z?|pD8tRd0`AQ#rcY*-hykU5cs%+cgU-3l*cPIw{mTRhiZNEV>(DwZdUFlEf4i36{)|xgIiYm@cSEUCtg%tLp8&`3wjG2e z%iOUfTKB=3#bXJV6&WE|*#!O^l^%k14?)nY_Cuq9$Kbpihu6Umy=rU-&JV#wE!#Xm zL)%U#@g|ZHH^V@p_*J}0Ai|kYrV^DK9GU}CAm%uv7;vqjl14caQ)e0~g^1#j zg%(jn9D!l9-nNJm8rTE}imk;Q3c-{5_&hy!KRhoWM|ss@D9~K&Rm*Z5e@`^QAGblA zSB2npVrRa-ofBg}jM)S4-U+eZ7}*4W_Bx*232`|FUA@Mk)NN23HC>J)dOkWEPkSBK zgfZTj$b>P=a*XhVG4_NpJfYKm=(Hzv>In@!VJuy}v4-uW#(IPr&08K>2fBi5L4!{^v5aZxs8vO_q!lSSh4v`#x9M-{;5QL}T2k;xX z4h|FhAA#H8w*>WR8udGBJp<3fbMO}YLGR^Rv_pl^NA-mdXjc!|Ehmj%rTVG<#F^K@ z9HOsvnBI=;`P*usz2|SMRKi3MW-q8gG(r-7`_*6?q4ZAA0`mmSe=^{p0mBV7B;QcO zjzJ>*Jxaz634xEB!h)O5faz;NXJHfJj$UYbWuI0CEfe}mvr-JOIZFh0o%4?F1; z8SX^l@q;jYnb+8d19Ds;jY`Q+Z@}RL=iyRL+m0^2oMS9@#r8A0woX)4EO&y_z8#$)ZL9vxut-(E+6x zL(6qS9lBsM#{Ive@;H@c%Z4A)Fzz+Mwi9f-A#5y!e{kabh;fm*4^Jr`OO1zJA)MS| z(j~B6L=MIPOoB8_j_P4WZVGugIMej z@#uwQ8~{Tw6(-{#n2v+tEF1!Ba3}L()dO7~Y&Ax3ZUP>4AOLk!G4 z0da+of}vh(&UGMr%S2ZXslRDpRrsVbyd^ zkM}Yj-OjSNZg=X8gSdWK`k;(`xUq#s+AhKj(jJ*$;8+-h<6t;uK_;~)(8)d(C(?m9 ze}(9k9nlwqAW_Y*S3cKXxdZalX=*yH(|}y8)r>wJ;?zuLbWH=6=Xxa5!0w-GOK;Mn z&ESR@1Ds3@O%Q;ALOZu7DuK((|nuY?$yt$h;GVr)TcP^U}vY`UqaQ z7cUws(;vc%@RIZp{$wfN9wA4df5Q&c^2AK=syo@5fk=+z1!rrU(zx8Y8^5m3+Bxv?$rC-G3G(TU8!zf7M>j zR+X;`^cmi&W{X2wuW!}j#p1Xma2$h7vOWfmD7H)zVy;8-fGt*d>lmPej_?g_{7C!( z+0y4nX=O(QCx_;8at!$AS#3}Y2p^u($Y80wy^SY{TcX5`5dmbVIku~9L|kpdcD09z z9cr$16yndLrvqr-wHyJMn9e@)e>O-uh_^3e`Lhpqu-(s50=g?sAInA)8%rU)Ge?mv zau5p;&KwaF7zgN;+h1l-IJb9 zD{y%es0V>f*@@932kjC4!n^8;J0J!E>=#1>`F8K^5u<3@CNU-?f5v$eo5Z9XclxrN zq$j-YWjV=DST6LP(3haIpg@uVS}^Q{)4Yl4G9)I`BzHm|EdU7P68r5iTAf~)3W=%K zN}I%K+aXrBXL;h%4~PPQmh}|!dc2ADg0{CqxhR5ia+{@kleK8!t2gD4H%Z_1p{uvg zp{;Sa^Tg7O{bD|`e_@d2(wa z{e5U_JpH|c5FzHzF}-Hg>4^8n+ovO)TlVQlNcSe#$72<@f0(aDc}VzoHouroZ~~;m zMK!n1NfR2!w@UXWjXfYPv%3F; zx+i;+55pL5f3htbhUo6f?k>~4$({sHA`Q8chIpLY!Q+iP0&ZGGHt`GQr0j%KJkD+4 z^f-4iqd_+98-czCL5m^%DBD9!;pyY?WF8RLk{U_z#vg|9P2z@-xS5zCKF8zrcvCXH zeGZ7*>2+UkA8+4~xFe^ZH}**#9QF3w?MG@o~>ibo?-&}oN=r~hfS2@b~Y8fS>7=BJLFCoQwDH&{+ z!ASfue<{n$VF6wNXXBNy3a^5-cr{#!*T8oC8Qg(ChkNl_*o)V}LA)Lg;|=gMZihGU zCioNH44>gG@Nc{oPT+0Gzs#M4JFq|g5(na)IEqw4Cho*j@E)9u_u*8$A9L~7I2Rwl zMYspg#s`UwLm0p&tjGPh84uv4co46^hw(ame*|wP=D!;cQLiWI%~RC+4L(o2{w5y5 zPw}_-SNt9R1E0ZvtI#AB$V@FXAqe^}Fy>aTq@rFXI>D1N@u#3Lg;v!mmX${zEGK ze@4dPzhp9gD+l6HnTG$7TOW`Krdz~87pM~IXA&Q6P^Hw0C$2eFEvC1LVl+IX zmZ+uR#?x_^o;Oa;r#a44%OF{ve?#uba^;2;nG5M^g*pq8 zPcvQ)gO!TkCdfEwROhG!Fy$_C=NS70g^;9Hk{RzNB_h=-<%1OU3V2i*jp(D^B2&E_ z#?k$^Fj`e8KRr7J!_{h42_A=w?$)RP^u@XIZ#pOC63t?=TC3I(&X?h@e^nJU&}{GE zGF43@;^jwphN{uHe1U~3$e5}DI7rp1a|wgF@HbUQtt7Pp9#i!+Hd%cJMHW^t(vhjH zLkSZdgS6?ZV1WZw1L5a@v(?wCkw(P8D)psWPb)HTs`3z|nc#GsK@{OYy=0p)Y;8K$ ziV12XTbquxY7@<2xoNA3e;=&f-3+ldrOpdeO8o%b_PWo9zSbJm1z_5%xG=JcE#XzD zi^zr4*r~KIb_B&>!&f{A*(=E1X=ZPM-5%U&h>ak0^Y-JAWx#d=YG-0IS<11I4%SmN zV7=um0yM)y{!dbO^4`Fw4EPk0-Kpc`#2NU0N;7!7gm@H0Ga+tvf82$fGjdz6CU||0 z!y-fclm0mlQw+S2{%Hm}TwRZ|M$i^r2ylYNiO2bc8Zu~5GwpCnPX=3aMMeT7G!q;2 zXehKANL`AX+0pOqtW0)C&xWWr ze(%wv&N>PwpMZIWf4Z1^4KwhGIO}5a1=hR!#wO0BH+^Zg2}#YwhOW+M2e5yml_*U}8V}!K5y|3)d4*6eV*T4z$t;=D^&s2(}RABb#m@20cc2l8Pae@#*VbM$o{*%I?2j`nB{ z28d_D5YK^IJP&=u?_rGi1Dq^gfSKY&C=f5f8RC_Q-+3~4@H&#cd=QsKJkVu!xZi+9 zf@sqS6KiHEH5+7wJX0l_kU3=aRPvT=e-~zY5+>=liIdm^N|AUw4DAqvTZ3>f_PEIfR@v@MeWwBL-KnRQZHLe-x^DvY zC3;72Okz+pl{NZ{oiH>fNoFT|lEW{P^~+>_=}kJ6NgiW(^$EM#s}ISTgEE$*-!kqH zxd8fY$|17f(KC~DEe*@qivXd^;7UH8YK>b)EkZaf)^?YGwxZFvMS3t3#&v#0DRJvel3i~L9}yo;a#BlDKcQRKkr4IkKKCIj>=<#F8WPd?2-Q$y6JWQUfSXJUJ+Fw!escP< z`A>vzyy@xDmOu#aTvoIf&&#BBI*T)(9D68Zx30Pw2jdCGc$lQG)+&c{`jk9Ahb$)l zV*zdyDnm{e<DEln(JCuPONPV|$gy&?G2R$5IZEyV zr#q2jSK)MR45w?Ovb>pI<#lkf)-pn5w&5{&;!>II^fG`wt{zZ8%f4oaDKay76UM-2@TrxKo z>&lZmAXN)=b}}bxXFV3S!d&gFJ7F`Nsa<&k2E!9NrL5o-xK~%1IA|4rR=4V82yb1O zi9fdL&A3GtQlZVnYao$@6?sL|wJ0&v?FJNJxcp=o2@^Gp9nTJ53i?BWZs>7-H^g>5 zVsSi)KvGuEL>z5eZwrL%yudi0>wTxsP$RE&2Kc7zd1$4?Ugn@Dk z43!tbXn8Tow5?=EUqbTiM=)Rhn3(Y=uu5JDwel+XfxHGTmOq0_<+borc|BYuZ-ndR zO$2=#f7~Ru!wwpMx4b1%udsJEB4 z9~P@SN%u=ggDskEdBg6BY}h^8M!<+YV8OjU0`~^HmSF<8MjsN3&43bj(S&II<=+rTRdOE(Rb^-b)^SJkI9w(O`Z z!=>UpxJsN4*NO{Zhqw@Si!Jb|f4B&q6+eVOimmXTxCH(zF4g;WB^iA?V7$6t{hFMU zI`HY*y#&aDJ!-dlfY@{@+@<>ctY+>@kwL4BN}fw>N4NF%Z6jCDrpOJETc@tIVaY>mcmzCqL_e=OAU6T* zmp>4&vw6GMkRf^DlvuB!fA|{bH5`16_d4nM#gh}gPQ_QZHzp*1#97ED`D2n&S3V{$ zw~~x&yvdm%`EzppQx3xl&6CRJ$v%7J^;Wr*$Lq0=jF($_MK{|SL3t~QLT`$f{DEJ1 zQ~JmDkLw@bFR`CHBzI(bQ})QaLUPyAohQD0Ai|C{Fpx-AK)(HKe;6+2(D9!OGesdR z5cA+1vK*^L5!8xe*eDjj7O@a66KBBHViDXZO5irJn0)&sutzL~1L90LB$mN*VmbVk z&iX&ZS@17$Hk=UWV7yp~{X`iK5apUpLu9f3m3FdR?IS(%9L&=U+XoK7*}AkOg#^?; zRTD9ogDmBb)P8kw?G%MG`|M)d^En*{g4T7~LK!et;F)5k+G(}YK3!J zi0D0yoqCF}vtaxNk~L#*X2v!&V=uA8?N8WjO*{?j4SB91e;er^fTU(vZHKQr?jofW z!jLx`@^S-n4Y}NA^&!nLL~GE>3AlbW*ddh3s9Z&gMh90Bu_fd+B;8kxrT>lUQsl zDc5l@PGpgWe>s_?-gsCfCcrW=5z53VB=xc(C?=ES%OrN28d0+OkfGVaNqQz<{Z>6q zEHDt3s^6(+v{c#@kxH9%Y6)p$8ff#T+grv?uQl@7$jIk(JsS7QwJqo@h-oHdV{Fo@ zX?8{0aTsFA2Z+wcU?T0rQ82AyJ+fGySHHJ)^9^=He|T29KBHU#ttmMv!zSeW^XXte zmKnk?_sFN3`e~LvCIsKqqzHFa-JtW^~`^nE6 zQQvf!e_DG0!T6(k$%Zl2hLOZ|=jjLJJJDt5(SR050ZNJhdbwA~Ebb7QSJbOEj2s(= zJ3WL?)4$KszrSyie`*V-GzyMey+&#cz^Ps*8DPOVRlfn~*CgM6Q1m+>{{rwJ#vhQM z@imFJ1Y1HXq`zWFQznpyr_>ufm3mXXr6&`(e_p+<{sdgHo1oq$BkyDN7xkI?D;dpS z>-&GIZ`8l^{lE47f7CJh*J?F~TMiLvIU+5m-TK%O=SW}(4!3=uOfzWMbi(`FEw3Zh zF$g%M5=(;SJjdXfURE!aZb+KLzU@LtcZpxs#{h#T2) zoVxCn^hm3uX;inV+9a-J)k2b$xM|ZmN7JTPdf!KSruUW9jr+Yfv%|2vENlH-BzE7t z_ucm!zVxlvUI(y?E(K8mp8~&%04fQ!e;2d~Et1euBa!2S7xcJAsN83y3~N8Z7Yg?) zs3I(uKv~O3M2=~h(H?C)2nD`sEP$$Dp^8PQAsmaF$w+2w_nwQ9OJ+JTqz@TZWH386 z#$VcyHg4(Zh>;vmM259XdZa@h9M!Fkgc%>poZoVO%P#)tG{+|i0cNFV2sPa^f1H_X zyMo09(!_Kth+12kB`TI;8KFu~S%ziglVDILv4T)B&?&%Is%S(LYdk1rV2uatg9lWs z!fKX7DnbZ#r*tclG*Wsztqog|jGmrgZ4&x~o`{?gFfqB)9>iKas9>Fnhp?WoWj30m z=3q&d5h>?nq>t4-ESH1@Bf53Mf6TD>W{R*b6wc!vH`8oAft`b5t|5dKw5VvsM#Ad( z5D0!|@-FG&s6gJNA|f!w_F1v9Ma9DHzuJI&;{nN1D#X(LW3)p5MNj+&A zQ##>LXkPN=2(Sl7L_Qy7?jcXS4`)+x;cpMI{soAlOTnWmy3s>eI4i-}QsY^+)NY50 zr!KS??t}}s1oh*>=qCv4e~S<)f}-FQVdad|F9?@<+!;h4PAlkFaRwZ+EhWN3X5wMq zIFZPX7%4lKqN$9frQ&StO`+m}SRA`uFg~YZ0FM!tFd@5QMLF~i+F>Z{RFYyYTnjK+ z=_d;EROsE?(Z?$1v=8EO_=3%j2??+)S$(GrxS%#1+R5UR1B7h}e&Pk*cm@39`aaOFxL_YhpA+F6! zi%~l#P%|nlWSOhaHFiaaEhRQTDU9(c!pZz3nT=nfV|0tp zW4bXiY8{NnfAvg;18E={?iT~Z&!~7AHwfyWM{=$}CCC+O+Fp&D_*n(7sB?|X# z_nN8RY$74d_Zbzh?7VuY$8iPqIIUX`H>R(!0kC&(ytHeG|-hu^!1E8B^m*O1k`RVsK4<5LJ=u_O}kSp2teiTjp`@gw^1BdDJR=C zVj9)u)$3!V;`m~3#!};@0@H!G3h#CE3|Ib)ae5)c4JU8HCu)8(9D7bd6+Ze^2e)}l z5i3o$dEke+!R2$Rm(bWR6kZeKk8gMPfy>G5p0{0{$)45Fk9H5&ERl{jC1y_tb}m3! z>4zxBeb=nrNV8~f8v9UV<5{aXd|Y&mGsI9s%`mM48)i}yJ+H*7mq9Cbei+$Z>lS2( z-p$A5!V}&uC-RU^?XPC$1SVug3c1C+?8}{W+_cC2y)3coN*U8JVh$<+>Z&Qh zq49R}$r$OR(G8z=N7zGX@E|dBF8ftK3vSDjx1y{Ov92VIGql4 zCu`n&{`ag&hwt0`mA3#=)Wj(?X_Hi9PtQ~a6jhHp+3;SwWd;dVS!~R$Y(^r-5m2ot zYZKQE_VHP>`;1{>**sGmkn=#Dh*HJ}lm@GXV#dy~*S{gIk!vrO@9zB~P~*Q^J9yx~ySA+&UofspYjUHas>ZE#Zbf9qm9`^7>+e&(CiY{J9qthneWP zClP0!VWT*+u!26H3^KgQ?YgMRo@H<9tNV?vkPpJ-e%f6$j=WMv)*(9tWRsFxc46Np zg?+nFr|?*@q$KH)5Pl&-xR4s#HSps;rbgU)0B?b0OPOM1HVnYV#1JWfO4_Yp@Z3}8 zlwb=n+O&uiZ^L_#VX}7jJn+KhLNt-lRV$KhX0_?KXGJ05Keek`HH_XOopd9aqI|~7 zrzLYR{Eec#NMy~LI=_$uO_w~!0^?-hT}C@enL@^^h?7zo1RulZ`|tVoevF6uBmemp zz49|9Ru1wrFawaOpYr?G@V6I5t-To9Njcn}Z0q0od&~0N%XHZLupsvO3I^4>3DLY6 z?EK7L;XpJtsja`fCG00-cV$uciGic7?U4V5E_E*O>Ow~S=7O3GTTf`@Z{Hsral2st zNs&j}2z}6dyVKwtR!sPt=@p{qtZt@`62w|(vJ$FA-URTMm3`H~?s?^yXVo3iXS$^) z%zYPupgnfb!)YpDd^PN+KYJ?Uw)Yhy4;q;G9vcb@ z*uL%G--u%ZDe-1tJmwa!9gxJ=n`BW4O&}uSZo>K1#VO_;F$Zw|=;SxjUx}nTwvHMN z-W7y-ytM!dfi;5iQlMI2RjY%ff!MOB6}3NPND8+qY~c7J{6`T;9l@)t)6biO2bVn$ z-Ly(yBg-vTyk3}t$_1U0s%YA^s4xiixQHg8ah|4d?aX18z|bm`nj)}P$R;a)0O_RePFA&#zp^fmsJ0&O98Vc-SpV_%OK{p-uvLb}Lm#W-6t#^DrUn@>c)z`sE zf`x)9h&wy#FCw33KvfQvo#)_f)WH1Aph$mktKq+`d>^Sn{)K(?K5;_F`Y9jeXpZHL za_s@+oh@_sWh0%69*w|Coxs052`n7pE$)bK{88ff$awpqz4f(E(K@|Q*DbN>EO_7@ zv8w(+xR0q^pBG-Ai_vR7S784#46ic%w&hxJ;wVp4h!kbA47w)|f}!t@%m_-Z)aa!W zJ_~gqe3etuEW^HW2eB?Z7=hU-z4zrjyfXrX4u+lrYabb2Cwz3hNE7UXE2t;Y5X@O? zlVr?kdpq)@lygZ|nfwKd3_qqw%ncv%Uf)gd6zyn$iiDOjZuUDRLN2J|rLZ>YRdWn# znHLXVg&skt)o?WHc5iu7>l(}7ni9LFa5zA1y`6`P{}Ylu;QTxsQ%0l9Ph(1iS?m-E}>;uBgo1fEckrEe{(2$ z;m6)o{<(1QYku`AOmM=<>yG3oxjTaR!T%h=|Gainw7@Hp8Me2~J6H|y3e$Ud-C-27WO+aq(utNvZfY_UF?3o04sEGF z=dnET)qlU{>S~%al4;5YRS^9mSieBx0ZO_JRr(P^Y=%kK25+9+MX%IThA!}Xbo571 z^2h&FOvJli@b@0-zf2O}HJ(ARwA{p+jE_Tf!TyerD4^E(cl1(Q8(Ba_A^>KE!tLiH zlaDy=M(H-oOYYKjLMyMH40gs$9+>EjR(Q8{t{b$jy&c*wx{u;sFo-4b7stUPPm%E5 z--Q_fuw^*q^UEB69KRlAcs_X3-r6XRZFJq)TGW~GJdHIy156nXOX_3ry+Y`Go1){C zG%)!l6!{h}PB*R@)oe@N>;bPK;hFo)DtM?U_@$@_`TXWI@A>CUy8O-Qe10l!<>fWS zsw>JBCR7EGoA{9UeEq_P=u6Pp>gvjFDS<6foiB zYke-yJ*Yl%K%^EGEPj_cqSg?K@pDKFbVpBf&*u~Z^Vg4tk9yu1`2zkXUTKY>91K>F zn^~9kmbV=9HLIm(r%ozx@OP_Bk-^J+>7+xn%wU-&nm%~B-(%K+8KhLbY>?_MSLzN{ zIm0(jFv$YZn9aUo`vCLF8%r#vQs4!;bB|EF4ruU}P?ym(3ppV=S#cUI?!$R3yn6S{ zwfLMzQIG0P)6bI*3lT+aSg;QHn4}OU(@&^UNGFS-TE70Dti#rzAefy0`07NFFe?8Q z?(r~Y|KZuU5@F0S{v)nylN7U`(*ObSd!{Ru!59EQfW@ErXa*6;BSPxLk^@Llg0+8> zCYzFGMzWw{q^s+scigmCVy45WSw%;P5Yqpl)9x&HTd7d1Y-wq+uZErY`TemiOWsJz za(eUdc0uv*F9fptA7sW>va_6E*HbB3h|(NVe&k ziD&znkz~;8IQR<4Mq5TSQjS!IJ}9inKOWqjuUrH3=e06jx{#g2U#4S2w<8dRQ`50b zhO{w-Jjvn0zQBZRaIRn6hzg3ktTD z62i5X0-ht6x9+VT^Yk4h)DDjV8ydHAFlo08qX1BIVp*vY6k+jzp@oy@CL*}fy}Yx{ zLswT$K0Abm8siIF(BnQ`u)jB(qI?DbSvo$pnz12Ob#F-$ZLra^y48RK zBWOAAdo|<+%XjP3sS|U#Tp2hS-Hj7#mk-dMYVtruy7}y4D0HfF0|Ah>{ctlpVdF{-Rrp=RjYNfWgZbbkp94B&xl(^+02Iw)l zV&YiIViRWtTCv%5K(gi1fHnRymLp1)SO%--1C-UGxf-mnzfg#5jXn3m5*{T()jn4h z$F8ZS1VoCo_DFNX)|tw3*St6&?FbDN$EbVF&*t?Bd|V19S}O*Q!mz@4$?7sr-U2nr zw0OXcHw+%)cmKqMv)Ueq+BAgRY?VkfFuf%i=KfQ2sOVsmHx$=je#|@0DWecC@cIfJ zO?;&#+s;rJo_BKbaQB8iW75txGL@OnZYN!S%|}U4&iWwoGDuX;=q(@F=##` zbmsYiE2hgkZOB5>k?Z;Wgkc{dFn$O8Dp)r1$WY>HMZ#E;G8>^Rfol1xm2GIF8|P?% zi`P7CGKLt~;63g)y+vd6neRrxO$ez)wb{lRsBYio8~wl|CkV2Hs3Z(SNVIF)YJkk{ z2a`R^G^J#3nN&!FJs@O|L=v}g=0PH>7zHEoP6(O z{m6;+vv&lQeQkIa+t?|GL)8<6btli*t9-Nt)_$`ayl&;78-y+*2O(TE(zCTgW3p8? zMnNF919yJ}^Ev(5xLnbC@L8lXf?6Q%S3dB@u6f8*!V{O6RtYu0|M_1c&h^=ni}YtB@3o&+5S*v4ixHs#J|-zPOZV;QuymYgNCy2s83F%T4Sj$ zh-)*N2Hd@jAkGoMr0NOnD(K4v600G@BVkO0!PH^~6bTC#!7!zZW$@Q*9qDdxV&-1GLgld-lTnT zJ}9?jm^xZOuT`JUEyuk!Fav6XYI6l)mcD4SDH^$`^w}iO=18X$wWR1@K%Woy=RyFW z|HG8xVCk~tc17vL-igk^j%-JH)Sj_$cO<@zqkD??}e4?F~*ff%0CX3pZ0UVx+8d|$i7Wh!V8 zPr;Atk5FWbZDrTv>Zlw(lO*UI7_-|D(8AgbH6<@w`?t2+1dCEZiAh%ASs4ZHvX)YN zRarq>5ht5ZR3^kaWArTNlW!&!cp6c5VwGLXC5HI{621%E)Nno&S$WKcEL8@*QJ`~? z1Zp0DFLV$NFYXPhonNEWBe`;hKLKBEfE}Y|!O4_4fxXC)l+BXk77NeLICi}x;H+#E zeMmE1(&o>>Dp+zQ&aH$d`%)bI=m8i$1r8@P1xd^=(JZRpkJ*=1w@n%N+(#GfVPL$q z)Vecz+19(PzwJv3h`qKG;AY|n$`hJLg+ZeMbs4MM=MV1Us~?=~d_p)9T!C=3WPi7e zMIfgaoiMoce#bI$Ck|HZZ*GSKVZB{y1iioDO|v-?OjA@pHU{z$=@YUf*x;0n!j_Nf zu++sMSR^kDi9!4`Um`al)HagE6^%~XA}el1$iP(@!lfQRYqa@Q^`(ZGJ7FhMD{4Li zsC12XrFF&L&k)Z}ihn4Qn!YVrb472!Kot)Aj44l=gj1_;&3KlvG@~n_fBSR+d(cQ7 zn*C7Z2;dA8skopBTVvbG&sNrF-s{iFI#mEfIB}~@@FVT>e!uBf$3djK9B6A)PM+K= zTE^Pknda`fK`Sd?*tS6^?4iU$)x25(O3=~~i4UGK5U8Sks0S|lcLU5o(WvW?e$|XF zKx6E-YVIdXdeKxmg$Z%Ck3TLP+sV(+NfJlv5inH8(4EfLF9pcd#p>!C_aZYy>mze) zq=LlW^8&fL99R(BeuSCZIEoKlxcwTkxq7Bdzb?BV2Rkj<)su*7Hz(8FQ+~Gq%+y0OEk_+d|dyxU+< z`{dI0{v2=%(@IKUt<$h_;yooL~2yFBik% ze@?ctcA`Ntm%qb9Y)5b;23PBMJ0Cg22#{BBIl15MrxgxvERV3rjJ8{FSDZyXGJpai z9JR#)ih|L~&4l}S^4Bib4)4Lqf4gjl{Jj?Z2&pjhoj|m7Wg#D;6;L>J^jZhGGE=o4 z0i&_ZcW(<@xXQL1%)Y|_-~&u|#hFHf`nklF_4A zVB53Okiobf{NjGb`S;$7U~HH{c?IQ9Z%nqxM4$yBoiojlc$xHiq!FFI-9y`pTVuiH z4}rwK<{gN<1m-dXa0@r$2!Rb5;J)JWigFV;zJXFJrP^M##reg?n|EcxqqrP9fdZlx z62L9pJSclTZTtIDQ69(aO#v4I>P06R+u2)!iKrTh2yVcwCk5E~pk zxF@=~u^j8B;0T{xc*QnGFP@=)M#t6SyyEo8%To}LajYr)$~?uoQCl(&qanAC?26x& zY|v20>6n0+yoCqd8EU1q)`4bcP2_E5Z1$?(^HT0V+<1+PyTN(&Xz^D$aEnNg?p#ZD zGmY!+;VM!AEPhhyzVLzmjHADalk9lz^Z~-{|An%AfPxAP#Un9isLY%-q4^Bf4x~Pl{fMIVt8? zg(nSXv-1)QVvcoE{970+G~~idhp_Hq=a)CHb0$gvlqXv|BqcIzmMv0?^k&PT-y#G+aIwb5pLNhH-tGU1>PQGQjPUmxO*b*ziEetz~97ZD- zodk1%as-kfN@X7*5|a~doN2ULZ<0St1_*x4_`mJeaVbR~u`@}px;e!ViAOU*FJrz} z(`lap#x?_1x@un9bR^M#5yOUA=VqDcp>u%jAFJ!f(u@oQ%8Z$+3(JG8O@L zUA1h5&P(Ub6f1U`Dtbyf3XTHwWb@ig!$>N_tYBxh`Tpq{?WaYyLSE#ynBZZQLki`A z<_*JJ{2D`&XvW+0QSeFwWcO7leqnzdg1?Lb5a6f-`RvQXw7V2*@&2|jc8HWSD2+q5 zdQ(h8x=iurq*)!>S!(!dImfA`ZLa&yahQs&(cod4lySvWbz#dWOzg~yO53C|DbZpb zoYP3rUa+?Ay`^9!SvBAU_ao!6GaG)d%%Rc`We z=X8+hE^DH>o#n>CtNiLKjC19x&?%C=FfO3{p5wg-pUG8z6XUqmZ}+)6Sp(=!bzZ0A zbyCL;cs?Hpe!B9=rUO3Qgpi+4Upr9%Rs3wx7M=;4_Q)>c*-Hej~t5wl- zmvB@g89CgMP)-~odTB=`2n{~_cuqC+(=0=+UK9(n5vt)yddlrY{3}{p_IZ`d7kjZX zUWCJMA&bM{FkMe-yW?1J1zmY zWY0BJG|sNpE1vJgBdqgYq8_~fQk>%1|NK!^(Ur&}@Un66Pt9R%^1AVcF7G0S;6_qH zy6`f<>``A_CzjgC9@C%DOiEgjf6vX->XOh$O6Sg zZzSr>qljJAfyw3j?4bJSt*GuXo!NBT^ssjU1Iya zp3lubVyED-yt>{bNgH)nC5s-7u8ic#(jQs*{Q*(wdJWu6tcieq`cPI8Gi=!_$CqM-#d;OO5 zWZ%c&LxaTS5%5dhMif4vZk?XuIa*(j*DwNdScGZgt9nQjYa+bm$*e*T35|*zPDq$Xd&viW z-|0?A?_YT0PUOz$4j;i1idS?AC$h2cJ*Y=_{|Q1yS}xqmFKi>gH?+}PfKcnkhSbAE zZ~g4X{mf^=$Ww}^HYR|5h-F_ZB(od@Pq?6>+Pk)36eoNZ&m)zc_xHVM4mRWE4Q`^g zcx&W|Q8T@M1aik~)g%%_X8m1^AV=v$YgqhWeTB+SJMnHWt@0Y%ee^p_y)NsBm7xnT zzmFJsv+!gW!r#9D%qzAfBeB+n)QS!}NDk-wbRwUzOKw`y=T>fZ)s=%=%LJLBe;q#* zo*zzK?+^we4WdtBC?tOA40immOX_`+G&K~2DeqjnaOtGAQyR|=3y4V4KaO>-U5>RLL5p;*p16Fy|$XOD#ty7=-_! z_p;IcMM&Pcuz7W$TOUk3FYnPdLn8+v||!5|3Lt;=C7h z=B=k3X9EIxz5B9}#Hvn3tsONH+hgZalAk{^6_HO=f$lF+)yY>-kg>F)K9(!OLWh#V zJefOk6~P!2zQ37bvjIRFd4LCNkTs5zWag-J&|YJbRy)6MNL|_9cF?jN!ksZ13~P?A zMV-O}>ZoJsqYr5Z#GKhf1;LdNVOPw?+Cyk7v|YLKrex8=*zmz9kdJuV6C&|&&2$HD zhD;-!wd}{l?m6e9YV4Z}5*CR~x>gkQ(;ID_BdcbQltt7h%+LZ5GQK!O*d4Ob-CuD5JM36SYq4A2_)vLKQt!*&XMAc>V?N z{iDKp>*)SIEI?`A%8{ct;JaY>Tc^D3CJzIqmG?JW`_GmfrQsV#Lz5Uas($jzMbgwx zTMu^C)3O^!Ypr7^xAs7&YkS&$$0;*gjbLYMEmAvt`q6B`4oq|@CzNz{k);4Z5sY?V`6>JlTI#do1!3MSN3 z>KU}^D;Z+NHY7RTdEAb1Px2v~r$RzJ5k9(#IIt%RKFOWzZ^`$ArQcuQDG3|$D# z;grw6sz~64P$xWTqr)^!?skCj%ur%1!GE)+f5=^<7+|JHT1O%yVjAO62rR2fSVWR zi2_r7KP75E<6bI`QAbs+tEbRU=T;lo@gio|7QrEi_pViOO;Hv5kmI_}O0hLU6{MoG>2?ujDmd`y*Q#`630uk*7x0>}B`@muB^5vPwGAt3I z0VdF%0wRagUg;93vwLY2N|sz}K*V-rHKVy~7EKR26iM-4f>M$&6q;G{GrPd8bkJhqOt2zsgSoX($%fDi`)6L+x=Gh6!!^wR)p)$X zx7Nzyxz-&zc=k4+1JX2CSIzY^uX!8)o@`w*d1! zXoqKWc+Nz7qf|fN-E&mQlQBJ^2-DK{kVeWQ3Kwuk#^O>5WEG|k20Wb1HL03MdNMY2>{#1a z5~US)46dy$0``BS7$ufW?YYfcf+kPNG=PoFr=$uqX1!N;#?@t=g=3XYiE~!&;sQ&L z_bxWXEdb?w&*G>|6)4~%`Nig=Q#vJDCSzS~)7Khr zV!SX0*Bdq49MJf8M&FCk7IVhBLefLYCH(1XJsUMr5TF{xGmYtpDvm5wiwK|A)4Eii z8jWs`a4j)v5SrOvNM72tcma=O?B?0Br4h2wR#o;TRSm7c2@j&|5W!5+{qeZ#|3NMkxoD(dwAnUMKM%YSHkp! zInpaEt?=mB8djO4o}NO*H?1rpYOu4ehng*$aoQ$)h1yHfmVANIcnN~{;*GLEo_D2`N$`P&? z2oA{W6WFw)HEB9jS8S%SZ`b8pu*sVrM0~y;Euq&-&aC3J0^2hiwr{bZJ3!1+;Pf+D zZxL1m_hq2&!-z8{u3*9BI(+VhdY)qThDj7?m*-Ev`B(@YBiJ-3&u>JPT@Wu~J|@|M z27vZ5(3m#&353REa^J`fpblq8uow*gAv%b$2eL#RQvibd8mOBSYPj<>P&IZaFOqy~X3wS!lzMgzW(H?{nB8jSlSES>^JR)nD- z&7AEqcGC8oxx&>;RHb7HEiZ>$0rGos5zzShn+*oiV1cRH5;0~QojkS1ULU_djx`$p z7|sv&-?Y|_c|2qAaiG?^km#cbV+i82*1t4Sa zfhgO*mV&E2@bHiv3sfNB>{cWLe#4Mx6HaCqqb%%KzxFHBZy13<3~zVx&5DthjQ4IN z=|c!F2qqh7*+ls@(ZcdDr3S5*govt8-m|1?Qnye=qK#7mm%_n)@nGZ5DIPeITbGJ> z$1dB}<1^9%lCyuBi;4@d=&@uzfW1XMr3W_(H>1w;DX_*iDeatgC5oi81ge=7-10|J z;vJ(zfgJA9BMH?I{W`mgmS%{GQ?NJHjr(SuUCpsxb5)HUC>oIm2OOa zV&reEZ?HVYs~_d^pSk3j(`n4dAEQ^49${dKS@8zLKYe#)iIDOVkmqe!EU9q3LVT7* zJ$ix=WZ`98DQzdnUk67XQk&uTm*GP>(=B5+^^3bG0J1~j96HtgX$v#y&GteOcRF|Wp#dKOtLB1|weJSM* zC^j#2rD^hMU#i-)l?3R^Ac|^!17M%S=6mijwTcFi7?PnjJau%h?)l`w#~0)am^h8| z2BmZk01D(-0e+Z~E0=X7LhY|GqQ?(#)`%D)uNEWHACB=~niHy{t3h!jK2CBbN(?o2 zq;74ARa^R1JJIld6KtaOftM`D3ANZLMurk$bR&{)BJFfB1@qHrr6kK-nGBni90Gp5coT!qQ{Sk4WEIvO5_iN$n=#qEl z*i{%#ym?13p@PJOVE3`nxsc-#q|Q-cX!+n!%|GvLQQA3@d>{3n&~n<)Sofv(>Y*4D z17Gwc5ze@Bd~%6hdfWMm2KArV{TR@1rnuQhIg9u1lT{h4?t&dzDMSGV{lfSw7mR_5 z0Mx*2Aa@C(Vp<4};g32Q!Ib6!Y~+|J7!OLC!}3=hDd-5hC^B{m;QGADPFmv=azb}^ z+WJuFh%LGsBV*^%&rq?L#6WW*V0M4r`V(Y~x?NQ{M13SWiBTa4`Y>HyeKuuN^>`sr zY)08VBB51kneQakpu6Yb!;7h~nL3<*RMAX36Qq+GI%@cRvbkzH5-BbDqz2-G=1oVN zs+3;kHh!7wq!$!9+`m`XiZ-6*OY6oR=H{zVEGR_-ljahQmmyGTYXgsVQ5X+DFkSOO z_zSDHvyJY?$WGPAoT%;VuZ-sZXxJm`5>q^3UZsz7IbuRx6-2&jC08RC;d_W>fcs30 zSc1(GMLPVeb^cE)Zb|wK_4hKqDfgen3wNxJ`>g}I^ucHM{OuBV zoqSXA?$N)n9m59NgwN(2XR(GF0BcDvE2o}zo%Guz_E)KV7(X6bjeHD28ikn}Y>8bs ze66HG8s`-)hja7cR`>T~NK>RB$*%?$`3JHYg>lCL6iVR%1vL2CMo=Auh&ugoc4(Gu zM%=kl%RVMUkJGS-7P&Yf*n(!kcqll5=U@EoJLg~3pAO`6b4Jf>!HAtv0G!HSkyvtf zg`ER@r4L#A5;AQ&?P$L-l$M-65w|Fp(<)3%dppZ^ECK`ll`DW^NKsi4I0j8Og_E1v zK#;kJK_Jhoov^}`9TZf%$@+G1!&lbKZyF?KpzgRg4%xOMcbmOZVQOaz`2pFUe*Aau zAp1`qkt>)ewG71i2EPMV0C+HDyHB9^{hVFX>|Qze`)-!3$X(O&i7V+Uy|sk;24Y=3 zS)P9IckkT$PftS^xJgG(!T0%&7{Gt~DmlSeQh{S(_MC9B>#|XYtYRcr{faY>nJ+7* zED*!>?t!^^D1X(*%+eN!#Gwh(=WQ`&&hVVwToZhXX=U+UAJNj>=+HE6>j=- znY)K%SyrVHc147E1rsv&v%X#_`}loj1(nYHKk@T^q<~5xi20rsh)^9ul{|4}hd1(p z01(A(_!y|o+@D-p2?T6i3uU&zUi%X0ZPa86pEhr}_xsU%SYDF+BPxPQVwShDS5AP)(EhFOpCw_zJ*1ROTpLn7VNq{ZG+> zdz`Q%Vt%|`?e8^|EgP#p zmsrx!nBBYvCa2#TxllGyob*I{uee`d!QbCvcTz|{jVu#80DMx(cPOG}i9s$1Vl4X} z)~R~sw-{e_w;EM`34-)S%7vo`m{apXFmUySl&T&>H-}2}$C=eQ;WN6 z#q!2QOYYgCJQClo~0Z`IXsflBSNppqTTMtqsE<9QPJ} zHO^sx;j9gJC+OqO&J$|~+GY`)QRZ8$rvmNUFyk*IG-hv!>E0h-y>GSg0iibtsZdo5 zhomA)04aL+JsneI20ySp$=M#(4`-X=cP#7TVxCii__hw_K~ISEJnkWD0p}hg+NtrC zg(~dP#y!4_!!wfIGo6gLn9qT}lX)!JhR@K*pWAEHEwFlApP@DQk719ogoqoMI_c%K zlxs}PyY6W4lxOTQWNJL0yt;|raWDW-YaAU}c`FpF5EGFfd@pLnCd^1FDJqrHDQlh9&3Fb)7KEu-^`zTRA&rt>t z!`(cE;*7G1xi)FBeK!u;&$Jrf8s7?RfZsF%sd-e`)2Vrr3}diPIC_N$cqK{cW3^R@ z%gA)*p6a!$3!1#VN#4<+9_l`@gl?&&PtO+WLt?&j40VOur z>V+Iy4;*G0p7j!4o3kX}9kJoB>{N4|o$dkpdY_JNwXc|Z-#+QoT)#tZZ_YWhW~IPZ zkyR|UONCo9Al?c>q|pQP(3H!Gu}Gu`RqP=1&8*pn6R42uMuF%6<@Db@DMAYN;DF76 z^8?w+_%l3dbWw^sUt~t=t)g@tK!4s@o%Kw;wFO3^?Y0~YJ5r!*bU^G%J1vO5jlOtN z#dm3mY2IswoR2zkjvu)oo%I-$*jEJFlS#v5UV`2?tFgE^^<@7~>|%pixAG#dT}0R4 zC~Hgc6unPUjoX6Uqn@a8`V(Q0VYCw^NQ7TV5?H=`5F}E=VW<+M6*|N206NMA_sJMO zXGz6l`~;FyZ`E-EuB>0O5x#_H{RmiUX&8RVLA~=5(6y<>Dufx|x81C{R;KjJ${#lQ z`uJ>)B9Qnze`N4Umf3FUXK(EXP+pKEccci;Fb@;m`+d7G<3>LW*{%bdU2XGCaJLct z;lh^4aF=aF*oFn5LdZD&0P3(6WCU@=EvFBY@#lL&tU}`4oJ>i^CrY`(k!=0wDueEH7tQ#C7mEGXi?@_(6-3ECog$N9ZWh8mPyB7u z+yGg(I5D|`k^VepC01PWM!(=~rbN=%ZCd+#Ji{d8_X5oc+x$_GAD}^2ScIW#+freJ z2JMFV2mY}f@7A+pb0W^hxhqCviFn)70)r%V=?Oo1X2TPos- z)eHa5g*s;Ga(@+ywes3>bQX%aY0i2nPJ&fmXC4Mb!U0vn2>y5Bi^C^}Sx) z5E>9r9$Pvi8@NRJ9{?OQU|1W{6K{CUzgI=;tf|Em8uyU8&bD%G0DMDpgm5y+?_P^N zjrKq|<;jXH$E^cZBSsE}Y7tBsN{UiS(gQ}y5tY7)RhY2oMcDhM8^p`P-Hlu7WC42Y z=fUvma*E^OiQOk&z~!9?sFK%A-!s94a7C2h9-Qo>8dTkH4CZAS;IP%YgD?dCW)r+; z=$k`WTG6o}82CpTlx)9W(T@-XfwVx02d@@U4CJf+{fd25i3acGVF?zLE0i+G$}lRj zoD#zpN)+PUS95FGa5HWh5)wk>iEnwy-A_W8NT6v8 z0o>=KZLzt@=B%OyP#mNiDzA7jla>Ynx&T%gNrsGo0Cv%7B2*AD{Isk{x`|u)@^Hf( zZU5E!V zD^Qi2W@f^50rS!pM{5_b9ld}IGU7pM_TGPD;_(g$f?0zETq=IagD=!rj2-dzdy|=n zg`@MJA;d&*Aw{k~J@>bv%o(zx)S1*nAu1KXD<9bDtS1LO8`Do~h&u%uilquH1Zt37 zhUndN>hfhh?ZJ0e@}Og;l4BSWXJZ?PcTzVQ5`6Q!XBdozs;9R7jAN$mUJwed3)}u{QZpxBcsoB@>FKT40 zLR1?rVwUI}s=fIxRTn=Npp(-NNKb192j`0fy{RoxsjnqNLGH7n*+J1=%LFr*E|JrZ z;0Q6zA(HR6)RsCKOsQMcR$1rVhFJe-Y7}3upnQk|Mpo@dyEVgQ;C0OlloYgr)q6@#dKf z>9yr-!weWx6a0$@@q@S4aqg)^4ctnT#Iqx-SH+6peiFH~e~lEmGQADF%#e@>FWKuMeWdgh zZvX5wtM{*0KnH_7%_dwcqMI6!X0RIrQEOXP>qX*`c}@=TgPp1ip;!)+s7m7(Ga(D- z!EPyn;qpOv%RN#>YM6BOd=n}9A1m&xtG4wbK-<>)giymB;n%WfMR=+-1^5=vo2AU-9AMwHlb9A` zw!}8>c8e$6^~u|w!5eUXD9sltdAg18`B{4ncs9QvCvD_H+{zB-OHV*Kq_F;GRqK5{N? z=^NxlMBpuj@o!1qMDVqvxNu!_Lw26YhVmn{f)Z}#*@)T|9qsHU=5pcm)&JW-AzucM z1dgKEA_lc`?q0Xp{TtMPoD@m!+^h_!o^WztbAr4!&3JU!YOD9^-1P;JuIo6!YX|aY zBdl*!DwE{VJTEBuq@rW)+V@``Te6~5M}WEVE$SgdYlvR$scMI`9^gYAx4}qak`Mr56%nRd z&BTQtB|A%hkN|x{|K`OZ$n`K^*V$p{y$~$a5FAeOU-n5L_^tO%+7xDQd8duH*Jm#s zHkX>K>#bZ|Bs6?nHX!)uI@NyjRuF$M^~WfYiAwMC=YzZ?{BixP(B`$;PmxY-rzXc_ zM#*Ek10p!Q`*@uxH78)di^v5)d)`6&&i9qd`r^dH;8397EnkF+Tkvb8VmA1nEyqo3 zCb<1Qe`tT&HzDVb9z83di{;7g?V8-# zT)Si#!n_p&HDJCo^9>DjeYDaJnbZ&b`?og=a6`j!T_gx#nMB_C9hSx1o1hBxE1ZeM%<$x3m_pkr55ugGvYuVP1}y(P7eC2a zD-WvZ3XC$qea;Wn-r4{l;xAj1F84MUu^d$SOU`kZBhP%g$<=3wcxs3hWQcPk)~61+ zUaSA{$6nxa)Cmm{mD^jp6{-A~J7hMXNDF&00YiCkpKC(~w;Cnam#e6r2Y&8tb4NBN zYT|fWu+>li4YPFtO9c|16uGicK;|pQ_uxAN!CcEgLA|vCPA5Q?#bOt`|8`)=RFND+ zMU=N9A11Wr8EU<hJ>n4B{#~HJiH-*%M# z$Iq0YwbbA(iHd9{^>Ecwj`HL%$*T5K5QaiUbAnY#iZnK;4y|WwwGNU265~0f~ z!X0JypOyO{_$< z+*Ey_##fb`rHDMbMiCNZDNVY0v3@Ukn7XsfUjO_^SOk!k)gYVJIlQAe4mNnmZ5z7D zhT z%3RuTFCARPc8IbJ)gWI-SjkJ@_E|-CrwNALnYBnPPM<6;vYb6nip#A37c9j+=l23Z z>pnEK_A>w$!$MN=pe5l3W6g4mT*Y^uIwLi0j82Yc4BjqU+DUTBe7+zn2zGRtH}g*I zqia8%F03iDL2b2Y=I?5CV(F(M>3klRDFU|JUNS=4e60{J+*)osy4=Dtx@36I!V-cO zWlqCF0*&k%S!Z~yF{}2-FCAPn`_US^zq-;y>w6s1HF8eU2%o{%XN;Y1~oF(UJrWY#1V6&h4DX+lbdZ=ZXT z9$)`lcdxzI*=L{Ou6OP$=AIU{zM^4UZimm8_8SuJDc#9ue$zJVxL?op&fFl~5~KL8 z7oG;Y^MfTK9~C6eeN*Xh=Y^J;d3Vx_v6puVxt*T1C?V#S(Wc_?+;{q8)V%8=^E;Q! z@se;65$L%+Jn^bkdQrp=v3em2D_obHS&%RO<@O+U|ZS36V^s%k))-5?dYW%68&R^4zT<-HV zO(C~b?B9I<{P5LTAvsmdi85j6|Nqc)g#0J+nLS+NI@{ zH-lwWWr`ikm0E`^;M$eln08C_YWLY8r8k9jz8iAKxFwavoXO47YIziLG1cIVQB#lY zo&cL;iGr1@wnwiEyKH`Zsju7gkE*51XKreKo05Ngx9kIV&%~|`VvC#~UNCZd;nu$M zMBEw9^2?eLFDuX1hStBDdZU4RJmIOtv3>K!cYfSv_{QGbm;JdUXW??LrfU_SPe~qB4$3$qWs&Tr=(C%Kq}C*_Za8w(>PqtXr3uIKjK4%oY>DIF7<%kl zTxflMN~ROXJF15rZxB+MWVT}gH}?GYl(*AnugghE$P!Yq4>%=X;W*xLkxGZ()YV;4 z>(ZNht>4F_`@TD|E$qIMN{H%|pG(|5t|>aDtgHJ}KhH6Kq-e!~XBH;+Hno(w=Ij~k z<7`+~#a*@}_xbVc7b`u=+$z7WPW{wmcW*vbx8!V5+e;a>@pHebml(umN*v34nZOOq_C->*g=eFLOeP8w{=k!gH6)8P=84^3)MjtCT z+1RvWoqt2j#@I)k|D499gr-$KuD?7fvFkKoD>pTCmt?2`Z{LL z)fmT$OcR-F@;3D%%|A~Y6a*@cKBs&-DOEYC%Pr#e=3i=e%i~isZY)adN?hN!e{J6t zZF3HH`}c0$MX!y-dLo5-M4YGT#T|H(I?+omRkdc3WX&R5uA$nneNU=oy)qs>R@mEZ zFVsEOd75^rj^nSf?_c_rzPWV5ST|1cL*#>&&TtNGpQ$~;xYa=CvGu*;9U&2~{ySS` z^z&(T}}OHhJF3s!L#>bXsC56MISQ?6%J?R#~;$>5|5t&eK#W8{_v@ zIkpcIgfGR7N;-2@nw!*R7;(|!uw-I(Q2FlWY_~=GrzF=!N!}CKBa_8Je&sLrjG2P;N(YxU6MaQZa<$l$=F?8RV>SIkGTqIjQtj@Q}y|b^q zq3t`rZfQ?qLc`L9k%rY(+l@~h;Di?Zh(9!8T-e*VT!{|O{9NxQv3=ZK`G*%cNAgeT zowml+qwvS6Dbc-_*C$(MHdNmj*YoP}&rpF*0||R-{MEgW3+4;my}dC*YN&q1@!Ra? zyJd&MibKvHXt65!qLB3Tp!}4&j$k!*gXT)LMLU|;4l#RjZ2srbJKx-YQgFldzP3%* zm*#ml+^#(9fIrO|zW>#e6>kgfYH+v5L|uKU@c4%Lsg$`v1+5!b*e&inV_dke;EB<$ zh8*#ECL6aH%(^jtMYr`r4!b4fLP~w0_>?I>>yK5G=YLqJNSUz@At&Lu??Pi^sG4M)uZ>vz^sPhT0R-|3k6ne?k z33Qm1W*J!j~|G zck!p@lI~8~=buZb9I<{gv&(nnnmxB4K7{|AvSIYrOV#(C_4hvR$qWk!YRK3;b+g_Y z|FbqrER*3IC)Iiep#~?j%(q9nI$d|Jd{g_5yESgvQ@dlgO($f&vbVfAyK#o;whZq~ z%V4F{hHXbiY}y>VSYz?#-ADHnX+B7J?`nOh{m4S8FYz4G?ou9Daa3otdr2WC!hkh3V(AuTFq0@!!yq|AM z*_!&J){(33Fa0Xz(QL`2v9A0@WxDz4$N9&q<)UMPueyFnP2BBT``>Nzgj>00iRu>} zOhb;jlw@EIZrkrbH-sh0alur79+l!ob+-LWn&LU5@^%*&SsypN)5_|pfwr>WTZUt*pmmXqsKW*(O$f~U?+4tj^ zwx1-Os;X>#IBQ0OX-t;p8qsRm$lSVp1rpj?^;-5l%MNHoMQcTke=F9!=4_i-sJ`;y zH(3#N8QMlB)^C&(`kXj%?#|q&xslb01=Thc$>>eg664C?rsmU^m&I|)5`^-mYvxUt zExM?%Dcj*dorcoflH?bbB$xTYp=IAC4^r+akcGo{j$UqHGOUfpSeVk z;xAA8uQ#FtIBK(Fh*`YmVmH?CFv zxln=gx(boyyR;1&KC7FQT)8*Jx_NjnZEVpo|3A*caOue$I|YUI8TGNY$+!AOy?e2= zNcMD?=hbl16#PeVdu=`*@Scl%pnj9}?z# zSBjDIFS2&y(1F?sQYV*c1UbD_xbL_7*>SGc@m?99#`g&qD;6!#M98|&vBGif+^S6% z{ao!1F09BNb8XJeO8XrK>UWZc9ecoaQ4E=T&aTto@dYa>&rgj9rpX4S4u8dRUCjQa zKWhAyDO>qg4OM$*JWu)4@-67a@>icKa`(gu1&q=6u8oupyR=yLWm!}{I@cw1vGiGP zO>7reWB2sZ5w$f=?lS5l#^LLSd}P@%{D}#D7=` zwH4ndmXJ7=QWAHvl;C=0)FzByEF(OVUJ{<1m&D)d6}f-$irl-G6aI#B62GE?TstcW zZ+IoO3-gJ*rgq}%{?{a4`3;Fb*?%4TmfT-^OK`I)lECv8O+(*h?1v`m$+uhq~!eU*C zXR)mR_^{HWo0p^UAE}wB{UbGkaWyiXw6}dIi^ax&%9O|T?MbBCMlHk{aoZ>b{wdc` za0@jSd2MIQqJ}nVBu0K>yiQ6Ar?{#U;11D2@Xbz293%M{F%uhv3{#>8?k9SZX^q5sNaiL*YMMM;pL3!gfC0!_a3lthpFC=hCH^61% z2El>dlr|1Lgpt>i2O;0PDP4@{dSX!QckN5rj4im;vKhEGwR54bPIuqHj<@<1F+8)1}?UMmuCbmmYzQ>-xZ`kWGv~ zv-!o5Z4s2g81F1?ylvF7tIE8HXgf!eeTCfW5JNKQOtj0t0@p{Vs8MT=pM z%Vx2;*HF-NSVn^R{Xwp@EDlQk0YU#25o17+5E~601GNN1Wee0;DgYF zUM4g_aXK40@RPp4#De<%AdM@%q@)?nNkO+hKagXwjvKRB3wcT_$wI{Fx&_`W7=DdJW_b%!A{5ju$J_Rkylc3guQb(YOydGU1n(=<#FfCeFzv8IVgApH2I4oAdKv5$(j)x3doKSf~;IEFdUux z)xT!m$ ziRp?%5WSNa3;pR)nCUh)UWg-1_GN6OKaKRjbT|O;-5@5}v%_gQ?EQo>?kC1=4U{5T zd;$fmNSKH5um>&SDcY_??8;$go5hOT=^v5ld&q1@GB&%R3vk0Q_&;A+_W(xdD9jDs znf&Dl+9N@hZ?6PoG&UXIyP&%tC|QO!v`jQ&E2{kfv_2N8jl&rhdLS|U`r;!e#{^NO41O(x`ao~46VaAz>$wKH)&EfrIBEqc^4Z^ zQPfDXO~+&7BVnf`w(wb*`0nZ;5A z;l`_muJ;WDQAjof9)ml-3y7iDGBnL>GC!n^U!ZmwT3Xt^ELl7(M$aDa&%EyV;JJ#wWs z9R85Lw)WrZGs$;wz-2iylb*}b3Ig0P2C_s!F(BrQXcdpg3xQ0zfF{4WmQGf~kyK@nYt*?jzx0uU%F%ECiR zaqr#sfhDsAHZ@+Z^jegoOuOPdWK|%KfcpMC0vZKH&}a?PKs<(e-uFX2&4NTRGE2lW ztF~hl68}O;35;p&_ZZV5I0CH$X~^`XujQ>Y{(6!ne0Xu;>B-%W{(!rmA%M}6IFV7% zn%|dxXqXx;hJtzpJb+YWHs{@j+N01Ij`1DmYS(HL2)%%y7`N$>h_$yCllUOVp zo?e8H9|)2~${PLt)sHmCbwSOopyu#7XW%D2I(-)QpNe*Cfab@UM+(eSQ^rFLuDtT} zlQnjA$HSwj34kt@T?SE9|vOCz{7n5$+hU{CAiZ<<#Fpe6+JcF=(xDN16e}et&QIIP0 zF|bHTj0j0U6vhCuyO>EM;kS@f!C46G+r+Aea(6)uJqC)6KkZbNGVaL#1*M4D$Lj)z zNjWiMNy)@}$!%$z550H>y;#5#?^;J(y*>yHL;CJeUm!8n1Cr5=1ZivKAG$xA08cP5 zrG)@HODS3GZLbf;kL|>Gm#@Fc-uc|{p)l+ku-Wo{Kuh|md0B!90514HA2*M~&Ov2&nwYdOE z#Xrw$$?@2gnI8uy!2GB}<0jA!C}*0mFe5xMr^-a&d^H(6+G9ivwN;YV&ST{2RD!68 z(#qJ~!~l%%rZdI?t;zHyOVsvVJWP(apbL2=<-VD}-H8IlJob}-CwX>%vtqO?!_hj` zakd*wkSB0-!prf)j<{kOisKhehWJ8PY_vl~SZ;!`2^$}I^c%f}DMof;Bwz|4$crFH zmVh8NuI?WLj*9H&UQn4@FgbZuX0Q+O$10OaucTH&@*Pw<dkJ8LP1COmu!DjKqK}Wr9-D1GiI9+%%cLC(DSyK|uqG z756*d2%1k^I{>p2G9N%y;KL?Exl-{)vm$gT3_1iS0Runj(dX9>#K<$73FH5ufUoH; z)JYE>eZ11pYU6-E>?T;`LhGYVp!IcI2O*5o1>`zLWMT=DI*lHJHq^sW10crJ01??e zfT%GI=W%C!^n=~!;6J<1uXy76YoD+j(hDF<&VD+O)FupS`0fZ=9n;rhq#XT062`uh zL^s}p^anK16i}1oKPak}=-*5(1>X925i*zxt8CFgq4564N#*qyX7n(VwrXEg>3XQ| z6R0omrk8efP!OY$p?PWsG@p245Q2p=PHYcGuALr)eL(T$7!fs-tDGIj$84bpr*x1;Bjf{+z zMdNHpn|&COX(h;S89f}i&xB_o-j-gmC%v#71$!Gvl9@aO+t)o1#K>qG#eahxNq%;J z%7NZaM)puOb=V1b4`ZjvqBJ{tELPRhNL*P&6wR4M(_*-}Te}|&mq*^S-~(Z|!hn|o zIitc3`pQ*}`lc*a5c*qkhN}(uOCqV+{rU50zFi##BKnlp-=cw9Lj2)Br;azKjLcE2 zuL>@!BCZAR zfn>uRLb7`fkW|zXqyx@pMKOt*;CdaTtOAOO6vsig+{~kd&TmKy-J1~M{9HIF)V+rzGM34BhbQX?UU6=zRI@aLtv(5Mk z13|jDBT7!dbk&L&nIqkHXXs~a|JcW3Sa1$6Ob&0EysZz!A2Ei`j)KlQ^K^ELJ#UZ@ z@^GfLn4rwWGnu`xu&ZG^1 zR@T+8EbSxysKj*iAh|dRvTS}0c zVmN&TV=^`tzaqxp;#%7cj1yiHBXeF0o>|!F_?{T?c`Xh%b_b(o3o-sy&`c3lD~xS1 zg(>g%j}$j*BklvbdI4~J?jptkU7ekl<}nT7k#ODJ8`CDy&!^Wpd#5ka~nci{Su2-c% z&yEfMdz_FO@yCa}xI*HKfFx6w7@5;uFs5K*$T(sg(Ab^QC8Os-m+PR*yu#FEB6f8o zr@Ih;&I{tHDa1ISw3*BjEV9eJVDkNd+WYX-P1I<>pXhJK|Lpd8HW$HnF{mxx4W-G1 z_+wShxYo7I)ir|2*#MK1x193k*mXX0Cd{}-3(nKs1FlW~%;OhU*wr7GW|a^0;;mhO zR=?%>UFYDO1yI@-AkTT1zziqi`dgkyFM;@x3$W2)K%Ng-3Pwrqe&cU>&Ls6qt+WE` zyJ3(Rudr@w_N*F+ zAne(2dP{F9!um7QOIyoq@81I3%O8v%cMv1i)=X=*xgwJ5 zp}Qjg6m!RJ;_9`66f=AU#IN7O7!Nd1a!mNPJ@KN;ApA6h^D5oQeIz_+CASOF0)>@&9Kb98XKQs_p8wO8rxERC1OBQ!2den-FeWHAL=SQc00GXs z4C!zjW`}Av4o)k2>6@N982LWfnRxv())Rm6Fj|tS)y+vGwl%}*egpO5o!%^1U6{Hw zjx9mHOo3Bry7Jw>M~cO|Htp}v>V8|XzZb*$=RddkyDmj3$Z-vv0K+6Zvj$I+XERw6z^0G z@(+n1D?T;?m_+IZA+3NgOcpVBCac2=!f%gw=R;M)ApfOn3Ddf@z_g-q5K^_4R%e+0 z{J!kp@A&ApLH^>u*dhpijh1M3T%c`{zLSYU;xNyo_hYy+x{#^lTKrjut|{qKKX!y$&cfS?EF(9DnVkDM?1ptK!NA z=}OI>4fSw`d9{Rx$OpcEGCl%MX>ueeqUCY&*6ZQed>osBEYR8YWDm%})|V40v}dxY z4btY)k_`EuU-13=w0rv$3Z+?4vzftX%89@H_6ZWPgG9`D61ifFayHP$=tnr5bmN@e z?rC+&!}y&8S9pCj@RJ@b;z(RKY@o@Wk$Zsu#B^ZAzxT|0FtFPNyZSJMT^B regionSet = Sets.newHashSet(bounds); ArrayList result = new ArrayList<>(); for (File file : files) { UUID uuid = UUID.fromString(file.getParentFile().getName()); DiskStorageHistory dsh = new DiskStorageHistory(world, uuid, Integer.parseInt(file.getName().split("\\.")[0])); SimpleChangeSetSummary summary = dsh.summarize(boundsPlus, shallow); - RegionWrapper region = new RegionWrapper(summary.minX, summary.maxX, summary.minZ, summary.maxZ); + RegionWrapper region = new RegionWrapper(summary.minX, summary.maxX, extent.getMinY(), extent.getMaxY(), summary.minZ, + summary.maxZ); boolean encompassed = false; boolean isIn = false; for (RegionWrapper allowed : regionSet) { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweCache.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweCache.java index 6e7048e7e..0c355d01c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweCache.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/FaweCache.java @@ -64,9 +64,6 @@ public enum FaweCache implements Trimable { private static final Logger LOGGER = LogManagerCompat.getLogger(); public final int BLOCKS_PER_LAYER = 4096; - public final int CHUNK_LAYERS = 16; - public final int WORLD_HEIGHT = CHUNK_LAYERS << 4; - public final int WORLD_MAX_Y = WORLD_HEIGHT - 1; public final char[] EMPTY_CHAR_4096 = new char[4096]; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/BlendBall.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/BlendBall.java index 1695ebb8d..358eda0a5 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/BlendBall.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/BlendBall.java @@ -24,7 +24,8 @@ public class BlendBall implements Brush { int[] frequency = new int[BlockTypes.size()]; - int maxY = editSession.getMaximumPoint().getBlockY(); + int maxY = editSession.getMaxY(); + int minY = editSession.getMinY(); for (int x = -outsetSize; x <= outsetSize; x++) { int x0 = x + tx; @@ -43,7 +44,7 @@ public class BlendBall implements Brush { for (int ox = -1; ox <= 1; ox++) { for (int oz = -1; oz <= 1; oz++) { for (int oy = -1; oy <= 1; oy++) { - if (oy + y0 < 0 || oy + y0 > maxY) { + if (oy + y0 < minY || oy + y0 > maxY) { continue; } BlockState state = editSession.getBlock(x0 + ox, y0 + oy, z0 + oz); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/CommandBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/CommandBrush.java index 5165f3087..c8ea45f2a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/CommandBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/CommandBrush.java @@ -41,7 +41,8 @@ public class CommandBrush implements Brush { .replace("{size}", Integer.toString(radius)); Player player = editSession.getPlayer(); - Location face = player.getBlockTraceFace(256, true); + //Use max world height to allow full coverage of the world height + Location face = player.getBlockTraceFace(editSession.getWorld().getMaxY(), true); if (face == null) { position = position.add(0, 1, 1); } else { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/CopyPastaBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/CopyPastaBrush.java index 7d809e094..35f6785fb 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/CopyPastaBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/CopyPastaBrush.java @@ -78,7 +78,8 @@ public class CopyPastaBrush implements Brush, ResettableTool { }; // Add origin mask.test(position); - RecursiveVisitor visitor = new RecursiveVisitor(mask, new NullRegionFunction(), (int) size); + RecursiveVisitor visitor = new RecursiveVisitor(mask, new NullRegionFunction(), (int) size, editSession.getMinY(), + editSession.getMaxY()); visitor.visit(position); Operations.completeBlindly(visitor); // Build the clipboard diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/FallingSphere.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/FallingSphere.java index 98c1d160c..374458ef9 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/FallingSphere.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/FallingSphere.java @@ -16,6 +16,7 @@ public class FallingSphere implements Brush { int py = position.getBlockY(); int pz = position.getBlockZ(); int maxY = editSession.getMaxY(); + int minY = editSession.getMinY(); int radius = (int) Math.round(size); int radiusSqr = (int) Math.round(size * size); @@ -37,10 +38,10 @@ public class FallingSphere implements Brush { } int yRadius = MathMan.usqrt(remainingY); - int startY = Math.max(0, py - yRadius); + int startY = Math.max(minY, py - yRadius); int endY = Math.min(maxY, py + yRadius); - int heightY = editSession.getHighestTerrainBlock(ax, az, 0, endY); + int heightY = editSession.getHighestTerrainBlock(ax, az, startY, endY); if (heightY < startY) { int diff = startY - heightY; startY -= diff; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/FlattenBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/FlattenBrush.java index 172b5c5fc..60d5a17e3 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/FlattenBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/FlattenBrush.java @@ -21,9 +21,11 @@ public class FlattenBrush extends HeightBrush { boolean layers, boolean smooth, Clipboard clipboard, - ScalableHeightMap.Shape shape + ScalableHeightMap.Shape shape, + int minY, + int maxY ) { - super(stream, rotation, yscale, layers, smooth, clipboard, shape); + super(stream, rotation, yscale, layers, smooth, clipboard, shape, minY, maxY); } @Override diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/HeightBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/HeightBrush.java index 47615319b..2a92e7bb8 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/HeightBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/HeightBrush.java @@ -27,8 +27,9 @@ public class HeightBrush implements Brush { public final boolean layers; public final boolean smooth; - public HeightBrush(InputStream stream, int rotation, double yscale, boolean layers, boolean smooth, Clipboard clipboard) { - this(stream, rotation, yscale, layers, smooth, clipboard, ScalableHeightMap.Shape.CONE); + public HeightBrush(InputStream stream, int rotation, double yscale, boolean layers, boolean smooth, Clipboard clipboard, + int minY, int maxY) { + this(stream, rotation, yscale, layers, smooth, clipboard, ScalableHeightMap.Shape.CONE, minY, maxY); } public HeightBrush( @@ -38,7 +39,9 @@ public class HeightBrush implements Brush { boolean layers, boolean smooth, Clipboard clipboard, - ScalableHeightMap.Shape shape + ScalableHeightMap.Shape shape, + int minY, + int maxY ) { this.rotation = (rotation / 90) % 4; this.yscale = yscale; @@ -46,14 +49,14 @@ public class HeightBrush implements Brush { this.smooth = smooth; if (stream != null) { try { - heightMap = ScalableHeightMap.fromPNG(stream); + heightMap = ScalableHeightMap.fromPNG(stream, minY, maxY); } catch (IOException e) { throw new FaweException(Caption.of("fawe.worldedit.brush.brush.height.invalid")); } } else if (clipboard != null) { - heightMap = ScalableHeightMap.fromClipboard(clipboard); + heightMap = ScalableHeightMap.fromClipboard(clipboard, minY, maxY); } else { - heightMap = ScalableHeightMap.fromShape(shape); + heightMap = ScalableHeightMap.fromShape(shape, minY, maxY); } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ImageBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ImageBrush.java index 318ab0bb7..230be7993 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ImageBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ImageBrush.java @@ -102,7 +102,7 @@ public class ImageBrush implements Brush { colorFunction, editSession, session.getTextureUtil() - ), vector -> true, Integer.MAX_VALUE); + ), vector -> true, Integer.MAX_VALUE, editSession.getMinY(), editSession.getMaxY()); visitor.setDirections(Arrays.asList(BreadthFirstSearch.DIAGONAL_DIRECTIONS)); visitor.visit(center); Operations.completeBlindly(visitor); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/LayerBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/LayerBrush.java index e9301692c..e2db42374 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/LayerBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/LayerBrush.java @@ -36,10 +36,12 @@ public class LayerBrush implements Brush { BlockTypes.AIR, BlockTypes.CAVE_AIR, BlockTypes.VOID_AIR - )); + ), editSession.getMinY(), editSession.getMaxY()); final SolidBlockMask solid = new SolidBlockMask(editSession); final RadiusMask radius = new RadiusMask(0, (int) size); - visitor = new RecursiveVisitor(new MaskIntersection(adjacent, solid, radius), function -> true); + visitor = new RecursiveVisitor(new MaskIntersection(adjacent, solid, radius), funcion -> true, Integer.MAX_VALUE, + editSession.getMinY(), + editSession.getMaxY()); visitor.visit(position); visitor.setDirections(Arrays.asList(BreadthFirstSearch.DIAGONAL_DIRECTIONS)); Operations.completeBlindly(visitor); @@ -48,7 +50,7 @@ public class LayerBrush implements Brush { int depth = visitor.getDepth(); Pattern currentPattern = layers[depth]; return currentPattern.apply(editSession, pos, pos); - }, layers.length - 1); + }, layers.length - 1, editSession.getMinY(), editSession.getMaxY()); for (BlockVector3 pos : visited) { visitor.visit(pos); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/RecurseBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/RecurseBrush.java index c9234084e..97bf3fa0e 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/RecurseBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/RecurseBrush.java @@ -48,7 +48,7 @@ public class RecurseBrush implements Brush { visitor.visit(position); Operations.completeBlindly(visitor); } else { - RecursiveVisitor visitor = new RecursiveVisitor(mask, replace, radius) { + RecursiveVisitor visitor = new RecursiveVisitor(mask, replace, radius, editSession.getMinY(), editSession.getMaxY()) { @Override public boolean isVisitable(BlockVector3 from, BlockVector3 to) { int y = to.getBlockY(); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ScatterBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ScatterBrush.java index 54aaf864e..3d8f15aa3 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ScatterBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/ScatterBrush.java @@ -52,7 +52,8 @@ public class ScatterBrush implements Brush { final int distance = Math.min((int) size, this.distance); - RecursiveVisitor visitor = new RecursiveVisitor(new MaskIntersection(radius, surface), function -> true); + RecursiveVisitor visitor = new RecursiveVisitor(new MaskIntersection(radius, surface), function -> true, + Integer.MAX_VALUE, editSession.getMinY(), editSession.getMaxY()); visitor.visit(position); visitor.setDirections(Arrays.asList(BreadthFirstSearch.DIAGONAL_DIRECTIONS)); Operations.completeBlindly(visitor); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SplatterBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SplatterBrush.java index 135c067a8..930ba96dc 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SplatterBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SplatterBrush.java @@ -42,7 +42,7 @@ public class SplatterBrush extends ScatterBrush { SurfaceMask surface = new SurfaceMask(editSession); RecursiveVisitor visitor = new RecursiveVisitor(new SplatterBrushMask(editSession, position, size2, surface, placed), - vector -> editSession.setBlock(vector, finalPattern), recursion + vector -> editSession.setBlock(vector, finalPattern), recursion, editSession.getMinY(), editSession.getMaxY() ); visitor.setMaxBranch(2); visitor.setDirections(Arrays.asList(BreadthFirstSearch.DIAGONAL_DIRECTIONS)); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/StencilBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/StencilBrush.java index b4a81bef7..7bb17ad84 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/StencilBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/StencilBrush.java @@ -21,8 +21,9 @@ public class StencilBrush extends HeightBrush { private final boolean onlyWhite; - public StencilBrush(InputStream stream, int rotation, double yscale, boolean onlyWhite, Clipboard clipboard) { - super(stream, rotation, yscale, false, true, clipboard); + public StencilBrush(InputStream stream, int rotation, double yscale, boolean onlyWhite, Clipboard clipboard, int minY, + int maxY) { + super(stream, rotation, yscale, false, true, clipboard, minY, maxY); this.onlyWhite = onlyWhite; } @@ -32,15 +33,16 @@ public class StencilBrush extends HeightBrush { int size = (int) sizeDouble; int size2 = (int) (sizeDouble * sizeDouble); int maxY = editSession.getMaxY(); + int minY = editSession.getMinY(); int add; if (yscale < 0) { - add = maxY; + add = maxY - minY; } else { add = 0; } final HeightMap map = getHeightMap(); map.setSize(size); - int cutoff = onlyWhite ? maxY : 0; + int cutoff = onlyWhite ? maxY - minY : 0; final SolidBlockMask solid = new SolidBlockMask(editSession); Location loc = editSession.getPlayer().getLocation(); @@ -48,7 +50,7 @@ public class StencilBrush extends HeightBrush { float pitch = loc.getPitch(); AffineTransform transform = new AffineTransform().rotateY((-yaw) % 360).rotateX(pitch - 90).inverse(); - double scale = (yscale / sizeDouble) * (maxY + 1); + double scale = (yscale / sizeDouble) * (maxY - minY + 1); RecursiveVisitor visitor = new RecursiveVisitor(new StencilBrushMask( editSession, @@ -63,7 +65,7 @@ public class StencilBrush extends HeightBrush { maxY, pattern ), - vector -> true, Integer.MAX_VALUE + vector -> true, Integer.MAX_VALUE, editSession.getMinY(), editSession.getMaxY() ); visitor.setDirections(Arrays.asList(BreadthFirstSearch.DIAGONAL_DIRECTIONS)); visitor.visit(center); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SurfaceSphereBrush.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SurfaceSphereBrush.java index 234a2d497..26b654957 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SurfaceSphereBrush.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SurfaceSphereBrush.java @@ -25,7 +25,7 @@ public class SurfaceSphereBrush implements Brush { final RadiusMask radius = new RadiusMask(0, (int) size); RecursiveVisitor visitor = new RecursiveVisitor( new MaskIntersection(surface, radius), - vector -> editSession.setBlock(vector, pattern) + vector -> editSession.setBlock(vector, pattern), Integer.MAX_VALUE, editSession.getMinY(), editSession.getMaxY() ); visitor.visit(position); visitor.setDirections(Arrays.asList(BreadthFirstSearch.DIAGONAL_DIRECTIONS)); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SurfaceSpline.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SurfaceSpline.java index aff11cf6c..3be389898 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SurfaceSpline.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/command/tool/brush/SurfaceSpline.java @@ -37,13 +37,14 @@ public class SurfaceSpline implements Brush { public void build(EditSession editSession, BlockVector3 pos, Pattern pattern, double radius) throws MaxChangedBlocksException { int maxY = editSession.getMaxY(); + int minY = editSession.getMinY(); if (path.isEmpty() || !pos.equals(path.get(path.size() - 1))) { int max = editSession.getNearestSurfaceTerrainBlock( pos.getBlockX(), pos.getBlockZ(), pos.getBlockY(), - 0, - editSession.getMaxY() + minY, + maxY ); if (max == -1) { return; @@ -71,7 +72,7 @@ public class SurfaceSpline implements Brush { final int tipx = MathMan.roundInt(tipv.getX()); final int tipz = (int) tipv.getZ(); int tipy = MathMan.roundInt(tipv.getY()); - tipy = editSession.getNearestSurfaceTerrainBlock(tipx, tipz, tipy, 0, maxY); + tipy = editSession.getNearestSurfaceTerrainBlock(tipx, tipz, tipy, minY, maxY); if (tipy == -1) { continue; } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/AdjacentMaskParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/AdjacentMaskParser.java index 750f8bd63..d5a8dc909 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/AdjacentMaskParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/AdjacentMaskParser.java @@ -5,9 +5,13 @@ import com.fastasyncworldedit.core.function.mask.AdjacentAnyMask; import com.fastasyncworldedit.core.function.mask.AdjacentMask; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.command.util.SuggestionHelper; +import com.sk89q.worldedit.entity.Player; import com.sk89q.worldedit.extension.input.InputParseException; import com.sk89q.worldedit.extension.input.ParserContext; +import com.sk89q.worldedit.extension.platform.Locatable; +import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.mask.Mask; +import com.sk89q.worldedit.world.World; import javax.annotation.Nonnull; import java.util.stream.Stream; @@ -43,7 +47,7 @@ public class AdjacentMaskParser extends RichParser { max = min; } if (max >= 8 && min == 1) { - return new AdjacentAnyMask(subMask); + return new AdjacentAnyMask(subMask, context.getMinY(), context.getMaxY()); } return new AdjacentMask(subMask, min, max); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/RichOffsetMaskParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/RichOffsetMaskParser.java index 4bea571e1..f6a21ef6f 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/RichOffsetMaskParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/mask/RichOffsetMaskParser.java @@ -43,7 +43,7 @@ public class RichOffsetMaskParser extends RichParser { int y = Integer.parseInt(arguments[1]); int z = Integer.parseInt(arguments[2]); Mask submask = worldEdit.getMaskFactory().parseFromInput(arguments[3], context); - return new OffsetMask(submask, BlockVector3.at(x, y, z)); + return new OffsetMask(submask, BlockVector3.at(x, y, z), context.getMinY(), context.getMaxY()); } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/OffsetPatternParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/OffsetPatternParser.java index d7adf2c6b..ea2a37b6b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/OffsetPatternParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/OffsetPatternParser.java @@ -58,10 +58,7 @@ public class OffsetPatternParser extends RichParser { } else { x = y = z = Integer.parseInt(arguments[1]); } - Extent extent = context.requireExtent(); - int minY = extent.getMinY(); - int maxY = extent.getMaxY(); - return new OffsetPattern(inner, x, y, z, minY, maxY); + return new OffsetPattern(inner, x, y, z, context.getMinY(), context.getMaxY()); } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/RandomOffsetPatternParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/RandomOffsetPatternParser.java index e3efcf6e3..2250c982a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/RandomOffsetPatternParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/RandomOffsetPatternParser.java @@ -58,8 +58,7 @@ public class RandomOffsetPatternParser extends RichParser { } else { x = y = z = Integer.parseInt(arguments[1]); } - Extent extent = context.requireExtent(); - return new RandomOffsetPattern(inner, x, y, z, extent.getMinY(), extent.getMaxY()); + return new RandomOffsetPattern(inner, x, y, z, context.getMinY(), context.getMaxY()); } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/RelativePatternParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/RelativePatternParser.java index e998a6db9..688eeebd5 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/RelativePatternParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/RelativePatternParser.java @@ -41,8 +41,7 @@ public class RelativePatternParser extends RichParser { )); } Pattern inner = this.worldEdit.getPatternFactory().parseFromInput(input[0], context); - Extent extent = context.requireExtent(); - return new RelativePattern(inner, extent.getMinY(), extent.getMaxY()); + return new RelativePattern(inner, context.getMinY(), context.getMaxY()); } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/SolidRandomOffsetPatternParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/SolidRandomOffsetPatternParser.java index bd8115ea7..45b3dda76 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/SolidRandomOffsetPatternParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/SolidRandomOffsetPatternParser.java @@ -58,8 +58,7 @@ public class SolidRandomOffsetPatternParser extends RichParser { } else { x = y = z = Integer.parseInt(arguments[1]); } - Extent extent = context.requireExtent(); - return new SolidRandomOffsetPattern(inner, x, y, z, extent.getMinY(), extent.getMaxY()); + return new SolidRandomOffsetPattern(inner, x, y, z, context.getMinY(), context.getMaxY()); } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/SurfaceRandomOffsetPatternParser.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/SurfaceRandomOffsetPatternParser.java index 50c100e80..ab5a882ef 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/SurfaceRandomOffsetPatternParser.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extension/factory/parser/pattern/SurfaceRandomOffsetPatternParser.java @@ -47,8 +47,7 @@ public class SurfaceRandomOffsetPatternParser extends RichParser { } Pattern inner = this.worldEdit.getPatternFactory().parseFromInput(arguments[0], context); int distance = Integer.parseInt(arguments[1]); - Extent extent = context.requireExtent(); - return new SurfaceRandomOffsetPattern(inner, distance, extent.getMinY(), extent.getMaxY()); + return new SurfaceRandomOffsetPattern(inner, distance, context.getMinY(), context.getMaxY()); } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/ExtentHeightCacher.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/ExtentHeightCacher.java index 647df1ae5..dee157658 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/ExtentHeightCacher.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/ExtentHeightCacher.java @@ -44,7 +44,7 @@ public class ExtentHeightCacher extends PassthroughExtent { index = rx + (rz << 8); } int result = cacheHeights[index] & 0xFF; - if (result == 0) { + if (result == minY) { cacheHeights[index] = (byte) (result = lastY = super .getNearestSurfaceTerrainBlock(x, z, lastY, minY, maxY)); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/NullExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/NullExtent.java index f7cdb7844..c775bf438 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/NullExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/NullExtent.java @@ -217,6 +217,11 @@ public class NullExtent extends FaweRegionExtent implements IBatchProcessor { throw reason; } + @Override + public int getMinY() { + throw reason; + } + @Override public BlockArrayClipboard lazyCopy(Region region) { throw reason; @@ -273,21 +278,6 @@ public class NullExtent extends FaweRegionExtent implements IBatchProcessor { throw reason; } - @Override - public int getNearestSurfaceTerrainBlock(int x, int z, int y, int minY, int maxY, boolean ignoreAir) { - throw reason; - } - - @Override - public int getNearestSurfaceTerrainBlock(int x, int z, int y, int minY, int maxY) { - throw reason; - } - - @Override - public int getNearestSurfaceTerrainBlock(int x, int z, int y, int minY, int maxY, int failedMin, int failedMax) { - throw reason; - } - @Override public int getNearestSurfaceTerrainBlock(int x, int z, int y, int minY, int maxY, int failedMin, int failedMax, Mask mask) { throw reason; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/ChunkFilterBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/ChunkFilterBlock.java index a91bab7bc..2cd997fc5 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/ChunkFilterBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/filter/block/ChunkFilterBlock.java @@ -71,7 +71,7 @@ public abstract class ChunkFilterBlock extends AbstractExtentFilterBlock { */ public final IChunkSet filter(IChunk chunk, IChunkGet get, IChunkSet set, Filter filter) { initChunk(chunk.getX(), chunk.getZ()); - for (int layer = 0; layer < 16; layer++) { + for (int layer = get.getMinSectionIndex(); layer <= get.getMaxSectionIndex(); layer++) { if (set.hasSection(layer)) { initLayer(get, set, layer); filter(filter); @@ -87,7 +87,7 @@ public abstract class ChunkFilterBlock extends AbstractExtentFilterBlock { if (region != null) { region.filter(chunk, filter, this, get, set, full); } else { - for (int layer = 0; layer < 16; layer++) { + for (int layer = get.getMinSectionIndex(); layer <= get.getMaxSectionIndex(); layer++) { if ((!full && !get.hasSection(layer)) || !filter.appliesLayer(chunk, layer)) { continue; } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/LimitExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/LimitExtent.java index 308e0ae93..9a91bedf5 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/LimitExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/LimitExtent.java @@ -119,92 +119,92 @@ public class LimitExtent extends AbstractDelegateExtent { @Override public int getHighestTerrainBlock(int x, int z, int minY, int maxY) { - limit.THROW_MAX_CHECKS(FaweCache.IMP.WORLD_HEIGHT); + limit.THROW_MAX_CHECKS(maxY - minY + 1); try { return super.getHighestTerrainBlock(x, z, minY, maxY); } catch (FaweException e) { if (!limit.MAX_FAILS()) { throw e; } - return 0; + return minY; } } @Override public int getHighestTerrainBlock(int x, int z, int minY, int maxY, Mask filter) { - limit.THROW_MAX_CHECKS(FaweCache.IMP.WORLD_HEIGHT); + limit.THROW_MAX_CHECKS(maxY - minY + 1); try { return super.getHighestTerrainBlock(x, z, minY, maxY, filter); } catch (FaweException e) { if (!limit.MAX_FAILS()) { throw e; } - return 0; + return minY; } } @Override public int getNearestSurfaceLayer(int x, int z, int y, int minY, int maxY) { - limit.THROW_MAX_CHECKS(FaweCache.IMP.WORLD_HEIGHT); + limit.THROW_MAX_CHECKS(maxY - minY + 1); try { return super.getNearestSurfaceLayer(x, z, y, minY, maxY); } catch (FaweException e) { if (!limit.MAX_FAILS()) { throw e; } - return 0; + return minY; } } @Override public int getNearestSurfaceTerrainBlock(int x, int z, int y, int minY, int maxY, boolean ignoreAir) { - limit.THROW_MAX_CHECKS(FaweCache.IMP.WORLD_HEIGHT); + limit.THROW_MAX_CHECKS(maxY - minY + 1); try { return super.getNearestSurfaceTerrainBlock(x, z, y, minY, maxY, ignoreAir); } catch (FaweException e) { if (!limit.MAX_FAILS()) { throw e; } - return 0; + return minY; } } @Override public int getNearestSurfaceTerrainBlock(int x, int z, int y, int minY, int maxY) { - limit.THROW_MAX_CHECKS(FaweCache.IMP.WORLD_HEIGHT); + limit.THROW_MAX_CHECKS(maxY - minY + 1); try { return super.getNearestSurfaceTerrainBlock(x, z, y, minY, maxY); } catch (FaweException e) { if (!limit.MAX_FAILS()) { throw e; } - return 0; + return minY; } } @Override public int getNearestSurfaceTerrainBlock(int x, int z, int y, int minY, int maxY, int failedMin, int failedMax) { - limit.THROW_MAX_CHECKS(FaweCache.IMP.WORLD_HEIGHT); + limit.THROW_MAX_CHECKS(maxY - minY + 1); try { return super.getNearestSurfaceTerrainBlock(x, z, y, minY, maxY, failedMin, failedMax); } catch (FaweException e) { if (!limit.MAX_FAILS()) { throw e; } - return 0; + return minY; } } @Override public int getNearestSurfaceTerrainBlock(int x, int z, int y, int minY, int maxY, int failedMin, int failedMax, Mask mask) { - limit.THROW_MAX_CHECKS(FaweCache.IMP.WORLD_HEIGHT); + limit.THROW_MAX_CHECKS(maxY - minY + 1); try { return super.getNearestSurfaceTerrainBlock(x, z, y, minY, maxY, failedMin, failedMax, mask); } catch (FaweException e) { if (!limit.MAX_FAILS()) { throw e; } - return 0; + return minY; } } @@ -219,14 +219,14 @@ public class LimitExtent extends AbstractDelegateExtent { int failedMax, boolean ignoreAir ) { - limit.THROW_MAX_CHECKS(FaweCache.IMP.WORLD_HEIGHT); + limit.THROW_MAX_CHECKS(maxY - minY + 1); try { return super.getNearestSurfaceTerrainBlock(x, z, y, minY, maxY, failedMin, failedMax, ignoreAir); } catch (FaweException e) { if (!limit.MAX_FAILS()) { throw e; } - return 0; + return minY; } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/ArrayHeightMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/ArrayHeightMap.java index 6b977cce8..6bce75ba1 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/ArrayHeightMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/ArrayHeightMap.java @@ -11,7 +11,15 @@ public class ArrayHeightMap extends ScalableHeightMap { private double rx; private double rz; - public ArrayHeightMap(byte[][] height) { + /** + * New height map represented by byte array[][] of values x*z to be scaled given a set size + * + * @param height array of height values + * @param minY min y value allowed to be set. Inclusive. + * @param maxY max y value allowed to be set. Inclusive. + */ + public ArrayHeightMap(byte[][] height, int minY, int maxY) { + super(minY, maxY); setSize(5); this.height = height; this.width = height.length; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/FlatScalableHeightMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/FlatScalableHeightMap.java index 0c790436e..a32285a09 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/FlatScalableHeightMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/FlatScalableHeightMap.java @@ -2,8 +2,15 @@ package com.fastasyncworldedit.core.extent.processor.heightmap; public class FlatScalableHeightMap extends ScalableHeightMap { - public FlatScalableHeightMap() { - super(); + /** + * New height map where the returned height is the minmum height value if outside the size, otherwise returns height equal + * to size. + * + * @param minY min y value allowed to be set. Inclusive. + * @param maxY max y value allowed to be set. Inclusive. + */ + public FlatScalableHeightMap(int minY, int maxY) { + super(minY, maxY); } @Override @@ -12,7 +19,7 @@ public class FlatScalableHeightMap extends ScalableHeightMap { int dz = Math.abs(z); int d2 = dx * dx + dz * dz; if (d2 > size2) { - return 0; + return minY; } return size; } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/HeightMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/HeightMap.java index f98288743..421abbba4 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/HeightMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/HeightMap.java @@ -18,7 +18,6 @@ public interface HeightMap { void setSize(int size); - default void perform( EditSession session, Mask mask, @@ -83,8 +82,8 @@ public interface HeightMap { boolean towards, final boolean layers ) { - BlockVector3 top = session.getMaximumPoint(); - int maxY = top.getBlockY(); + int maxY = session.getMaxY(); + int minY = session.getMinY(); int diameter = 2 * size + 1; int centerX = pos.getBlockX(); int centerZ = pos.getBlockZ(); @@ -121,15 +120,15 @@ public interface HeightMap { } int height; if (layers) { - height = tmpY = session.getNearestSurfaceLayer(xx, zz, tmpY, 0, maxY); + height = tmpY = session.getNearestSurfaceLayer(xx, zz, tmpY, minY, maxY); } else { - height = tmpY = session.getNearestSurfaceTerrainBlock(xx, zz, tmpY, 0, maxY); + height = tmpY = session.getNearestSurfaceTerrainBlock(xx, zz, tmpY, minY, maxY); if (height == -1) { continue; } } oldData[index] = height; - if (height == 0) { + if (height == minY) { newData[index] = centerY; continue; } @@ -137,8 +136,9 @@ public interface HeightMap { int diff = targetY - height; double raiseScaled = diff * (raisePow * sizePowInv); double raiseScaledAbs = Math.abs(raiseScaled); - int random = ThreadLocalRandom.current().nextInt(256) < (int) ((Math.ceil(raiseScaledAbs) - Math.floor( - raiseScaledAbs)) * 256) ? (diff > 0 ? 1 : -1) : 0; + int random = + ThreadLocalRandom.current().nextInt(maxY + 1 - minY) - minY < (int) ((Math.ceil(raiseScaledAbs) - Math.floor( + raiseScaledAbs)) * (maxY + 1 - minY)) ? (diff > 0 ? 1 : -1) : 0; int raiseScaledInt = (int) raiseScaled + random; newData[index] = height + raiseScaledInt; } @@ -166,20 +166,22 @@ public interface HeightMap { break; } if (layers) { - height = session.getNearestSurfaceLayer(xx, zz, height, 0, maxY); + height = session.getNearestSurfaceLayer(xx, zz, height, minY, maxY); } else { - height = session.getNearestSurfaceTerrainBlock(xx, zz, height, 0, maxY); - if (height == -1) { + height = session.getNearestSurfaceTerrainBlock(xx, zz, height, minY, maxY); + if (height == minY - 1) { continue; } } oldData[index] = height; - if (height == 0) { + if (height == minY) { newData[index] = centerY; continue; } raise = (yscale * raise); - int random = ThreadLocalRandom.current().nextInt(256) < (int) ((raise - (int) raise) * (256)) ? 1 : 0; + int random = + ThreadLocalRandom.current().nextInt(maxY + 1 - minY) - minY < (int) ((raise - (int) raise) * (maxY - minY + 1)) + ? 1 : 0; int newHeight = height + (int) raise + random; newData[index] = newHeight; } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/ScalableHeightMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/ScalableHeightMap.java index 00b05e894..ff70dcf35 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/ScalableHeightMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/heightmap/ScalableHeightMap.java @@ -18,20 +18,26 @@ public class ScalableHeightMap implements HeightMap { public int size2; public int size; + protected int minY; + protected int maxY; public enum Shape { CONE, CYLINDER, } - public ScalableHeightMap() { + /** + * New height map. + * + * @param minY min y value allowed to be set. Inclusive. + * @param maxY max y value allowed to be set. Inclusive. + */ + public ScalableHeightMap(final int minY, final int maxY) { + this.minY = minY; + this.maxY = maxY; setSize(5); } - public ScalableHeightMap(int size) { - setSize(size); - } - @Override public void setSize(int size) { this.size = size; @@ -44,29 +50,29 @@ public class ScalableHeightMap implements HeightMap { int dz = Math.abs(z); int d2 = dx * dx + dz * dz; if (d2 > size2) { - return 0; + return minY; } - return Math.max(0, size - MathMan.sqrtApprox(d2)); + return Math.max(minY, size - MathMan.sqrtApprox(d2)); } - public static ScalableHeightMap fromShape(Shape shape) { + public static ScalableHeightMap fromShape(Shape shape, int minY, int maxY) { switch (shape) { default: case CONE: - return new ScalableHeightMap(); + return new ScalableHeightMap(minY, maxY); case CYLINDER: - return new FlatScalableHeightMap(); + return new FlatScalableHeightMap(minY, maxY); } } - public static ScalableHeightMap fromClipboard(Clipboard clipboard) { + public static ScalableHeightMap fromClipboard(Clipboard clipboard, int minY, int maxY) { BlockVector3 dim = clipboard.getDimensions(); byte[][] heightArray = new byte[dim.getBlockX()][dim.getBlockZ()]; - int minX = clipboard.getMinimumPoint().getBlockX(); - int minZ = clipboard.getMinimumPoint().getBlockZ(); - int minY = clipboard.getMinimumPoint().getBlockY(); - int maxY = clipboard.getMaximumPoint().getBlockY(); - int clipHeight = maxY - minY + 1; + int clipMinX = clipboard.getMinimumPoint().getBlockX(); + int clipMinZ = clipboard.getMinimumPoint().getBlockZ(); + int clipMinY = clipboard.getMinimumPoint().getBlockY(); + int clipMaxY = clipboard.getMaximumPoint().getBlockY(); + int clipHeight = clipMaxY - clipMinY + 1; HashSet visited = new HashSet<>(); MutableBlockVector3 bv = new MutableBlockVector3(); for (BlockVector3 pos : clipboard.getRegion()) { @@ -77,24 +83,24 @@ public class ScalableHeightMap implements HeightMap { visited.add(pair); int xx = pos.getBlockX(); int zz = pos.getBlockZ(); - int highestY = minY; + int highestY = clipMinY; bv.setComponents(pos); - for (int y = minY; y <= maxY; y++) { + for (int y = clipMinY; y <= clipMaxY; y++) { bv.mutY(y); BlockState block = clipboard.getBlock(bv); if (!block.getBlockType().getMaterial().isAir()) { highestY = y + 1; } } - int pointHeight = Math.min(255, (256 * (highestY - minY)) / clipHeight); - int x = xx - minX; - int z = zz - minZ; + int pointHeight = Math.min(clipMaxY, ((maxY - minY + 1 ) * (highestY - clipMinY)) / clipHeight); + int x = xx - clipMinX; + int z = zz - clipMinZ; heightArray[x][z] = (byte) pointHeight; } - return new ArrayHeightMap(heightArray); + return new ArrayHeightMap(heightArray, minY, maxY); } - public static ScalableHeightMap fromPNG(InputStream stream) throws IOException { + public static ScalableHeightMap fromPNG(InputStream stream, int minY, int maxY) throws IOException { BufferedImage heightFile = MainUtil.readImage(stream); int width = heightFile.getWidth(); int length = heightFile.getHeight(); @@ -113,7 +119,7 @@ public class ScalableHeightMap implements HeightMap { array[x][z] = (byte) intensity; } } - return new ArrayHeightMap(array); + return new ArrayHeightMap(array, minY, maxY); } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/NMSRelighter.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/NMSRelighter.java index 385f2292e..b595e5291 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/NMSRelighter.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/NMSRelighter.java @@ -60,11 +60,12 @@ public class NMSRelighter implements Relighter { private final ConcurrentHashMap concurrentLightQueue; private final RelightMode relightMode; private final int maxY; + private final int minY; private final ReentrantLock lightingLock; private final AtomicBoolean finished = new AtomicBoolean(false); private boolean removeFirst; - public NMSRelighter(IQueueExtent queue, boolean calculateHeightMaps) { + public NMSRelighter(IQueueExtent queue) { this(queue, null); } @@ -75,6 +76,7 @@ public class NMSRelighter implements Relighter { this.chunksToSend = new Long2ObjectOpenHashMap<>(12); this.concurrentLightQueue = new ConcurrentHashMap<>(12); this.maxY = queue.getMaxY(); + this.minY = queue.getMinY(); this.relightMode = relightMode != null ? relightMode : RelightMode.valueOf(Settings.IMP.LIGHTING.MODE); this.lightingLock = new ReentrantLock(); } @@ -118,6 +120,8 @@ public class NMSRelighter implements Relighter { if (m2 == null) { m2 = m1[x] = new long[4]; } + // Account for negative y values by "adding" minY + y -= minY; m2[y >> 6] |= 1L << y; } @@ -132,6 +136,8 @@ public class NMSRelighter implements Relighter { this.lightQueue.put(index, currentMap); } set(x & 15, y, z & 15, currentMap); + this.lightQueue.putAll(concurrentLightQueue); + concurrentLightQueue.clear(); } finally { lightLock.set(false); } @@ -154,7 +160,7 @@ public class NMSRelighter implements Relighter { } public boolean addChunk(int cx, int cz, byte[] fix, int bitmask) { - RelightSkyEntry toPut = new RelightSkyEntry(cx, cz, fix, bitmask); + RelightSkyEntry toPut = new RelightSkyEntry(cx, cz, fix, bitmask, minY, maxY); extendSkyToRelight.add(toPut); return true; } @@ -188,7 +194,7 @@ public class NMSRelighter implements Relighter { if (!iChunk.isInit()) { iChunk.init(queue, chunk.x, chunk.z); } - for (int i = 0; i < 16; i++) { + for (int i = minY >> 4; i <= maxY >> 4; i++) { iChunk.removeSectionLighting(i, true); } iter.remove(); @@ -238,7 +244,7 @@ public class NMSRelighter implements Relighter { for (int j = 0; j < 64; j++) { if (((value >> j) & 1) == 1) { int x = lx + bx; - int y = yStart + j; + int y = yStart + j + minY; int z = lz + bz; int oldLevel = iChunk.getEmittedLight(lx, y, lz); int newLevel = iChunk.getBrightness(lx, y, lz); @@ -287,7 +293,7 @@ public class NMSRelighter implements Relighter { removalVisited, visited ); - if (node.getY() > 0) { + if (node.getY() > minY) { this.computeRemoveBlockLight( node.getX(), node.getY() - 1, @@ -299,7 +305,7 @@ public class NMSRelighter implements Relighter { visited ); } - if (node.getY() < 255) { + if (node.getY() < maxY) { this.computeRemoveBlockLight( node.getX(), node.getY() + 1, @@ -650,7 +656,7 @@ public class NMSRelighter implements Relighter { this.computeSpreadBlockLight(x, y - 1, z, currentLight, queue, visited); } state = this.queue.getBlock(x, y + 1, z); - if (y < 255 && !top && isSlabOrTrueValue(state, "top") && isStairOrTrueTop(state, true)) { + if (y < maxY && !top && isSlabOrTrueValue(state, "top") && isStairOrTrueTop(state, true)) { this.computeSpreadBlockLight(x, y + 1, z, currentLight, queue, visited); } } @@ -696,7 +702,7 @@ public class NMSRelighter implements Relighter { this.computeSpreadBlockLight(x, y - 1, z, currentLight, queue, visited); } state = this.queue.getBlock(x, y + 1, z); - if (y < 255 && isSlabOrTrueValue(state, "top") && isStairOrTrueTop(state, false)) { + if (y < maxY && isSlabOrTrueValue(state, "top") && isStairOrTrueTop(state, false)) { this.computeSpreadBlockLight(x, y + 1, z, currentLight, queue, visited); } } @@ -944,7 +950,7 @@ public class NMSRelighter implements Relighter { int z = MathMan.unpairIntY(pair); ChunkHolder chunk = (ChunkHolder) queue.getOrCreateChunk(x, z); chunk.setBitMask(bitMask); - chunk.flushLightToGet(true); + chunk.flushLightToGet(); Fawe.imp().getPlatformAdapter().sendChunk(chunk.getOrCreateGet(), bitMask, true); iter.remove(); } @@ -984,7 +990,7 @@ public class NMSRelighter implements Relighter { } } - public void fill(byte[] mask, int chunkX, int y, int chunkZ, byte reason) { + public void fill(byte[] mask, ChunkHolder iChunk, int y, byte reason) { if (y >= 16) { Arrays.fill(mask, (byte) 15); return; @@ -995,12 +1001,10 @@ public class NMSRelighter implements Relighter { return; } case SkipReason.AIR: { - int bx = chunkX << 4; - int bz = chunkZ << 4; int index = 0; for (int z = 0; z < 16; z++) { for (int x = 0; x < 16; x++) { - mask[index++] = (byte) queue.getSkyLight(bx + x, y, bz + z); + mask[index++] = (byte) iChunk.getSkyLight(x, y, z); } } } @@ -1026,19 +1030,19 @@ public class NMSRelighter implements Relighter { } } } - for (int y = 255; y > 0; y--) { + for (int y = maxY; y > minY; y--) { for (RelightSkyEntry chunk : chunks) { // Propagate skylight - int layer = y >> 4; + int layer = (y - minY) >> 4; byte[] mask = chunk.mask; - if (chunk.fix[layer] != SkipReason.NONE) { - if ((y & 15) == 0 && layer != 0 && chunk.fix[layer - 1] == SkipReason.NONE) { - fill(mask, chunk.x, y, chunk.z, chunk.fix[layer]); - } - continue; - } int bx = chunk.x << 4; int bz = chunk.z << 4; ChunkHolder iChunk = (ChunkHolder) queue.getOrCreateChunk(chunk.x, chunk.z); + if (chunk.fix[layer] != SkipReason.NONE) { + if ((y & 15) == 0 && layer != 0 && chunk.fix[layer - 1] == SkipReason.NONE) { + fill(mask, iChunk, y, chunk.fix[layer]); + } + continue; + } if (!iChunk.isInit()) { iChunk.init(queue, chunk.x, chunk.z); } @@ -1157,29 +1161,29 @@ public class NMSRelighter implements Relighter { } byte value = mask[j]; if (x != 0 && z != 0) { - if ((value = (byte) Math.max(iChunk.getSkyLight(x - 1, y, z) - 1, value)) >= 14) { - } else if ((value = (byte) Math.max(iChunk.getSkyLight(x, y, z - 1) - 1, value)) >= 14) { + if ((value = (byte) Math.max(iChunk.getSkyLight(x - 1, y, z) - 1, value)) < 14) { + value = (byte) Math.max(iChunk.getSkyLight(x, y, z - 1) - 1, value); } if (value > mask[j]) { iChunk.setSkyLight(x, y, z, mask[j] = value); } } else if (x == 0 && z == 0) { - if ((value = (byte) Math.max(iChunkx.getSkyLight(15, y, z) - 1, value)) >= 14) { - } else if ((value = (byte) Math.max(iChunkz.getSkyLight(x, y, 15) - 1, value)) >= 14) { + if ((value = (byte) Math.max(iChunkx.getSkyLight(15, y, z) - 1, value)) < 14) { + value = (byte) Math.max(iChunkz.getSkyLight(x, y, 15) - 1, value); } if (value > mask[j]) { iChunk.setSkyLight(x, y, z, mask[j] = value); } } else if (x == 0) { - if ((value = (byte) Math.max(iChunkx.getSkyLight(15, y, z) - 1, value)) >= 14) { - } else if ((value = (byte) Math.max(iChunk.getSkyLight(x, y, z - 1) - 1, value)) >= 14) { + if ((value = (byte) Math.max(iChunkx.getSkyLight(15, y, z) - 1, value)) < 14) { + value = (byte) Math.max(iChunk.getSkyLight(x, y, z - 1) - 1, value); } if (value > mask[j]) { iChunk.setSkyLight(x, y, z, mask[j] = value); } } else { - if ((value = (byte) Math.max(iChunk.getSkyLight(x - 1, y, z) - 1, value)) >= 14) { - } else if ((value = (byte) Math.max(iChunkz.getSkyLight(x, y, 15) - 1, value)) >= 14) { + if ((value = (byte) Math.max(iChunk.getSkyLight(x - 1, y, z) - 1, value)) < 14) { + value = (byte) Math.max(iChunkz.getSkyLight(x, y, 15) - 1, value); } if (value > mask[j]) { iChunk.setSkyLight(x, y, z, mask[j] = value); @@ -1203,29 +1207,29 @@ public class NMSRelighter implements Relighter { } byte value = mask[j]; if (x != 15 && z != 15) { - if ((value = (byte) Math.max(iChunk.getSkyLight(x + 1, y, z) - 1, value)) >= 14) { - } else if ((value = (byte) Math.max(iChunk.getSkyLight(x, y, z + 1) - 1, value)) >= 14) { + if ((value = (byte) Math.max(iChunk.getSkyLight(x + 1, y, z) - 1, value)) < 14) { + value = (byte) Math.max(iChunk.getSkyLight(x, y, z + 1) - 1, value); } if (value > mask[j]) { iChunk.setSkyLight(x, y, z, mask[j] = value); } } else if (x == 15 && z == 15) { - if ((value = (byte) Math.max(iChunkx.getSkyLight(0, y, z) - 1, value)) >= 14) { - } else if ((value = (byte) Math.max(iChunkz.getSkyLight(x, y, 0) - 1, value)) >= 14) { + if ((value = (byte) Math.max(iChunkx.getSkyLight(0, y, z) - 1, value)) < 14) { + value = (byte) Math.max(iChunkz.getSkyLight(x, y, 0) - 1, value); } if (value > mask[j]) { iChunk.setSkyLight(x, y, z, mask[j] = value); } } else if (x == 15) { - if ((value = (byte) Math.max(iChunkx.getSkyLight(0, y, z) - 1, value)) >= 14) { - } else if ((value = (byte) Math.max(iChunk.getSkyLight(x, y, z + 1) - 1, value)) >= 14) { + if ((value = (byte) Math.max(iChunkx.getSkyLight(0, y, z) - 1, value)) < 14) { + value = (byte) Math.max(iChunk.getSkyLight(x, y, z + 1) - 1, value); } if (value > mask[j]) { iChunk.setSkyLight(x, y, z, mask[j] = value); } } else { - if ((value = (byte) Math.max(iChunk.getSkyLight(x + 1, y, z) - 1, value)) >= 14) { - } else if ((value = (byte) Math.max(iChunkz.getSkyLight(x, y, 0) - 1, value)) >= 14) { + if ((value = (byte) Math.max(iChunk.getSkyLight(x + 1, y, z) - 1, value)) < 14) { + value = (byte) Math.max(iChunkz.getSkyLight(x, y, 0) - 1, value); } if (value > mask[j]) { iChunk.setSkyLight(x, y, z, mask[j] = value); @@ -1235,7 +1239,7 @@ public class NMSRelighter implements Relighter { } } - private class RelightSkyEntry implements Comparable { + private static class RelightSkyEntry implements Comparable { public final int x; public final int z; @@ -1244,7 +1248,7 @@ public class NMSRelighter implements Relighter { public int bitmask; public boolean smooth; - public RelightSkyEntry(int x, int z, byte[] fix, int bitmask) { + private RelightSkyEntry(int x, int z, byte[] fix, int bitmask, int minY, int maxY) { this.x = x; this.z = z; byte[] array = new byte[256]; @@ -1252,13 +1256,14 @@ public class NMSRelighter implements Relighter { this.mask = array; this.bitmask = bitmask; if (fix == null) { - this.fix = new byte[(maxY + 1) >> 4]; + this.fix = new byte[(maxY - minY + 1) >> 4]; Arrays.fill(this.fix, SkipReason.NONE); } else { this.fix = fix; } } + //Following are public because they are public in Object. NONE of this nested class is API. @Override public String toString() { return x + "," + z; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/RelightProcessor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/RelightProcessor.java index 57af21a1a..2f46d1c90 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/RelightProcessor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/extent/processor/lighting/RelightProcessor.java @@ -28,11 +28,12 @@ public class RelightProcessor implements IBatchProcessor { if (Settings.IMP.LIGHTING.MODE == 2) { relighter.addChunk(chunk.getX(), chunk.getZ(), null, chunk.getBitMask()); } else if (Settings.IMP.LIGHTING.MODE == 1) { - byte[] fix = new byte[16]; + byte[] fix = new byte[get.getSectionCount()]; boolean relight = false; - for (int i = 15; i >= 0; i--) { + for (int i = get.getMaxSectionIndex(); i >= get.getMinSectionIndex(); i--) { if (!set.hasSection(i)) { - fix[i] = Relighter.SkipReason.AIR; + // Array index cannot be < 0 so "add" the min + fix[i - get.getMinSectionIndex()] = Relighter.SkipReason.AIR; continue; } relight = true; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/CavesGen.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/CavesGen.java index 374895bd2..6cc3eef7f 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/CavesGen.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/CavesGen.java @@ -189,11 +189,11 @@ public class CavesGen extends GenBase { n = 16; } - if (i1 < 1) { - i1 = 1; + if (i1 < chunk.getMinY() + 1) { + i1 = chunk.getMinY(); } - if (i2 > 256 - 8) { - i2 = 256 - 8; + if (i2 >= chunk.getMaxY() - 8) { + i2 = chunk.getMaxY() - 8; } if (i3 < 0) { i3 = 0; @@ -207,7 +207,7 @@ public class CavesGen extends GenBase { for (int local_x = m; !waterFound && local_x < n; local_x++) { for (int local_z = i3; !waterFound && local_z < i4; local_z++) { for (int local_y = i2 + 1; !waterFound && local_y >= i1 - 1; local_y--) { - if (local_y < 255) { + if (local_y < chunk.getMaxY()) { BlockState material = chunk.getBlock(bx + local_x, local_y, bz + local_z); if (material.getBlockType() == BlockTypes.WATER) { waterFound = true; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/OreGen.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/OreGen.java index 3ac9a9726..73262f306 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/OreGen.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/OreGen.java @@ -78,11 +78,11 @@ public class OreGen implements Resource { double d12o2 = d12 * ONE_2; int minX = MathMan.floorZero(d7 - d11o2); - int minY = Math.max(1, MathMan.floorZero(d8 - d12o2)); + int minY = Math.max(this.minY + 1, MathMan.floorZero(d8 - d12o2)); int minZ = MathMan.floorZero(d9 - d11o2); int maxX = MathMan.floorZero(d7 + d11o2); - int maxY = Math.min(255, MathMan.floorZero(d8 + d12o2)); + int maxY = Math.min(this.maxY, MathMan.floorZero(d8 + d12o2)); int maxZ = MathMan.floorZero(d9 + d11o2); double id11o2 = 1.0 / (d11o2); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/SchemGen.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/SchemGen.java index cba37c0f2..dcf2d7a36 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/SchemGen.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/generator/SchemGen.java @@ -33,7 +33,7 @@ public class SchemGen implements Resource { public boolean spawn(Random random, int x, int z) throws WorldEditException { mutable.mutX(x); mutable.mutZ(z); - int y = extent.getNearestSurfaceTerrainBlock(x, z, mutable.getBlockY(), 0, 255); + int y = extent.getNearestSurfaceTerrainBlock(x, z, mutable.getBlockY(), this.extent.getMinY(), this.extent.getMaxY()); if (y == -1) { return false; } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AdjacentAnyMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AdjacentAnyMask.java index 877890018..a72150d65 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AdjacentAnyMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AdjacentAnyMask.java @@ -12,10 +12,14 @@ public class AdjacentAnyMask extends AbstractMask implements ResettableMask { private final CachedMask mask; private final MutableBlockVector3 mutable; + private final int minY; + private final int maxY; - public AdjacentAnyMask(Mask mask) { + public AdjacentAnyMask(Mask mask, int minY, int maxY) { this.mask = CachedMask.cache(mask); mutable = new MutableBlockVector3(); + this.minY = minY; + this.maxY = maxY; } @Override @@ -44,9 +48,9 @@ public class AdjacentAnyMask extends AbstractMask implements ResettableMask { return mutable.setComponents(0, 0, 1); } else if (mask.test(x, y, z - 1)) { return mutable.setComponents(0, 0, -1); - } else if (y < 256 && mask.test(x, y + 1, z)) { + } else if (y < maxY && mask.test(x, y + 1, z)) { return mutable.setComponents(0, 1, 0); - } else if (y > 0 && mask.test(x, y - 1, z)) { + } else if (y > minY && mask.test(x, y - 1, z)) { return mutable.setComponents(0, -1, 0); } else { return null; @@ -55,7 +59,7 @@ public class AdjacentAnyMask extends AbstractMask implements ResettableMask { @Override public Mask copy() { - return new AdjacentAnyMask(mask.copy()); + return new AdjacentAnyMask(mask.copy(), minY, maxY); } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AngleMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AngleMask.java index 10c73bd80..b10285b69 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AngleMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/AngleMask.java @@ -18,6 +18,7 @@ public class AngleMask extends SolidBlockMask implements ResettableMask { protected final boolean overlay; protected final boolean checkFirst; protected final int maxY; + protected final int minY; protected final int distance; public AngleMask(Extent extent, double min, double max, boolean overlay, int distance) { @@ -26,7 +27,8 @@ public class AngleMask extends SolidBlockMask implements ResettableMask { this.min = min; this.max = max; this.checkFirst = max >= (Math.tan(90 * (Math.PI / 180))); - this.maxY = extent.getMaximumPoint().getBlockY(); + this.maxY = extent.getMaxY(); + this.minY = extent.getMinY(); this.overlay = overlay; this.distance = distance; } @@ -77,7 +79,7 @@ public class AngleMask extends SolidBlockMask implements ResettableMask { } int result = cacheHeights[index] & 0xFF; if (y > result) { - cacheHeights[index] = (byte) (result = lastY = extent.getNearestSurfaceTerrainBlock(x, z, lastY, 0, maxY)); + cacheHeights[index] = (byte) (result = lastY = extent.getNearestSurfaceTerrainBlock(x, z, lastY, minY, maxY)); } return result; } catch (Throwable e) { @@ -141,10 +143,10 @@ public class AngleMask extends SolidBlockMask implements ResettableMask { if (!mask.test(x, y, z - 1)) { return true; } - if (y < 255 && !mask.test(x, y + 1, z)) { + if (y < maxY && !mask.test(x, y + 1, z)) { return true; } - return y > 0 && !mask.test(x, y - 1, z); + return y > minY && !mask.test(x, y - 1, z); } @Override @@ -164,7 +166,7 @@ public class AngleMask extends SolidBlockMask implements ResettableMask { return false; } if (overlay) { - if (y < 255 && !adjacentAir(vector)) { + if (y < maxY && !adjacentAir(vector)) { return lastValue = false; } } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/CachedMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/CachedMask.java index e2fa01756..7d3adbed0 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/CachedMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/CachedMask.java @@ -57,9 +57,10 @@ public class CachedMask extends AbstractDelegateMask implements ResettableMask { return result; } catch (UnsupportedOperationException ignored) { boolean result = getMask().test(mutable.setComponents(x, y, z)); - if (y < 0 || y > 255) { - return result; - } + // Assume that the mask won't be given y outside the world range + // if (y < 0 || y > 255) { + // return result; + //} resetCache(); cache_checked.setOffset(x, z); cache_results.setOffset(x, z); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/MaskedTargetBlock.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/MaskedTargetBlock.java index 6e7c48291..fc558aee7 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/MaskedTargetBlock.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/MaskedTargetBlock.java @@ -25,10 +25,10 @@ public class MaskedTargetBlock extends TargetBlock { if (!mask.test(current.toBlockPoint())) { if (searchForLastBlock) { lastBlock = current; - if (lastBlock.getBlockY() <= 0 || lastBlock.getBlockY() >= world.getMaxY()) { + if (lastBlock.getBlockY() <= world.getMinY() || lastBlock.getBlockY() >= world.getMaxY()) { searchForLastBlock = false; } - } else if (current.getBlockY() <= 0) { + } else if (current.getBlockY() <= world.getMinY()) { break; } } else { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/SurfaceMask.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/SurfaceMask.java index 1bfc6e8eb..6d935e103 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/SurfaceMask.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/mask/SurfaceMask.java @@ -9,7 +9,7 @@ import com.sk89q.worldedit.world.block.BlockTypes; public class SurfaceMask extends AdjacentAnyMask { public SurfaceMask(Extent extent) { - super(getMask(extent)); + super(getMask(extent), extent.getMinY(), extent.getMaxY()); } public static AbstractExtentMask getMask(Extent extent) { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/AngleColorPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/AngleColorPattern.java index 892e1830a..a13061951 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/AngleColorPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/AngleColorPattern.java @@ -45,8 +45,8 @@ public class AngleColorPattern extends AnglePattern { int x = vector.getBlockX(); int y = vector.getBlockY(); int z = vector.getBlockZ(); - int height = extent.getNearestSurfaceTerrainBlock(x, z, y, 0, maxY); - if (height > 0) { + int height = extent.getNearestSurfaceTerrainBlock(x, z, y, minY, maxY); + if (height > minY) { BlockState below = extent.getBlock(x, height - 1, z); if (!below.getBlockType().getMaterial().isMovementBlocker()) { return Integer.MAX_VALUE; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/AnglePattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/AnglePattern.java index 6c8ca56dc..0e4d5262b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/AnglePattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/AnglePattern.java @@ -13,6 +13,7 @@ public abstract class AnglePattern extends AbstractPattern { public final double factor; public final Extent extent; public final int maxY; + public final int minY; public final int distance; /** @@ -23,9 +24,10 @@ public abstract class AnglePattern extends AbstractPattern { */ public AnglePattern(Extent extent, int distance) { this.extent = new ExtentHeightCacher(extent); - this.maxY = extent.getMaximumPoint().getBlockY(); + this.maxY = extent.getMaxY(); + this.minY = extent.getMinY(); this.distance = distance; - this.factor = (1D / distance) * (1D / 255); + this.factor = (1D / distance) * (1D / maxY); } public > int getSlope(T block, BlockVector3 vector, Extent extent) { @@ -36,29 +38,29 @@ public abstract class AnglePattern extends AbstractPattern { return -1; } int slope = Math.abs( - extent.getNearestSurfaceTerrainBlock(x + distance, z, y, 0, maxY) - extent - .getNearestSurfaceTerrainBlock(x - distance, z, y, 0, maxY)) * 7; + extent.getNearestSurfaceTerrainBlock(x + distance, z, y, minY, maxY) - extent + .getNearestSurfaceTerrainBlock(x - distance, z, y, minY, maxY)) * 7; slope += Math.abs(extent.getNearestSurfaceTerrainBlock( x, z + distance, y, - 0, + minY, maxY - ) - extent.getNearestSurfaceTerrainBlock(x, z - distance, y, 0, maxY)) * 7; + ) - extent.getNearestSurfaceTerrainBlock(x, z - distance, y, minY, maxY)) * 7; slope += Math.abs(extent.getNearestSurfaceTerrainBlock( x + distance, z + distance, y, - 0, + minY, maxY - ) - extent.getNearestSurfaceTerrainBlock(x - distance, z - distance, y, 0, maxY)) * 5; + ) - extent.getNearestSurfaceTerrainBlock(x - distance, z - distance, y, minY, maxY)) * 5; slope += Math.abs(extent.getNearestSurfaceTerrainBlock( x - distance, z + distance, y, - 0, + minY, maxY - ) - extent.getNearestSurfaceTerrainBlock(x + distance, z - distance, y, 0, maxY)) * 5; + ) - extent.getNearestSurfaceTerrainBlock(x + distance, z - distance, y, minY, maxY)) * 5; return slope; } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/OffsetPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/OffsetPattern.java index eda121d6d..894f9d06a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/OffsetPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/OffsetPattern.java @@ -7,6 +7,7 @@ import com.sk89q.worldedit.function.pattern.AbstractPattern; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.block.BaseBlock; +import com.sk89q.worldedit.world.block.BlockTypes; public class OffsetPattern extends AbstractPattern { @@ -42,6 +43,9 @@ public class OffsetPattern extends AbstractPattern { mutable.mutX(position.getX() + dx); mutable.mutY(position.getY() + dy); mutable.mutZ(position.getZ() + dz); + if (mutable.getY() < minY || mutable.getY() > maxY) { + return BlockTypes.AIR.getDefaultState().toBaseBlock(); + } return pattern.applyBlock(mutable); } @@ -49,10 +53,10 @@ public class OffsetPattern extends AbstractPattern { public boolean apply(Extent extent, BlockVector3 get, BlockVector3 set) throws WorldEditException { mutable.mutX(get.getX() + dx); mutable.mutY(get.getY() + dy); - if (mutable.getY() < minY || mutable.getY() > maxY) { + mutable.mutZ(get.getZ() + dz); + if (mutable.getY() < extent.getMinY() || mutable.getY() > extent.getMaxY()) { return false; } - mutable.mutZ(get.getZ() + dz); return pattern.apply(extent, get, mutable); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/RandomOffsetPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/RandomOffsetPattern.java index aae82e9fe..3eb5c3b77 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/RandomOffsetPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/RandomOffsetPattern.java @@ -7,6 +7,7 @@ import com.sk89q.worldedit.function.pattern.AbstractPattern; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.block.BaseBlock; +import com.sk89q.worldedit.world.block.BlockTypes; import java.util.SplittableRandom; @@ -32,8 +33,8 @@ public class RandomOffsetPattern extends AbstractPattern { * @param dx offset x * @param dy offset y * @param dz offset z - * @param minY min applicable y (inclusive - * @param maxY max applicable y (inclusive + * @param minY min applicable y (inclusive) + * @param maxY max applicable y (inclusive) */ public RandomOffsetPattern(Pattern pattern, int dx, int dy, int dz, int minY, int maxY) { this.pattern = pattern; @@ -54,6 +55,9 @@ public class RandomOffsetPattern extends AbstractPattern { mutable.mutX((position.getX() + r.nextInt(dx2) - dx)); mutable.mutY((position.getY() + r.nextInt(dy2) - dy)); mutable.mutZ((position.getZ() + r.nextInt(dz2) - dz)); + if (mutable.getY() < minY || mutable.getY() > maxY) { + return BlockTypes.AIR.getDefaultState().toBaseBlock(); + } return pattern.applyBlock(mutable); } @@ -62,7 +66,7 @@ public class RandomOffsetPattern extends AbstractPattern { mutable.mutX((set.getX() + r.nextInt(dx2) - dx)); mutable.mutY((set.getY() + r.nextInt(dy2) - dy)); mutable.mutZ((set.getZ() + r.nextInt(dz2) - dz)); - if (mutable.getY() < minY || mutable.getY() > maxY) { + if (mutable.getY() < extent.getMinY() || mutable.getY() > extent.getMaxY()) { return false; } return pattern.apply(extent, get, mutable); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/RelativePattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/RelativePattern.java index 3501d1645..cda875f04 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/RelativePattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/RelativePattern.java @@ -7,6 +7,7 @@ import com.sk89q.worldedit.function.pattern.AbstractPattern; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.block.BaseBlock; +import com.sk89q.worldedit.world.block.BlockTypes; public class RelativePattern extends AbstractPattern implements ResettablePattern { @@ -37,6 +38,9 @@ public class RelativePattern extends AbstractPattern implements ResettablePatter mutable.mutX(pos.getX() - origin.getX()); mutable.mutY(pos.getY() - origin.getY()); mutable.mutZ(pos.getZ() - origin.getZ()); + if (mutable.getY() < minY || mutable.getY() > maxY) { + return BlockTypes.AIR.getDefaultState().toBaseBlock(); + } return pattern.applyBlock(mutable); } @@ -47,10 +51,10 @@ public class RelativePattern extends AbstractPattern implements ResettablePatter } mutable.mutX(set.getX() - origin.getX()); mutable.mutY(set.getY() - origin.getY()); - if (mutable.getY() < minY || mutable.getY() > maxY) { + mutable.mutZ(set.getZ() - origin.getZ()); + if (mutable.getY() < extent.getMinY() || mutable.getY() > extent.getMaxY()) { return false; } - mutable.mutZ(set.getZ() - origin.getZ()); return pattern.apply(extent, get, mutable); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/SolidRandomOffsetPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/SolidRandomOffsetPattern.java index a8be79b62..12b64a497 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/SolidRandomOffsetPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/SolidRandomOffsetPattern.java @@ -66,6 +66,12 @@ public class SolidRandomOffsetPattern extends AbstractPattern { mutable.mutX(position.getX() + r.nextInt(dx2) - dx); mutable.mutY(position.getY() + r.nextInt(dy2) - dy); mutable.mutZ(position.getZ() + r.nextInt(dz2) - dz); + if (mutable.getY() < minY || mutable.getY() > maxY) { + return BlockTypes.AIR.getDefaultState().toBaseBlock(); + } + if (mutable.getY() < minY || mutable.getY() > maxY) { + return BlockTypes.AIR.getDefaultState().toBaseBlock(); + } BaseBlock block = pattern.applyBlock(mutable); if (block.getMaterial().isSolid()) { return block; @@ -77,10 +83,10 @@ public class SolidRandomOffsetPattern extends AbstractPattern { public boolean apply(Extent extent, BlockVector3 get, BlockVector3 set) throws WorldEditException { mutable.mutX(set.getX() + r.nextInt(dx2) - dx); mutable.mutY(set.getY() + r.nextInt(dy2) - dy); - if (mutable.getY() < minY || mutable.getY() > maxY) { + mutable.mutZ(set.getZ() + r.nextInt(dz2) - dz); + if (mutable.getY() < extent.getMinY() || mutable.getY() > extent.getMaxY()) { return false; } - mutable.mutZ(set.getZ() + r.nextInt(dz2) - dz); BaseBlock block = pattern.applyBlock(mutable); if (block.getMaterial().isSolid()) { return pattern.apply(extent, get, mutable); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/SurfaceRandomOffsetPattern.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/SurfaceRandomOffsetPattern.java index 6b531ccf5..73327f94a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/SurfaceRandomOffsetPattern.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/pattern/SurfaceRandomOffsetPattern.java @@ -1,6 +1,8 @@ package com.fastasyncworldedit.core.function.pattern; import com.fastasyncworldedit.core.math.MutableBlockVector3; +import com.sk89q.worldedit.WorldEditException; +import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.AbstractPattern; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.function.visitor.BreadthFirstSearch; @@ -41,6 +43,11 @@ public class SurfaceRandomOffsetPattern extends AbstractPattern { allowed = new MutableBlockVector3[buffer.length]; } + @Override + public boolean apply(final Extent extent, final BlockVector3 get, final BlockVector3 set) throws WorldEditException { + return super.apply(extent, get, set); + } + @Override public BaseBlock applyBlock(BlockVector3 position) { return pattern.applyBlock(travel(position)); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/AboveVisitor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/AboveVisitor.java index a41985332..d2503447b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/AboveVisitor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/AboveVisitor.java @@ -22,13 +22,12 @@ public class AboveVisitor extends RecursiveVisitor { * @param mask the mask * @param function the function * @param baseY the base Y + * @param depth maximum number of iterations + * @param minY min visitable y value. Inclusive. + * @param maxY max visitable y value. Inclusive. */ - public AboveVisitor(Mask mask, RegionFunction function, int baseY) { - this(mask, function, baseY, Integer.MAX_VALUE); - } - - public AboveVisitor(Mask mask, RegionFunction function, int baseY, int depth) { - super(mask, function, depth); + public AboveVisitor(Mask mask, RegionFunction function, int baseY, int depth, int minY, int maxY) { + super(mask, function, depth, minY, maxY); checkNotNull(mask); this.baseY = baseY; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/DirectionalVisitor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/DirectionalVisitor.java index c7ee64002..b7b14059b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/DirectionalVisitor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/function/visitor/DirectionalVisitor.java @@ -19,12 +19,22 @@ public class DirectionalVisitor extends RecursiveVisitor { private final BlockVector3 origin; private final BlockVector3 dirVec; - public DirectionalVisitor(Mask mask, RegionFunction function, BlockVector3 origin, BlockVector3 direction) { - this(mask, function, origin, direction, Integer.MAX_VALUE); - } - - public DirectionalVisitor(Mask mask, RegionFunction function, BlockVector3 origin, BlockVector3 direction, int distance) { - super(mask, function, distance); + /** + * New visitor. Only visits in the given direction + * + * @param mask block mask + * @param function function to apply + * @param origin start position + * @param direction allowable direction to visit between + * @param distance max number of iterations + * @param minY min visitable y value. Inclusive. + * @param maxY max visitable y value. Inclusive. + */ + public DirectionalVisitor( + Mask mask, RegionFunction function, BlockVector3 origin, BlockVector3 direction, int distance, + int minY, int maxY + ) { + super(mask, function, distance, minY, maxY); checkNotNull(mask); this.origin = origin; this.dirVec = direction; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/DiskStorageHistory.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/DiskStorageHistory.java index f8e7381e3..7ea8dfbdc 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/DiskStorageHistory.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/DiskStorageHistory.java @@ -102,6 +102,7 @@ public class DiskStorageHistory extends FaweStreamChangeSet { nbttFile = new File(folder, index + ".nbtt"); entfFile = new File(folder, index + ".entf"); enttFile = new File(folder, index + ".entt"); + //Switch file ending due to new (sort-of) format. (Added e for Extended height) bdFile = new File(folder, index + ".bd"); bioFile = new File(folder, index + ".bio"); } @@ -431,6 +432,8 @@ public class DiskStorageHistory extends FaweStreamChangeSet { final FaweInputStream gis = MainUtil.getCompressedIS(fis); // skip mode gis.skipFully(1); + // skip version + gis.skipFully(1); // origin ox = ((gis.read() << 24) + (gis.read() << 16) + (gis.read() << 8) + gis.read()); oz = ((gis.read() << 24) + (gis.read() << 16) + (gis.read() << 8) + gis.read()); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/AbstractChangeSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/AbstractChangeSet.java index e7e16f5d9..221001daf 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/AbstractChangeSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/AbstractChangeSet.java @@ -157,7 +157,7 @@ public abstract class AbstractChangeSet implements ChangeSet, IBatchProcessor { addEntityCreate(tag); } } - for (int layer = 0; layer < 16; layer++) { + for (int layer = get.getMinSectionIndex(); layer <= get.getMaxSectionIndex(); layer++) { if (!set.hasSection(layer)) { continue; } @@ -172,6 +172,7 @@ public abstract class AbstractChangeSet implements ChangeSet, IBatchProcessor { char[] blocksSet; System.arraycopy(set.load(layer), 0, (blocksSet = new char[4096]), 0, 4096); + // Account for negative layers int by = layer << 4; for (int y = 0, index = 0; y < 16; y++) { int yy = y + by; @@ -195,14 +196,21 @@ public abstract class AbstractChangeSet implements ChangeSet, IBatchProcessor { BiomeType[] biomes = set.getBiomes(); if (biomes != null) { - for (int y = 0, index = 0; y < 64; y++) { - for (int z = 0; z < 4; z++) { - for (int x = 0; x < 4; x++, index++) { - BiomeType newBiome = biomes[index]; - if (newBiome != null) { - BiomeType oldBiome = get.getBiomeType(x, y, z); - if (oldBiome != newBiome) { - addBiomeChange(bx + (x << 2), y << 2, bz + (z << 2), oldBiome, newBiome); + int index = 0; + for (int layer = get.getMinSectionIndex(); layer <= get.getMaxSectionIndex(); layer++) { + if (!set.hasBiomes(layer)) { + continue; + } + int yy = layer << 4; + for (int y = 0; y < 4; y++) { + for (int z = 0; z < 4; z++) { + for (int x = 0; x < 4; x++, index++) { + BiomeType newBiome = biomes[index]; + if (newBiome != null) { + BiomeType oldBiome = get.getBiomeType(x, y, z); + if (oldBiome != newBiome) { + addBiomeChange(bx + (x << 2), yy + (y << 2), bz + (z << 2), oldBiome, newBiome); + } } } } @@ -341,11 +349,17 @@ public abstract class AbstractChangeSet implements ChangeSet, IBatchProcessor { return addWriteTask(writeTask, Fawe.isMainThread()); } - public Future addWriteTask(Runnable writeTask, boolean completeNow) { + public Future addWriteTask(final Runnable writeTask, final boolean completeNow) { AbstractChangeSet.this.waitingCombined.incrementAndGet(); Runnable wrappedTask = () -> { try { writeTask.run(); + } catch (Throwable t) { + if (completeNow) { + throw t; + } else { + t.printStackTrace(); + } } finally { if (AbstractChangeSet.this.waitingCombined.decrementAndGet() <= 0) { synchronized (AbstractChangeSet.this.waitingAsync) { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/FaweStreamChangeSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/FaweStreamChangeSet.java index 8534c7d81..c780297cc 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/FaweStreamChangeSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/history/changeset/FaweStreamChangeSet.java @@ -28,11 +28,16 @@ import java.util.Collections; import java.util.Iterator; import java.util.NoSuchElementException; +/** + * FAWE stream ChangeSet offering support for extended-height worlds + */ public abstract class FaweStreamChangeSet extends AbstractChangeSet { public static final int HEADER_SIZE = 9; + private static final int version = 1; private int mode; private final int compression; + private final int minY; protected FaweStreamIdDelegate idDel; protected FaweStreamPositionDelegate posDel; @@ -44,6 +49,7 @@ public abstract class FaweStreamChangeSet extends AbstractChangeSet { public FaweStreamChangeSet(World world, int compression, boolean storeRedo, boolean smallLoc) { super(world); this.compression = compression; + this.minY = world.getMinY(); init(storeRedo, smallLoc); } @@ -139,6 +145,10 @@ public abstract class FaweStreamChangeSet extends AbstractChangeSet { @Override public void write(OutputStream out, int x, int y, int z) throws IOException { + if (y < 0 || y > 255) { + throw new UnsupportedOperationException("y cannot be outside range 0-255 for " + + "small-edits=true"); + } int rx = -lx + (lx = x); int ry = -ly + (ly = y); int rz = -lz + (lz = z); @@ -174,7 +184,7 @@ public abstract class FaweStreamChangeSet extends AbstractChangeSet { }; } else { posDel = new FaweStreamPositionDelegate() { - final byte[] buffer = new byte[5]; + final byte[] buffer = new byte[6]; int lx; int ly; int lz; @@ -188,7 +198,8 @@ public abstract class FaweStreamChangeSet extends AbstractChangeSet { stream.write(((rx) >> 8) & 0xff); stream.write((rz) & 0xff); stream.write(((rz) >> 8) & 0xff); - stream.write((byte) ry); + stream.write((ry) & 0xff); + stream.write(((ry) >> 8) & 0xff); } @Override @@ -199,7 +210,7 @@ public abstract class FaweStreamChangeSet extends AbstractChangeSet { @Override public int readY(FaweInputStream is) throws IOException { - return (ly = (ly + (buffer[4]))) & 0xFF; + return ly = (ly + (buffer[4] & 0xFF) + (buffer[5] << 8)); } @Override @@ -212,6 +223,8 @@ public abstract class FaweStreamChangeSet extends AbstractChangeSet { public void writeHeader(OutputStream os, int x, int y, int z) throws IOException { os.write(mode); + // Allows for version detection of history in case of changes to format. + os.write(version); setOrigin(x, z); os.write((byte) (x >> 24)); os.write((byte) (x >> 16)); @@ -227,6 +240,10 @@ public abstract class FaweStreamChangeSet extends AbstractChangeSet { public void readHeader(InputStream is) throws IOException { // skip mode int mode = is.read(); + int version = is.read(); + if (version != FaweStreamChangeSet.version) { + throw new UnsupportedOperationException(String.format("Version %s history not supported!", version)); + } // origin int x = ((is.read() << 24) + (is.read() << 16) + (is.read() << 8) + is.read()); int z = ((is.read() << 24) + (is.read() << 16) + (is.read() << 8) + is.read()); @@ -290,10 +307,6 @@ public abstract class FaweStreamChangeSet extends AbstractChangeSet { public abstract NBTInputStream getTileRemoveIS() throws IOException; protected int blockSize; - public int entityCreateSize; - public int entityRemoveSize; - public int tileCreateSize; - public int tileRemoveSize; private int originX; private int originZ; @@ -325,9 +338,12 @@ public abstract class FaweStreamChangeSet extends AbstractChangeSet { } @Override - public void addBiomeChange(int x, int y, int z, BiomeType from, BiomeType to) { + public void addBiomeChange(int bx, int by, int bz, BiomeType from, BiomeType to) { blockSize++; try { + int x = bx >> 2; + int y = by >> 2; + int z = bz >> 2; FaweOutputStream os = getBiomeOS(); os.write((byte) (x >> 24)); os.write((byte) (x >> 16)); @@ -337,7 +353,9 @@ public abstract class FaweStreamChangeSet extends AbstractChangeSet { os.write((byte) (z >> 16)); os.write((byte) (z >> 8)); os.write((byte) (z)); - os.write((byte) (y)); + // only need to store biomes in the 4x4x4 chunks so only need one byte for y still (signed byte -128 -> 127) + // means -512 -> 508. Add 128 to avoid negative value casting. + os.write((byte) (y + 128)); os.writeVarInt(from.getInternalId()); os.writeVarInt(to.getInternalId()); } catch (Throwable e) { @@ -465,9 +483,9 @@ public abstract class FaweStreamChangeSet extends AbstractChangeSet { try { int int1 = is.read(); if (int1 != -1) { - int x = ((int1 << 24) + (is.read() << 16) + (is.read() << 8) + is.read()); - int z = ((is.read() << 24) + (is.read() << 16) + (is.read() << 8) + is.read()); - int y = is.read(); + int x = ((int1 << 24) + (is.read() << 16) + (is.read() << 8) + is.read()) << 2; + int z = ((is.read() << 24) + (is.read() << 16) + (is.read() << 8) + is.read()) << 2; + int y = (is.read() - 128) << 2; int from = is.readVarInt(); int to = is.readVarInt(); change.setBiome(x, y, z, from, to); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/BlockVector3ChunkMap.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/BlockVector3ChunkMap.java index 49dc09e27..775f96e4d 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/BlockVector3ChunkMap.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/BlockVector3ChunkMap.java @@ -3,26 +3,26 @@ package com.fastasyncworldedit.core.math; import com.fastasyncworldedit.core.util.MathMan; import com.fastasyncworldedit.core.util.collection.IAdaptedMap; import com.sk89q.worldedit.math.BlockVector3; -import it.unimi.dsi.fastutil.shorts.Short2ObjectArrayMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; import java.util.Map; -public class BlockVector3ChunkMap implements IAdaptedMap { +public class BlockVector3ChunkMap implements IAdaptedMap { - private final Short2ObjectArrayMap map = new Short2ObjectArrayMap<>(); + private final Int2ObjectArrayMap map = new Int2ObjectArrayMap<>(); @Override - public Map getParent() { + public Map getParent() { return map; } @Override - public Short adaptKey(BlockVector3 key) { + public Integer adaptKey(BlockVector3 key) { return MathMan.tripleBlockCoord(key.getX(), key.getY(), key.getZ()); } @Override - public BlockVector3 adaptKey2(Short key) { + public BlockVector3 adaptKey2(Integer key) { int x = MathMan.untripleBlockCoordX(key); int y = MathMan.untripleBlockCoordY(key); int z = MathMan.untripleBlockCoordZ(key); @@ -40,23 +40,23 @@ public class BlockVector3ChunkMap implements IAdaptedMap implements int newSize = count + size; if (newSize > index) { int localIndex = index - count; - BlockVector3 pos = set.getIndex(localIndex); + MutableBlockVector3 pos = set.getIndex(localIndex); if (pos != null) { int pair = entry.getIntKey(); int cx = MathMan.unpairX(pair); int cz = MathMan.unpairY(pair); - pos = pos.mutX((cx << 11) + pos.getBlockX()); - pos = pos.mutZ((cz << 11) + pos.getBlockZ()); - return pos; + pos.mutX((cx << 11) + pos.getBlockX()); + pos.mutZ((cz << 11) + pos.getBlockZ()); + return pos.toImmutable(); } } count += newSize; @@ -91,7 +91,7 @@ public class BlockVectorSet extends AbstractCollection implements if (!entries.hasNext()) { return Collections.emptyIterator(); } - return new Iterator() { + return new Iterator<>() { Int2ObjectMap.Entry entry = entries.next(); Iterator entryIter = entry.getValue().iterator(); final MutableBlockVector3 mutable = new MutableBlockVector3(); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/LocalBlockVectorSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/LocalBlockVectorSet.java index fcef656e5..92b904610 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/LocalBlockVectorSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/math/LocalBlockVectorSet.java @@ -11,14 +11,14 @@ import java.util.Set; /** * The LocalBlockVectorSet is a Memory and CPU optimized Set for storing BlockVectors which are all in a local region - * - All vectors must be in a 2048 * 2048 area centered around the first entry + * - All vectors must be in a 2048 * 512 * 2048 area centered around the first entry * - This will use 8 bytes for every 64 BlockVectors (about 800x less than a HashSet) */ public class LocalBlockVectorSet implements Set { + private final SparseBitSet set; private int offsetX; private int offsetZ; - private final SparseBitSet set; public LocalBlockVectorSet() { offsetX = offsetZ = Integer.MAX_VALUE; @@ -42,7 +42,8 @@ public class LocalBlockVectorSet implements Set { } public boolean contains(int x, int y, int z) { - return set.get(MathMan.tripleSearchCoords(x - offsetX, y, z - offsetZ)); + // take 128 to fit -256 { if (size() < length * length * length) { int index = -1; while ((index = set.nextSetBit(index + 1)) != -1) { - int b1 = (byte) (index >> 0) & 0xFF; - int b2 = (byte) (index >> 8) & 0x7F; - int b3 = (byte) (index >> 15) & 0xFF; - int b4 = (byte) (index >> 23) & 0xFF; - if (Math.abs((offsetX + (((b3 + ((MathMan.unpair8x(b2)) << 8)) << 21) >> 21)) - x) <= radius && Math.abs((offsetZ + (((b4 + ((MathMan - .unpair8y(b2)) << 8)) << 21) >> 21)) - z) <= radius && Math.abs((b1) - y) <= radius) { + int b1 = (index & 0xFF); + int b2 = (index >> 8) & 0xff; + int b3 = (index >> 15) & 0xFF; + int b4 = (index >> 23) & 0xFF; + int ix = (offsetX + (b3 + (((b2 & 0x7)) << 8)) << 21) >> 21; + // Add 128 as we shift y by 128 to fit -256> 6) & 0x1) == 0 ? 1 : -1); + int iz = (offsetZ + (b4 + (((b2 >> 3) & 0x7) << 8)) << 21) >> 21; + if (Math.abs(ix - x) <= radius && Math.abs(iz - z) <= radius && Math.abs(iy - y) <= radius) { return true; } } @@ -100,7 +104,7 @@ public class LocalBlockVectorSet implements Set { this.offsetZ = z; } - protected BlockVector3 getIndex(int getIndex) { + protected MutableBlockVector3 getIndex(int getIndex) { int size = size(); if (getIndex > size) { return null; @@ -110,13 +114,15 @@ public class LocalBlockVectorSet implements Set { index = set.nextSetBit(index + 1); } if (index != -1) { - int b1 = (byte) (index >> 0) & 0xFF; - int b2 = (byte) (index >> 8) & 0x7F; - int b3 = (byte) (index >> 15) & 0xFF; - int b4 = (byte) (index >> 23) & 0xFF; - int x = offsetX + (((b3 + (MathMan.unpair8x(b2) << 8)) << 21) >> 21); - int z = offsetZ + (((b4 + (MathMan.unpair8y(b2) << 8)) << 21) >> 21); - return MutableBlockVector3.get(x, b1, z); + int b1 = (index & 0xFF); + int b2 = (index >> 8) & 0xff; + int b3 = (index >> 15) & 0xFF; + int b4 = (index >> 23) & 0xFF; + int x = (offsetX + (b3 + (((b2 & 0x7)) << 8)) << 21) >> 21; + // Add 128 as we shift y by 128 to fit -256> 6) & 0x1) == 0 ? 1 : -1); + int z = (offsetZ + (b4 + (((b2 >> 3) & 0x7) << 8)) << 21) >> 21; + return MutableBlockVector3.get(x, y, z); } return null; } @@ -125,9 +131,9 @@ public class LocalBlockVectorSet implements Set { @Override public Iterator iterator() { return new Iterator() { + final MutableBlockVector3 mutable = new MutableBlockVector3(0, 0, 0); int index = set.nextSetBit(0); int previous = -1; - final MutableBlockVector3 mutable = new MutableBlockVector3(0, 0, 0); @Override public void remove() { @@ -143,12 +149,16 @@ public class LocalBlockVectorSet implements Set { public BlockVector3 next() { if (index != -1) { int b1 = (index & 0xFF); - int b2 = ((byte) (index >> 8)) & 0x7F; - int b3 = ((byte) (index >> 15)) & 0xFF; - int b4 = ((byte) (index >> 23)) & 0xFF; - mutable.mutX(offsetX + (((b3 + (MathMan.unpair8x(b2) << 8)) << 21) >> 21)); - mutable.mutY(b1); - mutable.mutZ(offsetZ + (((b4 + (MathMan.unpair8y(b2) << 8)) << 21) >> 21)); + int b2 = (index >> 8) & 0xff; + int b3 = (index >> 15) & 0xFF; + int b4 = (index >> 23) & 0xFF; + int x = (offsetX + (b3 + (((b2 & 0x7)) << 8)) << 21) >> 21; + // Add 128 as we shift y by 128 to fit -256> 6) & 0x1) == 0 ? 1 : -1); + int z = (offsetZ + (b4 + (((b2 >> 3) & 0x7) << 8)) << 21) >> 21; + mutable.mutX(x); + mutable.mutY(y); + mutable.mutZ(z); previous = index; index = set.nextSetBit(index + 1); return mutable; @@ -175,12 +185,14 @@ public class LocalBlockVectorSet implements Set { for (int i = 0; i < size; i++) { index = set.nextSetBit(index); int b1 = (index & 0xFF); - int b2 = ((byte) (index >> 8)) & 0x7F; - int b3 = ((byte) (index >> 15)) & 0xFF; - int b4 = ((byte) (index >> 23)) & 0xFF; - int x = offsetX + (((b3 + ((MathMan.unpair8x(b2)) << 8)) << 21) >> 21); - int z = offsetZ + (((b4 + ((MathMan.unpair8y(b2)) << 8)) << 21) >> 21); - array[i] = (T) BlockVector3.at(x, b1, z); + int b2 = (index >> 8) & 0xff; + int b3 = (index >> 15) & 0xFF; + int b4 = (index >> 23) & 0xFF; + int x = (offsetX + (b3 + (((b2 & 0x7)) << 8)) << 21) >> 21; + // Add 128 as we shift y by 128 to fit -256> 6) & 0x1) == 0 ? 1 : -1); + int z = (offsetZ + (b4 + (((b2 >> 3) & 0x7) << 8)) << 21) >> 21; + array[i] = (T) BlockVector3.at(x, y, z); index++; } return array; @@ -195,7 +207,7 @@ public class LocalBlockVectorSet implements Set { if (relX > 1023 || relX < -1024 || relZ > 1023 || relZ < -1024) { return false; } - return y >= 0 && y <= 256; + return y >= -128 && y <= 383; } public boolean add(int x, int y, int z) { @@ -209,8 +221,8 @@ public class LocalBlockVectorSet implements Set { throw new UnsupportedOperationException( "LocalVectorSet can only contain vectors within 1024 blocks (cuboid) of the first entry. "); } - if (y < 0 || y > 255) { - throw new UnsupportedOperationException("LocalVectorSet can only contain vectors from y elem:[0,255]"); + if (y < -128 || y > 383) { + throw new UnsupportedOperationException("LocalVectorSet can only contain vectors from y elem:[-128,383]"); } int index = getIndex(x, y, z); if (set.get(index)) { @@ -227,11 +239,17 @@ public class LocalBlockVectorSet implements Set { } private int getIndex(BlockVector3 vector) { - return MathMan.tripleSearchCoords(vector.getBlockX() - offsetX, vector.getBlockY(), vector.getBlockZ() - offsetZ); + // take 128 to fit -256 { if (relX > 1023 || relX < -1024 || relZ > 1023 || relZ < -1024) { return false; } - int index = MathMan.tripleSearchCoords(relX, y, relZ); + // take 128 to fit -256 { for (int i = 0; i < size; i++) { index = set.nextSetBit(index + 1); int b1 = (index & 0xFF); - int b2 = ((byte) (index >> 8)) & 0x7F; - int b3 = ((byte) (index >> 15)) & 0xFF; - int b4 = ((byte) (index >> 23)) & 0xFF; - mVec.mutX(offsetX + (((b3 + ((MathMan.unpair8x(b2)) << 8)) << 21) >> 21)); - mVec.mutY(b1); - mVec.mutZ(offsetZ + (((b4 + ((MathMan.unpair8y(b2)) << 8)) << 21) >> 21)); + int b2 = (index >> 8) & 0xff; + int b3 = (index >> 15) & 0xFF; + int b4 = (index >> 23) & 0xFF; + int x = (offsetX + (b3 + (((b2 & 0x7)) << 8)) << 21) >> 21; + // Add 128 as we shift y by 128 to fit -256> 6) & 0x1) == 0 ? 1 : -1); + int z = (offsetZ + (b4 + (((b2 >> 3) & 0x7) << 8)) << 21) >> 21; + mVec.mutX(x); + mVec.mutY(y); + mVec.mutZ(z); if (!c.contains(mVec)) { result = true; set.clear(index); @@ -312,21 +335,17 @@ public class LocalBlockVectorSet implements Set { for (int i = 0; i < size; i++) { index = set.nextSetBit(index + 1); int b1 = (index & 0xFF); - int b2 = ((byte) (index >> 8)) & 0x7F; - int b3 = ((byte) (index >> 15)) & 0xFF; - int b4 = ((byte) (index >> 23)) & 0xFF; - int x = offsetX + (((b3 + ((MathMan.unpair8x(b2)) << 8)) << 21) >> 21); - int z = offsetZ + (((b4 + ((MathMan.unpair8y(b2)) << 8)) << 21) >> 21); - visitor.run(x, b1, z, index); + int b2 = (index >> 8) & 0xff; + int b3 = (index >> 15) & 0xFF; + int b4 = (index >> 23) & 0xFF; + int x = (offsetX + (b3 + (((b2 & 0x7)) << 8)) << 21) >> 21; + // Add 128 as we shift y by 128 to fit -256> 6) & 0x1) == 0 ? 1 : -1); + int z = (offsetZ + (b4 + (((b2 >> 3) & 0x7) << 8)) << 21) >> 21; + visitor.run(x, y, z, index); } } - public interface BlockVectorSetVisitor { - - void run(int x, int y, int z, int index); - - } - @Override public void clear() { offsetZ = Integer.MAX_VALUE; @@ -334,4 +353,10 @@ public class LocalBlockVectorSet implements Set { set.clear(); } + public interface BlockVectorSetVisitor { + + void run(int x, int y, int z, int index); + + } + } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBatchProcessor.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBatchProcessor.java index 392990f1a..8345d3bde 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBatchProcessor.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBatchProcessor.java @@ -1,6 +1,5 @@ package com.fastasyncworldedit.core.queue; -import com.fastasyncworldedit.core.FaweCache; import com.fastasyncworldedit.core.extent.processor.EmptyBatchProcessor; import com.fastasyncworldedit.core.extent.processor.MultiBatchProcessor; import com.fastasyncworldedit.core.extent.processor.ProcessorScope; @@ -42,7 +41,7 @@ public interface IBatchProcessor { */ default boolean trimY(IChunkSet set, int minY, int maxY) { int minLayer = (minY - 1) >> 4; - for (int layer = 0; layer <= minLayer; layer++) { + for (int layer = set.getMinSectionIndex(); layer <= minLayer; layer++) { if (set.hasSection(layer)) { if (layer == minLayer) { char[] arr = set.load(layer); @@ -57,7 +56,7 @@ public interface IBatchProcessor { } } int maxLayer = (maxY + 1) >> 4; - for (int layer = maxLayer; layer < FaweCache.IMP.CHUNK_LAYERS; layer++) { + for (int layer = maxLayer; layer < set.getMaxSectionIndex(); layer++) { if (set.hasSection(layer)) { if (layer == minLayer) { char[] arr = set.load(layer); @@ -74,10 +73,8 @@ public interface IBatchProcessor { try { int layer = (minY - 15) >> 4; while (layer < (maxY + 15) >> 4) { - if (layer > -1) { - if (set.hasSection(layer)) { - return true; - } + if (set.hasSection(layer)) { + return true; } layer++; } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java index 25aa33470..437370e71 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IBlocks.java @@ -11,7 +11,6 @@ import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.registry.BlockRegistry; -import org.jetbrains.annotations.Range; import java.io.IOException; import java.util.Map; @@ -23,7 +22,14 @@ import java.util.stream.IntStream; */ public interface IBlocks extends Trimable { - boolean hasSection(@Range(from = 0, to = 15) int layer); + /** + * Returns if the chunk has a BLOCKS section at the given layer. May not be indicative of presence + * of entities, tile entites, biomes, etc. + * + * @param layer chunk section layer + * @return if blocks/a block section is present + */ + boolean hasSection(int layer); char[] load(int layer); @@ -38,7 +44,7 @@ public interface IBlocks extends Trimable { BiomeType getBiomeType(int x, int y, int z); default int getBitMask() { - return IntStream.range(0, FaweCache.IMP.CHUNK_LAYERS).filter(this::hasSection) + return IntStream.range(getMinSectionIndex(), getMaxSectionIndex() + 1).filter(this::hasSection) .map(layer -> (1 << layer)).sum(); } @@ -48,6 +54,21 @@ public interface IBlocks extends Trimable { IBlocks reset(); + /** + * Get the number of stores sections + */ + int getSectionCount(); + + /** + * Max ChunkSection array index + */ + int getMaxSectionIndex(); + + /** + * Min ChunkSection array index + */ + int getMinSectionIndex(); + default byte[] toByteArray(boolean full, boolean stretched) { return toByteArray(null, getBitMask(), full, stretched); } @@ -61,7 +82,7 @@ public interface IBlocks extends Trimable { .queryCapability(Capability.GAME_HOOKS).getRegistries().getBlockRegistry(); FastByteArrayOutputStream sectionByteArray = new FastByteArrayOutputStream(buffer); try (FaweOutputStream sectionWriter = new FaweOutputStream(sectionByteArray)) { - for (int layer = 0; layer < FaweCache.IMP.CHUNK_LAYERS; layer++) { + for (int layer = 0; layer < this.getSectionCount(); layer++) { if (!this.hasSection(layer) || (bitMask & (1 << layer)) == 0) { continue; } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkExtent.java index bd789eec6..d61d40c45 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkExtent.java @@ -17,7 +17,6 @@ import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockStateHolder; -import org.jetbrains.annotations.Range; import java.util.ArrayList; import java.util.HashMap; @@ -37,7 +36,7 @@ public interface IChunkExtent extends Extent { T getOrCreateChunk(int chunkX, int chunkZ); @Override - default > boolean setBlock(int x, @Range(from = 0, to = 255) int y, int z, B state) { + default > boolean setBlock(int x, int y, int z, B state) { final IChunk chunk = getOrCreateChunk(x >> 4, z >> 4); return chunk.setBlock(x & 15, y, z & 15, state); } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkGet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkGet.java index 7f18ba27b..8004f7098 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkGet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkGet.java @@ -48,19 +48,43 @@ public interface IChunkGet extends IBlocks, Trimable, InputExtent, ITileInput { CompoundTag getEntity(UUID uuid); - void setCreateCopy(boolean createCopy); - boolean isCreateCopy(); + void setCreateCopy(boolean createCopy); + @Nullable default IChunkGet getCopy() { return null; } - void setLightingToGet(char[][] lighting); + /** + * Flush the block lighting array (section*blocks) to the chunk GET between the given section indices. Negative allowed. + * + * @param lighting lighting array + * @param startSectionIndex lowest section index + * @param endSectionIndex highest section index + */ + void setLightingToGet(char[][] lighting, int startSectionIndex, int endSectionIndex); - void setSkyLightingToGet(char[][] lighting); + /** + * Flush the sky lighting array (section*blocks) to the chunk GET between the given section indices. Negative allowed. + * + * @param lighting sky lighting array + * @param startSectionIndex lowest section index + * @param endSectionIndex highest section index + */ + void setSkyLightingToGet(char[][] lighting, int startSectionIndex, int endSectionIndex); void setHeightmapToGet(HeightMapType type, int[] data); + /** + * Max y value for the chunk's world (inclusive) + */ + int getMaxY(); + + /** + * Min y value for the chunk's world (inclusive) + */ + int getMinY(); + } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkSet.java index ffa633725..318e8ebeb 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/IChunkSet.java @@ -107,4 +107,12 @@ public interface IChunkSet extends IBlocks, OutputExtent { return null; } + /** + * If the given layer has biomes stored to be set to the world. Can be negative + * + * @param layer layer to check + * @return if the layer has biomes stored to be set to the world + */ + boolean hasBiomes(int layer); + } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/Flood.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/Flood.java index cc2c901bd..096477d4a 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/Flood.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/Flood.java @@ -25,11 +25,17 @@ public class Flood { private int chunkYLayer; private int chunkZ; private final ConcurrentLinkedQueue queuePool = new ConcurrentLinkedQueue<>(); + private final int minSectionIndex; + private final int maxSectionIndex; + private final int sectionCount; - public Flood(int maxBranch, int maxDepth, Direction[] directions) { + public Flood(int maxBranch, int maxDepth, Direction[] directions, int minSectionIndex, int maxSectionIndex) { this.maxBranch = maxBranch; this.maxDepth = maxDepth; this.directions = directions; + this.minSectionIndex = minSectionIndex; + this.maxSectionIndex = maxSectionIndex; + this.sectionCount = maxSectionIndex - minSectionIndex + 1; this.queues = new int[27][]; this.visits = new long[27][]; @@ -64,7 +70,7 @@ public class Flood { int chunkX = x >> 4; int chunkZ = z >> 4; long pair = MathMan.pairInt(chunkX, chunkZ); - int layer = y >> 4; + int layer = (y >> 4) - minSectionIndex; int[] section = getOrCreateQueue(pair, layer); int val = (x & 15) + ((z & 15) << 4) + ((y & 15) << 8) + (depth << 12); push(section, val); @@ -73,7 +79,7 @@ public class Flood { private int[] getOrCreateQueue(long pair, int layer) { int[][] arrs = chunkQueues.get(pair); if (arrs == null) { - chunkQueues.put(pair, arrs = new int[16][]); + chunkQueues.put(pair, arrs = new int[sectionCount][]); } int[] section = arrs[layer]; if (section == null) { @@ -154,7 +160,7 @@ public class Flood { if (visit == null || queue == null) { long pair = MathMan.pairInt(this.chunkX + nextX, this.chunkZ + nextZ); int layer = this.chunkYLayer + nextY; - if (layer < 0 || layer > 15) { + if (layer < minSectionIndex || layer > maxSectionIndex) { continue; } queues[sectionIndex] = queue = getOrCreateQueue(pair, layer); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/SingleThreadQueueExtent.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/SingleThreadQueueExtent.java index 782251bd6..ed6cf8609 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/SingleThreadQueueExtent.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/SingleThreadQueueExtent.java @@ -52,6 +52,10 @@ public class SingleThreadQueueExtent extends ExtentBatchProcessorHolder implemen // Chunks currently being queued / worked on private final Long2ObjectLinkedOpenHashMap chunks = new Long2ObjectLinkedOpenHashMap<>(); + private World world = null; + private int minY = 0; + private int maxY = 255; + private IChunkCache cacheGet; private IChunkCache cacheSet; private boolean initialized; @@ -68,7 +72,15 @@ public class SingleThreadQueueExtent extends ExtentBatchProcessorHolder implemen private final ReentrantLock getChunkLock = new ReentrantLock(); - private World world = null; + public SingleThreadQueueExtent() {} + + /** + * New instance given inclusive world height bounds. + */ + public SingleThreadQueueExtent(int minY, int maxY) { + this.minY = minY; + this.maxY = maxY; + } /** * Safety check to ensure that the thread being used matches the one being initialized on. - Can @@ -111,6 +123,16 @@ public class SingleThreadQueueExtent extends ExtentBatchProcessorHolder implemen return fastmode; } + @Override + public int getMinY() { + return minY; + } + + @Override + public int getMaxY() { + return maxY; + } + /** * Resets the queue. */ @@ -142,6 +164,8 @@ public class SingleThreadQueueExtent extends ExtentBatchProcessorHolder implemen @Override public synchronized void init(Extent extent, IChunkCache get, IChunkCache set) { reset(); + this.minY = extent.getMinY(); + this.maxY = extent.getMaxY(); currentThread = Thread.currentThread(); if (get == null) { get = (x, z) -> { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/BitSetBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/BitSetBlocks.java index c441aa63b..96a2e4b83 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/BitSetBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/BitSetBlocks.java @@ -20,14 +20,21 @@ public class BitSetBlocks implements IChunkSet { private final MemBlockSet.RowZ row; private final BlockState blockState; + private final int minSectionIndex; + private final int maxSectionIndex; + private final int layers; - public BitSetBlocks(BlockState blockState) { - this.row = new MemBlockSet.RowZ(); + public BitSetBlocks(BlockState blockState, int minSectionIndex, int maxSectionIndex) { + this.row = new MemBlockSet.RowZ(minSectionIndex, maxSectionIndex); this.blockState = blockState; + this.minSectionIndex = minSectionIndex; + this.maxSectionIndex = maxSectionIndex; + this.layers = maxSectionIndex - minSectionIndex + 1; } @Override public boolean hasSection(int layer) { + layer -= minSectionIndex; return row.rows[layer] != MemBlockSet.NULL_ROW_Y; } @@ -39,19 +46,21 @@ public class BitSetBlocks implements IChunkSet { @Override public > boolean setBlock(int x, int y, int z, T holder) { - row.set(null, x, y, z); + y -= minSectionIndex << 4; + row.set(null, x, y, z, minSectionIndex, maxSectionIndex); return true; } @Override public void setBlocks(int layer, char[] data) { + layer -= minSectionIndex; row.reset(layer); int by = layer << 4; for (int y = 0, index = 0; y < 16; y++) { for (int z = 0; z < 16; z++) { for (int x = 0; x < 16; x++, index++) { if (data[index] != 0) { - row.set(null, x, by + y, z); + row.set(null, x, by + y, z, minSectionIndex, maxSectionIndex); } } } @@ -114,6 +123,7 @@ public class BitSetBlocks implements IChunkSet { @Override public char[] load(int layer) { + layer -= minSectionIndex; char[] arr = FaweCache.IMP.SECTION_BITS_TO_CHAR.get(); MemBlockSet.IRow nullRowY = row.getRow(layer); if (nullRowY instanceof MemBlockSet.RowY) { @@ -189,6 +199,26 @@ public class BitSetBlocks implements IChunkSet { return this; } + @Override + public boolean hasBiomes(final int layer) { + return false; + } + + @Override + public int getSectionCount() { + return layers; + } + + @Override + public int getMaxSectionIndex() { + return minSectionIndex; + } + + @Override + public int getMinSectionIndex() { + return maxSectionIndex; + } + @Override public boolean trim(boolean aggressive) { return false; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharBlocks.java index 0c90c4849..5665c8789 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharBlocks.java @@ -7,7 +7,6 @@ import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockTypesCache; import org.apache.logging.log4j.Logger; -import org.jetbrains.annotations.Range; public abstract class CharBlocks implements IBlocks { @@ -15,30 +14,30 @@ public abstract class CharBlocks implements IBlocks { protected static final Section FULL = new Section() { @Override - public final char[] get(CharBlocks blocks, int layer) { + public char[] get(CharBlocks blocks, int layer) { return blocks.blocks[layer]; } // Ignore aggressive switch here. @Override - public char[] get(CharBlocks blocks, @Range(from = 0, to = 15) int layer, boolean aggressive) { + public char[] get(CharBlocks blocks, int layer, boolean aggressive) { return blocks.blocks[layer]; } @Override - public final boolean isFull() { + public boolean isFull() { return true; } }; protected final Section empty = new Section() { @Override - public final synchronized char[] get(CharBlocks blocks, int layer) { + public synchronized char[] get(CharBlocks blocks, int layer) { // Defaults to aggressive as it should only be avoided where we know we've reset a chunk during an edit return get(blocks, layer, true); } @Override - public synchronized char[] get(CharBlocks blocks, @Range(from = 0, to = 15) int layer, boolean aggressive) { + public synchronized char[] get(CharBlocks blocks, int layer, boolean aggressive) { char[] arr = blocks.blocks[layer]; if (arr == null) { arr = blocks.blocks[layer] = blocks.update(layer, null, aggressive); @@ -58,17 +57,26 @@ public abstract class CharBlocks implements IBlocks { } @Override - public final boolean isFull() { + public boolean isFull() { return false; } }; - public final char[][] blocks; - public final Section[] sections; + public char[][] blocks; + public Section[] sections; + protected int minSectionIndex; + protected int maxSectionIndex; + protected int sectionCount; - public CharBlocks() { - blocks = new char[16][]; - sections = new Section[16]; - for (int i = 0; i < 16; i++) { + /** + * New instance given initial min/max section indices. Can be negative. + */ + public CharBlocks(int minSectionIndex, int maxSectionIndex) { + this.minSectionIndex = minSectionIndex; + this.maxSectionIndex = maxSectionIndex; + this.sectionCount = maxSectionIndex - minSectionIndex + 1; + blocks = new char[sectionCount][]; + sections = new Section[sectionCount]; + for (int i = 0; i < sectionCount; i++) { sections[i] = empty; } } @@ -76,7 +84,7 @@ public abstract class CharBlocks implements IBlocks { @Override public synchronized boolean trim(boolean aggressive) { boolean result = true; - for (int i = 0; i < 16; i++) { + for (int i = 0; i < sectionCount; i++) { if (!sections[i].isFull() && blocks[i] != null) { blocks[i] = null; } else { @@ -99,13 +107,14 @@ public abstract class CharBlocks implements IBlocks { @Override public synchronized IChunkSet reset() { - for (int i = 0; i < 16; i++) { + for (int i = 0; i < sectionCount; i++) { sections[i] = empty; } return null; } - public synchronized void reset(@Range(from = 0, to = 15) int layer) { + public synchronized void reset(int layer) { + layer -= minSectionIndex; sections[layer] = empty; } @@ -121,12 +130,14 @@ public abstract class CharBlocks implements IBlocks { // Not synchronized as any subsequent methods called from this class will be, or the section shouldn't appear as loaded anyway. @Override - public boolean hasSection(@Range(from = 0, to = 15) int layer) { - return sections[layer].isFull(); + public boolean hasSection(int layer) { + layer -= minSectionIndex; + return layer >= 0 && layer < sections.length && sections[layer].isFull(); } @Override - public char[] load(@Range(from = 0, to = 15) int layer) { + public char[] load(int layer) { + layer -= minSectionIndex; synchronized (sections[layer]) { return sections[layer].get(this, layer); } @@ -137,17 +148,17 @@ public abstract class CharBlocks implements IBlocks { return BlockTypesCache.states[get(x, y, z)]; } - public char get(int x, @Range(from = 0, to = 255) int y, int z) { - final int layer = y >> 4; + public char get(int x, int y, int z) { + int layer = y >> 4; final int index = (y & 15) << 8 | z << 4 | x; - if (layer >= sections.length || layer < 0) { + if (layer > maxSectionIndex || layer < minSectionIndex) { return 0; } - return sections[layer].get(this, layer, index); + return get(layer, index); } // Not synchronized as it refers to a synchronized method and includes nothing that requires synchronization - public void set(int x, @Range(from = 0, to = 255) int y, int z, char value) { + public void set(int x, int y, int z, char value) { final int layer = y >> 4; final int index = (y & 15) << 8 | z << 4 | x; try { @@ -163,24 +174,26 @@ public abstract class CharBlocks implements IBlocks { Section */ - public final char get(@Range(from = 0, to = 15) int layer, int index) { + public final char get(int layer, int index) { + layer -= minSectionIndex; return sections[layer].get(this, layer, index); } - public synchronized final void set(@Range(from = 0, to = 15) int layer, int index, char value) throws + public synchronized final void set(int layer, int index, char value) throws ArrayIndexOutOfBoundsException { + layer -= minSectionIndex; sections[layer].set(this, layer, index, value); } public abstract static class Section { - public abstract char[] get(CharBlocks blocks, @Range(from = 0, to = 15) int layer); + public abstract char[] get(CharBlocks blocks, int layer); - public abstract char[] get(CharBlocks blocks, @Range(from = 0, to = 15) int layer, boolean aggressive); + public abstract char[] get(CharBlocks blocks, int layer, boolean aggressive); public abstract boolean isFull(); - public final char get(CharBlocks blocks, @Range(from = 0, to = 15) int layer, int index) { + public final char get(CharBlocks blocks, int layer, int index) { char[] section = get(blocks, layer); if (section == null) { blocks.reset(layer); @@ -189,7 +202,7 @@ public abstract class CharBlocks implements IBlocks { return section[index]; } - public final void set(CharBlocks blocks, @Range(from = 0, to = 15) int layer, int index, char value) { + public final void set(CharBlocks blocks, int layer, int index, char value) { get(blocks, layer)[index] = value; } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharGetBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharGetBlocks.java index 11dfd5b46..e443d6bd7 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharGetBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharGetBlocks.java @@ -10,6 +10,13 @@ import java.util.Arrays; public abstract class CharGetBlocks extends CharBlocks implements IChunkGet { + /** + * New instance given the min/max section indices + */ + public CharGetBlocks(final int minSectionIndex, final int maxSectionIndex) { + super(minSectionIndex, maxSectionIndex); + } + @Override public BaseBlock getFullBlock(int x, int y, int z) { BlockState state = BlockTypesCache.states[get(x, y, z)]; @@ -18,7 +25,7 @@ public abstract class CharGetBlocks extends CharBlocks implements IChunkGet { @Override public boolean trim(boolean aggressive) { - for (int i = 0; i < 16; i++) { + for (int i = 0; i < sectionCount; i++) { sections[i] = empty; blocks[i] = null; } @@ -36,6 +43,7 @@ public abstract class CharGetBlocks extends CharBlocks implements IChunkGet { @Override public synchronized boolean trim(boolean aggressive, int layer) { + layer -= minSectionIndex; sections[layer] = empty; blocks[layer] = null; return true; @@ -47,4 +55,9 @@ public abstract class CharGetBlocks extends CharBlocks implements IChunkGet { return null; } + @Override + public int getSectionCount() { + return sectionCount; + } + } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java index cca3f4bc2..81256fdcb 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/CharSetBlocks.java @@ -11,7 +11,6 @@ import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BlockStateHolder; -import org.jetbrains.annotations.Range; import java.util.Arrays; import java.util.Collections; @@ -45,6 +44,8 @@ public class CharSetBlocks extends CharBlocks implements IChunkSet { private int bitMask = -1; private CharSetBlocks() { + // Expand as we go + super(0, 15); } @Override @@ -59,9 +60,10 @@ public class CharSetBlocks extends CharBlocks implements IChunkSet { @Override public BiomeType getBiomeType(int x, int y, int z) { - if (biomes == null) { + if (biomes == null || (y >> 4) < minSectionIndex || (y >> 4) > maxSectionIndex) { return null; } + y -= minSectionIndex << 4; return biomes[(y >> 2) << 4 | (z >> 2) << 2 | x >> 2]; } @@ -92,15 +94,18 @@ public class CharSetBlocks extends CharBlocks implements IChunkSet { @Override public boolean setBiome(int x, int y, int z, BiomeType biome) { + updateSectionIndexRange(y >> 4); + y -= minSectionIndex << 4; if (biomes == null) { - biomes = new BiomeType[1024]; + biomes = new BiomeType[64 * sectionCount]; } biomes[(y >> 2) << 4 | (z >> 2) << 2 | x >> 2] = biome; return true; } @Override - public > boolean setBlock(int x, @Range(from = 0, to = 255) int y, int z, T holder) { + public > boolean setBlock(int x, int y, int z, T holder) { + updateSectionIndexRange(y >> 4); set(x, y, z, holder.getOrdinalChar()); holder.applyTileEntity(this, x, y, z); return true; @@ -108,6 +113,8 @@ public class CharSetBlocks extends CharBlocks implements IChunkSet { @Override public void setBlocks(int layer, char[] data) { + updateSectionIndexRange(layer); + layer -= minSectionIndex; this.blocks[layer] = data; this.sections[layer] = data == null ? empty : FULL; } @@ -123,38 +130,41 @@ public class CharSetBlocks extends CharBlocks implements IChunkSet { if (tiles == null) { tiles = new BlockVector3ChunkMap<>(); } + updateSectionIndexRange(y >> 4); tiles.put(x, y, z, tile); return true; } @Override public void setBlockLight(int x, int y, int z, int value) { + updateSectionIndexRange(y >> 4); if (light == null) { - light = new char[16][]; + light = new char[sectionCount][]; } - final int layer = y >> 4; + final int layer = (y >> 4) - minSectionIndex; if (light[layer] == null) { char[] c = new char[4096]; Arrays.fill(c, (char) 16); light[layer] = c; } final int index = (y & 15) << 8 | (z & 15) << 4 | (x & 15); - light[y >> 4][index] = (char) value; + light[layer][index] = (char) value; } @Override public void setSkyLight(int x, int y, int z, int value) { + updateSectionIndexRange(y >> 4); if (skyLight == null) { - skyLight = new char[16][]; + skyLight = new char[sectionCount][]; } - final int layer = y >> 4; + final int layer = (y >> 4) - minSectionIndex; if (skyLight[layer] == null) { char[] c = new char[4096]; Arrays.fill(c, (char) 16); skyLight[layer] = c; } final int index = (y & 15) << 8 | (z & 15) << 4 | (x & 15); - skyLight[y >> 4][index] = (char) value; + skyLight[layer][index] = (char) value; } @Override @@ -167,17 +177,21 @@ public class CharSetBlocks extends CharBlocks implements IChunkSet { @Override public void setLightLayer(int layer, char[] toSet) { + updateSectionIndexRange(layer); if (light == null) { - light = new char[16][]; + light = new char[sectionCount][]; } + layer -= minSectionIndex; light[layer] = toSet; } @Override public void setSkyLightLayer(int layer, char[] toSet) { + updateSectionIndexRange(layer); if (skyLight == null) { - skyLight = new char[16][]; + skyLight = new char[sectionCount][]; } + layer -= minSectionIndex; skyLight[layer] = toSet; } @@ -193,8 +207,10 @@ public class CharSetBlocks extends CharBlocks implements IChunkSet { @Override public void removeSectionLighting(int layer, boolean sky) { + updateSectionIndexRange(layer); + layer -= minSectionIndex; if (light == null) { - light = new char[16][]; + light = new char[sectionCount][]; } if (light[layer] == null) { light[layer] = new char[4096]; @@ -202,7 +218,7 @@ public class CharSetBlocks extends CharBlocks implements IChunkSet { Arrays.fill(light[layer], (char) 0); if (sky) { if (skyLight == null) { - skyLight = new char[16][]; + skyLight = new char[sectionCount][]; } if (skyLight[layer] == null) { skyLight[layer] = new char[4096]; @@ -213,14 +229,16 @@ public class CharSetBlocks extends CharBlocks implements IChunkSet { @Override public void setFullBright(int layer) { + updateSectionIndexRange(layer); + layer -= minSectionIndex; if (light == null) { - light = new char[16][]; + light = new char[sectionCount][]; } if (light[layer] == null) { light[layer] = new char[4096]; } if (skyLight == null) { - skyLight = new char[16][]; + skyLight = new char[sectionCount][]; } if (skyLight[layer] == null) { skyLight[layer] = new char[4096]; @@ -275,7 +293,7 @@ public class CharSetBlocks extends CharBlocks implements IChunkSet { if (biomes != null || light != null || skyLight != null) { return false; } - return IntStream.range(0, 16).noneMatch(this::hasSection); + return IntStream.range(minSectionIndex, maxSectionIndex + 1).noneMatch(this::hasSection); } @Override @@ -288,4 +306,98 @@ public class CharSetBlocks extends CharBlocks implements IChunkSet { return null; } + @Override + public boolean hasBiomes(int layer) { + layer -= minSectionIndex; + if (layer < 0 || layer >= sections.length) { + return false; + } + return biomes != null; + } + + @Override + public char[] load(final int layer) { + updateSectionIndexRange(layer); + return super.load(layer); + } + + @Override + public int getSectionCount() { + return sectionCount; + } + + @Override + public int getMaxSectionIndex() { + return maxSectionIndex; + } + + @Override + public int getMinSectionIndex() { + return minSectionIndex; + } + + // Checks and updates the various section arrays against the new layer index + private void updateSectionIndexRange(int layer) { + if (layer >= minSectionIndex && layer <= maxSectionIndex) { + return; + } + if (layer < minSectionIndex) { + int diff = minSectionIndex - layer; + sectionCount += diff; + char[][] tmpBlocks = new char[sectionCount][]; + Section[] tmpSections = new Section[sectionCount]; + System.arraycopy(blocks, 0, tmpBlocks, diff, blocks.length); + System.arraycopy(sections, 0, tmpSections, diff, sections.length); + for (int i = 0; i < diff; i++) { + tmpSections[i] = empty; + } + blocks = tmpBlocks; + sections = tmpSections; + minSectionIndex = layer; + if (biomes != null) { + BiomeType[] tmpBiomes = new BiomeType[sectionCount * 64]; + System.arraycopy(biomes, 0, tmpBiomes, 64*diff, biomes.length); + biomes = tmpBiomes; + } + if (light != null) { + char[][] tmplight = new char[sectionCount][]; + System.arraycopy(light, 0, tmplight, diff, light.length); + light = tmplight; + } + if (skyLight != null) { + char[][] tmplight = new char[sectionCount][]; + System.arraycopy(skyLight, 0, tmplight, diff, skyLight.length); + skyLight = tmplight; + } + } else { + int diff = layer - maxSectionIndex; + sectionCount += diff; + char[][] tmpBlocks = new char[sectionCount][]; + Section[] tmpSections = new Section[sectionCount]; + System.arraycopy(blocks, 0, tmpBlocks, 0, blocks.length); + System.arraycopy(sections, 0, tmpSections, 0, sections.length); + for (int i = sectionCount - diff; i < sectionCount; i++) { + tmpSections[i] = empty; + } + blocks = tmpBlocks; + sections = tmpSections; + maxSectionIndex = layer; + if (biomes != null) { + BiomeType[] tmpBiomes = new BiomeType[sectionCount * 64]; + System.arraycopy(biomes, 0, tmpBiomes, 0, biomes.length); + biomes = tmpBiomes; + } + if (light != null) { + char[][] tmplight = new char[sectionCount][]; + System.arraycopy(light, 0, tmplight, 0, light.length); + light = tmplight; + } + if (skyLight != null) { + char[][] tmplight = new char[sectionCount][]; + System.arraycopy(skyLight, 0, tmplight, 0, skyLight.length); + skyLight = tmplight; + } + } + } + } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/NullChunkGet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/NullChunkGet.java index e79d724d4..1e1e14dc8 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/NullChunkGet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/blocks/NullChunkGet.java @@ -78,17 +78,37 @@ public final class NullChunkGet implements IChunkGet { } @Override - public void setLightingToGet(char[][] lighting) { + public void setLightingToGet(char[][] lighting, int startSectionIndex, int endSectionIndex) { } @Override - public void setSkyLightingToGet(char[][] lighting) { + public void setSkyLightingToGet(char[][] lighting, int minSectionIndex, int maxSectionIndex) { } @Override public void setHeightmapToGet(HeightMapType type, int[] data) { } + @Override + public int getMaxY() { + return 0; + } + + @Override + public int getMinY() { + return 0; + } + + @Override + public int getMaxSectionIndex() { + return 0; + } + + @Override + public int getMinSectionIndex() { + return 0; + } + public boolean trim(boolean aggressive) { return true; } @@ -129,6 +149,11 @@ public final class NullChunkGet implements IChunkGet { return null; } + @Override + public int getSectionCount() { + return 0; + } + private NullChunkGet() { } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkHolder.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkHolder.java index f9b2be467..5f1dab37b 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkHolder.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/ChunkHolder.java @@ -19,7 +19,6 @@ import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockStateHolder; -import org.jetbrains.annotations.Range; import javax.annotation.Nullable; import java.util.Map; @@ -140,6 +139,12 @@ public class ChunkHolder> implements IQueueChunk { return bitMask; } + @Override + public boolean hasBiomes(final int layer) { + // No need to go through delegate. hasBiomes is SET only. + return getOrCreateSet().hasBiomes(layer); + } + public boolean isInit() { return isInit; } @@ -160,12 +165,12 @@ public class ChunkHolder> implements IQueueChunk { } @Override - public void setLightingToGet(char[][] lighting) { + public void setLightingToGet(char[][] lighting, int minSectionIndex, int maxSectionIndex) { delegate.setLightingToGet(this, lighting); } @Override - public void setSkyLightingToGet(char[][] lighting) { + public void setSkyLightingToGet(char[][] lighting, int minSectionIndex, int maxSectionIndex) { delegate.setSkyLightingToGet(this, lighting); } @@ -174,8 +179,28 @@ public class ChunkHolder> implements IQueueChunk { delegate.setHeightmapToGet(this, type, data); } - public void flushLightToGet(boolean heightmaps) { - delegate.flushLightToGet(this, heightmaps); + @Override + public int getMaxY() { + return getOrCreateGet().getMaxY(); + } + + @Override + public int getMinY() { + return getOrCreateGet().getMinY(); + } + + @Override + public int getMaxSectionIndex() { + return getOrCreateGet().getMaxSectionIndex(); + } + + @Override + public int getMinSectionIndex() { + return getOrCreateGet().getMinSectionIndex(); + } + + public void flushLightToGet() { + delegate.flushLightToGet(this); } private static final IBlockDelegate BOTH = new IBlockDelegate() { @@ -260,6 +285,7 @@ public class ChunkHolder> implements IQueueChunk { public int getSkyLight(ChunkHolder chunk, int x, int y, int z) { if (chunk.chunkSet.getSkyLight() != null) { int layer = y >> 4; + layer -= chunk.chunkSet.getMinSectionIndex(); if (chunk.chunkSet.getSkyLight()[layer] != null) { int setLightValue = chunk.chunkSet.getSkyLight()[layer][(y & 15) << 8 | (z & 15) << 4 | (x & 15)]; if (setLightValue < 16) { @@ -274,6 +300,7 @@ public class ChunkHolder> implements IQueueChunk { public int getEmittedLight(ChunkHolder chunk, int x, int y, int z) { if (chunk.chunkSet.getLight() != null) { int layer = y >> 4; + layer -= chunk.chunkSet.getMinSectionIndex(); if (chunk.chunkSet.getLight()[layer] != null) { int setLightValue = chunk.chunkSet.getLight()[layer][(y & 15) << 8 | (z & 15) << 4 | (x & 15)]; if (setLightValue < 16) { @@ -300,19 +327,21 @@ public class ChunkHolder> implements IQueueChunk { } @Override - public void flushLightToGet(ChunkHolder chunk, boolean heightmaps) { - chunk.chunkExisting.setLightingToGet(chunk.chunkSet.getLight()); - chunk.chunkExisting.setSkyLightingToGet(chunk.chunkSet.getSkyLight()); + public void flushLightToGet(ChunkHolder chunk) { + chunk.chunkExisting.setLightingToGet(chunk.chunkSet.getLight(), chunk.chunkSet.getMinSectionIndex(), + chunk.chunkSet.getMaxSectionIndex()); + chunk.chunkExisting.setSkyLightingToGet(chunk.chunkSet.getSkyLight(), chunk.chunkSet.getMinSectionIndex(), + chunk.chunkSet.getMaxSectionIndex()); } @Override public void setLightingToGet(ChunkHolder chunk, char[][] lighting) { - chunk.chunkExisting.setLightingToGet(lighting); + chunk.chunkExisting.setLightingToGet(lighting, chunk.chunkSet.getMinSectionIndex(), chunk.chunkSet.getMaxSectionIndex()); } @Override public void setSkyLightingToGet(ChunkHolder chunk, char[][] lighting) { - chunk.chunkExisting.setSkyLightingToGet(lighting); + chunk.chunkExisting.setSkyLightingToGet(lighting, chunk.chunkSet.getMinSectionIndex(), chunk.chunkSet.getMaxSectionIndex()); } @Override @@ -447,18 +476,18 @@ public class ChunkHolder> implements IQueueChunk { } @Override - public void flushLightToGet(ChunkHolder chunk, boolean heightmaps) { + public void flushLightToGet(ChunkHolder chunk) { // Do nothing as no lighting to flush to GET } @Override public void setLightingToGet(ChunkHolder chunk, char[][] lighting) { - chunk.chunkExisting.setLightingToGet(lighting); + chunk.chunkExisting.setLightingToGet(lighting, chunk.chunkSet.getMinSectionIndex(), chunk.chunkSet.getMaxSectionIndex()); } @Override public void setSkyLightingToGet(ChunkHolder chunk, char[][] lighting) { - chunk.chunkExisting.setSkyLightingToGet(lighting); + chunk.chunkExisting.setSkyLightingToGet(lighting, chunk.chunkSet.getMinSectionIndex(), chunk.chunkSet.getMaxSectionIndex()); } @Override @@ -493,7 +522,7 @@ public class ChunkHolder> implements IQueueChunk { public > boolean setBlock( ChunkHolder chunk, int x, - @Range(from = 0, to = 255) int y, + int y, int z, B block ) { @@ -568,6 +597,7 @@ public class ChunkHolder> implements IQueueChunk { public int getSkyLight(ChunkHolder chunk, int x, int y, int z) { if (chunk.chunkSet.getSkyLight() != null) { int layer = y >> 4; + layer -= chunk.chunkSet.getMinSectionIndex(); if (chunk.chunkSet.getSkyLight()[layer] != null) { int setLightValue = chunk.chunkSet.getSkyLight()[layer][(y & 15) << 8 | (z & 15) << 4 | (x & 15)]; if (setLightValue < 16) { @@ -585,6 +615,7 @@ public class ChunkHolder> implements IQueueChunk { public int getEmittedLight(ChunkHolder chunk, int x, int y, int z) { if (chunk.chunkSet.getLight() != null) { int layer = y >> 4; + layer -= chunk.chunkSet.getMinSectionIndex(); if (chunk.chunkSet.getLight()[layer] != null) { int setLightValue = chunk.chunkSet.getLight()[layer][(y & 15) << 8 | (z & 15) << 4 | (x & 15)]; if (setLightValue < 16) { @@ -623,12 +654,11 @@ public class ChunkHolder> implements IQueueChunk { } @Override - public void flushLightToGet(ChunkHolder chunk, boolean heightmaps) { + public void flushLightToGet(ChunkHolder chunk) { chunk.getOrCreateGet(); chunk.delegate = BOTH; chunk.chunkExisting.trim(false); - chunk.chunkExisting.setLightingToGet(chunk.chunkSet.getLight()); - chunk.chunkExisting.setSkyLightingToGet(chunk.chunkSet.getSkyLight()); + chunk.flushLightToGet(); } @Override @@ -636,7 +666,7 @@ public class ChunkHolder> implements IQueueChunk { chunk.getOrCreateGet(); chunk.delegate = BOTH; chunk.chunkExisting.trim(false); - chunk.chunkExisting.setLightingToGet(lighting); + chunk.setLightingToGet(lighting, chunk.chunkSet.getMinSectionIndex(), chunk.chunkSet.getMaxSectionIndex()); } @Override @@ -644,7 +674,7 @@ public class ChunkHolder> implements IQueueChunk { chunk.getOrCreateGet(); chunk.delegate = BOTH; chunk.chunkExisting.trim(false); - chunk.chunkExisting.setSkyLightingToGet(lighting); + chunk.setSkyLightingToGet(lighting, chunk.chunkSet.getMinSectionIndex(), chunk.chunkSet.getMaxSectionIndex()); } @Override @@ -652,7 +682,7 @@ public class ChunkHolder> implements IQueueChunk { chunk.getOrCreateGet(); chunk.delegate = BOTH; chunk.chunkExisting.trim(false); - chunk.chunkExisting.setHeightmapToGet(type, data); + chunk.setHeightmapToGet(type, data); } }; @@ -804,7 +834,7 @@ public class ChunkHolder> implements IQueueChunk { } @Override - public void flushLightToGet(ChunkHolder chunk, boolean heightmaps) { + public void flushLightToGet(ChunkHolder chunk) { // Do nothing as no light to flush } @@ -813,7 +843,7 @@ public class ChunkHolder> implements IQueueChunk { chunk.getOrCreateGet(); chunk.delegate = GET; chunk.chunkExisting.trim(false); - chunk.setLightingToGet(lighting); + chunk.setLightingToGet(lighting, chunk.chunkSet.getMinSectionIndex(), chunk.chunkSet.getMaxSectionIndex()); } @Override @@ -821,7 +851,7 @@ public class ChunkHolder> implements IQueueChunk { chunk.getOrCreateGet(); chunk.delegate = GET; chunk.chunkExisting.trim(false); - chunk.setSkyLightingToGet(lighting); + chunk.setSkyLightingToGet(lighting, chunk.chunkSet.getMinSectionIndex(), chunk.chunkSet.getMaxSectionIndex()); } @Override @@ -889,6 +919,11 @@ public class ChunkHolder> implements IQueueChunk { return this.trim(aggressive); } + @Override + public int getSectionCount() { + return getOrCreateGet().getSectionCount(); + } + @Override public boolean isEmpty() { return chunkSet == null || chunkSet.isEmpty(); @@ -1117,7 +1152,7 @@ public class ChunkHolder> implements IQueueChunk { int[] getHeightMap(ChunkHolder chunk, HeightMapType type); - void flushLightToGet(ChunkHolder chunk, boolean heightmaps); + void flushLightToGet(ChunkHolder chunk); void setLightingToGet(ChunkHolder chunk, char[][] lighting); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/NullChunk.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/NullChunk.java index 766e8ae4b..9f8b5ade0 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/NullChunk.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/queue/implementation/chunk/NullChunk.java @@ -82,6 +82,11 @@ public final class NullChunk implements IQueueChunk { return new char[0][]; } + @Override + public boolean hasBiomes(final int layer) { + return false; + } + @Nonnull public int[] getHeightMap(@Nullable HeightMapType type) { return new int[256]; @@ -182,17 +187,37 @@ public final class NullChunk implements IQueueChunk { } @Override - public void setLightingToGet(char[][] lighting) { + public void setLightingToGet(char[][] lighting, int minSectionIndex, int maxSectionIndex) { } @Override - public void setSkyLightingToGet(char[][] lighting) { + public void setSkyLightingToGet(char[][] lighting, int minSectionIndex, int maxSectionIndex) { } @Override public void setHeightmapToGet(HeightMapType type, int[] data) { } + @Override + public int getMaxY() { + return 0; + } + + @Override + public int getMinY() { + return 0; + } + + @Override + public int getMaxSectionIndex() { + return 0; + } + + @Override + public int getMinSectionIndex() { + return 0; + } + @Nullable public > T call(@Nullable IChunkSet set, @Nullable Runnable finalize) { return null; @@ -206,6 +231,11 @@ public final class NullChunk implements IQueueChunk { return true; } + @Override + public int getSectionCount() { + return 0; + } + private NullChunk() { } diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FuzzyRegion.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FuzzyRegion.java index 7511287ee..5fc7c543f 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FuzzyRegion.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/FuzzyRegion.java @@ -51,7 +51,7 @@ public class FuzzyRegion extends AbstractRegion { RecursiveVisitor search = new RecursiveVisitor(mask, p -> { setMinMax(p.getBlockX(), p.getBlockY(), p.getBlockZ()); return true; - }, 256); + }, 256, extent.getMinY(), extent.getMaxY()); search.setVisited(set); search.visit(BlockVector3.at(x, y, z)); Operations.completeBlindly(search); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/RegionWrapper.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/RegionWrapper.java index 83e2a68e9..a5d38deee 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/RegionWrapper.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/regions/RegionWrapper.java @@ -7,6 +7,8 @@ import com.sk89q.worldedit.regions.CuboidRegion; public class RegionWrapper extends CuboidRegion { private static final RegionWrapper GLOBAL = new RegionWrapper( + Integer.MIN_VALUE, + Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, @@ -20,16 +22,16 @@ public class RegionWrapper extends CuboidRegion { public int minZ; public int maxZ; - public static RegionWrapper GLOBAL() { - return GLOBAL; - } - + /** + * @deprecated use {@link RegionWrapper#RegionWrapper(int, int, int, int, int, int)} + */ + @Deprecated public RegionWrapper(final int minX, final int maxX, final int minZ, final int maxZ) { this(minX, maxX, 0, 255, minZ, maxZ); } public RegionWrapper(final int minX, final int maxX, final int minY, final int maxY, final int minZ, final int maxZ) { - this(BlockVector3.at(minX, 0, minZ), BlockVector3.at(maxX, 255, maxZ)); + this(BlockVector3.at(minX, minY, minZ), BlockVector3.at(maxX, maxY, maxZ)); } public RegionWrapper(final BlockVector3 pos1, final BlockVector3 pos2) { @@ -42,6 +44,10 @@ public class RegionWrapper extends CuboidRegion { this.maxY = Math.max(pos1.getBlockY(), pos2.getBlockY()); } + public static RegionWrapper GLOBAL() { + return GLOBAL; + } + @Override protected void recalculate() { super.recalculate(); @@ -134,7 +140,8 @@ public class RegionWrapper extends CuboidRegion { @Override public boolean isGlobal() { - return minX == Integer.MIN_VALUE && minZ == Integer.MIN_VALUE && maxX == Integer.MAX_VALUE && maxZ == Integer.MAX_VALUE && minY <= 0 && maxY >= 255; + return minX == Integer.MIN_VALUE && minY == Integer.MIN_VALUE && minZ == Integer.MIN_VALUE + && maxX == Integer.MAX_VALUE && maxY == Integer.MAX_VALUE && maxZ == Integer.MAX_VALUE; } public boolean contains(RegionWrapper current) { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MathMan.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MathMan.java index d7c7d1fbc..c53df7ec7 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MathMan.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/MathMan.java @@ -152,52 +152,65 @@ public class MathMan { } public static long tripleWorldCoord(int x, int y, int z) { - return y + (((long) x & 0x3FFFFFF) << 8) + (((long) z & 0x3FFFFFF) << 34); + return ((y + 256) & 0xffff) + (((long) x & 0xffffff) << 16) + (((long) z & 0xffffff) << 40); } public static long untripleWorldCoordX(long triple) { - return (((triple >> 8) & 0x3FFFFFF) << 38) >> 38; + return (((triple >> 16) & 0xffffff) << 38) >> 38; } public static long untripleWorldCoordY(long triple) { - return triple & 0xFF; + return (triple & 0xffff) - 256; } public static long untripleWorldCoordZ(long triple) { - return (((triple >> 34) & 0x3FFFFFF) << 38) >> 38; + return (((triple >> 40) & 0xffffff) << 38) >> 38; } - public static short tripleBlockCoord(int x, int y, int z) { - return (short) ((x & 15) << 12 | (z & 15) << 8 | y); + public static int tripleBlockCoord(int x, int y, int z) { + // account for the fact y can be negative now. Assume it won't be less than -256 + y += 256; + return ((x & 15) << 16 | (z & 15) << 12 | y); } public static char tripleBlockCoordChar(int x, int y, int z) { - return (char) ((x & 15) << 12 | (z & 15) << 8 | y); + return (char) ((x & 15) << 16 | (z & 15) << 12 | y); } public static int untripleBlockCoordX(int triple) { - return (triple >> 12) & 0xF; + return (triple >> 16) & 0xF; } public static int untripleBlockCoordY(int triple) { - return (triple & 0xFF); + return (triple & 0x1ff) - 256; } public static int untripleBlockCoordZ(int triple) { - return (triple >> 8) & 0xF; + return (triple >> 12) & 0xF; } + /** + * Obtain an integer representation of 3 ints, x, y and z. y is represented by the right-most 9 bits and can + * be within the range -256 to 255 (inclusive). x and z are represented by 11 bits each and can be within the range + * -1024 to 1023 (inclusive). + * + * @param x x value + * @param y y value + * @param z z value + * @return integer representation of x y z + */ public static int tripleSearchCoords(int x, int y, int z) { - byte b1 = (byte) y; - byte b3 = (byte) (x); - byte b4 = (byte) (z); - int x16 = (x >> 8) & 0x7; - int z16 = (z >> 8) & 0x7; - byte b2 = MathMan.pair8(x16, z16); - return ((b1 & 0xFF) - + ((b2 & 0x7F) << 8) - + ((b3 & 0xFF) << 15) - + ((b4 & 0xFF) << 23)); + if (x > 1023 || x < -1024 || y > 255 || y < -256 || z > 1023 || z < -1024) { + throw new IndexOutOfBoundsException(String.format("Check range on x=%s, y=%s and z=%s!", x, y, z)); + } + int b1 = Math.abs(y) & 0xff; + int b3 = x & 0xff; + int b4 = z & 0xff; + int x16 = (((x >> 8) & 0x3) | (x < 0 ? 0x4 : 0x00)); + int z16 = (((z >> 8) & 0x3) | (z < 0 ? 0x4 : 0x00)); + int y16 = (y < 0 ? 0x1 : 0x00); + int b2 = ((x16 + (z16 << 3) + (y16 << 6))); + return (((b1) | (b2 << 8)) | (b3 << 15)) | (b4 << 23); } public static int pairSearchCoords(int x, int y) { diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/MemBlockSet.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/MemBlockSet.java index a3803ae47..232dd7017 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/MemBlockSet.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/util/collection/MemBlockSet.java @@ -28,17 +28,17 @@ public final class MemBlockSet extends BlockSet { public static final IRow NULL_ROW_Y = new NullRowY(); public final IRow[] rows; public final MutableBlockVector3 mutable; + private final int minSectionIndex; + private final int maxSectionIndex; - public MemBlockSet() { - this(16, 0, 0); - } - - public MemBlockSet(int size, int offsetX, int offsetZ) { + public MemBlockSet(int size, int offsetX, int offsetZ, int minSectionIndex, int maxSectionIndex) { super(offsetX, offsetZ); this.rows = new IRow[size]; for (int i = 0; i < size; i++) { rows[i] = NULL_ROW_X; } + this.minSectionIndex = minSectionIndex; + this.maxSectionIndex = maxSectionIndex; this.mutable = new MutableBlockVector3(); } @@ -53,14 +53,14 @@ public final class MemBlockSet extends BlockSet { public boolean add(int x, int y, int z) { x -= getBlockOffsetX(); z -= getBlockOffsetZ(); - return rows[x >> 4].add(this.rows, x, y, z - getBlockOffsetZ()); + return rows[x >> 4].add(this.rows, x, y, z - getBlockOffsetZ(), minSectionIndex, maxSectionIndex); } @Override public void set(int x, int y, int z) { x -= getBlockOffsetX(); z -= getBlockOffsetZ(); - rows[x >> 4].set(this.rows, x, y, z - getBlockOffsetZ()); + rows[x >> 4].set(this.rows, x, y, z - getBlockOffsetZ(), minSectionIndex, maxSectionIndex); } @Override @@ -88,11 +88,11 @@ public final class MemBlockSet extends BlockSet { @Override public Set getChunks() { - return new AbstractSet() { + return new AbstractSet<>() { @Nonnull @Override public Iterator iterator() { - return new Iterator() { + return new Iterator<>() { private final MutableBlockVector2 mutable = new MutableBlockVector2(); private boolean hasNext; private int X; @@ -181,10 +181,10 @@ public final class MemBlockSet extends BlockSet { } public Set getChunkCubes() { - return new AbstractSet() { + return new AbstractSet<>() { @Override public Iterator iterator() { - return new Iterator() { + return new Iterator<>() { private final MutableBlockVector3 mutable = new MutableBlockVector3(); private boolean hasNext; private int X; @@ -234,7 +234,7 @@ public final class MemBlockSet extends BlockSet { @Override public BlockVector3 next() { mutable.setComponents( - setX + getBlockOffsetX(), setY, setZ + getBlockOffsetX()); + setX + getBlockOffsetX(), setY - (minSectionIndex << 4), setZ + getBlockOffsetX()); init(); return mutable; } @@ -282,7 +282,7 @@ public final class MemBlockSet extends BlockSet { if (rowx instanceof RowX) { IRow rowz = ((RowX) rowx).rows[other.getZ()]; if (rowz instanceof RowZ) { - return ((RowZ) rowz).rows[other.getY() - getChunkOffsetZ()] instanceof RowY; + return ((RowZ) rowz).rows[other.getY() - (minSectionIndex << 4) - getChunkOffsetZ()] instanceof RowY; } } } @@ -293,7 +293,7 @@ public final class MemBlockSet extends BlockSet { @Override public int getMinimumY() { - int maxY = 15; + int maxY = maxSectionIndex; int maxy = 16; int by = Integer.MAX_VALUE; for (IRow nullRowX : rows) { @@ -357,7 +357,7 @@ public final class MemBlockSet extends BlockSet { } RowZ rowz = (RowZ) nullRowZ; outer: - for (int Y = 15; Y >= maxY; Y--) { + for (int Y = maxSectionIndex; Y >= maxY; Y--) { IRow nullRowY = rowz.rows[Y]; if (!(nullRowY instanceof RowY)) { continue; @@ -376,8 +376,8 @@ public final class MemBlockSet extends BlockSet { maxy = y + 1; } by = (Y << 4) + y; - if (by == FaweCache.IMP.WORLD_MAX_Y) { - return FaweCache.IMP.WORLD_MAX_Y; + if (by == (maxSectionIndex << 4) + 15) { + return (maxSectionIndex << 4) + 15; } break outer; } @@ -582,7 +582,7 @@ public final class MemBlockSet extends BlockSet { if (!(nullRowY instanceof RowY)) { continue; } - int by = Y << 4; + int by = ((Y - minSectionIndex) << 4); RowY rowY = (RowY) nullRowY; for (int y = 0, i = 0; y < 16; y++) { for (int z = 0; z < 16; z += 4, i++) { @@ -615,7 +615,7 @@ public final class MemBlockSet extends BlockSet { @Override public Iterator iterator() { - return new Iterator() { + return new Iterator<>() { private int bx; private int by; private int bz; @@ -817,10 +817,10 @@ public final class MemBlockSet extends BlockSet { return false; } - void set(IRow[] rows, int x, int y, int z); + void set(IRow[] rows, int x, int y, int z, int minSectionIndex, int maxSectionIndex); - default boolean add(IRow[] rows, int x, int y, int z) { - set(rows, x, y, z); + default boolean add(IRow[] rows, int x, int y, int z, int minSectionIndex, int maxSectionIndex) { + set(rows, x, y, z, minSectionIndex, maxSectionIndex); return true; } @@ -837,10 +837,10 @@ public final class MemBlockSet extends BlockSet { public static final class NullRowX implements IRow { @Override - public void set(IRow[] parent, int x, int y, int z) { + public void set(IRow[] parent, int x, int y, int z, int minSectionIndex, int maxSectionIndex) { IRow row = new RowX(parent.length); parent[x >> 4] = row; - row.set(parent, x, y, z); + row.set(parent, x, y, z, minSectionIndex, maxSectionIndex); } } @@ -848,10 +848,10 @@ public final class MemBlockSet extends BlockSet { public static final class NullRowZ implements IRow { @Override - public void set(IRow[] parent, int x, int y, int z) { - IRow row = new RowZ(); + public void set(IRow[] parent, int x, int y, int z, int minSectionIndex, int maxSectionIndex) { + IRow row = new RowZ(minSectionIndex, maxSectionIndex); parent[z >> 4] = row; - row.set(parent, x, y, z); + row.set(parent, x, y, z, minSectionIndex, maxSectionIndex); } } @@ -859,10 +859,10 @@ public final class MemBlockSet extends BlockSet { public static final class NullRowY implements IRow { @Override - public void set(IRow[] parent, int x, int y, int z) { + public void set(IRow[] parent, int x, int y, int z, int minSectionIndex, int maxSectionIndex) { IRow row = new RowY(); parent[y >> 4] = row; - row.set(parent, x, y, z); + row.set(parent, x, y, z, minSectionIndex, maxSectionIndex); } } @@ -884,13 +884,13 @@ public final class MemBlockSet extends BlockSet { } @Override - public void set(IRow[] parent, int x, int y, int z) { - this.rows[z >> 4].set(this.rows, x, y, z); + public void set(IRow[] parent, int x, int y, int z, int minSectionIndex, int maxSectionIndex) { + this.rows[z >> 4].set(this.rows, x, y, z, minSectionIndex, maxSectionIndex); } @Override - public boolean add(IRow[] parent, int x, int y, int z) { - return this.rows[z >> 4].add(this.rows, x, y, z); + public boolean add(IRow[] parent, int x, int y, int z, int minSectionIndex, int maxSectionIndex) { + return this.rows[z >> 4].add(this.rows, x, y, z, minSectionIndex, maxSectionIndex); } @Override @@ -909,8 +909,8 @@ public final class MemBlockSet extends BlockSet { public final IRow[] rows; - public RowZ() { - this.rows = new IRow[FaweCache.IMP.CHUNK_LAYERS]; + public RowZ(int minSectionIndex, int maxSectionIndex) { + this.rows = new IRow[maxSectionIndex - minSectionIndex + 1]; reset(); } @@ -924,18 +924,19 @@ public final class MemBlockSet extends BlockSet { } @Override - public void set(IRow[] parent, int x, int y, int z) { - this.rows[y >> 4].set(this.rows, x, y, z); + public void set(IRow[] parent, int x, int y, int z, int minSectionIndex, int maxSectionIndex) { + this.rows[y >> 4].set(this.rows, x, y, z, minSectionIndex, maxSectionIndex); } @Override - public boolean add(IRow[] parent, int x, int y, int z) { - return this.rows[y >> 4].add(this.rows, x, y, z); + public boolean add(IRow[] parent, int x, int y, int z, int minSectionIndex, int maxSectionIndex) { + return this.rows[y >> 4].add(this.rows, x, y, z, minSectionIndex, maxSectionIndex); } @Override public void clear(IRow[] parent, int x, int y, int z) { - this.rows[y >> 4].set(this.rows, x, y, z); + // min/amx layer does not matter here. + this.rows[y >> 4].set(this.rows, x, y, z, 0, 0); } @Override @@ -957,9 +958,7 @@ public final class MemBlockSet extends BlockSet { } public void reset() { - for (int i = 0; i < FaweCache.IMP.CHUNK_LAYERS; i++) { - rows[i] = NULL_ROW_Y; - } + Arrays.fill(rows, NULL_ROW_Y); } } @@ -983,13 +982,13 @@ public final class MemBlockSet extends BlockSet { } @Override - public void set(IRow[] parent, int x, int y, int z) { + public void set(IRow[] parent, int x, int y, int z, int minSectionIndex, int maxSectionIndex) { int i = ((y & 15) << 8) | ((z & 15) << 4) | (x & 15); bits[i >> 6] |= (1L << (i & 0x3F)); } @Override - public boolean add(IRow[] parent, int x, int y, int z) { + public boolean add(IRow[] parent, int x, int y, int z, int minSectionIndex, int maxSectionIndex) { int i = ((y & 15) << 8) | ((z & 15) << 4) | (x & 15); int offset = i >> 6; long value = bits[offset]; diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/SimpleWorld.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/SimpleWorld.java index 61cfd5f15..70c7abd9c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/SimpleWorld.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/world/SimpleWorld.java @@ -61,6 +61,11 @@ public interface SimpleWorld extends World { return getMaximumPoint().getBlockY(); } + @Override + default int getMinY() { + return getMinimumPoint().getBlockY(); + } + @Override default Mask createLiquidMask() { return new BlockMask(this).add(BlockTypes.LAVA, BlockTypes.WATER); diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/AsyncPlayer.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/AsyncPlayer.java index 3793a4e92..43616cdb5 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/AsyncPlayer.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/AsyncPlayer.java @@ -85,8 +85,8 @@ public class AsyncPlayer extends PlayerProxy { public boolean ascendToCeiling(int clearance, boolean alwaysGlass) { Location pos = getBlockLocation(); int x = pos.getBlockX(); - int initialY = Math.max(0, pos.getBlockY()); - int y = Math.max(0, pos.getBlockY() + 2); + int initialY = Math.max(getWorld().getMinY(), pos.getBlockY()); + int y = Math.max(getWorld().getMinY(), pos.getBlockY() + 2); int z = pos.getBlockZ(); Extent world = getLocation().getExtent(); @@ -121,15 +121,15 @@ public class AsyncPlayer extends PlayerProxy { public boolean ascendUpwards(int distance, boolean alwaysGlass) { final Location pos = getBlockLocation(); final int x = pos.getBlockX(); - final int initialY = Math.max(0, pos.getBlockY()); - int y = Math.max(0, pos.getBlockY() + 1); + final int initialY = Math.max(getWorld().getMinY(), pos.getBlockY()); + int y = Math.max(getWorld().getMinY(), pos.getBlockY() + 1); final int z = pos.getBlockZ(); final int maxY = Math.min(getWorld().getMaxY() + 1, initialY + distance); final Extent world = getLocation().getExtent(); MutableBlockVector3 mutable = new MutableBlockVector3(x, y, z); - while (y <= world.getMaximumPoint().getY() + 2) { + while (y <= world.getMaxY() + 2) { if (world.getBlock(mutable.mutY(y)).getBlockType().getMaterial() .isMovementBlocker()) { break; // Hit something diff --git a/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/WorldWrapper.java b/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/WorldWrapper.java index d3c5960bd..8374cba7c 100644 --- a/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/WorldWrapper.java +++ b/worldedit-core/src/main/java/com/fastasyncworldedit/core/wrappers/WorldWrapper.java @@ -96,6 +96,11 @@ public class WorldWrapper extends AbstractWorld { return parent.getMaxY(); } + @Override + public int getMinY() { + return parent.getMinY(); + } + @Override public Mask createLiquidMask() { return parent.createLiquidMask(); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java index 91e215e44..b834508dc 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java @@ -1184,6 +1184,16 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { return getBlockChangeCount(); } + @Override + public BlockVector3 getMinimumPoint() { + return getWorld().getMinimumPoint(); + } + + @Override + public BlockVector3 getMaximumPoint() { + return getWorld().getMaximumPoint(); + } + //FAWE start public void setSize(int size) { this.changes = size; @@ -1276,7 +1286,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { public > int fall(final Region region, boolean fullHeight, final B replace) { FlatRegion flat = asFlatRegion(region); final int startPerformY = region.getMinimumPoint().getBlockY(); - final int startCheckY = fullHeight ? 0 : startPerformY; + final int startCheckY = fullHeight ? getMinY() : startPerformY; final int endY = region.getMaximumPoint().getBlockY(); RegionVisitor visitor = new RegionVisitor(flat, pos -> { int x = pos.getX(); @@ -1353,7 +1363,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { final BlockReplace replace = new BlockReplace(EditSession.this, pattern); // Pick how we're going to visit blocks - RecursiveVisitor visitor = new DirectionalVisitor(mask, replace, origin, direction, (int) (radius * 2 + 1)); + RecursiveVisitor visitor = new DirectionalVisitor(mask, replace, origin, direction, (int) (radius * 2 + 1), minY, maxY); // Start at the origin visitor.visit(origin); @@ -1406,8 +1416,8 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { Mask mask = new MaskIntersection( new RegionMask(new EllipsoidRegion(null, origin, Vector3.at(radius, radius, radius))), new BoundedHeightMask( - Math.max(origin.getBlockY() - depth + 1, getMinimumPoint().getBlockY()), - Math.min(getMaxY(), origin.getBlockY()) + Math.max(origin.getBlockY() - depth + 1, minY), + Math.min(maxY, origin.getBlockY()) ), Masks.negate(new ExistingBlockMask(this)) ); @@ -1417,11 +1427,11 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { // Pick how we're going to visit blocks RecursiveVisitor visitor; - //FAWE start - provide extent for preloading + //FAWE start - provide extent for preloading, min/max y if (recursive) { - visitor = new RecursiveVisitor(mask, replace, (int) (radius * 2 + 1), this); + visitor = new RecursiveVisitor(mask, replace, (int) (radius * 2 + 1), minY, maxY, this); } else { - visitor = new DownwardVisitor(mask, replace, origin.getBlockY(), (int) (radius * 2 + 1), this); + visitor = new DownwardVisitor(mask, replace, origin.getBlockY(), (int) (radius * 2 + 1), minY, maxY, this); } //FAWE end @@ -1938,7 +1948,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { //FAWE end } Mask mask = new MaskIntersection( - new BoundedHeightMask(getWorld().getMinY(), getWorld().getMaxY()), + new BoundedHeightMask(minY, maxY), new RegionMask(new EllipsoidRegion(null, origin, Vector3.at(radius, radius, radius))), //FAWE start liquidMask @@ -1950,8 +1960,8 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { } else { replace = new BlockReplace(this, BlockTypes.AIR.getDefaultState()); } - //FAWE start - provide extent for preloading - RecursiveVisitor visitor = new RecursiveVisitor(mask, replace, (int) (radius * 2 + 1), this); + //FAWE start - provide extent for preloading, min/max y + RecursiveVisitor visitor = new RecursiveVisitor(mask, replace, (int) (radius * 2 + 1), minY, maxY, this); //FAWE end // Around the origin in a 3x3 block @@ -1989,14 +1999,14 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { // There are boundaries that the routine needs to stay in Mask mask = new MaskIntersection( - new BoundedHeightMask(getWorld().getMinY(), Math.min(origin.getBlockY(), getWorld().getMaxY())), + new BoundedHeightMask(minY, Math.min(origin.getBlockY(), maxY)), new RegionMask(new EllipsoidRegion(null, origin, Vector3.at(radius, radius, radius))), blockMask ); BlockReplace replace = new BlockReplace(this, fluid.getDefaultState()); - //FAWE start - provide extent for preloading - NonRisingVisitor visitor = new NonRisingVisitor(mask, replace, Integer.MAX_VALUE, this); + //FAWE start - provide extent for preloading, world min/maxY + NonRisingVisitor visitor = new NonRisingVisitor(mask, replace, Integer.MAX_VALUE, minY, maxY, this); //FAWE end // Around the origin in a 3x3 block @@ -2411,7 +2421,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { } } } - if (y != 0 && (yy = py - y) >= 0) { + if (y != 0 && (yy = py - y) >= minY) { this.setBlock(px + x, yy, pz + z, block); if (x != 0) { this.setBlock(px - x, yy, pz + z, block); @@ -2506,9 +2516,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { BlockState air = BlockTypes.AIR.getDefaultState(); BlockState water = BlockTypes.WATER.getDefaultState(); - int centerY = Math.max(getWorld().getMinY(), Math.min(getWorld().getMaxY(), oy)); - int minY = Math.max(getWorld().getMinY(), centerY - height); - int maxY = Math.min(getWorld().getMaxY(), centerY + height); + int centerY = Math.max(minY, Math.min(maxY, oy)); + int minY = Math.max(this.minY, centerY - height); + int maxY = Math.min(this.maxY, centerY + height); //FAWE start - mutable MutableBlockVector3 mutable = new MutableBlockVector3(); @@ -2535,8 +2545,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { ++affected; } } else if (id == BlockTypes.SNOW) { + //FAWE start if (setBlock(mutable, air)) { - if (y > 0) { + if (y > getMinY()) { BlockState block = getBlock(mutable2); if (block.getStates().containsKey(snowy)) { if (setBlock(mutable2, block.with(snowy, false))) { @@ -2649,9 +2660,9 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { final BlockState grass = BlockTypes.GRASS_BLOCK.getDefaultState(); - final int centerY = Math.max(getWorld().getMinY(), Math.min(getWorld().getMaxY(), oy)); - final int minY = Math.max(getWorld().getMinY(), centerY - height); - final int maxY = Math.min(getWorld().getMaxY(), centerY + height); + final int centerY = Math.max(minY, Math.min(maxY, oy)); + final int minY = Math.max(this.minY, centerY - height); + final int maxY = Math.min(this.maxY, centerY + height); //FAWE start - mutable MutableBlockVector3 mutable = new MutableBlockVector3(); @@ -2952,7 +2963,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { int zv = (int) (z.getValue() * unit.getZ() + zero2.getZ()); BlockState get; - if (yv >= 0 && yv < 256) { + if (yv >= minY && yv <= maxY) { get = getBlock(xv, yv, zv); } else { get = BlockTypes.AIR.getDefaultState(); @@ -3538,7 +3549,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { int xx = x + bx; for (int z = 0; z < 16; z++) { int zz = z + bz; - for (int y = 0; y < maxY + 1; y++) { + for (int y = minY; y < maxY + 1; y++) { BaseBlock block = getFullBlock(mutable.setComponents(xx, y, zz)); fcs.add(mutable, block, BlockTypes.AIR.getDefaultState().toBaseBlock()); } @@ -3561,7 +3572,7 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { for (int z = 0; z < 16; z++) { int zz = z + bz; mutable.mutZ(zz); - for (int y = 0; y < maxY + 1; y++) { + for (int y = minY; y < maxY + 1; y++) { mutable.mutY(y); boolean contains = (fe == null || fe.contains(xx, y, zz)) && region.contains(mutable); if (contains) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java index 510fe90dc..ede31707f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/LocalSession.java @@ -211,6 +211,13 @@ public class LocalSession implements TextureHolder { if (defaultSelector != null) { this.selector = defaultSelector.createSelector(); } + //FAWE start + if (worldOverride != null) { + this.selector.setWorld(worldOverride); + } else { + this.selector.setWorld(currentWorld); + } + //FAWE end } //FAWE start diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java index 2fe324eb0..6d0b7ee8b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/BrushCommands.java @@ -457,6 +457,7 @@ public class BrushCommands { ) @CommandPermissions("worldedit.brush.stencil") public void stencilBrush( + Player player, LocalSession session, InjectedValueAccess context, @Arg(desc = "Pattern") Pattern fill, @@ -478,13 +479,15 @@ public class BrushCommands { worldEdit.checkMaxBrushRadius(radius); InputStream stream = getHeightmapStream(image); HeightBrush brush; + int minY = player.getWorld().getMinY(); + int maxY = player.getWorld().getMaxY(); try { brush = new StencilBrush(stream, rotation, yscale, onlyWhite, "#clipboard".equalsIgnoreCase(image) - ? session.getClipboard().getClipboard() : null + ? session.getClipboard().getClipboard() : null, minY, maxY ); } catch (EmptyClipboardException ignored) { - brush = new StencilBrush(stream, rotation, yscale, onlyWhite, null); + brush = new StencilBrush(stream, rotation, yscale, onlyWhite, null, minY, maxY); } if (randomRotate) { brush.setRandomRotate(true); @@ -710,6 +713,7 @@ public class BrushCommands { ) @CommandPermissions("worldedit.brush.height") public void heightBrush( + Player player, LocalSession session, @Arg(desc = "Expression", def = "5") Expression radius, @@ -728,7 +732,7 @@ public class BrushCommands { boolean dontSmooth, InjectedValueAccess context ) throws WorldEditException, FileNotFoundException { - terrainBrush(session, radius, image, rotation, yscale, false, randomRotate, layers, + terrainBrush(player, session, radius, image, rotation, yscale, false, randomRotate, layers, !dontSmooth, ScalableHeightMap.Shape.CONE, context ); } @@ -741,6 +745,7 @@ public class BrushCommands { ) @CommandPermissions("worldedit.brush.height") public void cliffBrush( + Player player, LocalSession session, @Arg(desc = "Expression", def = "5") Expression radius, @@ -760,7 +765,7 @@ public class BrushCommands { boolean dontSmooth, InjectedValueAccess context ) throws WorldEditException, FileNotFoundException { - terrainBrush(session, radius, image, rotation, yscale, true, randomRotate, layers, + terrainBrush(player, session, radius, image, rotation, yscale, true, randomRotate, layers, !dontSmooth, ScalableHeightMap.Shape.CYLINDER, context ); } @@ -775,6 +780,7 @@ public class BrushCommands { ) @CommandPermissions("worldedit.brush.height") public void flattenBrush( + Player player, LocalSession session, @Arg(desc = "Expression", def = "5") Expression radius, @@ -794,12 +800,13 @@ public class BrushCommands { boolean dontSmooth, InjectedValueAccess context ) throws WorldEditException, FileNotFoundException { - terrainBrush(session, radius, image, rotation, yscale, true, randomRotate, layers, + terrainBrush(player, session, radius, image, rotation, yscale, true, randomRotate, layers, !dontSmooth, ScalableHeightMap.Shape.CONE, context ); } private void terrainBrush( + Player player, LocalSession session, Expression radius, String image, @@ -816,23 +823,25 @@ public class BrushCommands { worldEdit.checkMaxBrushRadius(radius); InputStream stream = getHeightmapStream(image); HeightBrush brush; + int minY = player.getWorld().getMinY(); + int maxY = player.getWorld().getMaxY(); if (flat) { try { brush = new FlattenBrush(stream, rotation, yscale, layers, smooth, "#clipboard".equalsIgnoreCase(image) - ? session.getClipboard().getClipboard() : null, shape + ? session.getClipboard().getClipboard() : null, shape, minY, maxY ); } catch (EmptyClipboardException ignored) { - brush = new FlattenBrush(stream, rotation, yscale, layers, smooth, null, shape); + brush = new FlattenBrush(stream, rotation, yscale, layers, smooth, null, shape, minY, maxY); } } else { try { brush = new HeightBrush(stream, rotation, yscale, layers, smooth, "#clipboard".equalsIgnoreCase(image) - ? session.getClipboard().getClipboard() : null + ? session.getClipboard().getClipboard() : null, minY, maxY ); } catch (EmptyClipboardException ignored) { - brush = new HeightBrush(stream, rotation, yscale, layers, smooth, null); + brush = new HeightBrush(stream, rotation, yscale, layers, smooth, null, minY, maxY); } } if (randomRotate) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java index 1cc269847..b408418f2 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/GenerationCommands.java @@ -635,12 +635,18 @@ public class GenerationCommands { @Arg(desc = "Ore vein size") @Range(from = 0, to = Integer.MAX_VALUE) int size, @Arg(desc = "Ore vein frequency (number of times to attempt to place ore)", def = "10") @Range(from = 0, to = Integer.MAX_VALUE) int freq, @Arg(desc = "Ore vein rarity (% chance each attempt is placed)", def = "100") @Range(from = 0, to = 100) int rarity, - @Arg(desc = "Ore vein min y", def = "0") @Range(from = 0, to = 255) int minY, - @Arg(desc = "Ore vein max y", def = "63") @Range(from = 0, to = 255) int maxY + @Arg(desc = "Ore vein min y", def = "0") int minY, + @Arg(desc = "Ore vein max y", def = "63") int maxY ) throws WorldEditException { if (mask instanceof AbstractExtentMask) { ((AbstractExtentMask) mask).setExtent(editSession); } + checkCommandArgument(minY >= editSession.getMinY(), Caption.of("fawe.error.outside-range-lower", "miny", + editSession.getMinY())); + checkCommandArgument(maxY <= editSession.getMaxY(), Caption.of("fawe.error.outside-range-upper", "maxy", + editSession.getMaxY())); + checkCommandArgument(minY < maxY, Caption.of("fawe.error.argument-size-mismatch", "miny", + "maxy")); editSession.addOre(region, mask, material, size, freq, rarity, minY, maxY); actor.print(Caption.of("fawe.worldedit.visitor.visitor.block", editSession.getBlockChangeCount())); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistorySubCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistorySubCommands.java index 0336cb627..1d97c13d2 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistorySubCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/HistorySubCommands.java @@ -133,8 +133,8 @@ public class HistorySubCommands { Location origin = player.getLocation(); BlockVector3 bot = origin.toBlockPoint().subtract(radius, radius, radius); BlockVector3 top = origin.toBlockPoint().add(radius, radius, radius); - bot = bot.clampY(0, world.getMaxY()); - top = top.clampY(0, world.getMaxY()); + bot = bot.clampY(world.getMinY(), world.getMaxY()); + top = top.clampY(world.getMinY(), world.getMaxY()); // TODO mask the regions bot / top to the bottom and top coord in the allowedRegions // TODO: then mask the edit to the bot / top // if (allowedRegions.length != 1 || !allowedRegions[0].isGlobal()) { @@ -196,9 +196,9 @@ public class HistorySubCommands { .summarize(RegionWrapper.GLOBAL(), false); if (summary != null) { rollback.setDimensions( - BlockVector3.at(summary.minX, 0, summary.minZ), + BlockVector3.at(summary.minX, world.getMinY(), summary.minZ), BlockVector3 - .at(summary.maxX, 255, summary.maxZ) + .at(summary.maxX, world.getMaxY(), summary.maxZ) ); rollback.setTime(historyFile.lastModified()); RollbackDatabase db = DBHandler.IMP @@ -410,8 +410,8 @@ public class HistorySubCommands { BlockVector3 bot = origin.toBlockPoint().subtract(radius, radius, radius); BlockVector3 top = origin.toBlockPoint().add(radius, radius, radius); - bot = bot.clampY(0, world.getMaxY()); - top = top.clampY(0, world.getMaxY()); + bot = bot.clampY(world.getMinY(), world.getMaxY()); + top = top.clampY(world.getMinY(), world.getMaxY()); long minTime = System.currentTimeMillis() - timeDiff; Iterable> edits = database.getEdits(other, minTime, bot, top, false, false); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java index f69a93b64..b51e82113 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java @@ -363,17 +363,23 @@ public class RegionCommands { @Selection Region region, @Arg(name = "pattern", desc = "The pattern of blocks to lay") Pattern patternArg ) throws WorldEditException { - BlockVector3 max = region.getMaximumPoint(); - int maxY = max.getBlockY(); + //FAWE start - world min/maxY + int maxY = region.getMaximumY(); + int minY = region.getMinimumY(); + //FAWE end Iterable flat = Regions.asFlatRegion(region).asFlatRegion(); Iterator iter = flat.iterator(); - int y = 0; + //FAWE start - world min/maxY + int y = minY; + //FAWE end int affected = 0; while (iter.hasNext()) { BlockVector2 pos = iter.next(); int x = pos.getBlockX(); int z = pos.getBlockZ(); - y = editSession.getNearestSurfaceTerrainBlock(x, z, y, 0, maxY); + //FAWE start - world min/maxY + y = editSession.getNearestSurfaceTerrainBlock(x, z, y, minY, maxY); + //FAWE end editSession.setBlock(x, y, z, patternArg); affected++; } @@ -856,6 +862,7 @@ public class RegionCommands { ) @CommandPermissions("worldedit.region.flora") @Logging(REGION) + @Preload(Preload.PreloadCheck.PRELOAD) @Confirm(Confirm.Processor.REGION) public int flora( Actor actor, EditSession editSession, @Selection Region region, @@ -867,7 +874,7 @@ public class RegionCommands { FloraGenerator generator = new FloraGenerator(editSession); GroundFunction ground = new GroundFunction(new ExistingBlockMask(editSession), generator); //FAWE start - provide extent for preloading - LayerVisitor visitor = new LayerVisitor(asFlatRegion(region), minimumBlockY(region), maximumBlockY(region), ground, editSession); + LayerVisitor visitor = new LayerVisitor(asFlatRegion(region), minimumBlockY(region), maximumBlockY(region), ground); //FAWE end visitor.setMask(new NoiseFilter2D(new RandomNoise(), density)); Operations.completeLegacy(visitor); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java index d1cd86615..f5e8758e9 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/SelectionCommands.java @@ -124,9 +124,9 @@ public class SelectionCommands { Location pos; //FAWE start - clamp if (coordinates != null) { - pos = new Location(world, coordinates.toVector3().clampY(0, world.getMaxY())); + pos = new Location(world, coordinates.toVector3().clampY(world.getMinY(), world.getMaxY())); } else if (actor instanceof Locatable) { - pos = ((Locatable) actor).getBlockLocation().clampY(0, world.getMaxY()); + pos = ((Locatable) actor).getBlockLocation().clampY(world.getMinY(), world.getMaxY()); //FAWE end } else { actor.print(Caption.of("worldedit.pos.console-require-coords")); @@ -157,9 +157,9 @@ public class SelectionCommands { Location pos; if (coordinates != null) { //FAWE start - clamp - pos = new Location(world, coordinates.toVector3().clampY(0, world.getMaxY())); + pos = new Location(world, coordinates.toVector3().clampY(world.getMinY(), world.getMaxY())); } else if (actor instanceof Locatable) { - pos = ((Locatable) actor).getBlockLocation().clampY(0, world.getMaxY()); + pos = ((Locatable) actor).getBlockLocation().clampY(world.getMinY(), world.getMaxY()); //Fawe end } else { actor.print(Caption.of("worldedit.pos.console-require-coords")); @@ -258,7 +258,7 @@ public class SelectionCommands { .clampY(minChunkY, maxChunkY); min = minChunk.shl(CHUNK_SHIFTS, CHUNK_SHIFTS_Y, CHUNK_SHIFTS); - max = maxChunk.shl(CHUNK_SHIFTS, CHUNK_SHIFTS_Y, CHUNK_SHIFTS).add(15, world.getMaxY(), 15); + max = maxChunk.shl(CHUNK_SHIFTS, CHUNK_SHIFTS_Y, CHUNK_SHIFTS).add(15, 255, 15); actor.print(Caption.of( "worldedit.chunk.selected-multiple", @@ -286,7 +286,7 @@ public class SelectionCommands { } min = minChunk.shl(CHUNK_SHIFTS, CHUNK_SHIFTS_Y, CHUNK_SHIFTS); - max = min.add(15, world.getMaxY(), 15); + max = min.add(15, 255, 15); actor.print(Caption.of( "worldedit.chunk.selected", diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java index 173334e96..24def83d0 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/UtilityCommands.java @@ -413,8 +413,8 @@ public class UtilityCommands { ) throws WorldEditException { size = Math.max(1, size); we.checkMaxRadius(size); - height = height != null ? Math.min((world.getMaxY() + 1), height + 1) : (world.getMaxY() + 1); + height = height != null ? Math.min((world.getMaxY() - world.getMinY() + 1), height + 1) : (world.getMaxY() - world.getMinY() + 1); int affected = editSession.removeAbove(session.getPlacementPosition(actor), size, height); actor.print(Caption.of("worldedit.removeabove.removed", TextComponent.of(affected))); return affected; @@ -436,8 +436,8 @@ public class UtilityCommands { ) throws WorldEditException { size = Math.max(1, size); we.checkMaxRadius(size); - height = height != null ? Math.min((world.getMaxY() + 1), height + 1) : (world.getMaxY() + 1); + height = height != null ? Math.min((world.getMaxY() - world.getMinY() + 1), height + 1) : (world.getMaxY() - world.getMinY() + 1); int affected = editSession.removeBelow(session.getPlacementPosition(actor), size, height); actor.print(Caption.of("worldedit.removebelow.removed", TextComponent.of(affected))); return affected; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BrushTool.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BrushTool.java index c15d4dc6f..d6c44fa66 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BrushTool.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BrushTool.java @@ -388,7 +388,7 @@ public class BrushTool final int x = loc.getBlockX(); final int z = loc.getBlockZ(); int y; - for (y = height; y > 0; y--) { + for (y = height; y > editSession.getMinY(); y--) { BlockType block = editSession.getBlockType(x, y, z); if (block.getMaterial().isMovementBlocker()) { break; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloodFillTool.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloodFillTool.java index bb0b9a46a..7986a7a1d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloodFillTool.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloodFillTool.java @@ -87,7 +87,8 @@ public class FloodFillTool implements BlockTool { //FAWE start - Respect masks Mask mask = initialType.toMask(editSession); BlockReplace function = new BlockReplace(editSession, pattern); - RecursiveVisitor visitor = new RecursiveVisitor(mask, function, range, editSession); + RecursiveVisitor visitor = new RecursiveVisitor(mask, function, range, editSession.getMinY(), + editSession.getMaxY(), editSession); visitor.visit(origin); Operations.completeLegacy(visitor); //FAWE end diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/RecursivePickaxe.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/RecursivePickaxe.java index 1b2ea3f5f..9fad39f9d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/RecursivePickaxe.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/RecursivePickaxe.java @@ -86,7 +86,14 @@ public class RecursivePickaxe implements BlockTool { final int radius = (int) range; final BlockReplace replace = new BlockReplace(editSession, (BlockTypes.AIR.getDefaultState())); editSession.setMask(null); - RecursiveVisitor visitor = new RecursiveVisitor(new IdMask(editSession), replace, radius, editSession); + RecursiveVisitor visitor = new RecursiveVisitor( + new IdMask(editSession), + replace, + radius, + editSession.getMinY(), + editSession.getMaxY(), + editSession + ); //TODO: Fix below //visitor.visit(pos); //Operations.completeBlindly(visitor); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/GravityBrush.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/GravityBrush.java index 72bba1d95..b82601288 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/GravityBrush.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/brush/GravityBrush.java @@ -39,8 +39,8 @@ public class GravityBrush implements Brush { MaxChangedBlocksException { //FAWE start - Ours operates differently to upstream, but does the same double endY = position.getY() + size; - double startPerformY = Math.max(0, position.getY() - size); - double startCheckY = fullHeight ? 0 : startPerformY; + double startPerformY = Math.max(editSession.getMinY(), position.getY() - size); + double startCheckY = fullHeight ? editSession.getMinY() : startPerformY; for (double x = position.getX() + size; x > position.getX() - size; --x) { for (double z = position.getZ() + size; z > position.getZ() - size; --z) { double freeSpot = startCheckY; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/OffsetMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/OffsetMaskParser.java index ccf875833..a9c12235c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/OffsetMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/OffsetMaskParser.java @@ -69,7 +69,7 @@ public class OffsetMaskParser extends InputParser implements AliasedParser submask = new ExistingBlockMask(context.requireExtent()); } //FAWE start - OffsetMask > OffsetsMask - return new OffsetMask(submask, BlockVector3.at(0, firstChar == '>' ? -1 : 1, 0)); + return new OffsetMask(submask, BlockVector3.at(0, firstChar == '>' ? -1 : 1, 0), context.getMinY(), context.getMaxY()); //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/input/ParserContext.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/input/ParserContext.java index 4bbb20354..660c8331d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/input/ParserContext.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/input/ParserContext.java @@ -23,6 +23,7 @@ import com.fastasyncworldedit.core.configuration.Caption; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.extension.factory.MaskFactory; import com.sk89q.worldedit.extension.platform.Actor; +import com.sk89q.worldedit.extension.platform.Locatable; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.world.World; import org.enginehub.piston.inject.InjectedValueAccess; @@ -50,6 +51,8 @@ public class ParserContext { private boolean preferringWildcard; //Fawe start private InjectedValueAccess injected; + private int minY = Integer.MIN_VALUE; + private int maxY = Integer.MAX_VALUE; //FAWE end /** @@ -270,5 +273,69 @@ public class ParserContext { public InjectedValueAccess getInjected() { return injected; } + + /** + * Attempts to resolve the minimum Y value associated with this context or returns 0. + * Caches both min and max y values. + * + * @return Minimum y value (inclusive) or 0 + */ + public int getMinY() { + if (minY != Integer.MIN_VALUE) { + return minY; + } + + Extent extent = null; + + if (actor instanceof Locatable) { + extent = ((Locatable) actor).getExtent(); + } else if (world != null) { + extent = world; + } else if (this.extent != null) { + extent = this.extent; + } + + if (extent != null) { + minY = extent.getMinY(); + maxY = extent.getMaxY(); + } else { + minY = 0; + maxY = 255; + } + + return minY; + } + + /** + * Attempts to resolve the maximum Y value associated with this context or returns 255. + * Caches both min and max y values. + * + * @return Maximum y value (inclusive) or 255 + */ + public int getMaxY() { + if (maxY != Integer.MAX_VALUE) { + return maxY; + } + + Extent extent = null; + + if (actor instanceof Locatable) { + extent = ((Locatable) actor).getExtent(); + } else if (world != null) { + extent = world; + } else if (this.extent != null) { + extent = this.extent; + } + + if (extent != null) { + minY = extent.getMinY(); + maxY = extent.getMaxY(); + } else { + minY = 0; + maxY = 255; + } + + return maxY; + } //FAWE end } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/AbstractDelegateExtent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/AbstractDelegateExtent.java index d414c2a96..643cec495 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/AbstractDelegateExtent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/AbstractDelegateExtent.java @@ -202,6 +202,11 @@ public class AbstractDelegateExtent implements Extent { return extent.getMaxY(); } + @Override + public int getMinY() { + return extent.getMinY(); + } + @Override public boolean relight(int x, int y, int z) { return extent.relight(x, y, z); @@ -317,7 +322,7 @@ public class AbstractDelegateExtent implements Extent { @Override public > boolean setBlock( - int x, @Range(from = 0, to = 255) int y, + int x, int y, int z, T block ) throws WorldEditException { return extent.setBlock(x, y, z, block); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/Extent.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/Extent.java index cb6ed7634..dfda01b0f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/Extent.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/Extent.java @@ -200,9 +200,16 @@ public interface Extent extends InputExtent, OutputExtent { - TODO: actually optimize these */ + /** + * Returns the highest solid 'terrain' block. + * + * @param x the X coordinate + * @param z the Z coordinate + * @param minY minimal height + * @param maxY maximal height + * @return height of highest block found or 'minY' + */ default int getHighestTerrainBlock(final int x, final int z, int minY, int maxY) { - maxY = Math.min(maxY, Math.max(0, maxY)); - minY = Math.max(0, minY); for (int y = maxY; y >= minY; --y) { BlockState block = getBlock(x, y, z); if (block.getBlockType().getMaterial().isMovementBlocker()) { @@ -212,9 +219,19 @@ public interface Extent extends InputExtent, OutputExtent { return minY; } + /** + * Returns the highest solid 'terrain' block. + * + * @param x the X coordinate + * @param z the Z coordinate + * @param minY minimal height + * @param maxY maximal height + * @param filter a mask of blocks to consider, or null to consider any solid (movement-blocking) block + * @return height of highest block found or 'minY' + */ default int getHighestTerrainBlock(final int x, final int z, int minY, int maxY, Mask filter) { - maxY = Math.min(maxY, Math.max(0, maxY)); - minY = Math.max(0, minY); + maxY = Math.min(maxY, getMaxY()); + minY = Math.max(getMinY(), minY); MutableBlockVector3 mutable = new MutableBlockVector3(); @@ -226,6 +243,18 @@ public interface Extent extends InputExtent, OutputExtent { return minY; } + /** + * Returns the nearest surface layer (up/down from start) + *

+ * TODO: Someone understand this..? + * + * @param x x to search from + * @param z y to search from + * @param y z to search from + * @param minY min y to search (inclusive) + * @param maxY max y to search (inclusive) + * @return nearest surface layer + */ default int getNearestSurfaceLayer(int x, int z, int y, int minY, int maxY) { int clearanceAbove = maxY - y; int clearanceBelow = y - minY; @@ -255,7 +284,7 @@ public interface Extent extends InputExtent, OutputExtent { for (int layer = y - clearance - 1; layer >= minY; layer--) { block = getBlock(x, layer, z); if (block.getBlockType().getMaterial().isMovementBlocker() == state) { - return ((layer + offset) << 4) + 0; + return (layer + offset) << 4; } data1 = PropertyGroup.LEVEL.get(block); } @@ -272,18 +301,20 @@ public interface Extent extends InputExtent, OutputExtent { return (state ? minY : maxY) << 4; } - default int getNearestSurfaceTerrainBlock(int x, int z, int y, int minY, int maxY, boolean ignoreAir) { - return getNearestSurfaceTerrainBlock(x, z, y, minY, maxY, minY, maxY, ignoreAir); - } - - default int getNearestSurfaceTerrainBlock(int x, int z, int y, int minY, int maxY) { - return getNearestSurfaceTerrainBlock(x, z, y, minY, maxY, minY, maxY); - } - - default int getNearestSurfaceTerrainBlock(int x, int z, int y, int minY, int maxY, int failedMin, int failedMax) { - return getNearestSurfaceTerrainBlock(x, z, y, minY, maxY, failedMin, failedMax, true); - } - + /** + * Gets y value for the nearest block that is considered the surface of the terrain (cave roof/floor, mountain surface, + * etc) where the block conforms to a given mask. Searches in the x,z column given. + * + * @param x column x + * @param z column z + * @param y start y + * @param minY minimum y height to consider. Inclusive. + * @param maxY maximum y height to consider. Inclusive. + * @param failedMin if nothing found, the minimum y value to return if returning min + * @param failedMax if nothing found, the maximum y value to return if returning max + * @param mask mask to test blocks against + * @return The y value of the nearest terrain block + */ default int getNearestSurfaceTerrainBlock(int x, int z, int y, int minY, int maxY, int failedMin, int failedMax, Mask mask) { y = Math.max(minY, Math.min(maxY, y)); int clearanceAbove = maxY - y; @@ -320,6 +351,68 @@ public interface Extent extends InputExtent, OutputExtent { return state ? failedMin : failedMax; } + /** + * Gets y value for the nearest block that is considered the surface of the terrain (cave roof/floor, mountain surface, + * etc). Searches in the x,z column given. + * + * @param x column x + * @param z column z + * @param y start y + * @param minY minimum y height to consider. Inclusive. + * @param maxY maximum y height to consider. Inclusive. + * @param ignoreAir if air at the final value if no block found should be considered for return, else return -1 + * @return The y value of the nearest terrain block + */ + default int getNearestSurfaceTerrainBlock(int x, int z, int y, int minY, int maxY, boolean ignoreAir) { + return getNearestSurfaceTerrainBlock(x, z, y, minY, maxY, minY, maxY, ignoreAir); + } + + /** + * Gets y value for the nearest block that is considered the surface of the terrain (cave roof/floor, mountain surface, + * etc). Searches in the x,z column given. + * + * @param x column x + * @param z column z + * @param y start y + * @param minY minimum y height to consider. Inclusive. + * @param maxY maximum y height to consider. Inclusive. + * @return The y value of the nearest terrain block + */ + default int getNearestSurfaceTerrainBlock(int x, int z, int y, int minY, int maxY) { + return getNearestSurfaceTerrainBlock(x, z, y, minY, maxY, minY, maxY); + } + + /** + * Gets y value for the nearest block that is considered the surface of the terrain (cave roof/floor, mountain surface, + * etc). Searches in the x,z column given. + * + * @param x column x + * @param z column z + * @param y start y + * @param minY minimum y height to consider. Inclusive. + * @param maxY maximum y height to consider. Inclusive. + * @param failedMin if nothing found, the minimum y value to return if returning min + * @param failedMax if nothing found, the maximum y value to return if returning max + * @return The y value of the nearest terrain block + */ + default int getNearestSurfaceTerrainBlock(int x, int z, int y, int minY, int maxY, int failedMin, int failedMax) { + return getNearestSurfaceTerrainBlock(x, z, y, minY, maxY, failedMin, failedMax, true); + } + + /** + * Gets y value for the nearest block that is considered the surface of the terrain (cave roof/floor, mountain surface, + * etc). Searches in the x,z column given. + * + * @param x column x + * @param z column z + * @param y start y + * @param minY minimum y height to consider. Inclusive. + * @param maxY maximum y height to consider. Inclusive. + * @param failedMin if nothing found, the minimum y value to return if returning min + * @param failedMax if nothing found, the maximum y value to return if returning max + * @param ignoreAir if air at the final value if no block found should be considered for return, else return -1 + * @return The y value of the nearest terrain block + */ default int getNearestSurfaceTerrainBlock( int x, int z, @@ -367,7 +460,7 @@ public interface Extent extends InputExtent, OutputExtent { } } int result = state ? failedMin : failedMax; - if (result > 0 && !ignoreAir) { + if (result > minY && !ignoreAir) { block = getBlock(x, result, z); return block.getBlockType().getMaterial().isAir() ? -1 : result; } @@ -444,12 +537,13 @@ public interface Extent extends InputExtent, OutputExtent { spawnResource(region, new OreGen(this, mask, material, size, minY, maxY), rarity, frequency); } + //TODO: probably update these for 1.18 etc. default void addOres(Region region, Mask mask) throws WorldEditException { - addOre(region, mask, BlockTypes.DIRT.getDefaultState(), 33, 10, 100, 0, 255); - addOre(region, mask, BlockTypes.GRAVEL.getDefaultState(), 33, 8, 100, 0, 255); - addOre(region, mask, BlockTypes.ANDESITE.getDefaultState(), 33, 10, 100, 0, 79); - addOre(region, mask, BlockTypes.DIORITE.getDefaultState(), 33, 10, 100, 0, 79); - addOre(region, mask, BlockTypes.GRANITE.getDefaultState(), 33, 10, 100, 0, 79); + addOre(region, mask, BlockTypes.DIRT.getDefaultState(), 33, 10, 100, getMinY(), getMaxY()); + addOre(region, mask, BlockTypes.GRAVEL.getDefaultState(), 33, 8, 100, getMinY(), getMaxY()); + addOre(region, mask, BlockTypes.ANDESITE.getDefaultState(), 33, 10, 100, getMinY(), 79); + addOre(region, mask, BlockTypes.DIORITE.getDefaultState(), 33, 10, 100, getMinY(), 79); + addOre(region, mask, BlockTypes.GRANITE.getDefaultState(), 33, 10, 100, getMinY(), 79); addOre(region, mask, BlockTypes.COAL_ORE.getDefaultState(), 17, 20, 100, 0, 127); addOre(region, mask, BlockTypes.IRON_ORE.getDefaultState(), 9, 20, 100, 0, 63); addOre(region, mask, BlockTypes.GOLD_ORE.getDefaultState(), 9, 2, 100, 0, 31); @@ -556,11 +650,11 @@ public interface Extent extends InputExtent, OutputExtent { } default int getMinY() { - return 0; + return getMinimumPoint().getY(); } default int getMaxY() { - return 255; + return getMaximumPoint().getY(); } /** diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java index 890bafbaf..79280819e 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extent/clipboard/Clipboard.java @@ -347,7 +347,7 @@ public interface Clipboard extends Extent, Iterable, Closeable { if (!pasteAir && block.getBlockType().getMaterial().isAir()) { continue; } - if (pos.getY() < 0) { + if (pos.getY() < extent.getMinY()) { throw new RuntimeException("Y-Position cannot be less than 0!"); } extent.setBlock(xx, yy, zz, block); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetMask.java index b7d8006ad..91e92964f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetMask.java @@ -31,6 +31,10 @@ import static com.google.common.base.Preconditions.checkNotNull; */ public class OffsetMask extends AbstractMask { + //FAWE start - ignore resultant position outside world height range + private final int minY; + private final int maxY; + //FAWE end private Mask mask; private BlockVector3 offset; @@ -39,12 +43,30 @@ public class OffsetMask extends AbstractMask { * * @param mask the mask * @param offset the offset + * @deprecated use {@link OffsetMask#OffsetMask(Mask, BlockVector3, int, int)} */ + @Deprecated public OffsetMask(Mask mask, BlockVector3 offset) { + this(mask, offset, 0, 255); + } + + /** + * Create a new instance. + * + * @param mask the mask + * @param offset the offset + * @param minY minimum allowable y value to be set. Inclusive. + * @param maxY maximum allowable y value to be set. Inclusive. + */ + //FAWE start - ignore resultant position outside world height range + public OffsetMask(Mask mask, BlockVector3 offset, int minY, int maxY) { checkNotNull(mask); checkNotNull(offset); this.mask = mask; this.offset = offset; + this.minY = minY; + this.maxY = maxY; + //FAWE end } /** @@ -87,11 +109,13 @@ public class OffsetMask extends AbstractMask { @Override public boolean test(BlockVector3 vector) { + //FAWE start - ignore resultant position outside world height range BlockVector3 testPos = vector.add(offset); - if (testPos.getBlockY() < 0 || testPos.getBlockY() > 255) { + if (testPos.getBlockY() < minY || testPos.getBlockY() > maxY) { return false; } - return getMask().test(vector.add(offset)); + return getMask().test(testPos); + //FAWE end } @Nullable @@ -108,7 +132,7 @@ public class OffsetMask extends AbstractMask { //FAWE start @Override public Mask copy() { - return new OffsetMask(mask.copy(), offset.toImmutable()); + return new OffsetMask(mask.copy(), offset.toImmutable(), minY, maxY); } //FAWE end diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java index 7e73eaa75..aadf915a3 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/BreadthFirstSearch.java @@ -95,6 +95,8 @@ public abstract class BreadthFirstSearch implements Operation { private BlockVectorSet visited = new BlockVectorSet(); private BlockVector3[] directions; //FAWE end + protected final int minY; + protected final int maxY; private int affected = 0; //FAWE start private int currentDepth = 0; @@ -107,21 +109,21 @@ public abstract class BreadthFirstSearch implements Operation { * @param function the function to apply to visited blocks */ public BreadthFirstSearch(RegionFunction function) { - //FAWE start - this(function, Integer.MAX_VALUE); - //FAWE end - checkNotNull(function); + //FAWE start - int depth, min/max y + this(function, Integer.MAX_VALUE, 0, 255, null); } - //FAWE start + //FAWE start - int depth, min/max y, preloading /** * Create a new instance. * * @param function the function to apply to visited blocks - * @param maxDepth the maximum number of iterations + * @param depth maximum number of iterations + * @param minY minimum allowable y to visit. Inclusive. + * @param maxY maximum allowable y to visit. Inclusive. */ - public BreadthFirstSearch(RegionFunction function, int maxDepth) { - this(function, maxDepth, null); + public BreadthFirstSearch(RegionFunction function, int depth, int minY, int maxY) { + this(function, depth, minY, maxY, null); } /** @@ -129,13 +131,17 @@ public abstract class BreadthFirstSearch implements Operation { * * @param function the function to apply to visited blocks * @param maxDepth the maximum number of iterations + * @param minY minimum y value to visit. Inclusive. + * @param maxY maximum y value to visit. Inclusive. * @param extent extent to use for preloading */ - public BreadthFirstSearch(RegionFunction function, int maxDepth, Extent extent) { + public BreadthFirstSearch(RegionFunction function, int maxDepth, int minY, int maxY, Extent extent) { checkNotNull(function); this.function = function; this.directions = DEFAULT_DIRECTIONS; this.maxDepth = maxDepth; + this.minY = minY; + this.maxY = maxY; if (extent != null) { ExtentTraverser queueTraverser = new ExtentTraverser<>(extent).find(ParallelQueueExtent.class); this.singleQueue = queueTraverser != null ? (SingleThreadQueueExtent) queueTraverser.get().getExtent() : null; @@ -314,7 +320,7 @@ public abstract class BreadthFirstSearch implements Operation { for (int i = 0, j = 0; i < dirs.length && j < maxBranch; i++) { BlockVector3 direction = dirs[i]; int y = from.getBlockY() + direction.getY(); - if (y < 0 || y >= 256) { + if (y < minY || y > maxY) { continue; } int x = from.getBlockX() + direction.getX(); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/DownwardVisitor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/DownwardVisitor.java index 5e1d12971..45a81c9a0 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/DownwardVisitor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/DownwardVisitor.java @@ -37,19 +37,22 @@ public class DownwardVisitor extends RecursiveVisitor { private final int baseY; - //FAWE start - /** * Create a new visitor. * * @param mask the mask * @param function the function * @param baseY the base Y + * @deprecated Use {@link DownwardVisitor#DownwardVisitor(Mask, RegionFunction, int, int, int, int)} */ + @Deprecated public DownwardVisitor(Mask mask, RegionFunction function, int baseY) { - this(mask, function, baseY, Integer.MAX_VALUE); + //FAWE start - int depth, min/max y + this(mask, function, baseY, Integer.MAX_VALUE, 0, 255, null); + //FAWE end } + //FAWE start - int depth, min/max y, preloading /** * Create a new visitor. * @@ -57,9 +60,11 @@ public class DownwardVisitor extends RecursiveVisitor { * @param function the function * @param baseY the base Y * @param depth maximum number of iterations + * @param minY minimum allowable y to visit. Inclusive. + * @param maxY maximum allowable y to visit. Inclusive. */ - public DownwardVisitor(Mask mask, RegionFunction function, int baseY, int depth) { - this (mask, function, baseY, depth, null); + public DownwardVisitor(Mask mask, RegionFunction function, int baseY, int depth, int minY, int maxY) { + this(mask, function, baseY, depth, minY, maxY, null); } /** @@ -69,10 +74,12 @@ public class DownwardVisitor extends RecursiveVisitor { * @param function the function * @param baseY the base Y * @param depth maximum number of iterations + * @param minY minimum allowable y to visit. Inclusive. + * @param maxY maximum allowable y to visit. Inclusive. * @param extent extent for preloading */ - public DownwardVisitor(Mask mask, RegionFunction function, int baseY, int depth, Extent extent) { - super(mask, function, depth, extent); + public DownwardVisitor(Mask mask, RegionFunction function, int baseY, int depth, int minY, int maxY, Extent extent) { + super(mask, function, depth, minY, maxY, extent); checkNotNull(mask); this.baseY = baseY; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/NonRisingVisitor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/NonRisingVisitor.java index eafc86ffe..f1a358f36 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/NonRisingVisitor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/NonRisingVisitor.java @@ -29,29 +29,32 @@ import com.sk89q.worldedit.math.BlockVector3; */ public class NonRisingVisitor extends RecursiveVisitor { - //FAWE start - max int - /** - * Create a new recursive visitor. + * Create a new resursive visitor. * * @param mask the mask * @param function the function + * @deprecated Use {@link NonRisingVisitor#NonRisingVisitor(Mask, RegionFunction, int, int, int, Extent)} */ + @Deprecated public NonRisingVisitor(Mask mask, RegionFunction function) { - this(mask, function, Integer.MAX_VALUE); + //FAWE start - int depth, y min/max + this(mask, function, Integer.MAX_VALUE, 0, 255, null); + //FAWE end } - //FAWE end - //FAWE start - int depth, preloading + //FAWE start - int depth, preloading, min/max y /** * Create a new recursive visitor. * * @param mask the mask * @param function the function * @param depth the maximum number of iterations + * @param minY minimum allowable y to visit. Inclusive. + * @param maxY maximum allowable y to visit. Inclusive. */ - public NonRisingVisitor(Mask mask, RegionFunction function, int depth) { - this(mask, function, depth, null); + public NonRisingVisitor(Mask mask, RegionFunction function, int depth, int minY, int maxY) { + this(mask, function, Integer.MAX_VALUE, minY, maxY, null); } /** @@ -60,10 +63,12 @@ public class NonRisingVisitor extends RecursiveVisitor { * @param mask the mask * @param function the function * @param depth the maximum number of iterations + * @param minY minimum allowable y to visit. Inclusive. + * @param maxY maximum allowable y to visit. Inclusive. * @param extent the extent for preloading */ - public NonRisingVisitor(Mask mask, RegionFunction function, int depth, Extent extent) { - super(mask, function, depth, extent); + public NonRisingVisitor(Mask mask, RegionFunction function, int depth, int minY, int maxY, Extent extent) { + super(mask, function, depth, minY, maxY, extent); setDirections( BlockVector3.UNIT_X, BlockVector3.UNIT_MINUS_X, diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RecursiveVisitor.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RecursiveVisitor.java index 346b312ac..ba80448a0 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RecursiveVisitor.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/visitor/RecursiveVisitor.java @@ -34,7 +34,6 @@ public class RecursiveVisitor extends BreadthFirstSearch { private final Mask mask; - //FAWE start /** * Create a new recursive visitor. * @@ -42,30 +41,37 @@ public class RecursiveVisitor extends BreadthFirstSearch { * @param function the function */ public RecursiveVisitor(Mask mask, RegionFunction function) { - this(mask, function, Integer.MAX_VALUE); + this(mask, function, Integer.MAX_VALUE, 0, 255, null); + //FAWE end } + //FAWE start - int depth, min/max y /** * Create a new recursive visitor. * * @param mask the mask * @param function the function * @param maxDepth the maximum number of iterations + * @param minY minimum allowable y to visit. Inclusive. + * @param maxY maximum allowable y to visit. Inclusive. */ - public RecursiveVisitor(Mask mask, RegionFunction function, int maxDepth) { - this(mask, function, maxDepth, null); + public RecursiveVisitor(Mask mask, RegionFunction function, int maxDepth, int minY, int maxY) { + this(mask, function, maxDepth, minY, maxY, null); } + //FAWE start - int depth, min/max y /** * Create a new recursive visitor. * * @param mask the mask * @param function the function * @param maxDepth the maximum number of iterations + * @param minY minimum allowable y to visit. Inclusive. + * @param maxY maximum allowable y to visit. Inclusive. * @param extent the extent for preloading */ - public RecursiveVisitor(Mask mask, RegionFunction function, int maxDepth, Extent extent) { - super(function, maxDepth, extent); + public RecursiveVisitor(Mask mask, RegionFunction function, int maxDepth, int minY, int maxY, Extent extent) { + super(function, maxDepth, minY, maxY, extent); checkNotNull(mask); this.mask = mask; } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/util/BiomeMath.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/util/BiomeMath.java index c043a8874..a79347a90 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/util/BiomeMath.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/util/BiomeMath.java @@ -19,53 +19,54 @@ package com.sk89q.worldedit.internal.util; -import net.royawesome.jlibnoise.MathHelper; - public class BiomeMath { - // From BiomeArray / BiomeContainer - public static final int HORIZONTAL_SECTION_COUNT = (int) Math.round(Math.log(16.0D) / Math.log(2.0D)) - 2; - public static final int VERTICAL_SECTION_COUNT = (int) Math.round(Math.log(256.0D) / Math.log(2.0D)) - 2; - public static final int HORIZONTAL_BIT_MASK = (1 << HORIZONTAL_SECTION_COUNT) - 1; - public static final int VERTICAL_BIT_MASK = (1 << VERTICAL_SECTION_COUNT) - 1; + //FAWE - Removed because it's unneeded, and it would require effort to have it work with worlds of differing heights across + // different game versions - private BiomeMath() { - } - - /** - * Compute the index into the MC biome array, for non-extended-height worlds. - * - * @param x the block x coordinate - * @param y the block y coordinate - * @param z the block z coordinate - * @return the index into the standard MC biome array - */ - public static int computeBiomeIndex(int x, int y, int z) { - int l = (x >> 2) & HORIZONTAL_BIT_MASK; - int m = MathHelper.clamp(y >> 2, 0, VERTICAL_BIT_MASK); - int n = (z >> 2) & HORIZONTAL_BIT_MASK; - return m << HORIZONTAL_SECTION_COUNT + HORIZONTAL_SECTION_COUNT - | n << HORIZONTAL_SECTION_COUNT - | l; - } - - /** - * Compute the index into the MC biome array, for extended-height worlds. - * - * @param x the block x coordinate - * @param y the block y coordinate - * @param z the block z coordinate - * @param minY minimum y of the world - * @param maxY maximum y of the world - * @return the index into the standard MC biome array - */ - public static int computeBiomeIndex(int x, int y, int z, int minY, int maxY) { - int l = (x >> 2) & HORIZONTAL_BIT_MASK; - int m = MathHelper.clamp((y >> 2) - minY, 0, maxY); - int n = (z >> 2) & HORIZONTAL_BIT_MASK; - return m << HORIZONTAL_SECTION_COUNT + HORIZONTAL_SECTION_COUNT - | n << HORIZONTAL_SECTION_COUNT - | l; - } +// // From BiomeArray / BiomeContainer +// public static final int HORIZONTAL_SECTION_COUNT = (int) Math.round(Math.log(16.0D) / Math.log(2.0D)) - 2; +// public static final int VERTICAL_SECTION_COUNT = (int) Math.round(Math.log(256.0D) / Math.log(2.0D)) - 2; +// public static final int HORIZONTAL_BIT_MASK = (1 << HORIZONTAL_SECTION_COUNT) - 1; +// public static final int VERTICAL_BIT_MASK = (1 << VERTICAL_SECTION_COUNT) - 1; +// +// private BiomeMath() { +// } +// +// /** +// * Compute the index into the MC biome array, for non-extended-height worlds. +// * +// * @param x the block x coordinate +// * @param y the block y coordinate +// * @param z the block z coordinate +// * @return the index into the standard MC biome array +// */ +// public static int computeBiomeIndex(int x, int y, int z) { +// int l = (x >> 2) & HORIZONTAL_BIT_MASK; +// int m = MathHelper.clamp(y >> 2, 0, VERTICAL_BIT_MASK); +// int n = (z >> 2) & HORIZONTAL_BIT_MASK; +// return m << HORIZONTAL_SECTION_COUNT + HORIZONTAL_SECTION_COUNT +// | n << HORIZONTAL_SECTION_COUNT +// | l; +// } +// +// /** +// * Compute the index into the MC biome array, for extended-height worlds. +// * +// * @param x the block x coordinate +// * @param y the block y coordinate +// * @param z the block z coordinate +// * @param minY minimum y of the world +// * @param maxY maximum y of the world +// * @return the index into the standard MC biome array +// */ +// public static int computeBiomeIndex(int x, int y, int z, int minY, int maxY) { +// int l = (x >> 2) & HORIZONTAL_BIT_MASK; +// int m = MathHelper.clamp((y >> 2) - minY, 0, maxY); +// int n = (z >> 2) & HORIZONTAL_BIT_MASK; +// return m << HORIZONTAL_SECTION_COUNT + HORIZONTAL_SECTION_COUNT +// | n << HORIZONTAL_SECTION_COUNT +// | l; +// } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/math/convolution/HeightMap.java b/worldedit-core/src/main/java/com/sk89q/worldedit/math/convolution/HeightMap.java index d280f3699..fc8ada868 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/math/convolution/HeightMap.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/math/convolution/HeightMap.java @@ -97,18 +97,18 @@ public class HeightMap { int bx = min.getBlockX(); int bz = min.getBlockZ(); Iterator flat = Regions.asFlatRegion(region).asFlatRegion().iterator(); - int layer = 0; + int layer = session.getMinY(); while (flat.hasNext()) { BlockVector2 pos = flat.next(); int x = pos.getBlockX(); int z = pos.getBlockZ(); - layer = session.getNearestSurfaceLayer(x, z, (layer + 7) >> 3, 0, maxY); + layer = session.getNearestSurfaceLayer(x, z, (layer + 7) >> 3, session.getMinY(), maxY); data[(z - bz) * width + (x - bx)] = layer; } } else { // Store current heightmap data int index = 0; - int yTmp = 255; + int yTmp = session.getMaxY(); for (int z = 0; z < height; ++z) { for (int x = 0; x < width; ++x, index++) { if (mask != null) { @@ -324,7 +324,7 @@ public class HeightMap { int y0 = newHeight - 1; for (int setY = y0, getY = curHeight - 1; setY >= curHeight; setY--, getY--) { BlockState get; - if (getY >= 0 && getY < 256) { + if (getY >= session.getMinY() && getY <= session.getMaxY()) { get = session.getBlock(xr, getY, zr); } else { get = BlockTypes.AIR.getDefaultState(); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/CuboidRegion.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/CuboidRegion.java index d13fc5b8f..92ddcc65c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/CuboidRegion.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/CuboidRegion.java @@ -19,7 +19,6 @@ package com.sk89q.worldedit.regions; -import com.fastasyncworldedit.core.FaweCache; import com.fastasyncworldedit.core.configuration.Settings; import com.fastasyncworldedit.core.extent.filter.block.ChunkFilterBlock; import com.fastasyncworldedit.core.math.BlockVectorSet; @@ -745,7 +744,7 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion { if (bx >= minX && tx <= maxX && bz >= minZ && tz <= maxZ) { // contains all X/Z - if (minY <= 0 && maxY >= 255) { + if (minY <= set.getMinSectionIndex() << 4 && maxY >= (set.getMaxSectionIndex() << 4) + 15) { return set; } trimY(set, minY, maxY); @@ -766,7 +765,7 @@ public class CuboidRegion extends AbstractRegion implements FlatRegion { boolean trimX = lowerX != 0 || upperX != 15; boolean trimZ = lowerZ != 0 || upperZ != 15; - for (int layer = 0; layer < FaweCache.IMP.CHUNK_LAYERS; layer++) { + for (int layer = get.getMinSectionIndex(); layer < get.getMaxSectionIndex(); layer++) { if (set.hasSection(layer)) { char[] arr = set.load(layer); if (trimX || trimZ) { diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Region.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Region.java index 8ca6493a6..b9d080749 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Region.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/Region.java @@ -244,11 +244,11 @@ public interface Region extends Iterable, Cloneable, IBatchProcess final IChunkSet set, boolean full ) { - int minSection = Math.max(0, getMinimumY() >> 4); - int maxSection = Math.min(15, getMaximumY() >> 4); + int minSection = Math.max(get.getMinSectionIndex(), getMinimumY() >> 4); + int maxSection = Math.min(get.getMaxSectionIndex(), getMaximumY() >> 4); block = block.initChunk(chunk.getX(), chunk.getZ()); for (int layer = minSection; layer <= maxSection; layer++) { - if ((!full && !get.hasSection(layer)) || !filter.appliesLayer(chunk, layer)) { + if ((!full && !set.hasSection(layer)) || !filter.appliesLayer(chunk, layer)) { return; } block = block.initLayer(get, set, layer); diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/TargetBlock.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/TargetBlock.java index a0fb78882..cb83d5873 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/TargetBlock.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/TargetBlock.java @@ -178,7 +178,7 @@ public class TargetBlock { } else { if (searchForLastBlock) { lastBlock = getCurrentBlock(); - if (lastBlock.getBlockY() <= 0 || lastBlock.getBlockY() >= world.getMaxY()) { + if (lastBlock.getBlockY() <= world.getMinY() || lastBlock.getBlockY() >= world.getMaxY()) { searchForLastBlock = false; } } diff --git a/worldedit-core/src/main/resources/lang/strings.json b/worldedit-core/src/main/resources/lang/strings.json index 01d618d94..1574eaf65 100644 --- a/worldedit-core/src/main/resources/lang/strings.json +++ b/worldedit-core/src/main/resources/lang/strings.json @@ -131,6 +131,10 @@ "fawe.error.no-failure": "This shouldn't result in any failure", "fawe.error.invalid-bracketing": "Invalid bracketing, are you missing a '{0}'.", "fawe.error.too-simple": "Complexity must be in the range 0-100", + "fawe.error.outside-range": "Argument {0} outside of range {1}-{2}.", + "fawe.error.outside-range-lower": "Argument {0} may not be less than {1}", + "fawe.error.outside-range-upper": "Argument {0} may not be greater than {1}", + "fawe.error.argument-size-mismatch": "Argument {0} may not be greater than argument {1}", "fawe.error.input-parser-exception": "Invalid empty string instead of boolean.", "fawe.error.invalid-boolean": "Invalid boolean {0}", "fawe.error.schematic.not.found": "Schematic {0} not found.",