diff --git a/common/src/main/java/com/dfsek/terra/TerraWorld.java b/common/src/main/java/com/dfsek/terra/TerraWorld.java index 350b6b67f..e4d23a14d 100644 --- a/common/src/main/java/com/dfsek/terra/TerraWorld.java +++ b/common/src/main/java/com/dfsek/terra/TerraWorld.java @@ -3,13 +3,11 @@ package com.dfsek.terra; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.generator.GeneratorWrapper; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.biome.BiomeZone; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; +import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.config.base.ConfigPack; public class TerraWorld { - private final TerraBiomeGrid grid; - private final BiomeZone zone; + private final BiomeProvider provider; private final ConfigPack config; private final boolean safe; private final TerraProfiler profiler; @@ -19,8 +17,7 @@ public class TerraWorld { public TerraWorld(World w, ConfigPack c, TerraPlugin main) { config = c; profiler = new TerraProfiler(w); - this.grid = new TerraBiomeGrid.TerraBiomeGridBuilder(w.getSeed(), c, main).build(); - this.zone = grid.getZone(); + this.provider = config.getTemplate().getProviderBuilder().build(w.getSeed()); this.world = w; safe = true; } @@ -33,18 +30,14 @@ public class TerraWorld { return w.getGenerator().getHandle() instanceof GeneratorWrapper; } - public TerraBiomeGrid getGrid() { - return grid; + public BiomeProvider getBiomeProvider() { + return provider; } public ConfigPack getConfig() { return config; } - public BiomeZone getZone() { - return zone; - } - public boolean isSafe() { return safe; } diff --git a/common/src/main/java/com/dfsek/terra/api/GenericLoaders.java b/common/src/main/java/com/dfsek/terra/api/GenericLoaders.java index 72e886ab7..8ad9c2fd7 100644 --- a/common/src/main/java/com/dfsek/terra/api/GenericLoaders.java +++ b/common/src/main/java/com/dfsek/terra/api/GenericLoaders.java @@ -6,11 +6,9 @@ import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.math.noise.samplers.Normalizer; import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.carving.CarverPalette; -import com.dfsek.terra.config.loaders.ImageLoaderLoader; import com.dfsek.terra.config.loaders.MaterialSetLoader; import com.dfsek.terra.config.loaders.ProbabilityCollectionLoader; import com.dfsek.terra.config.loaders.RangeLoader; @@ -24,7 +22,6 @@ import com.dfsek.terra.config.loaders.palette.CarverPaletteLoader; import com.dfsek.terra.config.loaders.palette.PaletteHolderLoader; import com.dfsek.terra.config.loaders.palette.PaletteLayerLoader; import com.dfsek.terra.generation.config.NoiseBuilder; -import com.dfsek.terra.image.ImageLoader; import com.dfsek.terra.population.items.flora.FloraLayer; import com.dfsek.terra.population.items.flora.TerraFlora; import com.dfsek.terra.population.items.ores.Ore; @@ -55,10 +52,6 @@ public class GenericLoaders implements LoaderRegistrar { .registerLoader(TreeLayer.class, new TreeLayerLoader()) .registerLoader(MaterialSet.class, new MaterialSetLoader()) .registerLoader(OreHolder.class, new OreHolderLoader()) - .registerLoader(ImageLoader.class, new ImageLoaderLoader()) - .registerLoader(TerraBiomeGrid.Type.class, (t, o, l) -> TerraBiomeGrid.Type.valueOf(o.toString())) - .registerLoader(ImageLoader.Channel.class, (t, o, l) -> ImageLoader.Channel.valueOf(o.toString())) - .registerLoader(ImageLoader.Align.class, (t, o, l) -> ImageLoader.Align.valueOf(o.toString())) .registerLoader(TerraFlora.Search.class, (t, o, l) -> TerraFlora.Search.valueOf(o.toString())) .registerLoader(Normalizer.NormalType.class, (t, o, l) -> Normalizer.NormalType.valueOf(o.toString().toUpperCase())); } diff --git a/common/src/main/java/com/dfsek/terra/api/math/vector/Vector2.java b/common/src/main/java/com/dfsek/terra/api/math/vector/Vector2.java index d78b0acc0..aacf31660 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/vector/Vector2.java +++ b/common/src/main/java/com/dfsek/terra/api/math/vector/Vector2.java @@ -178,6 +178,14 @@ public class Vector2 implements Cloneable { return this; } + public int getBlockX() { + return FastMath.floorToInt(x); + } + + public int getBlockZ() { + return FastMath.floorToInt(z); + } + @Override public String toString() { return "(" + x + ", " + z + ")"; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BiomeFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BiomeFunction.java index 55b88e140..e2356a06b 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BiomeFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BiomeFunction.java @@ -9,8 +9,8 @@ import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.script.TerraImplementationArguments; import com.dfsek.terra.api.structures.structure.RotationUtil; import com.dfsek.terra.api.structures.tokenizer.Position; +import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import net.jafama.FastMath; public class BiomeFunction implements Function { @@ -36,7 +36,7 @@ public class BiomeFunction implements Function { RotationUtil.rotateVector(xz, arguments.getRotation()); - TerraBiomeGrid grid = main.getWorld(arguments.getBuffer().getOrigin().getWorld()).getGrid(); + BiomeProvider grid = main.getWorld(arguments.getBuffer().getOrigin().getWorld()).getBiomeProvider(); return ((UserDefinedBiome) grid.getBiome(arguments.getBuffer().getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))))).getID(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java index 0be6ac4a1..d834cbff2 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java @@ -12,9 +12,8 @@ import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.script.TerraImplementationArguments; import com.dfsek.terra.api.structures.structure.RotationUtil; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.api.world.generation.GenerationPhase; +import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.generation.math.SamplerCache; import net.jafama.FastMath; @@ -54,8 +53,8 @@ public class CheckFunction implements Function { if(comp > 0) return "LAND"; // If noise val is greater than zero, location will always be land. - TerraBiomeGrid grid = tw.getGrid(); - UserDefinedBiome b = (UserDefinedBiome) grid.getBiome(vector.getBlockX(), vector.getBlockZ(), GenerationPhase.POPULATE); + BiomeProvider provider = tw.getBiomeProvider(); + UserDefinedBiome b = (UserDefinedBiome) provider.getBiome(vector.getBlockX(), vector.getBlockZ()); BiomeTemplate c = b.getConfig(); if(vector.getY() > c.getSeaLevel()) return "AIR"; // Above sea level diff --git a/common/src/main/java/com/dfsek/terra/api/world/biome/BiomeGrid.java b/common/src/main/java/com/dfsek/terra/api/world/biome/BiomeGrid.java deleted file mode 100644 index e3b48fea4..000000000 --- a/common/src/main/java/com/dfsek/terra/api/world/biome/BiomeGrid.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.dfsek.terra.api.world.biome; - -import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite; -import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.world.generation.GenerationPhase; - -public abstract class BiomeGrid { - private final FastNoiseLite noiseX; - private final FastNoiseLite noiseZ; - private final int sizeX; - private final int sizeZ; - private TerraBiome[][] grid; - - - public BiomeGrid(long seed, double freq1, double freq2, int sizeX, int sizeZ) { - this.sizeX = sizeX; - this.sizeZ = sizeZ; - this.noiseX = new FastNoiseLite((int) seed); - this.noiseZ = new FastNoiseLite((int) seed + 1); - this.noiseX.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2); - this.noiseX.setFractalType(FastNoiseLite.FractalType.FBm); - this.noiseX.setFractalOctaves(4); - this.noiseZ.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2); - this.noiseZ.setFractalType(FastNoiseLite.FractalType.FBm); - this.noiseZ.setFractalOctaves(4); - this.noiseX.setFrequency(freq1); - this.noiseZ.setFrequency(freq2); - } - - - /** - * Gets the biome at a pair of coordinates. - * - * @param x - X-coordinate at which to fetch biome - * @param z - Z-coordinate at which to fetch biome - * @return TerraBiome - TerraBiome at the given coordinates. - */ - public TerraBiome getBiome(int x, int z, GenerationPhase phase) { - return grid[getBiomeNoiseX(x, z)][getBiomeNoiseZ(x, z)]; - } - - /** - * Gets the biome at a location. - * - * @param l - The location at which to fetch the biome. - * @return TerraBiome - TerraBiome at the given coordinates. - */ - public TerraBiome getBiome(Location l) { - return getBiome(l, GenerationPhase.POST_GEN); - } - - public double[] getRawNoise(int x, int z) { - return new double[] {noiseX.getNoise(x, z), noiseZ.getNoise(x, z)}; - } - - /** - * Get the raw X-noise for coordinates in the Grid. - * - * @param x X coordinate - * @param z Z coordinate - * @return Normalized noise - */ - public int getBiomeNoiseX(int x, int z) { - return normalize(noiseX.getNoise(x, z), sizeX); - } - - /** - * Get the raw Z-noise for coordinates in the Grid. - * - * @param x X coordinate - * @param z Z coordinate - * @return Normalized noise - */ - public int getBiomeNoiseZ(int x, int z) { - return normalize(noiseZ.getNoise(x, z), sizeZ); - } - - public TerraBiome[][] getGrid() { - return grid; - } - - public void setGrid(TerraBiome[][] grid) { - if(grid.length != sizeX) throw new IllegalArgumentException("Invalid length for grid, expected " + sizeX + ", got " + grid.length); - for(TerraBiome[] gridLayer : grid) { - if(gridLayer.length != sizeZ) - throw new IllegalArgumentException("Invalid length for grid layer, expected " + sizeZ + ", got " + gridLayer.length); - } - this.grid = grid; - } - - public TerraBiome getBiome(Location l, GenerationPhase phase) { - double biomeNoise = noiseX.getNoise(l.getBlockX(), l.getBlockZ()); - double climateNoise = noiseZ.getNoise(l.getBlockX(), l.getBlockZ()); - return grid[normalize(biomeNoise, sizeX)][normalize(climateNoise, sizeZ)]; - } - - public int getSizeX() { - return sizeX; - } - - public int getSizeZ() { - return sizeZ; - } - - /** - * Takes a noise input and normalizes it to a value between 0 and 15 inclusive. - * - * @param i - The noise value to normalize. - * @return int - The normalized value. - */ - protected int normalize(double i, int range) { - return NormalizationUtil.normalize(i, range, 4); - } - -} diff --git a/common/src/main/java/com/dfsek/terra/api/world/biome/NormalizationUtil.java b/common/src/main/java/com/dfsek/terra/api/world/biome/NormalizationUtil.java deleted file mode 100644 index 8d277a275..000000000 --- a/common/src/main/java/com/dfsek/terra/api/world/biome/NormalizationUtil.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.dfsek.terra.api.world.biome; - -import net.jafama.FastMath; - -/** - * Ultra-fast normalization utility for pre-defined lookup table based on 160 million points of Cellular noise generated from 1-octave Simplex noise. - */ -public class NormalizationUtil { - private static final double[] normalMap4 = new double[] {- 0.5522426962852478D, - 0.5356624126434326D, - 0.5250319838523865D, - 0.5172030329704285D, - 0.5108230710029602D, - 0.5051751136779785D, - 0.5003848075866699D, - 0.496286541223526D, - 0.49219056963920593D, - 0.488725870847702D, - 0.48548242449760437D, - 0.48233601450920105D, - 0.4794590473175049D, - 0.47680431604385376D, - 0.4741802513599396D, - 0.4716983437538147D, - 0.46938973665237427D, - 0.4671768844127655D, - 0.46493932604789734D, - 0.4628496468067169D, - 0.46085309982299805D, - 0.45893776416778564D, - 0.4571230709552765D, - 0.45534923672676086D, - 0.4535684585571289D, - 0.4518905282020569D, - 0.45032820105552673D, - 0.44873151183128357D, - 0.4472157657146454D, - 0.445724755525589D, - 0.4442773759365082D, - 0.44282811880111694D, - 0.44138428568840027D, - 0.43998438119888306D, - 0.43863797187805176D, - 0.4373200237751007D, - 0.43603432178497314D, - 0.4348065257072449D, - 0.4335438907146454D, - 0.43234220147132874D, - 0.4311666488647461D, - 0.42999887466430664D, - 0.4288702607154846D, - 0.4277186393737793D, - 0.42660200595855713D, - 0.425540030002594D, - 0.42445454001426697D, - 0.42338213324546814D, - 0.42237231135368347D, - 0.4213787317276001D, - 0.42034342885017395D, - 0.41934314370155334D, - 0.41838738322257996D, - 0.41747593879699707D, - 0.4165368676185608D, - 0.41563472151756287D, - 0.41473135352134705D, - 0.41381341218948364D, - 0.412920743227005D, - 0.4120390713214874D, - 0.41113483905792236D, - 0.41027551889419556D, - 0.40940171480178833D, - 0.4085462987422943D, - 0.40771594643592834D, - 0.4068986475467682D, - 0.4060843288898468D, - 0.4052877426147461D, - 0.40450364351272583D, - 0.40370258688926697D, - 0.40295007824897766D, - 0.4022042751312256D, - 0.40143170952796936D, - 0.40068766474723816D, - 0.3999272882938385D, - 0.39916759729385376D, - 0.3984144926071167D, - 0.3977096378803253D, - 0.3969724774360657D, - 0.3962542712688446D, - 0.3955434262752533D, - 0.39482179284095764D, - 0.39413219690322876D, - 0.3934393525123596D, - 0.39274853467941284D, - 0.3920603394508362D, - 0.3913818895816803D, - 0.3907110095024109D, - 0.39001911878585815D, - 0.3893643021583557D, - 0.38873276114463806D, - 0.38809072971343994D, - 0.38744935393333435D, - 0.38681110739707947D, - 0.38617849349975586D, - 0.3855555057525635D, - 0.3849259316921234D, - 0.38428404927253723D, - 0.38368701934814453D, - 0.38305720686912537D, - 0.3824397325515747D, - 0.38183310627937317D, - 0.3812190294265747D, - 0.38061732053756714D, - 0.3800400495529175D, - 0.37945547699928284D, - 0.37887564301490784D, - 0.3783135712146759D, - 0.3777320683002472D, - 0.3771609365940094D, - 0.3765930235385895D, - 0.3760446608066559D, - 0.37546253204345703D, - 0.37489989399909973D, - 0.37433329224586487D, - 0.3737635910511017D, - 0.37320101261138916D, - 0.37265515327453613D, - 0.3721090257167816D, - 0.3715764880180359D, - 0.3710474967956543D, - 0.3705263137817383D, - 0.37000274658203125D, - 0.36946558952331543D, - 0.3689403533935547D, - 0.3684338629245758D, - 0.3679268956184387D, - 0.3674132525920868D, - 0.3668895363807678D, - 0.36637264490127563D, - 0.3658500015735626D, - 0.3653477430343628D, - 0.3648494482040405D, - 0.3643417954444885D, - 0.36385640501976013D, - 0.36335185170173645D, - 0.3628855347633362D, - 0.3624073565006256D, - 0.3619007468223572D, - 0.36142677068710327D, - 0.3609183132648468D, - 0.3604544401168823D, - 0.3599613606929779D, - 0.3594810962677002D, - 0.3590005338191986D, - 0.3585355281829834D, - 0.35805660486221313D, - 0.35758334398269653D, - 0.3571120500564575D, - 0.356632798910141D, - 0.35616397857666016D, - 0.3557022213935852D, - 0.35522621870040894D, - 0.35475999116897583D, - 0.3543040454387665D, - 0.3538462817668915D, - 0.35339656472206116D, - 0.35294967889785767D, - 0.3525013029575348D, - 0.35205140709877014D, - 0.3516044616699219D, - 0.3511776924133301D, - 0.3507419228553772D, - 0.350308358669281D, - 0.34987354278564453D, - 0.3494442403316498D, - 0.34901976585388184D, - 0.34858623147010803D, - 0.3481590747833252D, - 0.3477269113063812D, - 0.34729984402656555D, - 0.34686949849128723D, - 0.34644952416419983D, - 0.3460380733013153D, - 0.345601350069046D, - 0.3451806306838989D, - 0.34476256370544434D, - 0.3443388342857361D, - 0.34393346309661865D, - 0.3435156047344208D, - 0.34309715032577515D, - 0.34269776940345764D, - 0.34230056405067444D, - 0.34190237522125244D, - 0.3415068984031677D, - 0.3411085307598114D, - 0.3407077193260193D, - 0.3403150737285614D, - 0.3399060070514679D, - 0.3395008146762848D, - 0.33910876512527466D, - 0.3387194573879242D, - 0.3383338451385498D, - 0.3379477858543396D, - 0.33756473660469055D, - 0.33716049790382385D, - 0.336769163608551D, - 0.33637988567352295D, - 0.3360031843185425D, - 0.33561065793037415D, - 0.33522093296051025D, - 0.33484047651290894D, - 0.3344566524028778D, - 0.3340719938278198D, - 0.33369651436805725D, - 0.33331871032714844D, - 0.3329450190067291D, - 0.3325762152671814D, - 0.3321962356567383D, - 0.3318250775337219D, - 0.33146360516548157D, - 0.331096351146698D, - 0.3307240307331085D, - 0.33036690950393677D, - 0.3300083577632904D, - 0.3296314477920532D, - 0.32925838232040405D, - 0.3289034366607666D, - 0.32853060960769653D, - 0.3281768262386322D, - 0.32781481742858887D, - 0.32745665311813354D, - 0.3271014988422394D, - 0.3267449736595154D, - 0.32637742161750793D, - 0.32601433992385864D, - 0.3256617784500122D, - 0.325309157371521D, - 0.32495537400245667D, - 0.3246041238307953D, - 0.324260413646698D, - 0.32391706109046936D, - 0.32356011867523193D, - 0.3232196569442749D, - 0.3228764235973358D, - 0.3225192129611969D, - 0.3221615254878998D, - 0.32181763648986816D, - 0.32147231698036194D, - 0.32113757729530334D, - 0.3207913041114807D, - 0.3204527795314789D, - 0.3200984597206116D, - 0.31977012753486633D, - 0.3194332718849182D, - 0.31908634305000305D, - 0.3187503516674042D, - 0.3184075951576233D, - 0.3180627226829529D, - 0.3177427053451538D, - 0.31741446256637573D, - 0.31707704067230225D, - 0.316744863986969D, - 0.31642594933509827D, - 0.3161090612411499D, - 0.31578725576400757D, - 0.3154592216014862D, - 0.31513524055480957D, - 0.3148083984851837D, - 0.31448230147361755D, - 0.3141593337059021D, - 0.3138306438922882D, - 0.313511461019516D, - 0.3132011592388153D, - 0.31286999583244324D, - 0.31256046891212463D, - 0.31223684549331665D, - 0.3119199573993683D, - 0.31160062551498413D, - 0.31128641963005066D, - 0.31096261739730835D, - 0.3106483519077301D, - 0.31033560633659363D, - 0.31001248955726624D, - 0.30969613790512085D, - 0.3093807101249695D, - 0.3090643584728241D, - 0.3087562322616577D, - 0.3084530532360077D, - 0.3081410229206085D, - 0.30783092975616455D, - 0.3075273334980011D, - 0.30720987915992737D, - 0.3068995177745819D, - 0.30659666657447815D, - 0.3062874376773834D, - 0.3059786558151245D, - 0.305671364068985D, - 0.3053743839263916D, - 0.30506861209869385D, - 0.30476105213165283D, - 0.3044643998146057D, - 0.3041706383228302D, - 0.3038659393787384D, - 0.30357563495635986D, - 0.3032696545124054D, - 0.30296090245246887D, - 0.30266377329826355D, - 0.3023788034915924D, - 0.302080899477005D, - 0.3017835319042206D, - 0.3014954924583435D, - 0.3012062609195709D, - 0.30091601610183716D, - 0.3006187677383423D, - 0.30032220482826233D, - 0.3000366985797882D, - 0.29973816871643066D, - 0.2994519770145416D, - 0.29914233088493347D, - 0.2988555431365967D, - 0.29856425523757935D, - 0.2982824742794037D, - 0.29798826575279236D, - 0.2976938486099243D, - 0.29739657044410706D, - 0.29710277915000916D, - 0.29681164026260376D, - 0.29652127623558044D, - 0.29623138904571533D, - 0.29592910408973694D, - 0.2956419289112091D, - 0.29535165429115295D, - 0.29506999254226685D, - 0.29478344321250916D, - 0.2944985330104828D, - 0.2942177355289459D, - 0.29393965005874634D, - 0.2936561107635498D, - 0.29337379336357117D, - 0.2930947542190552D, - 0.29281559586524963D, - 0.29254022240638733D, - 0.29226312041282654D, - 0.2919958531856537D, - 0.29172608256340027D, - 0.291446328163147D, - 0.2911716103553772D, - 0.29089251160621643D, - 0.2906162738800049D, - 0.290350079536438D, - 0.29007789492607117D, - 0.28980758786201477D, - 0.28953540325164795D, - 0.2892584502696991D, - 0.2889859974384308D, - 0.2887132167816162D, - 0.2884424030780792D, - 0.28817737102508545D, - 0.2879084348678589D, - 0.28764015436172485D, - 0.2873786389827728D, - 0.28710025548934937D, - 0.28683197498321533D, - 0.28656822443008423D, - 0.28629666566848755D, - 0.28602135181427D, - 0.2857580780982971D, - 0.2854946255683899D, - 0.2852350175380707D, - 0.28497231006622314D, - 0.2847127616405487D, - 0.2844494581222534D, - 0.28418153524398804D, - 0.2839117646217346D, - 0.28364670276641846D, - 0.2833735942840576D, - 0.2831180989742279D, - 0.28285273909568787D, - 0.282595694065094D, - 0.28233304619789124D, - 0.28208285570144653D, - 0.28183260560035706D, - 0.28156495094299316D, - 0.2813194692134857D, - 0.28106340765953064D, - 0.2807980179786682D, - 0.2805359661579132D, - 0.2802804410457611D, - 0.28002557158470154D, - 0.27975931763648987D, - 0.2795126140117645D, - 0.27925795316696167D, - 0.27899473905563354D, - 0.278735488653183D, - 0.27847906947135925D, - 0.27822330594062805D, - 0.27796468138694763D, - 0.27770230174064636D, - 0.2774444818496704D, - 0.27718687057495117D, - 0.27694857120513916D, - 0.2766880989074707D, - 0.27643832564353943D, - 0.2761860489845276D, - 0.2759307324886322D, - 0.2756873071193695D, - 0.2754386067390442D, - 0.2751883268356323D, - 0.27494344115257263D, - 0.2746928334236145D, - 0.274436354637146D, - 0.27417975664138794D, - 0.2739262282848358D, - 0.27367040514945984D, - 0.2734193205833435D, - 0.273158460855484D, - 0.27291545271873474D, - 0.2726711928844452D, - 0.27241599559783936D, - 0.27216801047325134D, - 0.2719186842441559D, - 0.27167946100234985D, - 0.2714363932609558D, - 0.271190345287323D, - 0.2709449231624603D, - 0.2706972360610962D, - 0.27045026421546936D, - 0.27020177245140076D, - 0.26996636390686035D, - 0.2697167992591858D, - 0.2694661319255829D, - 0.2692175805568695D, - 0.2689802348613739D, - 0.2687402367591858D, - 0.2684989869594574D, - 0.2682455778121948D, - 0.2680189311504364D, - 0.26777616143226624D, - 0.267528235912323D, - 0.2672905921936035D, - 0.2670466899871826D, - 0.26680880784988403D, - 0.2665674090385437D, - 0.26632341742515564D, - 0.2660820782184601D, - 0.2658466100692749D, - 0.26560917496681213D, - 0.26536619663238525D, - 0.26512911915779114D, - 0.2648910880088806D, - 0.2646530270576477D, - 0.26441332697868347D, - 0.26417455077171326D, - 0.26393792033195496D, - 0.2637031376361847D, - 0.2634584307670593D, - 0.2632187306880951D, - 0.2629868984222412D, - 0.26276034116744995D, - 0.2625255584716797D, - 0.26228949427604675D, - 0.2620560824871063D, - 0.26182571053504944D, - 0.261595219373703D, - 0.2613618075847626D, - 0.26113298535346985D, - 0.2608985900878906D, - 0.26066386699676514D, - 0.26042836904525757D, - 0.2601918876171112D, - 0.25995346903800964D, - 0.2597239911556244D, - 0.25948530435562134D, - 0.25925174355506897D, - 0.25902727246284485D, - 0.25878533720970154D, - 0.2585568130016327D, - 0.25832033157348633D, - 0.25808852910995483D, - 0.25785645842552185D, - 0.2576303482055664D, - 0.25740429759025574D, - 0.25717857480049133D, - 0.2569526731967926D, - 0.25671908259391785D, - 0.25648829340934753D, - 0.25625646114349365D, - 0.2560245394706726D, - 0.25578436255455017D, - 0.2555571496486664D, - 0.25532659888267517D, - 0.25509998202323914D, - 0.2548714876174927D, - 0.2546450197696686D, - 0.2544119656085968D, - 0.25418850779533386D, - 0.25395628809928894D, - 0.25373202562332153D, - 0.2535029947757721D, - 0.2532775402069092D, - 0.2530599534511566D, - 0.25283512473106384D, - 0.2526094317436218D, - 0.2523849904537201D, - 0.25216206908226013D, - 0.2519350051879883D, - 0.2517090141773224D, - 0.2514895796775818D, - 0.2512630820274353D, - 0.25103917717933655D, - 0.2508082687854767D, - 0.25058355927467346D, - 0.25036174058914185D, - 0.2501283586025238D, - 0.24990904331207275D, - 0.249681293964386D, - 0.24945379793643951D, - 0.24923056364059448D, - 0.24901220202445984D, - 0.24878771603107452D, - 0.24855589866638184D, - 0.24833829700946808D, - 0.24811571836471558D, - 0.24789805710315704D, - 0.24767984449863434D, - 0.24746781587600708D, - 0.24724344909191132D, - 0.247017040848732D, - 0.24679675698280334D, - 0.24657492339611053D, - 0.2463507503271103D, - 0.24612344801425934D, - 0.2459094524383545D, - 0.24569448828697205D, - 0.2454809844493866D, - 0.2452625036239624D, - 0.24504707753658295D, - 0.2448272854089737D, - 0.24461260437965393D, - 0.2443927526473999D, - 0.24417124688625336D, - 0.243961900472641D, - 0.24374017119407654D, - 0.24352549016475677D, - 0.2433115839958191D, - 0.24308589100837708D, - 0.24287600815296173D, - 0.24265910685062408D, - 0.24244506657123566D, - 0.24222184717655182D, - 0.2420046031475067D, - 0.24178411066532135D, - 0.2415642887353897D, - 0.24134574830532074D, - 0.24113741517066956D, - 0.24092262983322144D, - 0.24071024358272552D, - 0.2404916137456894D, - 0.24028095602989197D, - 0.2400677651166916D, - 0.23985490202903748D, - 0.23963676393032074D, - 0.23942221701145172D, - 0.23919777572155D, - 0.23898695409297943D, - 0.23877480626106262D, - 0.2385605275630951D, - 0.23833821713924408D, - 0.23812562227249146D, - 0.23791590332984924D, - 0.2377057671546936D, - 0.23749561607837677D, - 0.2372775822877884D, - 0.23707041144371033D, - 0.23685894906520844D, - 0.23664598166942596D, - 0.2364351749420166D, - 0.23622725903987885D, - 0.23601093888282776D, - 0.23579688370227814D, - 0.2355896234512329D, - 0.2353767305612564D, - 0.23516340553760529D, - 0.23495911061763763D, - 0.23474349081516266D, - 0.23453089594841003D, - 0.234323650598526D, - 0.2341182678937912D, - 0.23391124606132507D, - 0.23369914293289185D, - 0.23348599672317505D, - 0.23327989876270294D, - 0.23307158052921295D, - 0.23286454379558563D, - 0.23266181349754333D, - 0.2324516326189041D, - 0.23224829137325287D, - 0.2320389449596405D, - 0.23183543980121613D, - 0.23162415623664856D, - 0.23141750693321228D, - 0.2312154620885849D, - 0.23101359605789185D, - 0.2308085411787033D, - 0.23060521483421326D, - 0.2303977906703949D, - 0.23019705712795258D, - 0.22999277710914612D, - 0.22978724539279938D, - 0.22957871854305267D, - 0.2293720841407776D, - 0.2291649729013443D, - 0.22895236313343048D, - 0.2287459373474121D, - 0.22854582965373993D, - 0.2283381223678589D, - 0.22812990844249725D, - 0.2279345691204071D, - 0.2277294397354126D, - 0.22752392292022705D, - 0.22731730341911316D, - 0.22711612284183502D, - 0.22691002488136292D, - 0.2267099916934967D, - 0.2265053242444992D, - 0.22630846500396729D, - 0.22610722482204437D, - 0.22590836882591248D, - 0.2257007658481598D, - 0.22550742328166962D, - 0.22530819475650787D, - 0.22511185705661774D, - 0.22490867972373962D, - 0.2247025966644287D, - 0.22450992465019226D, - 0.22430776059627533D, - 0.22410835325717926D, - 0.2239159643650055D, - 0.22370943427085876D, - 0.22351300716400146D, - 0.22331230342388153D, - 0.22311504185199738D, - 0.2229161113500595D, - 0.2227165549993515D, - 0.22251492738723755D, - 0.22231879830360413D, - 0.222111314535141D, - 0.2219131737947464D, - 0.22171789407730103D, - 0.22152048349380493D, - 0.221323162317276D, - 0.2211257964372635D, - 0.22093181312084198D, - 0.2207297384738922D, - 0.22052015364170074D, - 0.22031758725643158D, - 0.22012105584144592D, - 0.21992850303649902D, - 0.21972830593585968D, - 0.2195286750793457D, - 0.2193296104669571D, - 0.2191292941570282D, - 0.21894055604934692D, - 0.21874472498893738D, - 0.21854627132415771D, - 0.21834976971149445D, - 0.21815654635429382D, - 0.21795278787612915D, - 0.21775475144386292D, - 0.2175593227148056D, - 0.21736285090446472D, - 0.21716663241386414D, - 0.2169671356678009D, - 0.21677885949611664D, - 0.21658332645893097D, - 0.21638570725917816D, - 0.21619734168052673D, - 0.21600238978862762D, - 0.21581146121025085D, - 0.21561749279499054D, - 0.21542775630950928D, - 0.21523769199848175D, - 0.2150374948978424D, - 0.21483974158763885D, - 0.21464426815509796D, - 0.2144438624382019D, - 0.2142522931098938D, - 0.21405142545700073D, - 0.2138548493385315D, - 0.21365608274936676D, - 0.21346205472946167D, - 0.21327044069766998D, - 0.2130790650844574D, - 0.21289238333702087D, - 0.21269790828227997D, - 0.21250642836093903D, - 0.2123108059167862D, - 0.21211734414100647D, - 0.21193185448646545D, - 0.2117394357919693D, - 0.2115425020456314D, - 0.21135464310646057D, - 0.21115921437740326D, - 0.2109653651714325D, - 0.2107720673084259D, - 0.2105797827243805D, - 0.2103857845067978D, - 0.21019317209720612D, - 0.20999492704868317D, - 0.20980359613895416D, - 0.20961257815361023D, - 0.20942623913288116D, - 0.209233820438385D, - 0.20904646813869476D, - 0.2088536024093628D, - 0.20866578817367554D, - 0.20847372710704803D, - 0.20828045904636383D, - 0.20809443295001984D, - 0.20790085196495056D, - 0.20771846175193787D, - 0.20753352344036102D, - 0.20734763145446777D, - 0.20716027915477753D, - 0.2069670557975769D, - 0.20677906274795532D, - 0.20658759772777557D, - 0.20640024542808533D, - 0.20621001720428467D, - 0.2060190588235855D, - 0.20582759380340576D, - 0.20564205944538116D, - 0.20544962584972382D, - 0.2052612006664276D, - 0.2050696611404419D, - 0.2048760950565338D, - 0.2046886533498764D, - 0.20449654757976532D, - 0.20430676639080048D, - 0.2041216492652893D, - 0.20393186807632446D, - 0.20373943448066711D, - 0.20355398952960968D, - 0.20336341857910156D, - 0.20317570865154266D, - 0.20299416780471802D, - 0.2028021663427353D, - 0.20261310040950775D, - 0.20243166387081146D, - 0.20224738121032715D, - 0.20206642150878906D, - 0.20188181102275848D, - 0.20169363915920258D, - 0.2015080600976944D, - 0.2013179212808609D, - 0.20112863183021545D, - 0.20093776285648346D, - 0.20075495541095734D, - 0.2005680948495865D, - 0.2003868669271469D, - 0.20020489394664764D, - 0.20001673698425293D, - 0.19983160495758057D, - 0.1996394246816635D, - 0.19945387542247772D, - 0.19926834106445312D, - 0.19908671081066132D, - 0.1988958865404129D, - 0.19870947301387787D, - 0.19852466881275177D, - 0.19834156334400177D, - 0.19815687835216522D, - 0.19796614348888397D, - 0.19778570532798767D, - 0.19759665429592133D, - 0.19740843772888184D, - 0.19722165167331696D, - 0.19703587889671326D, - 0.19684910774230957D, - 0.19666774570941925D, - 0.1964777112007141D, - 0.19629596173763275D, - 0.19611066579818726D, - 0.1959228813648224D, - 0.19573974609375D, - 0.19555895030498505D, - 0.1953638643026352D, - 0.19518616795539856D, - 0.19500669836997986D, - 0.19482499361038208D, - 0.1946471929550171D, - 0.194466695189476D, - 0.19428104162216187D, - 0.1940973550081253D, - 0.19391575455665588D, - 0.19373083114624023D, - 0.19354969263076782D, - 0.1933702528476715D, - 0.19318976998329163D, - 0.19300931692123413D, - 0.19283118844032288D, - 0.19264520704746246D, - 0.1924607753753662D, - 0.1922810971736908D, - 0.19210171699523926D, - 0.1919163316488266D, - 0.19173482060432434D, - 0.19155943393707275D, - 0.19138532876968384D, - 0.19119767844676971D, - 0.19101446866989136D, - 0.1908339560031891D, - 0.19065433740615845D, - 0.19047808647155762D, - 0.19029070436954498D, - 0.19011610746383667D, - 0.1899399310350418D, - 0.1897595226764679D, - 0.18958213925361633D, - 0.18940195441246033D, - 0.18922074139118195D, - 0.1890474408864975D, - 0.18887129426002502D, - 0.18868793547153473D, - 0.18850910663604736D, - 0.18833401799201965D, - 0.1881609410047531D, - 0.1879805475473404D, - 0.1877983957529068D, - 0.18762242794036865D, - 0.18744400143623352D, - 0.18727153539657593D, - 0.18709038197994232D, - 0.186911940574646D, - 0.18673141300678253D, - 0.1865476816892624D, - 0.18636727333068848D, - 0.1861869841814041D, - 0.18600544333457947D, - 0.18582187592983246D, - 0.18564167618751526D, - 0.18546094000339508D, - 0.18528078496456146D, - 0.1851012110710144D, - 0.18491904437541962D, - 0.1847427636384964D, - 0.18456260859966278D, - 0.18438087403774261D, - 0.1842058300971985D, - 0.1840263456106186D, - 0.1838521808385849D, - 0.1836727261543274D, - 0.18349887430667877D, - 0.18331634998321533D, - 0.18313662707805634D, - 0.18296116590499878D, - 0.18278826773166656D, - 0.1826159507036209D, - 0.18243756890296936D, - 0.18226413428783417D, - 0.18208879232406616D, - 0.18189701437950134D, - 0.1817188709974289D, - 0.18154506385326385D, - 0.18136811256408691D, - 0.18119221925735474D, - 0.18101762235164642D, - 0.18084242939949036D, - 0.18066288530826569D, - 0.18048758804798126D, - 0.1803077757358551D, - 0.1801341325044632D, - 0.1799568086862564D, - 0.17978443205356598D, - 0.17961187660694122D, - 0.17943669855594635D, - 0.17925851047039032D, - 0.17908446490764618D, - 0.17891113460063934D, - 0.17873777449131012D, - 0.17856022715568542D, - 0.17838963866233826D, - 0.17821721732616425D, - 0.17804166674613953D, - 0.1778649091720581D, - 0.17769235372543335D, - 0.17751924693584442D, - 0.17734745144844055D, - 0.1771826446056366D, - 0.1770143061876297D, - 0.17684297263622284D, - 0.17666888236999512D, - 0.1764875054359436D, - 0.17631016671657562D, - 0.1761368215084076D, - 0.17596030235290527D, - 0.1757875680923462D, - 0.17561489343643188D, - 0.17543856799602509D, - 0.175258606672287D, - 0.17508889734745026D, - 0.1749197393655777D, - 0.17475321888923645D, - 0.17457622289657593D, - 0.17440469563007355D, - 0.17423614859580994D, - 0.17406317591667175D, - 0.1738888919353485D, - 0.17371085286140442D, - 0.17354506254196167D, - 0.1733754277229309D, - 0.17320691049098969D, - 0.17303411662578583D, - 0.17286333441734314D, - 0.1726849228143692D, - 0.17251433432102203D, - 0.1723429262638092D, - 0.17217423021793365D, - 0.17199841141700745D, - 0.17183169722557068D, - 0.17165900766849518D, - 0.17149260640144348D, - 0.1713184118270874D, - 0.17114870250225067D, - 0.17097310721874237D, - 0.17080703377723694D, - 0.1706410050392151D, - 0.17047066986560822D, - 0.17030231654644012D, - 0.17013415694236755D, - 0.16996319591999054D, - 0.1697862595319748D, - 0.16962021589279175D, - 0.1694522649049759D, - 0.16928495466709137D, - 0.1691145896911621D, - 0.16894133388996124D, - 0.16877424716949463D, - 0.1686055213212967D, - 0.16844305396080017D, - 0.16827253997325897D, - 0.16810156404972076D, - 0.16793574392795563D, - 0.16776280105113983D, - 0.16759483516216278D, - 0.16742615401744843D, - 0.16726046800613403D, - 0.16708528995513916D, - 0.16691190004348755D, - 0.16673815250396729D, - 0.16657349467277527D, - 0.16640760004520416D, - 0.1662367582321167D, - 0.16606061160564423D, - 0.16588932275772095D, - 0.16572310030460358D, - 0.16555465757846832D, - 0.16538579761981964D, - 0.16521978378295898D, - 0.16504855453968048D, - 0.16488133370876312D, - 0.1647077053785324D, - 0.16454964876174927D, - 0.16438791155815125D, - 0.16421759128570557D, - 0.16404742002487183D, - 0.16388101875782013D, - 0.16371379792690277D, - 0.16355162858963013D, - 0.1633833944797516D, - 0.16321513056755066D, - 0.16304640471935272D, - 0.1628739833831787D, - 0.16270378232002258D, - 0.16253381967544556D, - 0.16236473619937897D, - 0.16219766438007355D, - 0.1620299369096756D, - 0.1618584245443344D, - 0.16168925166130066D, - 0.16151995956897736D, - 0.16134582459926605D, - 0.1611795872449875D, - 0.16101405024528503D, - 0.1608451008796692D, - 0.16068188846111298D, - 0.1605166792869568D, - 0.16034835577011108D, - 0.16018332540988922D, - 0.16001814603805542D, - 0.15985408425331116D, - 0.15968838334083557D, - 0.15952043235301971D, - 0.1593540459871292D, - 0.1591864973306656D, - 0.15901817381381989D, - 0.15885035693645477D, - 0.1586897224187851D, - 0.15852101147174835D, - 0.15835918486118317D, - 0.15819862484931946D, - 0.15802861750125885D, - 0.1578657180070877D, - 0.15770186483860016D, - 0.157541885972023D, - 0.15737460553646088D, - 0.15719760954380035D, - 0.15703265368938446D, - 0.15686756372451782D, - 0.15670160949230194D, - 0.15654122829437256D, - 0.15637557208538055D, - 0.15620650351047516D, - 0.15603956580162048D, - 0.15587256848812103D, - 0.15570658445358276D, - 0.1555391401052475D, - 0.15537893772125244D, - 0.15521250665187836D, - 0.15504445135593414D, - 0.1548793762922287D, - 0.15472041070461273D, - 0.15455928444862366D, - 0.1543930172920227D, - 0.15422186255455017D, - 0.15405680239200592D, - 0.15389008820056915D, - 0.15371909737586975D, - 0.15355190634727478D, - 0.1533874124288559D, - 0.15322037041187286D, - 0.15305693447589874D, - 0.15288913249969482D, - 0.15272565186023712D, - 0.15255971252918243D, - 0.15239514410495758D, - 0.15223248302936554D, - 0.15206488966941833D, - 0.15189997851848602D, - 0.1517343968153D, - 0.15157388150691986D, - 0.15141001343727112D, - 0.15124376118183136D, - 0.1510799080133438D, - 0.15091581642627716D, - 0.15075315535068512D, - 0.1505943238735199D, - 0.15042626857757568D, - 0.15026342868804932D, - 0.15009838342666626D, - 0.14992687106132507D, - 0.14975950121879578D, - 0.14959338307380676D, - 0.1494319885969162D, - 0.14927686750888824D, - 0.1491170972585678D, - 0.1489545851945877D, - 0.1487915962934494D, - 0.14862462878227234D, - 0.14846675097942352D, - 0.1482943892478943D, - 0.14813122153282166D, - 0.14796608686447144D, - 0.1478019803762436D, - 0.14763972163200378D, - 0.14748099446296692D, - 0.1473177820444107D, - 0.14715023338794708D, - 0.14698868989944458D, - 0.14682012796401978D, - 0.14665497839450836D, - 0.14649364352226257D, - 0.14632706344127655D, - 0.14616291224956512D, - 0.14600065350532532D, - 0.1458369493484497D, - 0.14567570388317108D, - 0.14551441371440887D, - 0.1453484296798706D, - 0.14518843591213226D, - 0.14502838253974915D, - 0.1448645293712616D, - 0.14470131695270538D, - 0.14454562962055206D, - 0.144387349486351D, - 0.14422045648097992D, - 0.14406554400920868D, - 0.14389978349208832D, - 0.14373210072517395D, - 0.14357031881809235D, - 0.14340740442276D, - 0.1432454138994217D, - 0.1430845707654953D, - 0.14292079210281372D, - 0.1427599936723709D, - 0.14259862899780273D, - 0.14243145287036896D, - 0.142270028591156D, - 0.1421079933643341D, - 0.1419392079114914D, - 0.1417788565158844D, - 0.14161263406276703D, - 0.14144699275493622D, - 0.1412813663482666D, - 0.14111489057540894D, - 0.14095115661621094D, - 0.140792116522789D, - 0.14062824845314026D, - 0.1404629498720169D, - 0.14029960334300995D, - 0.14013166725635529D, - 0.13997189700603485D, - 0.13981026411056519D, - 0.13965271413326263D, - 0.13948722183704376D, - 0.1393279731273651D, - 0.13916252553462982D, - 0.13900236785411835D, - 0.1388358473777771D, - 0.13866667449474335D, - 0.13850988447666168D, - 0.13835175335407257D, - 0.138188436627388D, - 0.13802814483642578D, - 0.13786524534225464D, - 0.1377078741788864D, - 0.13754159212112427D, - 0.1373801976442337D, - 0.1372184306383133D, - 0.13705679774284363D, - 0.13689808547496796D, - 0.13673967123031616D, - 0.13657420873641968D, - 0.13640782237052917D, - 0.13624517619609833D, - 0.13608133792877197D, - 0.13591967523097992D, - 0.13575933873653412D, - 0.13559971749782562D, - 0.13544517755508423D, - 0.1352863609790802D, - 0.13513325154781342D, - 0.13497786223888397D, - 0.13481275737285614D, - 0.13465309143066406D, - 0.13449665904045105D, - 0.13433897495269775D, - 0.1341773420572281D, - 0.13402383029460907D, - 0.1338663548231125D, - 0.1337081789970398D, - 0.13354714214801788D, - 0.13338331878185272D, - 0.13322538137435913D, - 0.13306425511837006D, - 0.13290470838546753D, - 0.13275213539600372D, - 0.13259844481945038D, - 0.1324356645345688D, - 0.13227884471416473D, - 0.1321146935224533D, - 0.1319541037082672D, - 0.131797656416893D, - 0.13164083659648895D, - 0.13147978484630585D, - 0.13131381571292877D, - 0.13115201890468597D, - 0.13099059462547302D, - 0.1308245062828064D, - 0.1306670606136322D, - 0.1305040717124939D, - 0.13035070896148682D, - 0.13019300997257233D, - 0.1300356239080429D, - 0.1298762559890747D, - 0.1297183632850647D, - 0.12956057488918304D, - 0.12940144538879395D, - 0.12924081087112427D, - 0.12908275425434113D, - 0.1289270669221878D, - 0.12876754999160767D, - 0.12860682606697083D, - 0.12844565510749817D, - 0.12828676402568817D, - 0.12812906503677368D, - 0.12797008454799652D, - 0.12781330943107605D, - 0.12765750288963318D, - 0.12749481201171875D, - 0.127337247133255D, - 0.1271742433309555D, - 0.1270153522491455D, - 0.12685935199260712D, - 0.1267004907131195D, - 0.12653754651546478D, - 0.12637701630592346D, - 0.1262156367301941D, - 0.12606389820575714D, - 0.12590430676937103D, - 0.12574836611747742D, - 0.12559638917446136D, - 0.12544165551662445D, - 0.1252770870923996D, - 0.1251228302717209D, - 0.12496986985206604D, - 0.12481474876403809D, - 0.1246587485074997D, - 0.12450014054775238D, - 0.1243380680680275D, - 0.12417808920145035D, - 0.12401260435581207D, - 0.12385917454957962D, - 0.12369806319475174D, - 0.12354270368814468D, - 0.12338215857744217D, - 0.12322761118412018D, - 0.12307074666023254D, - 0.12291423231363297D, - 0.12275463342666626D, - 0.12259893864393234D, - 0.12243746966123581D, - 0.12228085845708847D, - 0.12212485074996948D, - 0.12196937203407288D, - 0.12180796265602112D, - 0.12165087461471558D, - 0.12149342894554138D, - 0.12132823467254639D, - 0.12117192149162292D, - 0.12100870162248611D, - 0.12084946036338806D, - 0.12069331109523773D, - 0.12053768336772919D, - 0.12037955224514008D, - 0.1202208548784256D, - 0.12006158381700516D, - 0.11990135163068771D, - 0.11974664032459259D, - 0.11959299445152283D, - 0.11944324523210526D, - 0.11928992718458176D, - 0.11913513392210007D, - 0.11898119002580643D, - 0.11882483214139938D, - 0.1186707392334938D, - 0.11851347982883453D, - 0.11835876107215881D, - 0.11820124834775925D, - 0.11804813891649246D, - 0.11789484322071075D, - 0.11773931980133057D, - 0.11758462339639664D, - 0.117423877120018D, - 0.11726968735456467D, - 0.11711079627275467D, - 0.11694814264774323D, - 0.11679580062627792D, - 0.11663621664047241D, - 0.11648730933666229D, - 0.11632833629846573D, - 0.11617368459701538D, - 0.11601484566926956D, - 0.1158570870757103D, - 0.11570281535387039D, - 0.11555135250091553D, - 0.11539247632026672D, - 0.11523469537496567D, - 0.11507617682218552D, - 0.11491613835096359D, - 0.11476139724254608D, - 0.11460647732019424D, - 0.11445080488920212D, - 0.11429022997617722D, - 0.11413708329200745D, - 0.11397743970155716D, - 0.11382514238357544D, - 0.11366745084524155D, - 0.11351797729730606D, - 0.11336144059896469D, - 0.11320804059505463D, - 0.11305557936429977D, - 0.11289967596530914D, - 0.11274378001689911D, - 0.11258506029844284D, - 0.11242981255054474D, - 0.11227528750896454D, - 0.11211802810430527D, - 0.11196192353963852D, - 0.11180936545133591D, - 0.1116519570350647D, - 0.11149086058139801D, - 0.11133705824613571D, - 0.11118285357952118D, - 0.11102371662855148D, - 0.11086839437484741D, - 0.11070949584245682D, - 0.11055301874876022D, - 0.11039435863494873D, - 0.11024358123540878D, - 0.11008933931589127D, - 0.10994099080562592D, - 0.10978744924068451D, - 0.1096331849694252D, - 0.1094803735613823D, - 0.10932327806949615D, - 0.1091662347316742D, - 0.10901220887899399D, - 0.10886164009571075D, - 0.10870997607707977D, - 0.1085532084107399D, - 0.10839588195085526D, - 0.10824001580476761D, - 0.10808181017637253D, - 0.10793018341064453D, - 0.10777948796749115D, - 0.10762609541416168D, - 0.10746936500072479D, - 0.10731363296508789D, - 0.10715664178133011D, - 0.10699828714132309D, - 0.1068406030535698D, - 0.10668957233428955D, - 0.106535904109478D, - 0.1063794493675232D, - 0.1062263771891594D, - 0.10607559233903885D, - 0.1059180200099945D, - 0.1057700365781784D, - 0.1056135967373848D, - 0.10546034574508667D, - 0.10531051456928253D, - 0.10515706241130829D, - 0.10500892251729965D, - 0.10485366731882095D, - 0.10469770431518555D, - 0.1045420691370964D, - 0.10438660532236099D, - 0.10423186421394348D, - 0.10408131033182144D, - 0.10392504185438156D, - 0.103775754570961D, - 0.10362043231725693D, - 0.10346867889165878D, - 0.1033216342329979D, - 0.10317199677228928D, - 0.1030234843492508D, - 0.1028713583946228D, - 0.102719247341156D, - 0.10256177186965942D, - 0.10241074860095978D, - 0.1022588387131691D, - 0.10210096091032028D, - 0.10195054113864899D, - 0.10179688781499863D, - 0.10164371132850647D, - 0.10149170458316803D, - 0.10133637487888336D, - 0.1011854037642479D, - 0.10102973878383636D, - 0.10087919235229492D, - 0.10073055326938629D, - 0.10058251768350601D, - 0.10042925179004669D, - 0.10028298944234848D, - 0.10012997686862946D, - 0.09998201578855515D, - 0.09982899576425552D, - 0.0996730700135231D, - 0.09951788932085037D, - 0.09936707466840744D, - 0.09921209514141083D, - 0.09906535595655441D, - 0.09891849011182785D, - 0.0987686887383461D, - 0.0986199602484703D, - 0.09847044944763184D, - 0.09832371026277542D, - 0.09816580265760422D, - 0.09800924360752106D, - 0.09785451740026474D, - 0.0977015420794487D, - 0.09754469245672226D, - 0.0973912850022316D, - 0.09723710268735886D, - 0.09708409756422043D, - 0.09692969173192978D, - 0.09677083045244217D, - 0.09661783277988434D, - 0.09646695107221603D, - 0.09631767868995667D, - 0.09616906195878983D, - 0.0960221216082573D, - 0.09587518125772476D, - 0.09572049975395203D, - 0.09557510167360306D, - 0.09542537480592728D, - 0.09527473896741867D, - 0.09512560814619064D, - 0.09497389942407608D, - 0.09482252597808838D, - 0.09466812759637833D, - 0.0945177897810936D, - 0.09436610341072083D, - 0.0942160040140152D, - 0.09406259655952454D, - 0.09391862154006958D, - 0.09376517683267593D, - 0.09361439198255539D, - 0.09346404671669006D, - 0.09330684691667557D, - 0.09315872937440872D, - 0.09300410747528076D, - 0.09285490214824677D, - 0.09270570427179337D, - 0.09255209565162659D, - 0.09239742159843445D, - 0.09224936366081238D, - 0.09209839254617691D, - 0.09194477647542953D, - 0.09178774058818817D, - 0.09163559973239899D, - 0.09148869663476944D, - 0.09133746474981308D, - 0.09118695557117462D, - 0.09104108810424805D, - 0.09089026600122452D, - 0.09074579924345016D, - 0.09059691429138184D, - 0.0904451310634613D, - 0.09029250591993332D, - 0.09014249593019485D, - 0.08999146521091461D, - 0.08984044194221497D, - 0.0896981805562973D, - 0.08955065906047821D, - 0.08939830958843231D, - 0.08925025165081024D, - 0.08909676969051361D, - 0.0889468863606453D, - 0.0888008326292038D, - 0.08865290880203247D, - 0.08850424736738205D, - 0.08835210651159286D, - 0.08819899708032608D, - 0.08805057406425476D, - 0.08789926767349243D, - 0.0877542570233345D, - 0.08760009706020355D, - 0.08745313435792923D, - 0.08730407804250717D, - 0.08714929223060608D, - 0.08699973672628403D, - 0.08685608208179474D, - 0.08670856803655624D, - 0.08656258881092072D, - 0.08641660213470459D, - 0.086270771920681D, - 0.08612503111362457D, - 0.08597104996442795D, - 0.08581869304180145D, - 0.08567001670598984D, - 0.08551899343729019D, - 0.08536837995052338D, - 0.08521687984466553D, - 0.0850711539387703D, - 0.08492837101221085D, - 0.08477798104286194D, - 0.08462752401828766D, - 0.08447655290365219D, - 0.08432706445455551D, - 0.08418617397546768D, - 0.08403434604406357D, - 0.08388318866491318D, - 0.0837327241897583D, - 0.08358580619096756D, - 0.08344066143035889D, - 0.08329291641712189D, - 0.08314470201730728D, - 0.08299455791711807D, - 0.08284270763397217D, - 0.08269276469945908D, - 0.08254578709602356D, - 0.08239870518445969D, - 0.08224755525588989D, - 0.08210334926843643D, - 0.08195140957832336D, - 0.08179952949285507D, - 0.08164890855550766D, - 0.08149830996990204D, - 0.08135122805833817D, - 0.08120505511760712D, - 0.08105988055467606D, - 0.08091382682323456D, - 0.08076044917106628D, - 0.0806116908788681D, - 0.08046256750822067D, - 0.08032169938087463D, - 0.0801742672920227D, - 0.08002588152885437D, - 0.079876609146595D, - 0.07973120361566544D, - 0.07958308607339859D, - 0.07943569868803024D, - 0.0792907252907753D, - 0.07914266735315323D, - 0.07899928838014603D, - 0.0788513645529747D, - 0.07870672643184662D, - 0.07855851948261261D, - 0.07841243594884872D, - 0.07826675474643707D, - 0.07811979949474335D, - 0.07797133177518845D, - 0.07782232016324997D, - 0.07767399400472641D, - 0.07752782851457596D, - 0.0773797407746315D, - 0.0772305428981781D, - 0.07708588242530823D, - 0.07694590836763382D, - 0.07679516822099686D, - 0.07664846628904343D, - 0.07649309933185577D, - 0.07634805887937546D, - 0.07619959115982056D, - 0.07605158537626266D, - 0.07590463012456894D, - 0.07575789093971252D, - 0.0756126120686531D, - 0.0754665955901146D, - 0.07531381398439407D, - 0.07516654580831528D, - 0.07501640915870667D, - 0.07486724108457565D, - 0.07472105324268341D, - 0.07457690685987473D, - 0.07442717999219894D, - 0.07427489012479782D, - 0.07413031905889511D, - 0.0739874318242073D, - 0.07384069263935089D, - 0.07369356602430344D, - 0.07354933023452759D, - 0.07339967787265778D, - 0.07325538247823715D, - 0.07310646027326584D, - 0.072956882417202D, - 0.0728110745549202D, - 0.07266359776258469D, - 0.0725211426615715D, - 0.07237620651721954D, - 0.07222937792539597D, - 0.07207916676998138D, - 0.07193435728549957D, - 0.07179314643144608D, - 0.07164552807807922D, - 0.07149890810251236D, - 0.07135166227817535D, - 0.07120280712842941D, - 0.07105418294668198D, - 0.07091175019741058D, - 0.07076039910316467D, - 0.07061431556940079D, - 0.07047049701213837D, - 0.07032421231269836D, - 0.07017634063959122D, - 0.07002970576286316D, - 0.06988793611526489D, - 0.06974132359027863D, - 0.06959310919046402D, - 0.06945087015628815D, - 0.06930480152368546D, - 0.06915923953056335D, - 0.06900786608457565D, - 0.0688617154955864D, - 0.06871413439512253D, - 0.06856607645750046D, - 0.06841415911912918D, - 0.06826581805944443D, - 0.06812670081853867D, - 0.06798086315393448D, - 0.06783780455589294D, - 0.06768807768821716D, - 0.06754382699728012D, - 0.06739568710327148D, - 0.06724487990140915D, - 0.06709926575422287D, - 0.06695383787155151D, - 0.06680747866630554D, - 0.06665907055139542D, - 0.06651457399129868D, - 0.06636756658554077D, - 0.06622058898210526D, - 0.06607180833816528D, - 0.06592177599668503D, - 0.06577412784099579D, - 0.0656253919005394D, - 0.06547900289297104D, - 0.0653318390250206D, - 0.06518644094467163D, - 0.06504128873348236D, - 0.06489810347557068D, - 0.06475608795881271D, - 0.06460591405630112D, - 0.06446024030447006D, - 0.064316026866436D, - 0.06417583674192429D, - 0.06403206288814545D, - 0.06388941407203674D, - 0.06374424695968628D, - 0.06360013782978058D, - 0.0634584054350853D, - 0.06331267207860947D, - 0.0631692036986351D, - 0.06302201002836227D, - 0.06288087368011475D, - 0.06273243576288223D, - 0.06258194893598557D, - 0.06243429332971573D, - 0.06229083240032196D, - 0.06214556843042374D, - 0.062002599239349365D, - 0.06185929477214813D, - 0.061716437339782715D, - 0.061570484191179276D, - 0.06142384186387062D, - 0.06127782538533211D, - 0.061132557690143585D, - 0.060989513993263245D, - 0.060844529420137405D, - 0.06069890409708023D, - 0.06055354326963425D, - 0.060405682772397995D, - 0.06026533991098404D, - 0.06011749058961868D, - 0.059968482702970505D, - 0.05982600525021553D, - 0.059680480509996414D, - 0.059535522013902664D, - 0.059390582144260406D, - 0.05924614518880844D, - 0.05910341069102287D, - 0.05896386876702309D, - 0.05881671980023384D, - 0.05867418646812439D, - 0.05852854624390602D, - 0.05838187783956528D, - 0.05823810026049614D, - 0.05809527635574341D, - 0.057948093861341476D, - 0.0578012652695179D, - 0.05765361711382866D, - 0.05750838667154312D, - 0.05736393481492996D, - 0.057217638939619064D, - 0.05706694349646568D, - 0.05692378431558609D, - 0.05678245425224304D, - 0.05663757398724556D, - 0.05649363622069359D, - 0.05634985491633415D, - 0.056205663830041885D, - 0.05606226995587349D, - 0.05592307448387146D, - 0.05577968433499336D, - 0.05563392862677574D, - 0.05549056455492973D, - 0.05534479022026062D, - 0.055201154202222824D, - 0.05505699664354324D, - 0.0549137219786644D, - 0.05476832762360573D, - 0.05462126433849335D, - 0.05447656661272049D, - 0.05434228852391243D, - 0.05420103296637535D, - 0.05406308174133301D, - 0.05391890928149223D, - 0.0537768192589283D, - 0.05362963303923607D, - 0.0534859336912632D, - 0.05334062874317169D, - 0.05319816619157791D, - 0.05305417627096176D, - 0.0529022179543972D, - 0.0527631975710392D, - 0.05261426791548729D, - 0.05247179791331291D, - 0.05232933536171913D, - 0.05218454450368881D, - 0.05203909054398537D, - 0.05189083516597748D, - 0.05174766480922699D, - 0.05160299316048622D, - 0.051458291709423065D, - 0.051309190690517426D, - 0.05115984380245209D, - 0.05101843550801277D, - 0.05087246745824814D, - 0.05072947219014168D, - 0.05057992786169052D, - 0.05043843761086464D, - 0.05029204860329628D, - 0.05014629662036896D, - 0.05000283941626549D, - 0.049857232719659805D, - 0.049713216722011566D, - 0.04957091435790062D, - 0.04942091554403305D, - 0.04927506670355797D, - 0.04913335666060448D, - 0.048989035189151764D, - 0.048844993114471436D, - 0.0487007237970829D, - 0.048562195152044296D, - 0.048413559794425964D, - 0.048270318657159805D, - 0.04812940955162048D, - 0.04798140004277229D, - 0.0478396899998188D, - 0.047694046050310135D, - 0.047547876834869385D, - 0.04740189015865326D, - 0.04726110398769379D, - 0.04712127149105072D, - 0.046977218240499496D, - 0.04683265835046768D, - 0.046689197421073914D, - 0.04654806852340698D, - 0.046403829008340836D, - 0.046261515468358994D, - 0.04611881449818611D, - 0.04596831649541855D, - 0.04582914337515831D, - 0.04568442329764366D, - 0.04553995281457901D, - 0.04539845883846283D, - 0.04524900019168854D, - 0.045108482241630554D, - 0.04496757686138153D, - 0.04482390731573105D, - 0.04467904940247536D, - 0.04453316330909729D, - 0.044389624148607254D, - 0.04424721747636795D, - 0.04410555958747864D, - 0.043958716094493866D, - 0.04381263256072998D, - 0.04366842657327652D, - 0.04352462291717529D, - 0.04338620603084564D, - 0.04324391856789589D, - 0.043100159615278244D, - 0.04295606166124344D, - 0.042808517813682556D, - 0.04266786947846413D, - 0.04252271726727486D, - 0.04237944632768631D, - 0.042232923209667206D, - 0.042089663445949554D, - 0.0419427864253521D, - 0.041796110570430756D, - 0.04165620356798172D, - 0.04151580110192299D, - 0.04137476161122322D, - 0.04122743010520935D, - 0.04108310863375664D, - 0.0409451425075531D, - 0.04079899191856384D, - 0.0406576506793499D, - 0.04051866754889488D, - 0.04037083312869072D, - 0.04022456333041191D, - 0.040080901235342026D, - 0.03993881866335869D, - 0.03979869186878204D, - 0.039654675871133804D, - 0.03950592130422592D, - 0.039364293217659D, - 0.03922411799430847D, - 0.039080843329429626D, - 0.038942210376262665D, - 0.038799673318862915D, - 0.03865673393011093D, - 0.038515783846378326D, - 0.03837844729423523D, - 0.03823413327336311D, - 0.0380907878279686D, - 0.03794614225625992D, - 0.037802569568157196D, - 0.0376591794192791D, - 0.03751154989004135D, - 0.037371594458818436D, - 0.03723229467868805D, - 0.0370887815952301D, - 0.03694836050271988D, - 0.036804623901844025D, - 0.036663684993982315D, - 0.03652269020676613D, - 0.03638038784265518D, - 0.03623593971133232D, - 0.03609330207109451D, - 0.03595142811536789D, - 0.03580619767308235D, - 0.035664405673742294D, - 0.03552398458123207D, - 0.03537818789482117D, - 0.035238854587078094D, - 0.03509785979986191D, - 0.03495733439922333D, - 0.034811608493328094D, - 0.034666016697883606D, - 0.034524593502283096D, - 0.034383177757263184D, - 0.03424632549285889D, - 0.03410206362605095D, - 0.03395908698439598D, - 0.03381533920764923D, - 0.03367502987384796D, - 0.03353389352560043D, - 0.0333939865231514D, - 0.0332530252635479D, - 0.0331089124083519D, - 0.03296489268541336D, - 0.03281978890299797D, - 0.03268205374479294D, - 0.032543547451496124D, - 0.03239939734339714D, - 0.03225564956665039D, - 0.03211319074034691D, - 0.031970299780368805D, - 0.03183053806424141D, - 0.031690504401922226D, - 0.0315515473484993D, - 0.03140871226787567D, - 0.03127032518386841D, - 0.03113543428480625D, - 0.03099132515490055D, - 0.03084556572139263D, - 0.030708063393831253D, - 0.030564403161406517D, - 0.03042270988225937D, - 0.030277878046035767D, - 0.030134053900837898D, - 0.0299934484064579D, - 0.029853519052267075D, - 0.02970750257372856D, - 0.02956370636820793D, - 0.029423074796795845D, - 0.029277591034770012D, - 0.02913256548345089D, - 0.028991548344492912D, - 0.028849191963672638D, - 0.028712045401334763D, - 0.028571665287017822D, - 0.028429850935935974D, - 0.028289183974266052D, - 0.028145452961325645D, - 0.02800772339105606D, - 0.027868105098605156D, - 0.027727505192160606D, - 0.027587590739130974D, - 0.027444127947092056D, - 0.02730259671807289D, - 0.027155976742506027D, - 0.027012743055820465D, - 0.026867320761084557D, - 0.02672656998038292D, - 0.026584992185235023D, - 0.026440242305397987D, - 0.026296602562069893D, - 0.026151999831199646D, - 0.02601231448352337D, - 0.025870999321341515D, - 0.025728831067681313D, - 0.025589263066649437D, - 0.0254491176456213D, - 0.025309832766652107D, - 0.025158962234854698D, - 0.02501760981976986D, - 0.024877915158867836D, - 0.024732133373618126D, - 0.024590589106082916D, - 0.024444540962576866D, - 0.02430100180208683D, - 0.02415304444730282D, - 0.02401198446750641D, - 0.023868655785918236D, - 0.023721497505903244D, - 0.023579789325594902D, - 0.023435594514012337D, - 0.023291146382689476D, - 0.02314934879541397D, - 0.023010551929473877D, - 0.0228724405169487D, - 0.02272932231426239D, - 0.0225907564163208D, - 0.022446082904934883D, - 0.02230372652411461D, - 0.022165967151522636D, - 0.022024204954504967D, - 0.021882086992263794D, - 0.02174002304673195D, - 0.02160024642944336D, - 0.021454278379678726D, - 0.02131497487425804D, - 0.02117258496582508D, - 0.021028701215982437D, - 0.02088312990963459D, - 0.020745303481817245D, - 0.020600121468305588D, - 0.020457785576581955D, - 0.0203145369887352D, - 0.020174575969576836D, - 0.020029140636324883D, - 0.019890660420060158D, - 0.01975022256374359D, - 0.01960756629705429D, - 0.019467037171125412D, - 0.019320420920848846D, - 0.019179683178663254D, - 0.01904134452342987D, - 0.018906118348240852D, - 0.01876520924270153D, - 0.018623512238264084D, - 0.018482543528079987D, - 0.01834135875105858D, - 0.01820279471576214D, - 0.018056906759738922D, - 0.017920710146427155D, - 0.01777799427509308D, - 0.01763162389397621D, - 0.017489714547991753D, - 0.017347203567624092D, - 0.017202477902173996D, - 0.017058173194527626D, - 0.01691833697259426D, - 0.01677481085062027D, - 0.016630994156003D, - 0.016491299495100975D, - 0.016348596662282944D, - 0.01620868779718876D, - 0.016068479046225548D, - 0.015927160158753395D, - 0.015780296176671982D, - 0.015641076490283012D, - 0.01549579482525587D, - 0.015356827527284622D, - 0.015214596875011921D, - 0.015070712193846703D, - 0.014923106878995895D, - 0.014777173288166523D, - 0.014636659994721413D, - 0.014497545547783375D, - 0.01435788907110691D, - 0.014213880524039268D, - 0.014070038683712482D, - 0.013929210603237152D, - 0.013789304532110691D, - 0.013650632463395596D, - 0.013506708666682243D, - 0.013362940400838852D, - 0.013227197341620922D, - 0.01308612059801817D, - 0.012950407341122627D, - 0.012812728062272072D, - 0.012670092284679413D, - 0.012525119818747044D, - 0.012382328510284424D, - 0.012240074574947357D, - 0.012100824154913425D, - 0.011954340152442455D, - 0.011809084564447403D, - 0.011668648570775986D, - 0.011526428163051605D, - 0.011384048499166965D, - 0.011242672801017761D, - 0.011099583469331264D, - 0.010958466678857803D, - 0.010816705413162708D, - 0.010674509219825268D, - 0.01053413562476635D, - 0.010388684459030628D, - 0.010249142535030842D, - 0.01011234987527132D, - 0.009969789534807205D, - 0.009829124435782433D, - 0.009690780192613602D, - 0.00955201406031847D, - 0.009414111264050007D, - 0.009270462207496166D, - 0.009133466519415379D, - 0.008997434750199318D, - 0.008857715874910355D, - 0.008718002587556839D, - 0.00857506226748228D, - 0.008436493575572968D, - 0.0082900645211339D, - 0.008144848048686981D, - 0.008006873540580273D, - 0.007865924388170242D, - 0.007721261121332645D, - 0.00757999112829566D, - 0.007438249886035919D, - 0.0072948825545609D, - 0.007154085673391819D, - 0.007011679001152515D, - 0.00687157129868865D, - 0.00673050107434392D, - 0.006592079531401396D, - 0.006459984928369522D, - 0.006322549190372229D, - 0.006178436800837517D, - 0.0060307616367936134D, - 0.005891833920031786D, - 0.005752726923674345D, - 0.005611956585198641D, - 0.0054701571352779865D, - 0.005323751829564571D, - 0.0051832739263772964D, - 0.005041905678808689D, - 0.00490262545645237D, - 0.004762133117765188D, - 0.004622789565473795D, - 0.004480161238461733D, - 0.004337271209806204D, - 0.004192086402326822D, - 0.004049763083457947D, - 0.003913718741387129D, - 0.0037738564424216747D, - 0.0036340609658509493D, - 0.003496516030281782D, - 0.0033569824881851673D, - 0.0032230240758508444D, - 0.003080387134104967D, - 0.002938604447990656D, - 0.002798959845677018D, - 0.0026581448037177324D, - 0.0025131211150437593D, - 0.002374080941081047D, - 0.0022358258720487356D, - 0.002095262985676527D, - 0.0019611597526818514D, - 0.0018215921008959413D, - 0.001680250046774745D, - 0.0015372197376564145D, - 0.0014027993893250823D, - 0.0012627525720745325D, - 0.0011206334456801414D, - 9.801845299080014E-4D, - 8.360585197806358E-4D, - 6.988595123402774E-4D, - 5.616724956780672E-4D, - 4.2402747203595936E-4D, - 2.863466797862202E-4D, - 1.5011828509159386E-4D, - 1.1911492038052529E-5D, 1.0044277587439865E-4D, 2.4089615908451378E-4D, 3.8259042776189744E-4D, 5.168318748474121E-4D, 6.586313829757273E-4D, 7.998387445695698E-4D, 9.450495708733797E-4D, 0.0010857662418857217D, 0.0012270103907212615D, 0.0013727317564189434D, 0.0015129010425880551D, 0.0016575645422562957D, 0.0017949064495041966D, 0.0019364129984751344D, 0.0020784020889550447D, 0.0022141814697533846D, 0.002355905482545495D, 0.0024919311981648207D, 0.0026356957387179136D, 0.002776813693344593D, 0.002913307398557663D, 0.0030520898289978504D, 0.0031952024437487125D, 0.003334963461384177D, 0.0034765605814754963D, 0.0036186855286359787D, 0.003756078891456127D, 0.003890153020620346D, 0.00403519906103611D, 0.004175015725195408D, 0.004315280355513096D, 0.004453583620488644D, 0.004600624553859234D, 0.004738769959658384D, 0.0048819067887961864D, 0.00502460403367877D, 0.005163980647921562D, 0.00530367624014616D, 0.0054444135166704655D, 0.005587113089859486D, 0.005727327894419432D, 0.005868169944733381D, 0.006005023140460253D, 0.006145890802145004D, 0.006285244598984718D, 0.006429470144212246D, 0.006562682334333658D, 0.006704656407237053D, 0.006846507545560598D, 0.006985656917095184D, 0.007125002332031727D, 0.0072641754522919655D, 0.007406939286738634D, 0.007548102177679539D, 0.007690674625337124D, 0.007831089198589325D, 0.007975874468684196D, 0.008120712824165821D, 0.008261434733867645D, 0.008401445113122463D, 0.008544900454580784D, 0.008687532506883144D, 0.008825301192700863D, 0.008967659436166286D, 0.00910977553576231D, 0.009249896742403507D, 0.009386919438838959D, 0.009527354501187801D, 0.009668641723692417D, 0.009810841642320156D, 0.009948905557394028D, 0.010086851194500923D, 0.010232945904135704D, 0.010377375409007072D, 0.010519984178245068D, 0.01066502183675766D, 0.010805521160364151D, 0.01095004752278328D, 0.011089478619396687D, 0.011232255026698112D, 0.011374537833034992D, 0.011516883037984371D, 0.011656570248305798D, 0.01180147286504507D, 0.011942529119551182D, 0.012080904096364975D, 0.012226544320583344D, 0.012367763556540012D, 0.01251029223203659D, 0.012649907730519772D, 0.012789136730134487D, 0.012928737327456474D, 0.01306520588696003D, 0.01320936344563961D, 0.013349758461117744D, 0.01349073089659214D, 0.01362910307943821D, 0.013771780766546726D, 0.013916674070060253D, 0.014057740569114685D, 0.014193498529493809D, 0.014332176186144352D, 0.014474655501544476D, 0.014616861939430237D, 0.01476175058633089D, 0.014896937645971775D, 0.015033396892249584D, 0.015173542313277721D, 0.015313568525016308D, 0.015453768894076347D, 0.01559944823384285D, 0.015740878880023956D, 0.0158759206533432D, 0.016010040417313576D, 0.01614815928041935D, 0.016291707754135132D, 0.01642908714711666D, 0.016571102663874626D, 0.0167134590446949D, 0.016856668516993523D, 0.01699613407254219D, 0.017135608941316605D, 0.017271164804697037D, 0.017408248037099838D, 0.017549676820635796D, 0.017692318186163902D, 0.01783503033220768D, 0.017975015565752983D, 0.018124109134078026D, 0.018262648954987526D, 0.01840408705174923D, 0.01854878105223179D, 0.01869070902466774D, 0.01883384957909584D, 0.01896996609866619D, 0.019111407920718193D, 0.019254807382822037D, 0.01939486153423786D, 0.019534043967723846D, 0.019675271585583687D, 0.01981993578374386D, 0.0199629794806242D, 0.020102735608816147D, 0.02024231106042862D, 0.02038371004164219D, 0.02052323706448078D, 0.020661482587456703D, 0.02080468460917473D, 0.020946234464645386D, 0.021089831367135048D, 0.021232876926660538D, 0.021373441442847252D, 0.021513110026717186D, 0.021651804447174072D, 0.021792175248265266D, 0.02193247526884079D, 0.02207680605351925D, 0.022216327488422394D, 0.022360535338521004D, 0.022502677515149117D, 0.022643806412816048D, 0.022783884778618813D, 0.022923531010746956D, 0.023063546046614647D, 0.023204835131764412D, 0.02334384247660637D, 0.0234853345900774D, 0.023626044392585754D, 0.023764535784721375D, 0.023903118446469307D, 0.024048229679465294D, 0.024190595373511314D, 0.024332139641046524D, 0.024473512545228004D, 0.024614179506897926D, 0.02475305274128914D, 0.02489588037133217D, 0.025042027235031128D, 0.02518259361386299D, 0.02532017230987549D, 0.025456052273511887D, 0.025593649595975876D, 0.02572823315858841D, 0.025868959724903107D, 0.026007654145359993D, 0.026148367673158646D, 0.0262919794768095D, 0.026437588036060333D, 0.02657989040017128D, 0.02672424539923668D, 0.02686365135014057D, 0.027008309960365295D, 0.02714969776570797D, 0.0272962786257267D, 0.027433041483163834D, 0.027577880769968033D, 0.027716439217329025D, 0.02785547636449337D, 0.02799663133919239D, 0.028138086199760437D, 0.028283756226301193D, 0.02842445857822895D, 0.028564687818288803D, 0.02871151641011238D, 0.028853772208094597D, 0.028992416337132454D, 0.029137132689356804D, 0.02927905134856701D, 0.02942042425274849D, 0.029561731964349747D, 0.02970500849187374D, 0.029843736439943314D, 0.029985306784510612D, 0.030128538608551025D, 0.030271068215370178D, 0.030412210151553154D, 0.030556289479136467D, 0.030699994415044785D, 0.030839497223496437D, 0.030983222648501396D, 0.031125547364354134D, 0.03126153349876404D, 0.03140360862016678D, 0.03154664859175682D, 0.03168836608529091D, 0.03183047100901604D, 0.031973324716091156D, 0.032119471579790115D, 0.032263923436403275D, 0.03240408003330231D, 0.03255024179816246D, 0.03268946334719658D, 0.032828912138938904D, 0.03296731039881706D, 0.033110037446022034D, 0.0332510732114315D, 0.033393360674381256D, 0.03353823721408844D, 0.03368401527404785D, 0.033826667815446854D, 0.03397251293063164D, 0.03411085903644562D, 0.03425149992108345D, 0.03439020738005638D, 0.03453071042895317D, 0.03467126935720444D, 0.03481120616197586D, 0.03495373949408531D, 0.03510218858718872D, 0.03524219989776611D, 0.03538297861814499D, 0.03552223742008209D, 0.03566665202379227D, 0.035811614245176315D, 0.03595492243766785D, 0.036098580807447433D, 0.03623691946268082D, 0.036375124007463455D, 0.03651357814669609D, 0.03665870800614357D, 0.03680017217993736D, 0.03694377467036247D, 0.03708707168698311D, 0.03722917661070824D, 0.03737087547779083D, 0.03751356527209282D, 0.037658076733350754D, 0.03780198469758034D, 0.03794156014919281D, 0.03808009997010231D, 0.038226112723350525D, 0.03837020695209503D, 0.03851321339607239D, 0.03865883871912956D, 0.038796741515398026D, 0.0389384850859642D, 0.039080578833818436D, 0.039222534745931625D, 0.03936350718140602D, 0.03950297087430954D, 0.039649803191423416D, 0.03979025036096573D, 0.03993142768740654D, 0.04007851704955101D, 0.04022213816642761D, 0.04036031663417816D, 0.04050862044095993D, 0.04065130278468132D, 0.04079713299870491D, 0.04093990474939346D, 0.04108305647969246D, 0.041225969791412354D, 0.041370511054992676D, 0.04151448979973793D, 0.041656360030174255D, 0.04179975762963295D, 0.0419391430914402D, 0.04208112135529518D, 0.042221635580062866D, 0.04236719012260437D, 0.04251044988632202D, 0.042655352503061295D, 0.04279865324497223D, 0.04294498264789581D, 0.04309157654643059D, 0.0432388074696064D, 0.043379221111536026D, 0.04352143779397011D, 0.0436660498380661D, 0.043809980154037476D, 0.043953701853752136D, 0.04409695789217949D, 0.044244274497032166D, 0.04439061880111694D, 0.04453623667359352D, 0.044679705053567886D, 0.04482024908065796D, 0.044966381043195724D, 0.04511309415102005D, 0.04525725916028023D, 0.04540384188294411D, 0.04554888978600502D, 0.04569651558995247D, 0.045842498540878296D, 0.04599529504776001D, 0.04613592103123665D, 0.04628181457519531D, 0.04642462357878685D, 0.046567466109991074D, 0.04671074077486992D, 0.04685356095433235D, 0.04699184000492096D, 0.04713955894112587D, 0.047283634543418884D, 0.04742766171693802D, 0.047572653740644455D, 0.04771960899233818D, 0.04786102473735809D, 0.048005830496549606D, 0.04814976453781128D, 0.04828828200697899D, 0.04843548312783241D, 0.04858119785785675D, 0.048723604530096054D, 0.048864372074604034D, 0.049006760120391846D, 0.04914587363600731D, 0.049290046095848083D, 0.04943503066897392D, 0.0495775006711483D, 0.04972691833972931D, 0.04986768960952759D, 0.05001039057970047D, 0.050152115523815155D, 0.05029670521616936D, 0.050433799624443054D, 0.05058044195175171D, 0.05072341486811638D, 0.050868451595306396D, 0.05100876837968826D, 0.05115212872624397D, 0.05129583179950714D, 0.051437895745038986D, 0.051578447222709656D, 0.05172283574938774D, 0.05186808481812477D, 0.05201121047139168D, 0.052156444638967514D, 0.05230209603905678D, 0.05244390666484833D, 0.05258335545659065D, 0.052733324468135834D, 0.052873220294713974D, 0.053014714270830154D, 0.053156204521656036D, 0.05330459401011467D, 0.05344386771321297D, 0.05358799546957016D, 0.05373207479715347D, 0.05387803167104721D, 0.05401966720819473D, 0.054165832698345184D, 0.05431075394153595D, 0.05445530638098717D, 0.05459970980882645D, 0.05474735423922539D, 0.054893892258405685D, 0.055043041706085205D, 0.055188897997140884D, 0.05533526465296745D, 0.055484600365161896D, 0.055627673864364624D, 0.05576412007212639D, 0.05590971186757088D, 0.05605686828494072D, 0.056200768798589706D, 0.05634428188204765D, 0.056488286703825D, 0.05663173645734787D, 0.056780435144901276D, 0.056926608085632324D, 0.05707206204533577D, 0.05721326544880867D, 0.057361286133527756D, 0.05750444158911705D, 0.05764487013220787D, 0.0577898845076561D, 0.05793076753616333D, 0.058076728135347366D, 0.058221399784088135D, 0.05836668983101845D, 0.0585147961974144D, 0.05866195634007454D, 0.058808885514736176D, 0.05895547941327095D, 0.05910357087850571D, 0.05925220251083374D, 0.059399936348199844D, 0.059544846415519714D, 0.0596906840801239D, 0.05983436480164528D, 0.059979792684316635D, 0.06012662872672081D, 0.06027741730213165D, 0.060420021414756775D, 0.06056952476501465D, 0.06071772798895836D, 0.06086060404777527D, 0.06100845709443092D, 0.06115204840898514D, 0.06129597872495651D, 0.061436720192432404D, 0.06158551573753357D, 0.061730656772851944D, 0.061872199177742004D, 0.062023792415857315D, 0.06216789036989212D, 0.062311336398124695D, 0.06245182454586029D, 0.06259559094905853D, 0.06274344027042389D, 0.06288424134254456D, 0.06303341686725616D, 0.06318292021751404D, 0.06332501769065857D, 0.0634644404053688D, 0.06361117213964462D, 0.06375652551651001D, 0.06389967352151871D, 0.06404681503772736D, 0.06419290602207184D, 0.06433777511119843D, 0.06448273360729218D, 0.06462704390287399D, 0.06476743519306183D, 0.06491541117429733D, 0.06506048142910004D, 0.06520365178585052D, 0.06535018980503082D, 0.06549554318189621D, 0.06563982367515564D, 0.06578198075294495D, 0.06592462956905365D, 0.06607501208782196D, 0.06622092425823212D, 0.06637339293956757D, 0.06651996076107025D, 0.06666484475135803D, 0.06681187450885773D, 0.06696231663227081D, 0.06711585819721222D, 0.06726408004760742D, 0.06741142272949219D, 0.06756040453910828D, 0.06770794093608856D, 0.06785459071397781D, 0.06800307333469391D, 0.0681459829211235D, 0.06829492747783661D, 0.06843948364257812D, 0.06858658790588379D, 0.06873581558465958D, 0.06887979060411453D, 0.06902722269296646D, 0.06917352229356766D, 0.06932160258293152D, 0.06947020441293716D, 0.06961338222026825D, 0.0697583258152008D, 0.06990432739257812D, 0.07005196064710617D, 0.07020289450883865D, 0.07034890353679657D, 0.0704943984746933D, 0.07064209878444672D, 0.07078889012336731D, 0.07093801349401474D, 0.07108846306800842D, 0.07123790681362152D, 0.0713827982544899D, 0.07153139263391495D, 0.07167878746986389D, 0.0718243345618248D, 0.07197458297014236D, 0.0721186175942421D, 0.07226993888616562D, 0.07241969555616379D, 0.07256375253200531D, 0.07271335273981094D, 0.0728621557354927D, 0.07300735265016556D, 0.07315520942211151D, 0.0733007937669754D, 0.07344561070203781D, 0.07359104603528976D, 0.07373455911874771D, 0.07388798892498016D, 0.07403958588838577D, 0.07419036328792572D, 0.07433661073446274D, 0.07448694854974747D, 0.07463737577199936D, 0.07478373497724533D, 0.07492654025554657D, 0.07507633417844772D, 0.07522371411323547D, 0.07537233084440231D, 0.07551730424165726D, 0.07567018270492554D, 0.07581793516874313D, 0.07596828043460846D, 0.07611866295337677D, 0.07626424729824066D, 0.07641275972127914D, 0.07655782997608185D, 0.07670912891626358D, 0.07685425132513046D, 0.0769948735833168D, 0.07714076340198517D, 0.07728724926710129D, 0.07743407785892487D, 0.07758434861898422D, 0.07773226499557495D, 0.07788585126399994D, 0.07802983373403549D, 0.07818049192428589D, 0.07832662761211395D, 0.0784769281744957D, 0.07862069457769394D, 0.07877039164304733D, 0.07891900837421417D, 0.07907077670097351D, 0.07921970635652542D, 0.07936611026525497D, 0.07951349020004272D, 0.07966248691082001D, 0.07980795949697495D, 0.07995842397212982D, 0.08010289818048477D, 0.08025183528661728D, 0.08040019869804382D, 0.0805511549115181D, 0.08069602400064468D, 0.08084388077259064D, 0.08099634200334549D, 0.08114219456911087D, 0.08129317313432693D, 0.08143977075815201D, 0.08159446716308594D, 0.08174245059490204D, 0.08189191669225693D, 0.08204131573438644D, 0.08219429105520248D, 0.08234331756830215D, 0.08249454945325851D, 0.08264464884996414D, 0.08279923349618912D, 0.08295143395662308D, 0.08310498297214508D, 0.08325477689504623D, 0.08341126888990402D, 0.08355995267629623D, 0.08371108770370483D, 0.0838567465543747D, 0.0840054377913475D, 0.08415643125772476D, 0.0843018889427185D, 0.08445502817630768D, 0.08460331708192825D, 0.08475178480148315D, 0.08490157872438431D, 0.0850466936826706D, 0.08519754558801651D, 0.08534461259841919D, 0.08549437671899796D, 0.08564329892396927D, 0.08579885959625244D, 0.08595023304224014D, 0.08609388023614883D, 0.08624261617660522D, 0.08639498800039291D, 0.08654710650444031D, 0.08670050650835037D, 0.08685077726840973D, 0.08700422197580338D, 0.08715102076530457D, 0.0872977003455162D, 0.08744174242019653D, 0.08759422600269318D, 0.08774594217538834D, 0.08788730204105377D, 0.0880391076207161D, 0.08819255977869034D, 0.08835027366876602D, 0.08849414438009262D, 0.08864499628543854D, 0.08879048377275467D, 0.0889355018734932D, 0.08908633887767792D, 0.08923996984958649D, 0.08938561379909515D, 0.08953885734081268D, 0.08968373388051987D, 0.08983418345451355D, 0.0899851843714714D, 0.09013000875711441D, 0.09028015285730362D, 0.09042900800704956D, 0.09057943522930145D, 0.09072867780923843D, 0.09087312966585159D, 0.0910261869430542D, 0.09117311239242554D, 0.09132302552461624D, 0.09147395193576813D, 0.09162616729736328D, 0.09177488088607788D, 0.09192109853029251D, 0.09207016974687576D, 0.09221813082695007D, 0.09237463772296906D, 0.09252386540174484D, 0.0926787331700325D, 0.09283152222633362D, 0.0929817333817482D, 0.09312929958105087D, 0.09328164160251617D, 0.09343400597572327D, 0.09358806163072586D, 0.09373386949300766D, 0.09388978779315948D, 0.09403824061155319D, 0.09419355541467667D, 0.09434627741575241D, 0.09449343383312225D, 0.09464648365974426D, 0.09479928016662598D, 0.0949493870139122D, 0.09509287029504776D, 0.09524017572402954D, 0.09539571404457092D, 0.0955447256565094D, 0.09569557756185532D, 0.0958479791879654D, 0.09600166976451874D, 0.09614894539117813D, 0.0962982177734375D, 0.09644953906536102D, 0.09659972786903381D, 0.09674496948719025D, 0.09690061956644058D, 0.09705154597759247D, 0.09720408916473389D, 0.09735329449176788D, 0.09750240296125412D, 0.09765297919511795D, 0.09780307859182358D, 0.09795534610748291D, 0.09811047464609146D, 0.09826676547527313D, 0.09841451048851013D, 0.09856410324573517D, 0.09871689975261688D, 0.09886790066957474D, 0.099018894135952D, 0.09916773438453674D, 0.09932077676057816D, 0.09947634488344193D, 0.09962969273328781D, 0.09978242218494415D, 0.09993064403533936D, 0.10008084774017334D, 0.10023438930511475D, 0.10038559883832932D, 0.10053691267967224D, 0.10068517923355103D, 0.1008366048336029D, 0.10099314153194427D, 0.10114269703626633D, 0.10129916667938232D, 0.10144601762294769D, 0.10159671306610107D, 0.10175005346536636D, 0.10190296918153763D, 0.10205913335084915D, 0.10221262276172638D, 0.10236292332410812D, 0.10252030938863754D, 0.10267956554889679D, 0.10282602161169052D, 0.10297860950231552D, 0.10312694311141968D, 0.10327927768230438D, 0.10343994200229645D, 0.10359508544206619D, 0.10374914109706879D, 0.10390400141477585D, 0.10405304282903671D, 0.10420652478933334D, 0.10436088591814041D, 0.10451732575893402D, 0.10467734932899475D, 0.1048327088356018D, 0.10498455911874771D, 0.10513525456190109D, 0.10528642684221268D, 0.1054416224360466D, 0.10559043288230896D, 0.10574282705783844D, 0.10589909553527832D, 0.10605556517839432D, 0.10620948672294617D, 0.10636616498231888D, 0.10651878267526627D, 0.10667099058628082D, 0.1068253219127655D, 0.10697854310274124D, 0.10713843256235123D, 0.10728807747364044D, 0.10744231194257736D, 0.10759419202804565D, 0.1077449843287468D, 0.10790048539638519D, 0.1080583855509758D, 0.10821515321731567D, 0.1083710640668869D, 0.10852231085300446D, 0.10867666453123093D, 0.10882777720689774D, 0.10898458957672119D, 0.10913711041212082D, 0.10929664224386215D, 0.10945430397987366D, 0.10961125046014786D, 0.10976684093475342D, 0.10992513597011566D, 0.11008249223232269D, 0.11024082452058792D, 0.1103985533118248D, 0.11054976284503937D, 0.11070134490728378D, 0.1108558252453804D, 0.11100988835096359D, 0.11115804314613342D, 0.11131478101015091D, 0.11147209256887436D, 0.11162741482257843D, 0.11178641021251678D, 0.11193942278623581D, 0.1120971292257309D, 0.11224858462810516D, 0.11240638792514801D, 0.11256378889083862D, 0.11272016912698746D, 0.11287200450897217D, 0.11303041875362396D, 0.11318613588809967D, 0.11333518475294113D, 0.11348620057106018D, 0.11363913863897324D, 0.11379265785217285D, 0.11394768208265305D, 0.1140977144241333D, 0.11425047367811203D, 0.1144118458032608D, 0.11457011848688126D, 0.11472522467374802D, 0.11488304287195206D, 0.11503463238477707D, 0.11518769711256027D, 0.11534227430820465D, 0.11550097167491913D, 0.11565592885017395D, 0.11581210047006607D, 0.11596544831991196D, 0.11612154543399811D, 0.11628284305334091D, 0.11644155532121658D, 0.11660086363554001D, 0.11675584316253662D, 0.1169113963842392D, 0.11706878989934921D, 0.11722639948129654D, 0.11737873405218124D, 0.11753018200397491D, 0.11769700050354004D, 0.1178499087691307D, 0.11800309270620346D, 0.11816198378801346D, 0.1183200553059578D, 0.11847332119941711D, 0.11863360553979874D, 0.1187887191772461D, 0.11894822865724564D, 0.11911315470933914D, 0.11926519870758057D, 0.11942169815301895D, 0.11957871168851852D, 0.11973323673009872D, 0.11989237368106842D, 0.12004467844963074D, 0.12020543962717056D, 0.12036484479904175D, 0.1205243393778801D, 0.12068185210227966D, 0.12084473669528961D, 0.12100447714328766D, 0.12115930765867233D, 0.12131694704294205D, 0.1214812844991684D, 0.12163779884576797D, 0.12179568409919739D, 0.12195295840501785D, 0.12211063504219055D, 0.12226805835962296D, 0.12242195755243301D, 0.12257634848356247D, 0.12273655086755753D, 0.12289784848690033D, 0.12306149303913116D, 0.1232261061668396D, 0.12338338792324066D, 0.12354311347007751D, 0.12370559573173523D, 0.12387170642614365D, 0.12403009831905365D, 0.12418466806411743D, 0.12434112280607224D, 0.1244964450597763D, 0.12465308606624603D, 0.12481117248535156D, 0.12496909499168396D, 0.12512359023094177D, 0.12528195977210999D, 0.12543469667434692D, 0.12559561431407928D, 0.12575115263462067D, 0.12590746581554413D, 0.12606586515903473D, 0.12622293829917908D, 0.12637664377689362D, 0.12653762102127075D, 0.12669754028320312D, 0.12685619294643402D, 0.1270214170217514D, 0.12718062102794647D, 0.12733519077301025D, 0.12749606370925903D, 0.12765872478485107D, 0.12782463431358337D, 0.12798020243644714D, 0.1281414031982422D, 0.1283019781112671D, 0.12846773862838745D, 0.1286260485649109D, 0.12878255546092987D, 0.12894503772258759D, 0.1291048526763916D, 0.12926606833934784D, 0.12942789494991302D, 0.12959156930446625D, 0.12974515557289124D, 0.12989819049835205D, 0.1300552934408188D, 0.13021644949913025D, 0.13037624955177307D, 0.13053417205810547D, 0.13069522380828857D, 0.13085974752902985D, 0.13101573288440704D, 0.1311684399843216D, 0.13133539259433746D, 0.13149294257164001D, 0.13164502382278442D, 0.13180053234100342D, 0.1319563388824463D, 0.13211700320243835D, 0.1322767436504364D, 0.13244172930717468D, 0.1325972080230713D, 0.13275986909866333D, 0.13291573524475098D, 0.1330719292163849D, 0.1332334727048874D, 0.13339528441429138D, 0.13355481624603271D, 0.1337166279554367D, 0.13387836515903473D, 0.13404130935668945D, 0.13420721888542175D, 0.1343671977519989D, 0.1345280408859253D, 0.1346929669380188D, 0.13485346734523773D, 0.13500912487506866D, 0.13516193628311157D, 0.13532406091690063D, 0.13548418879508972D, 0.13564568758010864D, 0.135810986161232D, 0.13597291707992554D, 0.13613833487033844D, 0.1363004446029663D, 0.13646268844604492D, 0.1366201788187027D, 0.13678020238876343D, 0.13693927228450775D, 0.13709722459316254D, 0.1372576802968979D, 0.13741405308246613D, 0.13756953179836273D, 0.13772514462471008D, 0.13788801431655884D, 0.13804712891578674D, 0.13820964097976685D, 0.13837288320064545D, 0.13853824138641357D, 0.13870278000831604D, 0.13886971771717072D, 0.13903354108333588D, 0.13919901847839355D, 0.13936829566955566D, 0.13953237235546112D, 0.13969917595386505D, 0.1398545652627945D, 0.14002016186714172D, 0.14017291367053986D, 0.1403316706418991D, 0.14050057530403137D, 0.14065955579280853D, 0.14082512259483337D, 0.1409870684146881D, 0.14115603268146515D, 0.14131535589694977D, 0.14147478342056274D, 0.14164136350154877D, 0.14179907739162445D, 0.14195680618286133D, 0.14212191104888916D, 0.14228470623493195D, 0.14245115220546722D, 0.14261163771152496D, 0.14276936650276184D, 0.14292646944522858D, 0.14308787882328033D, 0.14325685799121857D, 0.14342321455478668D, 0.14359009265899658D, 0.1437581181526184D, 0.14392387866973877D, 0.14408327639102936D, 0.14425180852413177D, 0.14441044628620148D, 0.14458023011684418D, 0.1447472721338272D, 0.14490540325641632D, 0.14506784081459045D, 0.14523136615753174D, 0.14539727568626404D, 0.14555899798870087D, 0.1457156389951706D, 0.14588384330272675D, 0.146047443151474D, 0.14621107280254364D, 0.14637504518032074D, 0.14653868973255157D, 0.14670564234256744D, 0.1468755155801773D, 0.14703933894634247D, 0.14720577001571655D, 0.14737312495708466D, 0.14753885567188263D, 0.14770390093326569D, 0.14786669611930847D, 0.14803257584571838D, 0.14819718897342682D, 0.14836236834526062D, 0.14852797985076904D, 0.14869222044944763D, 0.14885452389717102D, 0.1490185558795929D, 0.14917722344398499D, 0.1493404656648636D, 0.14950552582740784D, 0.14966335892677307D, 0.14982236921787262D, 0.14998695254325867D, 0.1501506268978119D, 0.15031972527503967D, 0.1504816859960556D, 0.15064984560012817D, 0.15081049501895905D, 0.1509808599948883D, 0.15114429593086243D, 0.151309534907341D, 0.15147188305854797D, 0.15163883566856384D, 0.1517990082502365D, 0.15196684002876282D, 0.15213605761528015D, 0.1523030698299408D, 0.15247197449207306D, 0.1526411473751068D, 0.1528036892414093D, 0.15297077596187592D, 0.15313620865345D, 0.1533014178276062D, 0.1534666270017624D, 0.153630793094635D, 0.15379439294338226D, 0.15396162867546082D, 0.15412606298923492D, 0.15429098904132843D, 0.15445642173290253D, 0.15462461113929749D, 0.1547926366329193D, 0.15496547520160675D, 0.15512865781784058D, 0.15529468655586243D, 0.15546265244483948D, 0.1556297242641449D, 0.1557958573102951D, 0.1559613198041916D, 0.15613020956516266D, 0.15629254281520844D, 0.15645910799503326D, 0.15662696957588196D, 0.15679779648780823D, 0.1569603830575943D, 0.1571267694234848D, 0.15729504823684692D, 0.15745952725410461D, 0.15762628614902496D, 0.15778855979442596D, 0.15795747935771942D, 0.1581190824508667D, 0.15828733146190643D, 0.15845201909542084D, 0.15861950814723969D, 0.1587860882282257D, 0.1589500457048416D, 0.15911708772182465D, 0.15928740799427032D, 0.1594506800174713D, 0.1596156507730484D, 0.1597830355167389D, 0.15995223820209503D, 0.1601230353116989D, 0.16028858721256256D, 0.16046783328056335D, 0.16063354909420013D, 0.16080449521541595D, 0.16097332537174225D, 0.16114337742328644D, 0.16131465137004852D, 0.161483496427536D, 0.1616491973400116D, 0.16181625425815582D, 0.1619846075773239D, 0.16215431690216064D, 0.16232497990131378D, 0.16249686479568481D, 0.1626671552658081D, 0.16284231841564178D, 0.16301144659519196D, 0.16317616403102875D, 0.1633453667163849D, 0.1635095179080963D, 0.1636842042207718D, 0.1638593226671219D, 0.16402937471866608D, 0.16418977081775665D, 0.1643621176481247D, 0.16453686356544495D, 0.1647082269191742D, 0.16487736999988556D, 0.16504469513893127D, 0.16521750390529633D, 0.16538292169570923D, 0.16555410623550415D, 0.16572774946689606D, 0.16590924561023712D, 0.1660730093717575D, 0.16624289751052856D, 0.16641287505626678D, 0.16657964885234833D, 0.1667483001947403D, 0.16692405939102173D, 0.16709285974502563D, 0.16726498305797577D, 0.1674390435218811D, 0.1676134467124939D, 0.16778451204299927D, 0.16795344650745392D, 0.16812381148338318D, 0.16829201579093933D, 0.1684664785861969D, 0.1686391979455948D, 0.16881050169467926D, 0.16898894309997559D, 0.16915665566921234D, 0.16932551562786102D, 0.16949592530727386D, 0.1696702241897583D, 0.16984823346138D, 0.17002031207084656D, 0.1701897382736206D, 0.17036403715610504D, 0.17053993046283722D, 0.17071034014225006D, 0.1708792746067047D, 0.1710500866174698D, 0.17121891677379608D, 0.17139190435409546D, 0.17156367003917694D, 0.17173637449741364D, 0.17190755903720856D, 0.1720849573612213D, 0.17225277423858643D, 0.17242112755775452D, 0.17259423434734344D, 0.17276640236377716D, 0.17293871939182281D, 0.17311054468154907D, 0.17328397929668427D, 0.17345906794071198D, 0.17363303899765015D, 0.1738104373216629D, 0.17397917807102203D, 0.17414800822734833D, 0.17431917786598206D, 0.17449432611465454D, 0.17466172575950623D, 0.1748395413160324D, 0.17501668632030487D, 0.17519143223762512D, 0.17536838352680206D, 0.1755412071943283D, 0.17571064829826355D, 0.17589080333709717D, 0.17606942355632782D, 0.176247239112854D, 0.17641842365264893D, 0.17658698558807373D, 0.17676332592964172D, 0.176935613155365D, 0.17710785567760468D, 0.17728090286254883D, 0.17745928466320038D, 0.1776321828365326D, 0.17780578136444092D, 0.17798294126987457D, 0.17815785109996796D, 0.17833979427814484D, 0.17851093411445618D, 0.1786835491657257D, 0.17886051535606384D, 0.1790376603603363D, 0.17921648919582367D, 0.17939159274101257D, 0.17957083880901337D, 0.1797502636909485D, 0.17992530763149261D, 0.1801026463508606D, 0.18028408288955688D, 0.18045489490032196D, 0.1806340366601944D, 0.1808105707168579D, 0.18098872900009155D, 0.1811632215976715D, 0.18134437501430511D, 0.18152523040771484D, 0.18170255422592163D, 0.18187786638736725D, 0.18205541372299194D, 0.18223069608211517D, 0.18240229785442352D, 0.1825835108757019D, 0.18276111781597137D, 0.18293944001197815D, 0.18311530351638794D, 0.18329167366027832D, 0.18346892297267914D, 0.1836460679769516D, 0.1838228851556778D, 0.18399597704410553D, 0.18417446315288544D, 0.1843516230583191D, 0.184530109167099D, 0.18470726907253265D, 0.18488577008247375D, 0.18506748974323273D, 0.185249924659729D, 0.18543273210525513D, 0.1856096237897873D, 0.18578913807868958D, 0.1859683245420456D, 0.18614578247070312D, 0.18632252514362335D, 0.1864963322877884D, 0.18667510151863098D, 0.1868581920862198D, 0.18703486025333405D, 0.18721888959407806D, 0.18739253282546997D, 0.18757246434688568D, 0.1877577155828476D, 0.18793287873268127D, 0.18811465799808502D, 0.1882943958044052D, 0.18847425282001495D, 0.18864761292934418D, 0.18882161378860474D, 0.18899816274642944D, 0.18917573988437653D, 0.18935945630073547D, 0.18953947722911835D, 0.189716637134552D, 0.18990230560302734D, 0.19007518887519836D, 0.19025564193725586D, 0.1904321163892746D, 0.19061104953289032D, 0.19078995287418365D, 0.190964937210083D, 0.19114817678928375D, 0.19132809340953827D, 0.19151580333709717D, 0.19169238209724426D, 0.19187597930431366D, 0.19205956161022186D, 0.19224511086940765D, 0.19242414832115173D, 0.19260457158088684D, 0.19278565049171448D, 0.19296668469905853D, 0.19314511120319366D, 0.193329855799675D, 0.19351661205291748D, 0.1937016248703003D, 0.19387923181056976D, 0.1940610557794571D, 0.194246307015419D, 0.19443221390247345D, 0.19460652768611908D, 0.19479267299175262D, 0.1949712485074997D, 0.1951516568660736D, 0.19533394277095795D, 0.1955246925354004D, 0.19570086896419525D, 0.19588221609592438D, 0.19606895744800568D, 0.19625340402126312D, 0.19644010066986084D, 0.19662165641784668D, 0.1968076378107071D, 0.19699516892433167D, 0.1971805989742279D, 0.1973554939031601D, 0.1975409835577011D, 0.1977252960205078D, 0.19790977239608765D, 0.1980927288532257D, 0.19827796518802643D, 0.19846612215042114D, 0.19864800572395325D, 0.19883641600608826D, 0.19901731610298157D, 0.1992063969373703D, 0.19938835501670837D, 0.1995694637298584D, 0.19975224137306213D, 0.19993893802165985D, 0.20012065768241882D, 0.20030593872070312D, 0.20049719512462616D, 0.20067352056503296D, 0.20086051523685455D, 0.20104587078094482D, 0.2012348473072052D, 0.20142585039138794D, 0.20161063969135284D, 0.20179665088653564D, 0.20198526978492737D, 0.20217211544513702D, 0.20235659182071686D, 0.20254142582416534D, 0.20272696018218994D, 0.20291101932525635D, 0.20309440791606903D, 0.20328234136104584D, 0.20347049832344055D, 0.20365656912326813D, 0.203854501247406D, 0.20404016971588135D, 0.2042284607887268D, 0.20441436767578125D, 0.20460355281829834D, 0.20478859543800354D, 0.2049754112958908D, 0.20516854524612427D, 0.20535217225551605D, 0.20553888380527496D, 0.20573171973228455D, 0.20591837167739868D, 0.20610769093036652D, 0.2063007354736328D, 0.20649467408657074D, 0.2066875845193863D, 0.20687413215637207D, 0.2070641964673996D, 0.2072521448135376D, 0.20743364095687866D, 0.20761997997760773D, 0.20781198143959045D, 0.20800599455833435D, 0.20819956064224243D, 0.2083868831396103D, 0.2085733562707901D, 0.20876942574977875D, 0.20896922051906586D, 0.20915867388248444D, 0.2093524932861328D, 0.20954589545726776D, 0.2097388058900833D, 0.20992672443389893D, 0.21011590957641602D, 0.21031244099140167D, 0.21050217747688293D, 0.21069328486919403D, 0.2108885496854782D, 0.21107973158359528D, 0.21127483248710632D, 0.21146471798419952D, 0.21166469156742096D, 0.21185675263404846D, 0.2120511382818222D, 0.21224676072597504D, 0.2124384641647339D, 0.21262727677822113D, 0.2128206193447113D, 0.21302452683448792D, 0.2132214456796646D, 0.2134128361940384D, 0.21360456943511963D, 0.2137957513332367D, 0.21398882567882538D, 0.21418625116348267D, 0.21438726782798767D, 0.21458405256271362D, 0.21478569507598877D, 0.2149859517812729D, 0.2151806354522705D, 0.21538639068603516D, 0.21557798981666565D, 0.2157720923423767D, 0.21596337854862213D, 0.21616080403327942D, 0.2163562923669815D, 0.21655449271202087D, 0.2167525738477707D, 0.21694263815879822D, 0.21713177859783173D, 0.21732954680919647D, 0.21752935647964478D, 0.21772217750549316D, 0.21791480481624603D, 0.21811674535274506D, 0.21831247210502625D, 0.21851235628128052D, 0.21870890259742737D, 0.2189081758260727D, 0.21910427510738373D, 0.21930015087127686D, 0.21949778497219086D, 0.21969933807849884D, 0.21990087628364563D, 0.22009927034378052D, 0.22029325366020203D, 0.22049371898174286D, 0.22069047391414642D, 0.22089248895645142D, 0.22109095752239227D, 0.22129462659358978D, 0.22148814797401428D, 0.22169452905654907D, 0.2218969613313675D, 0.22209632396697998D, 0.22230185568332672D, 0.22250638902187347D, 0.2227063924074173D, 0.22290310263633728D, 0.22311145067214966D, 0.2233133167028427D, 0.22350966930389404D, 0.2237071990966797D, 0.22390885651111603D, 0.2241075336933136D, 0.22431014478206635D, 0.22450794279575348D, 0.22470755875110626D, 0.22491036355495453D, 0.22511586546897888D, 0.2253158539533615D, 0.22551269829273224D, 0.2257266342639923D, 0.22592762112617493D, 0.22613157331943512D, 0.22633376717567444D, 0.22653743624687195D, 0.22674024105072021D, 0.2269410938024521D, 0.22714996337890625D, 0.22734971344470978D, 0.22755438089370728D, 0.22775733470916748D, 0.22795677185058594D, 0.22816292941570282D, 0.22837083041667938D, 0.22858299314975739D, 0.2287832796573639D, 0.2289920300245285D, 0.22919484972953796D, 0.2293976992368698D, 0.22960828244686127D, 0.22981193661689758D, 0.2300211489200592D, 0.23022563755512238D, 0.2304365634918213D, 0.2306395173072815D, 0.23084834218025208D, 0.23105144500732422D, 0.2312522679567337D, 0.23145829141139984D, 0.23166124522686005D, 0.23187236487865448D, 0.23208360373973846D, 0.23229150474071503D, 0.23250751197338104D, 0.2327122539281845D, 0.23292763531208038D, 0.23313376307487488D, 0.23334120213985443D, 0.23354649543762207D, 0.23375554382801056D, 0.23396620154380798D, 0.23417723178863525D, 0.2343829721212387D, 0.23458978533744812D, 0.23479892313480377D, 0.23500783741474152D, 0.2352222204208374D, 0.2354322373867035D, 0.23564279079437256D, 0.23585160076618195D, 0.23605337738990784D, 0.23626479506492615D, 0.23648226261138916D, 0.2366953194141388D, 0.23690584301948547D, 0.23711639642715454D, 0.23733076453208923D, 0.23753586411476135D, 0.23774738609790802D, 0.23796023428440094D, 0.23817838728427887D, 0.2383866310119629D, 0.23860763013362885D, 0.23882152140140533D, 0.23903527855873108D, 0.23924735188484192D, 0.23945917189121246D, 0.23966942727565765D, 0.23988419771194458D, 0.2400980293750763D, 0.24030447006225586D, 0.240516796708107D, 0.24073119461536407D, 0.24094410240650177D, 0.24115683138370514D, 0.24137572944164276D, 0.24158714711666107D, 0.24180005490779877D, 0.2420184463262558D, 0.24223656952381134D, 0.24244916439056396D, 0.24266721308231354D, 0.2428855299949646D, 0.24310968816280365D, 0.243327334523201D, 0.2435457706451416D, 0.24375973641872406D, 0.2439749389886856D, 0.24419187009334564D, 0.24440546333789825D, 0.2446216642856598D, 0.24483764171600342D, 0.24505628645420074D, 0.2452733963727951D, 0.24548429250717163D, 0.24571490287780762D, 0.2459365725517273D, 0.24615846574306488D, 0.2463839054107666D, 0.2465975135564804D, 0.24682526290416718D, 0.24704609811306D, 0.24726620316505432D, 0.24748526513576508D, 0.24770237505435944D, 0.24791458249092102D, 0.24813757836818695D, 0.24836552143096924D, 0.24859130382537842D, 0.2488095611333847D, 0.24903202056884766D, 0.2492518126964569D, 0.24946889281272888D, 0.2496860921382904D, 0.2499072104692459D, 0.25012969970703125D, 0.25036224722862244D, 0.2505870461463928D, 0.2508128881454468D, 0.2510356307029724D, 0.25126001238822937D, 0.25148099660873413D, 0.25170382857322693D, 0.25192201137542725D, 0.2521439790725708D, 0.25237786769866943D, 0.25259867310523987D, 0.2528284192085266D, 0.2530532777309418D, 0.25327783823013306D, 0.25350385904312134D, 0.2537325918674469D, 0.2539677619934082D, 0.2541946470737457D, 0.2544255256652832D, 0.2546565532684326D, 0.25487953424453735D, 0.25510382652282715D, 0.25533539056777954D, 0.2555716931819916D, 0.25579825043678284D, 0.2560243308544159D, 0.25624626874923706D, 0.2564801275730133D, 0.2567085325717926D, 0.2569340765476227D, 0.2571656405925751D, 0.25739872455596924D, 0.2576286792755127D, 0.25786054134368896D, 0.2580936551094055D, 0.2583216726779938D, 0.25856003165245056D, 0.2587873339653015D, 0.25902122259140015D, 0.2592563033103943D, 0.2594849765300751D, 0.2597160339355469D, 0.25995558500289917D, 0.2601858973503113D, 0.2604183256626129D, 0.2606464922428131D, 0.26088303327560425D, 0.2611151337623596D, 0.26134592294692993D, 0.2615800201892853D, 0.2618105709552765D, 0.2620517909526825D, 0.2622908055782318D, 0.26252609491348267D, 0.2627618610858917D, 0.262994647026062D, 0.26323479413986206D, 0.26346999406814575D, 0.26371172070503235D, 0.26394981145858765D, 0.2641925811767578D, 0.26443660259246826D, 0.2646687924861908D, 0.26490625739097595D, 0.26514482498168945D, 0.2653883397579193D, 0.2656254470348358D, 0.26586461067199707D, 0.2660968005657196D, 0.26632776856422424D, 0.2665672302246094D, 0.2668079137802124D, 0.2670527696609497D, 0.26729103922843933D, 0.26753705739974976D, 0.267774760723114D, 0.2680116295814514D, 0.2682532072067261D, 0.2684982419013977D, 0.26874080300331116D, 0.26898348331451416D, 0.2692258656024933D, 0.26946553587913513D, 0.26971226930618286D, 0.26995396614074707D, 0.2702105641365051D, 0.2704511284828186D, 0.2706947326660156D, 0.2709454596042633D, 0.27119338512420654D, 0.2714472711086273D, 0.271695613861084D, 0.2719452679157257D, 0.2721904516220093D, 0.272445946931839D, 0.2727034091949463D, 0.27296075224876404D, 0.2732025980949402D, 0.27344566583633423D, 0.2736923396587372D, 0.273937851190567D, 0.2741943597793579D, 0.2744433581829071D, 0.2747053802013397D, 0.2749590575695038D, 0.27520620822906494D, 0.2754532992839813D, 0.27570030093193054D, 0.27594417333602905D, 0.2761920094490051D, 0.27644631266593933D, 0.2766968309879303D, 0.2769581079483032D, 0.277214914560318D, 0.2774685323238373D, 0.27772653102874756D, 0.2779829204082489D, 0.2782370150089264D, 0.2784930467605591D, 0.27874892950057983D, 0.2790064215660095D, 0.2792629301548004D, 0.2795135974884033D, 0.27977338433265686D, 0.28003010153770447D, 0.2802872657775879D, 0.2805541753768921D, 0.28081098198890686D, 0.28106915950775146D, 0.2813355028629303D, 0.2816014885902405D, 0.28186270594596863D, 0.28211551904678345D, 0.28238385915756226D, 0.28264784812927246D, 0.2829170227050781D, 0.28318625688552856D, 0.28344595432281494D, 0.2837064266204834D, 0.2839750647544861D, 0.28424525260925293D, 0.2845102846622467D, 0.2847710847854614D, 0.28503847122192383D, 0.285302072763443D, 0.2855624556541443D, 0.28583529591560364D, 0.28610533475875854D, 0.2863694727420807D, 0.28663894534111023D, 0.28690820932388306D, 0.2871835231781006D, 0.2874460816383362D, 0.28770965337753296D, 0.28797629475593567D, 0.28824037313461304D, 0.2885114252567291D, 0.28877952694892883D, 0.28905394673347473D, 0.2893272340297699D, 0.2896009385585785D, 0.2898753881454468D, 0.2901516556739807D, 0.29043030738830566D, 0.2906986474990845D, 0.2909756600856781D, 0.2912502586841583D, 0.2915216088294983D, 0.2917991578578949D, 0.2920747995376587D, 0.29235514998435974D, 0.29263055324554443D, 0.29290643334388733D, 0.29318350553512573D, 0.2934582233428955D, 0.2937442362308502D, 0.29402175545692444D, 0.2943044602870941D, 0.29458490014076233D, 0.294856458902359D, 0.29513412714004517D, 0.2954207956790924D, 0.2957027554512024D, 0.29599303007125854D, 0.2962748110294342D, 0.29655298590660095D, 0.29684072732925415D, 0.2971268594264984D, 0.297414630651474D, 0.29770198464393616D, 0.2979874312877655D, 0.2982670068740845D, 0.2985551059246063D, 0.2988506555557251D, 0.29913589358329773D, 0.29941803216934204D, 0.29970577359199524D, 0.2999911904335022D, 0.30029740929603577D, 0.30059298872947693D, 0.30088740587234497D, 0.30117687582969666D, 0.3014709949493408D, 0.3017614483833313D, 0.3020592927932739D, 0.3023589253425598D, 0.30265122652053833D, 0.3029458820819855D, 0.3032380938529968D, 0.3035353124141693D, 0.3038356900215149D, 0.30413827300071716D, 0.3044430613517761D, 0.3047422170639038D, 0.30505242943763733D, 0.3053557276725769D, 0.3056688904762268D, 0.30598193407058716D, 0.3062831461429596D, 0.3065822124481201D, 0.3068911135196686D, 0.3071833848953247D, 0.30748212337493896D, 0.30779045820236206D, 0.30809691548347473D, 0.30840522050857544D, 0.30872541666030884D, 0.30904072523117065D, 0.30936363339424133D, 0.3096707761287689D, 0.3099910020828247D, 0.31029611825942993D, 0.3106105327606201D, 0.31092625856399536D, 0.3112245798110962D, 0.3115399479866028D, 0.3118637800216675D, 0.31218570470809937D, 0.31249749660491943D, 0.3128180205821991D, 0.3131491243839264D, 0.3134590685367584D, 0.3137769103050232D, 0.31409183144569397D, 0.31440991163253784D, 0.3147423267364502D, 0.315074622631073D, 0.31538769602775574D, 0.3157178461551666D, 0.31604892015457153D, 0.3163736164569855D, 0.31670817732810974D, 0.31702810525894165D, 0.317355751991272D, 0.31768372654914856D, 0.31801432371139526D, 0.31834226846694946D, 0.31866806745529175D, 0.31899839639663696D, 0.31932738423347473D, 0.3196604251861572D, 0.32000088691711426D, 0.3203379511833191D, 0.32066595554351807D, 0.32100751996040344D, 0.3213508725166321D, 0.3216894865036011D, 0.322036474943161D, 0.322383314371109D, 0.32273414731025696D, 0.323082834482193D, 0.32343026995658875D, 0.3237669765949249D, 0.32412171363830566D, 0.3244626522064209D, 0.32481491565704346D, 0.32516875863075256D, 0.3255179226398468D, 0.325869619846344D, 0.3262259066104889D, 0.32658839225769043D, 0.3269360065460205D, 0.32728952169418335D, 0.3276480734348297D, 0.3280147612094879D, 0.3283637762069702D, 0.32871752977371216D, 0.32907935976982117D, 0.32943716645240784D, 0.3297964036464691D, 0.3301599621772766D, 0.33051931858062744D, 0.3308880627155304D, 0.3312579095363617D, 0.33161529898643494D, 0.3319781720638275D, 0.3323523998260498D, 0.3327375650405884D, 0.33311545848846436D, 0.33348867297172546D, 0.3338663876056671D, 0.3342553377151489D, 0.33464017510414124D, 0.33502036333084106D, 0.335401713848114D, 0.3357864320278168D, 0.3361833691596985D, 0.3365689218044281D, 0.33695119619369507D, 0.3373405933380127D, 0.33773842453956604D, 0.3381268084049225D, 0.3385128974914551D, 0.33890458941459656D, 0.3392952084541321D, 0.33968889713287354D, 0.3400922119617462D, 0.34048500657081604D, 0.3408714830875397D, 0.3412691354751587D, 0.34166914224624634D, 0.34207582473754883D, 0.3424929678440094D, 0.3428908586502075D, 0.3432921767234802D, 0.34369343519210815D, 0.3441072404384613D, 0.34452903270721436D, 0.3449375331401825D, 0.34534019231796265D, 0.3457581698894501D, 0.3461754322052002D, 0.3465886414051056D, 0.34700435400009155D, 0.34742265939712524D, 0.34784501791000366D, 0.34826958179473877D, 0.34871307015419006D, 0.3491317629814148D, 0.3495660424232483D, 0.3500021994113922D, 0.35043758153915405D, 0.35088497400283813D, 0.3513285517692566D, 0.3517633378505707D, 0.35219472646713257D, 0.3526288568973541D, 0.35309097170829773D, 0.35355913639068604D, 0.35399898886680603D, 0.35447028279304504D, 0.3549261689186096D, 0.35538268089294434D, 0.3558322489261627D, 0.3562908172607422D, 0.35675758123397827D, 0.35722026228904724D, 0.3576938509941101D, 0.35815972089767456D, 0.35862985253334045D, 0.35909539461135864D, 0.35957416892051697D, 0.36005738377571106D, 0.36053022742271423D, 0.36100655794143677D, 0.36148983240127563D, 0.3619798719882965D, 0.3624771535396576D, 0.36297959089279175D, 0.36347851157188416D, 0.3639810383319855D, 0.36445868015289307D, 0.36495158076286316D, 0.36546313762664795D, 0.3659844994544983D, 0.36649754643440247D, 0.36702680587768555D, 0.3675394356250763D, 0.3680706322193146D, 0.36859145760536194D, 0.3691083490848541D, 0.3696277141571045D, 0.3701637089252472D, 0.3707152307033539D, 0.37122446298599243D, 0.37175998091697693D, 0.3722837269306183D, 0.3728159964084625D, 0.3733748495578766D, 0.37392672896385193D, 0.37447816133499146D, 0.37505069375038147D, 0.375622421503067D, 0.3761715888977051D, 0.37675145268440247D, 0.37734055519104004D, 0.3779241442680359D, 0.3785025477409363D, 0.3791196346282959D, 0.37970981001853943D, 0.38029128313064575D, 0.3808829188346863D, 0.38146936893463135D, 0.3820830285549164D, 0.3827105760574341D, 0.3833059072494507D, 0.38394442200660706D, 0.3845558762550354D, 0.3851664662361145D, 0.38580548763275146D, 0.3864295184612274D, 0.3870803415775299D, 0.38771069049835205D, 0.3883456885814667D, 0.38899171352386475D, 0.38965052366256714D, 0.3903161883354187D, 0.3909873962402344D, 0.39163389801979065D, 0.3923026919364929D, 0.3929727375507355D, 0.3936687409877777D, 0.39436736702919006D, 0.395059734582901D, 0.395771861076355D, 0.3964758813381195D, 0.3972088098526001D, 0.39794230461120605D, 0.39865103363990784D, 0.39939573407173157D, 0.4001447558403015D, 0.4009042978286743D, 0.40168482065200806D, 0.40247029066085815D, 0.4032696485519409D, 0.4040483832359314D, 0.4048703610897064D, 0.40569815039634705D, 0.4065134525299072D, 0.4073511064052582D, 0.4082093834877014D, 0.40910643339157104D, 0.40995070338249207D, 0.4108522832393646D, 0.4117118716239929D, 0.41257336735725403D, 0.4134874641895294D, 0.41438743472099304D, 0.41531622409820557D, 0.4162694215774536D, 0.4172126054763794D, 0.41816097497940063D, 0.41914936900138855D, 0.42015671730041504D, 0.4211525321006775D, 0.4221918284893036D, 0.42320090532302856D, 0.4242560863494873D, 0.4253188669681549D, 0.4263918697834015D, 0.42751896381378174D, 0.42864561080932617D, 0.4297972321510315D, 0.4309712052345276D, 0.43211647868156433D, 0.43333739042282104D, 0.43459197878837585D, 0.4358139634132385D, 0.43709370493888855D, 0.43841537833213806D, 0.43972235918045044D, 0.4410899579524994D, 0.44247907400131226D, 0.44390785694122314D, 0.4453846514225006D, 0.44687512516975403D, 0.44836026430130005D, 0.4498823583126068D, 0.45146554708480835D, 0.4531130790710449D, 0.45482560992240906D, 0.4566359221935272D, 0.45852598547935486D, 0.4604836702346802D, 0.46249786019325256D, 0.4645693302154541D, 0.4668006896972656D, 0.46896860003471375D, 0.4712623059749603D, 0.473666787147522D, 0.4763219356536865D, 0.4791247844696045D, 0.48207300901412964D, 0.4851433336734772D, 0.48835480213165283D, 0.49189335107803345D, 0.49576520919799805D, 0.500032901763916D, 0.5047979354858398D, 0.510280966758728D, 0.5167609453201294D, 0.5248829126358032D, 0.5349445343017578D, 0.550952136516571D, 0.6102362275123596D}; - private static final double[] normalMap1 = new double[] {-0.993981122970581D, -0.9867534041404724D, -0.9814018607139587D, -0.9777977466583252D, -0.9740672707557678D, -0.9704886674880981D, -0.9673173427581787D, -0.964655876159668D, -0.9624447226524353D, -0.9604035019874573D, -0.9586348533630371D, -0.956900417804718D, -0.955359697341919D, -0.9537981152534485D, -0.9522461891174316D, -0.9506949186325073D, -0.9491915702819824D, -0.947837233543396D, -0.9465093612670898D, -0.9452851414680481D, -0.9440163969993591D, -0.9427854418754578D, -0.9415590167045593D, -0.9404380321502686D, -0.9392384886741638D, -0.9381521344184875D, -0.9370340704917908D, -0.9359375238418579D, -0.9349455237388611D, -0.9338868260383606D, -0.9328497648239136D, -0.931911826133728D, -0.9309902191162109D, -0.9300264716148376D, -0.9290929436683655D, -0.9282076954841614D, -0.9272778034210205D, -0.9263636469841003D, -0.9254574179649353D, -0.9245976209640503D, -0.9237018823623657D, -0.9228191375732422D, -0.9219982624053955D, -0.921193540096283D, -0.9204187393188477D, -0.9196520447731018D, -0.918891191482544D, -0.91814786195755D, -0.9173845052719116D, -0.9166402816772461D, -0.9158709645271301D, -0.9151347875595093D, -0.9144362807273865D, -0.9137468338012695D, -0.9130550622940063D, -0.9123724102973938D, -0.9117192029953003D, -0.9110715389251709D, -0.9104556441307068D, -0.9098379611968994D, -0.9092051982879639D, -0.908571720123291D, -0.9079737067222595D, -0.9073951840400696D, -0.906777024269104D, -0.9061700701713562D, -0.9055814743041992D, -0.9050177335739136D, -0.9044249057769775D, -0.903881847858429D, -0.9033547043800354D, -0.9028249979019165D, -0.902289092540741D, -0.9017468094825745D, -0.9012556672096252D, -0.9007599353790283D, -0.9002755880355835D, -0.8997661471366882D, -0.8992534279823303D, -0.8987354636192322D, -0.8982405066490173D, -0.8977617621421814D, -0.8972391486167908D, -0.8967417478561401D, -0.896254301071167D, -0.8957591652870178D, -0.895301878452301D, -0.8948580026626587D, -0.8943824768066406D, -0.8938983082771301D, -0.8934217095375061D, -0.8929500579833984D, -0.8924669027328491D, -0.8919958472251892D, -0.8915202021598816D, -0.8910564184188843D, -0.8906219005584717D, -0.8901892304420471D, -0.8897593021392822D, -0.8893160820007324D, -0.888887882232666D, -0.8884394764900208D, -0.8880050778388977D, -0.8875910043716431D, -0.8871419429779053D, -0.8867276906967163D, -0.8862883448600769D, -0.8858384490013123D, -0.8854177594184875D, -0.8849796652793884D, -0.8845346570014954D, -0.8840920925140381D, -0.8836329579353333D, -0.8831575512886047D, -0.882702112197876D, -0.8822483420372009D, -0.8818038105964661D, -0.8813790082931519D, -0.8809268474578857D, -0.8804680705070496D, -0.8800069093704224D, -0.8795323967933655D, -0.879081666469574D, -0.8786211013793945D, -0.8781455159187317D, -0.8776878714561462D, -0.8772246241569519D, -0.8767819404602051D, -0.876311182975769D, -0.8758470416069031D, -0.8753729462623596D, -0.8749485611915588D, -0.8744806051254272D, -0.8740207552909851D, -0.873558521270752D, -0.8731053471565247D, -0.8726766705513D, -0.8722361326217651D, -0.8717890977859497D, -0.8713359832763672D, -0.8708965182304382D, -0.8704631924629211D, -0.8700135350227356D, -0.8695434331893921D, -0.8690747022628784D, -0.8685927987098694D, -0.8681243062019348D, -0.8676489591598511D, -0.8671760559082031D, -0.8667223453521729D, -0.8662542700767517D, -0.8658044338226318D, -0.8653705716133118D, -0.8648831844329834D, -0.8644269108772278D, -0.863974392414093D, -0.8635271787643433D, -0.8630731105804443D, -0.8626294136047363D, -0.8622041344642639D, -0.8617463707923889D, -0.8612802624702454D, -0.8608363270759583D, -0.8603652715682983D, -0.8599016666412354D, -0.8594528436660767D, -0.8590061068534851D, -0.8585623502731323D, -0.8581123352050781D, -0.8576651215553284D, -0.8571998476982117D, -0.8567615151405334D, -0.8563039898872375D, -0.855833113193512D, -0.8553852438926697D, -0.8549563884735107D, -0.8545076251029968D, -0.854032576084137D, -0.8535919189453125D, -0.8531304597854614D, -0.8526818156242371D, -0.8522078990936279D, -0.8517653942108154D, -0.8513281345367432D, -0.8508611917495728D, -0.8504223227500916D, -0.8499665260314941D, -0.849520206451416D, -0.849053680896759D, -0.8485954403877258D, -0.8481417298316956D, -0.847692608833313D, -0.8472627401351929D, -0.8468097448348999D, -0.8463746905326843D, -0.8459068536758423D, -0.8454430103302002D, -0.8449950814247131D, -0.8445459604263306D, -0.8440717458724976D, -0.8435981273651123D, -0.8431227803230286D, -0.8426408767700195D, -0.8421630859375D, -0.8417009711265564D, -0.8412379026412964D, -0.8407769799232483D, -0.8403106331825256D, -0.8398558497428894D, -0.8393968343734741D, -0.8389428853988647D, -0.8384616374969482D, -0.8379984498023987D, -0.8375331163406372D, -0.8370792865753174D, -0.8366209864616394D, -0.8361372947692871D, -0.8356479406356812D, -0.8351752161979675D, -0.8347142934799194D, -0.8342487812042236D, -0.8338004350662231D, -0.8333517909049988D, -0.8328940272331238D, -0.8324223756790161D, -0.831952691078186D, -0.8314595222473145D, -0.8309986591339111D, -0.8305644392967224D, -0.8301018476486206D, -0.8296616077423096D, -0.8291927576065063D, -0.8287414312362671D, -0.8282740116119385D, -0.8278439044952393D, -0.8274041414260864D, -0.82695072889328D, -0.8264832496643066D, -0.8260218501091003D, -0.8255581855773926D, -0.8250904679298401D, -0.824647068977356D, -0.8241927623748779D, -0.823721170425415D, -0.8232881426811218D, -0.8228266835212708D, -0.8223466277122498D, -0.8218891024589539D, -0.8214482665061951D, -0.8209536075592041D, -0.8205164074897766D, -0.8200206160545349D, -0.8195541501045227D, -0.8191131353378296D, -0.8186835050582886D, -0.8182293772697449D, -0.8177539706230164D, -0.8172938227653503D, -0.8168179988861084D, -0.8163681626319885D, -0.8159137964248657D, -0.8154714703559875D, -0.8150300979614258D, -0.8145816922187805D, -0.8141164183616638D, -0.8136304020881653D, -0.813171923160553D, -0.812709391117096D, -0.8122345805168152D, -0.8117756247520447D, -0.8113128542900085D, -0.810836672782898D, -0.8103585243225098D, -0.8099002838134766D, -0.809456467628479D, -0.808990478515625D, -0.8085386157035828D, -0.8080651164054871D, -0.8075961470603943D, -0.807146430015564D, -0.8066928386688232D, -0.8062372207641602D, -0.8057619333267212D, -0.8053189516067505D, -0.8048828840255737D, -0.804431676864624D, -0.803987979888916D, -0.803577184677124D, -0.8031604290008545D, -0.8027421832084656D, -0.8023148775100708D, -0.8018929958343506D, -0.8014708757400513D, -0.8010631799697876D, -0.8006236553192139D, -0.8002043962478638D, -0.7997668385505676D, -0.7993491888046265D, -0.7989336252212524D, -0.7984876036643982D, -0.7980768084526062D, -0.7976296544075012D, -0.7971917390823364D, -0.7967548966407776D, -0.7962918877601624D, -0.7958443760871887D, -0.795405387878418D, -0.7949764728546143D, -0.7945268154144287D, -0.7940919399261475D, -0.7936583161354065D, -0.7932078838348389D, -0.7927955389022827D, -0.7923596501350403D, -0.7919219136238098D, -0.7914819121360779D, -0.791064441204071D, -0.7906320691108704D, -0.79017174243927D, -0.7897169589996338D, -0.7892693281173706D, -0.7888533473014832D, -0.788398802280426D, -0.7879447340965271D, -0.7875177264213562D, -0.7870922088623047D, -0.7866427302360535D, -0.7862313985824585D, -0.7857956290245056D, -0.7853496670722961D, -0.7849026918411255D, -0.7844541072845459D, -0.7840293645858765D, -0.7835724353790283D, -0.7831109166145325D, -0.7826611399650574D, -0.7821875214576721D, -0.7817301154136658D, -0.7812873721122742D, -0.7808514833450317D, -0.7803935408592224D, -0.7799123525619507D, -0.7794713377952576D, -0.7790182828903198D, -0.7785621881484985D, -0.7781559228897095D, -0.7776877880096436D, -0.7772501707077026D, -0.7768174409866333D, -0.7763848900794983D, -0.7759107351303101D, -0.7754525542259216D, -0.7749996185302734D, -0.7745270133018494D, -0.7740670442581177D, -0.7736034989356995D, -0.773161768913269D, -0.7726963758468628D, -0.7722465395927429D, -0.7717506289482117D, -0.7712973952293396D, -0.7708300352096558D, -0.7703608274459839D, -0.7698842287063599D, -0.7694273591041565D, -0.768983006477356D, -0.7685385942459106D, -0.76810622215271D, -0.7676629424095154D, -0.7671942710876465D, -0.7667547464370728D, -0.7662950754165649D, -0.7658786773681641D, -0.7654168605804443D, -0.76496821641922D, -0.764512300491333D, -0.7640527486801147D, -0.7636140584945679D, -0.7631645798683167D, -0.7627111077308655D, -0.7622628808021545D, -0.7618300914764404D, -0.7613887190818787D, -0.7609382271766663D, -0.760509729385376D, -0.7600770592689514D, -0.7596333622932434D, -0.7592030763626099D, -0.758743941783905D, -0.7582821846008301D, -0.7578146457672119D, -0.7573472261428833D, -0.7569139003753662D, -0.7564945220947266D, -0.7560456991195679D, -0.7555922865867615D, -0.7551515698432922D, -0.7547208070755005D, -0.7542534470558167D, -0.7538049221038818D, -0.7533339262008667D, -0.752889096736908D, -0.7524533867835999D, -0.7520151734352112D, -0.7515751719474792D, -0.7511124014854431D, -0.7506847381591797D, -0.7502515912055969D, -0.7498141527175903D, -0.7493629455566406D, -0.7488939762115479D, -0.7484484314918518D, -0.7480183243751526D, -0.7475797533988953D, -0.7471202611923218D, -0.7466857433319092D, -0.746245265007019D, -0.7458525896072388D, -0.7454100847244263D, -0.7449892163276672D, -0.744547426700592D, -0.7441168427467346D, -0.7436603903770447D, -0.7432155609130859D, -0.7427309155464172D, -0.7422654032707214D, -0.7418230175971985D, -0.7413456439971924D, -0.7408867478370667D, -0.7404426336288452D, -0.7399845719337463D, -0.7395214438438416D, -0.7390555739402771D, -0.7385861277580261D, -0.738116443157196D, -0.7376468777656555D, -0.7371915578842163D, -0.7367280721664429D, -0.7362213730812073D, -0.7357624769210815D, -0.735304057598114D, -0.7348542809486389D, -0.7343930006027222D, -0.7338942885398865D, -0.7334224581718445D, -0.7329620122909546D, -0.7324798703193665D, -0.7320289611816406D, -0.7315279245376587D, -0.7310631275177002D, -0.7305946350097656D, -0.7301591634750366D, -0.7297176718711853D, -0.7292467951774597D, -0.7288281321525574D, -0.7283647060394287D, -0.7278772592544556D, -0.727400541305542D, -0.7269569039344788D, -0.7264780402183533D, -0.7260096669197083D, -0.725562334060669D, -0.7250648140907288D, -0.7245859503746033D, -0.7241119146347046D, -0.723630428314209D, -0.7231666445732117D, -0.7227104902267456D, -0.7222658395767212D, -0.7217769622802734D, -0.7213007211685181D, -0.7208353877067566D, -0.720391571521759D, -0.7199460864067078D, -0.7194427847862244D, -0.7189367413520813D, -0.7185240983963013D, -0.7180306911468506D, -0.7175722718238831D, -0.7170929908752441D, -0.7166170477867126D, -0.7161218523979187D, -0.7156761288642883D, -0.7152342200279236D, -0.7147595882415771D, -0.7143203020095825D, -0.7138813734054565D, -0.7134413123130798D, -0.7129658460617065D, -0.712531566619873D, -0.7120937705039978D, -0.7116792798042297D, -0.7112746238708496D, -0.7108534574508667D, -0.7104528546333313D, -0.7100372314453125D, -0.7095867395401001D, -0.7091600298881531D, -0.7087348103523254D, -0.7083083987236023D, -0.7078754305839539D, -0.7074360251426697D, -0.7070069313049316D, -0.7065709233283997D, -0.7061734199523926D, -0.7057405710220337D, -0.7053127288818359D, -0.7048872113227844D, -0.7044483423233032D, -0.7040207386016846D, -0.7036097049713135D, -0.7031928896903992D, -0.7027456164360046D, -0.7023111581802368D, -0.7018752694129944D, -0.7014437317848206D, -0.7010111808776855D, -0.7005510926246643D, -0.7001100778579712D, -0.6996980905532837D, -0.6992843747138977D, -0.6988713145256042D, -0.6983832716941833D, -0.6979185938835144D, -0.6974824666976929D, -0.6970443725585938D, -0.6965860724449158D, -0.6961517333984375D, -0.6956964135169983D, -0.6952543258666992D, -0.6948185563087463D, -0.6944015622138977D, -0.6939572691917419D, -0.6935084462165833D, -0.6930390000343323D, -0.6925643086433411D, -0.6920949816703796D, -0.6916420459747314D, -0.6911906003952026D, -0.6907227039337158D, -0.690259575843811D, -0.6897680163383484D, -0.6892983913421631D, -0.6888791918754578D, -0.6883915066719055D, -0.6879323124885559D, -0.6874868869781494D, -0.6870161294937134D, -0.6865673065185547D, -0.6861105561256409D, -0.685651421546936D, -0.6852194666862488D, -0.6847624778747559D, -0.6842747330665588D, -0.6838182210922241D, -0.6833785176277161D, -0.6829265356063843D, -0.6824387311935425D, -0.6819712519645691D, -0.6814887523651123D, -0.6810264587402344D, -0.6805755496025085D, -0.6800896525382996D, -0.6796098947525024D, -0.6791496276855469D, -0.6786936521530151D, -0.6782419085502625D, -0.677756130695343D, -0.6773126125335693D, -0.6768563389778137D, -0.6764082908630371D, -0.6759566068649292D, -0.6755016446113586D, -0.6750813722610474D, -0.6746301651000977D, -0.6741729974746704D, -0.6736992001533508D, -0.6732316613197327D, -0.6727883815765381D, -0.6723057627677917D, -0.6718435287475586D, -0.6713894009590149D, -0.6709365844726562D, -0.6704763770103455D, -0.6700304746627808D, -0.6695900559425354D, -0.6691245436668396D, -0.6686742305755615D, -0.668216347694397D, -0.6677833199501038D, -0.6673141717910767D, -0.6668790578842163D, -0.6664288640022278D, -0.6659941673278809D, -0.6655833125114441D, -0.6651661396026611D, -0.6647082567214966D, -0.6642827391624451D, -0.6638473868370056D, -0.6633561253547668D, -0.6628942489624023D, -0.6624237298965454D, -0.6619466543197632D, -0.6615045666694641D, -0.661072850227356D, -0.6605978608131409D, -0.6601710915565491D, -0.6597480773925781D, -0.6592699885368347D, -0.6588332056999207D, -0.658392608165741D, -0.6579496264457703D, -0.657446026802063D, -0.656986653804779D, -0.6565669775009155D, -0.6561056971549988D, -0.6556894779205322D, -0.6552327275276184D, -0.6548108458518982D, -0.6544176936149597D, -0.6539667248725891D, -0.6535317897796631D, -0.6530807018280029D, -0.6526519060134888D, -0.6522371768951416D, -0.6518018841743469D, -0.6513494849205017D, -0.6508753299713135D, -0.6504021883010864D, -0.6499971151351929D, -0.6495323181152344D, -0.6490973234176636D, -0.6486873626708984D, -0.6482400894165039D, -0.6477917432785034D, -0.6473706364631653D, -0.646914541721344D, -0.6464476585388184D, -0.645993173122406D, -0.6455405950546265D, -0.6450999975204468D, -0.64466792345047D, -0.6442462205886841D, -0.6438097357749939D, -0.6433576941490173D, -0.6429150700569153D, -0.6425103545188904D, -0.6420614719390869D, -0.6415934562683105D, -0.6411587595939636D, -0.6407563090324402D, -0.6403141617774963D, -0.6398285031318665D, -0.6393874287605286D, -0.638950526714325D, -0.6384929418563843D, -0.6380735039710999D, -0.6376455426216125D, -0.6371946334838867D, -0.6367603540420532D, -0.6363311409950256D, -0.6358823180198669D, -0.63546222448349D, -0.6350165605545044D, -0.6345629692077637D, -0.6341010332107544D, -0.6336252689361572D, -0.6331813335418701D, -0.63270503282547D, -0.6322590708732605D, -0.6318042278289795D, -0.6313715577125549D, -0.6309155225753784D, -0.630476176738739D, -0.6300145387649536D, -0.6295765042304993D, -0.6291170716285706D, -0.6286421418190002D, -0.6281881332397461D, -0.6277390122413635D, -0.6272373795509338D, -0.6267513632774353D, -0.6262896656990051D, -0.6258484721183777D, -0.6253910064697266D, -0.6249442100524902D, -0.6244901418685913D, -0.6240485310554504D, -0.6236206889152527D, -0.6231616139411926D, -0.6226596832275391D, -0.6221743226051331D, -0.6217489242553711D, -0.621291995048523D, -0.6208148002624512D, -0.6203911900520325D, -0.6199749112129211D, -0.6195303797721863D, -0.6190845370292664D, -0.6185699701309204D, -0.6181412935256958D, -0.6176934242248535D, -0.6172602772712708D, -0.6167842149734497D, -0.6163712739944458D, -0.6158850789070129D, -0.6154088377952576D, -0.6149631142616272D, -0.6145434379577637D, -0.6141135692596436D, -0.6136382222175598D, -0.6131902933120728D, -0.612743079662323D, -0.6123250126838684D, -0.6118547916412354D, -0.6114357113838196D, -0.6109917163848877D, -0.6105717420578003D, -0.6101329922676086D, -0.6097121834754944D, -0.6092851161956787D, -0.6088412404060364D, -0.6084098815917969D, -0.6079666614532471D, -0.607525646686554D, -0.6070682406425476D, -0.6065964102745056D, -0.6061907410621643D, -0.6057188510894775D, -0.605266809463501D, -0.6048122048377991D, -0.604347288608551D, -0.6038910746574402D, -0.6034500002861023D, -0.6030161380767822D, -0.6025460362434387D, -0.6021080017089844D, -0.6016576290130615D, -0.6012001037597656D, -0.6007413864135742D, -0.6002840399742126D, -0.5998591184616089D, -0.5994294881820679D, -0.5989652276039124D, -0.5984882712364197D, -0.5980018973350525D, -0.5975683331489563D, -0.5971066951751709D, -0.5966431498527527D, -0.59619140625D, -0.5958024859428406D, -0.5953621864318848D, -0.5949565172195435D, -0.5945692658424377D, -0.5941520929336548D, -0.5936878323554993D, -0.5932301878929138D, -0.5927911996841431D, -0.5923627018928528D, -0.5918761491775513D, -0.5914469957351685D, -0.5909724831581116D, -0.5905429720878601D, -0.5900884866714478D, -0.5896493792533875D, -0.5892290472984314D, -0.5887760519981384D, -0.5883501768112183D, -0.5878588557243347D, -0.58735191822052D, -0.5868979692459106D, -0.586448073387146D, -0.5860018730163574D, -0.5855519771575928D, -0.5850552916526794D, -0.5845991969108582D, -0.5841348767280579D, -0.5837119221687317D, -0.5832936763763428D, -0.5828707218170166D, -0.5824082493782043D, -0.5820251703262329D, -0.5815789699554443D, -0.5810984969139099D, -0.5806310176849365D, -0.5801907777786255D, -0.5797252058982849D, -0.5792809724807739D, -0.5788083076477051D, -0.5783213973045349D, -0.5778913497924805D, -0.5774275660514832D, -0.5769709348678589D, -0.5765695571899414D, -0.5761199593544006D, -0.5756808519363403D, -0.5751828551292419D, -0.574739396572113D, -0.5742871761322021D, -0.5738288164138794D, -0.5733629465103149D, -0.5729423761367798D, -0.572485089302063D, -0.5720058679580688D, -0.5715680122375488D, -0.5710999965667725D, -0.5706731081008911D, -0.5702232718467712D, -0.56974858045578D, -0.5693201422691345D, -0.568897545337677D, -0.5684503316879272D, -0.5680347084999084D, -0.5675626397132874D, -0.5670663714408875D, -0.5666159987449646D, -0.5661755204200745D, -0.5656933784484863D, -0.5652275681495667D, -0.5647632479667664D, -0.5643265247344971D, -0.5638944506645203D, -0.5634651184082031D, -0.5630204677581787D, -0.5625607967376709D, -0.5621016621589661D, -0.5616597533226013D, -0.5612028241157532D, -0.5607337355613708D, -0.5603100657463074D, -0.5598271489143372D, -0.5593815445899963D, -0.5589413046836853D, -0.5584782958030701D, -0.5580465197563171D, -0.5575783848762512D, -0.5571232438087463D, -0.5566560626029968D, -0.5562322735786438D, -0.555738627910614D, -0.5552665591239929D, -0.554823637008667D, -0.5543604493141174D, -0.5538782477378845D, -0.5534418225288391D, -0.5529850721359253D, -0.5525240898132324D, -0.5520437359809875D, -0.5515938997268677D, -0.5511279106140137D, -0.5506861209869385D, -0.550226628780365D, -0.5497331619262695D, -0.549257218837738D, -0.5488153100013733D, -0.5483522415161133D, -0.5478795170783997D, -0.5474520921707153D, -0.5469785332679749D, -0.5465142130851746D, -0.546062171459198D, -0.54566890001297D, -0.5452328324317932D, -0.5447759628295898D, -0.5443392395973206D, -0.5438827872276306D, -0.5434367656707764D, -0.5430113077163696D, -0.5425428152084351D, -0.5420520305633545D, -0.5415939092636108D, -0.5411363840103149D, -0.5407477617263794D, -0.5402787923812866D, -0.5398295521736145D, -0.5393424034118652D, -0.5388583540916443D, -0.5384265184402466D, -0.5379411578178406D, -0.5374878644943237D, -0.5370199084281921D, -0.5365350842475891D, -0.5360611081123352D, -0.5355649590492249D, -0.5351121425628662D, -0.5345990657806396D, -0.5341669321060181D, -0.5337467789649963D, -0.5333049297332764D, -0.5328750014305115D, -0.5324127078056335D, -0.5319854617118835D, -0.5315192937850952D, -0.5310415029525757D, -0.5306323766708374D, -0.5301699042320251D, -0.5297111868858337D, -0.5292492508888245D, -0.5287858843803406D, -0.5283259153366089D, -0.5278311967849731D, -0.5273903608322144D, -0.526936948299408D, -0.5265194773674011D, -0.5260910391807556D, -0.5256368517875671D, -0.5252177119255066D, -0.5247905254364014D, -0.5243833065032959D, -0.5239353775978088D, -0.5234636068344116D, -0.5229857563972473D, -0.5225380659103394D, -0.5220516920089722D, -0.5216032266616821D, -0.5211589932441711D, -0.5207035541534424D, -0.5202432870864868D, -0.519791841506958D, -0.5193343162536621D, -0.5189166069030762D, -0.5184645056724548D, -0.5180600881576538D, -0.5176355838775635D, -0.5171905755996704D, -0.516732394695282D, -0.5162793397903442D, -0.5158212184906006D, -0.5153780579566956D, -0.5149728059768677D, -0.5145182013511658D, -0.5140626430511475D, -0.5135531425476074D, -0.5130990147590637D, -0.5126319527626038D, -0.5121858716011047D, -0.5117676258087158D, -0.5113520622253418D, -0.5108791589736938D, -0.5104767084121704D, -0.5100153088569641D, -0.5095524191856384D, -0.5091241002082825D, -0.5086731314659119D, -0.5082252025604248D, -0.5077710151672363D, -0.507340133190155D, -0.5068773031234741D, -0.5063926577568054D, -0.5059119462966919D, -0.5054774880409241D, -0.505023717880249D, -0.5045510530471802D, -0.5040978193283081D, -0.503696858882904D, -0.5032621622085571D, -0.5028178095817566D, -0.502354085445404D, -0.50189208984375D, -0.5014151334762573D, -0.5009788870811462D, -0.5005399584770203D, -0.5000848770141602D, -0.4996296167373657D, -0.49916690587997437D, -0.49872907996177673D, -0.49828365445137024D, -0.49784278869628906D, -0.4973927140235901D, -0.4969747066497803D, -0.496499627828598D, -0.49605849385261536D, -0.49562790989875793D, -0.49520403146743774D, -0.49475109577178955D, -0.49428069591522217D, -0.4938359260559082D, -0.4933910667896271D, -0.49294254183769226D, -0.4924793839454651D, -0.49202969670295715D, -0.49162542819976807D, -0.4911677837371826D, -0.49067744612693787D, -0.49027812480926514D, -0.48984992504119873D, -0.4894086420536041D, -0.48893997073173523D, -0.48848411440849304D, -0.48805075883865356D, -0.4876094460487366D, -0.4871782958507538D, -0.4867188334465027D, -0.486240416765213D, -0.4857710599899292D, -0.4853622615337372D, -0.484923779964447D, -0.48443329334259033D, -0.4839499890804291D, -0.48351210355758667D, -0.4830566346645355D, -0.48261359333992004D, -0.48216360807418823D, -0.4817146360874176D, -0.4812493324279785D, -0.48077741265296936D, -0.48034119606018066D, -0.4799092411994934D, -0.4794424772262573D, -0.4789618253707886D, -0.47851404547691345D, -0.47807857394218445D, -0.47761446237564087D, -0.47712457180023193D, -0.47667333483695984D, -0.47622331976890564D, -0.4757482409477234D, -0.4752673804759979D, -0.4748130440711975D, -0.47434619069099426D, -0.47390732169151306D, -0.47345981001853943D, -0.4729853868484497D, -0.4725019633769989D, -0.47202643752098083D, -0.47158005833625793D, -0.47112029790878296D, -0.47066575288772583D, -0.47026416659355164D, -0.46979641914367676D, -0.4693371057510376D, -0.4688774645328522D, -0.46840471029281616D, -0.46793320775032043D, -0.4674986004829407D, -0.46702343225479126D, -0.46656137704849243D, -0.4661322236061096D, -0.46566006541252136D, -0.46519672870635986D, -0.46473783254623413D, -0.46439436078071594D, -0.46398577094078064D, -0.46354690194129944D, -0.46305525302886963D, -0.46262606978416443D, -0.4621753990650177D, -0.4616986811161041D, -0.46126776933670044D, -0.4608273208141327D, -0.4603559076786041D, -0.4598826467990875D, -0.4594634771347046D, -0.45901820063591003D, -0.45853206515312195D, -0.45805060863494873D, -0.4576207399368286D, -0.45715758204460144D, -0.4567049443721771D, -0.45628368854522705D, -0.45583370327949524D, -0.45539772510528564D, -0.45492687821388245D, -0.4544738233089447D, -0.4540203809738159D, -0.45354411005973816D, -0.45309826731681824D, -0.4526641070842743D, -0.4522310495376587D, -0.45176005363464355D, -0.45129984617233276D, -0.4508618116378784D, -0.450420081615448D, -0.4499739110469818D, -0.449531227350235D, -0.44908884167671204D, -0.4486551284790039D, -0.4482029676437378D, -0.4477347731590271D, -0.4472775161266327D, -0.44681406021118164D, -0.4463559091091156D, -0.44590938091278076D, -0.44546636939048767D, -0.44499215483665466D, -0.4445340037345886D, -0.4440937936306D, -0.4436649680137634D, -0.44318997859954834D, -0.44273874163627625D, -0.4422561824321747D, -0.44178012013435364D, -0.44134721159935D, -0.44089630246162415D, -0.4404234290122986D, -0.4399433732032776D, -0.43953943252563477D, -0.4390520751476288D, -0.43859511613845825D, -0.43811362981796265D, -0.43765103816986084D, -0.4372456967830658D, -0.43681710958480835D, -0.4363972842693329D, -0.4359303414821625D, -0.43546876311302185D, -0.43497487902641296D, -0.43451398611068726D, -0.4340492784976959D, -0.43363693356513977D, -0.4331943094730377D, -0.4327276945114136D, -0.43224164843559265D, -0.4318208396434784D, -0.43134722113609314D, -0.43084287643432617D, -0.4303792715072632D, -0.429912805557251D, -0.4294090270996094D, -0.42893385887145996D, -0.42844635248184204D, -0.42798569798469543D, -0.42753586173057556D, -0.4270614683628082D, -0.4265874922275543D, -0.4261167347431183D, -0.4256487786769867D, -0.42519906163215637D, -0.4247068464756012D, -0.4242536425590515D, -0.42379605770111084D, -0.42333462834358215D, -0.42286252975463867D, -0.4224444329738617D, -0.4219934046268463D, -0.4215393364429474D, -0.4210718274116516D, -0.42061617970466614D, -0.4201585054397583D, -0.41968807578086853D, -0.41920599341392517D, -0.4187593162059784D, -0.4182948172092438D, -0.41779500246047974D, -0.4173271656036377D, -0.41686588525772095D, -0.41638249158859253D, -0.41590481996536255D, -0.4154355227947235D, -0.4149766266345978D, -0.41452762484550476D, -0.4140367805957794D, -0.4136026203632355D, -0.4131450653076172D, -0.41266801953315735D, -0.41221460700035095D, -0.4117613732814789D, -0.4112788140773773D, -0.41078534722328186D, -0.41030487418174744D, -0.40985924005508423D, -0.40937814116477966D, -0.4089410901069641D, -0.40847721695899963D, -0.408033549785614D, -0.40757739543914795D, -0.40711915493011475D, -0.4066314697265625D, -0.4061741828918457D, -0.4056779444217682D, -0.4052165448665619D, -0.404753714799881D, -0.4042343497276306D, -0.4037852883338928D, -0.40332233905792236D, -0.402822881937027D, -0.4023677110671997D, -0.40190503001213074D, -0.4014160633087158D, -0.400924414396286D, -0.4004696011543274D, -0.3999839723110199D, -0.3995433449745178D, -0.39907631278038025D, -0.398613303899765D, -0.39813822507858276D, -0.3976576626300812D, -0.3971708416938782D, -0.3967016339302063D, -0.3961956202983856D, -0.3957078456878662D, -0.395264208316803D, -0.3948236107826233D, -0.3943391442298889D, -0.39385995268821716D, -0.39338982105255127D, -0.39291146397590637D, -0.39242783188819885D, -0.3919692933559418D, -0.39151468873023987D, -0.3910646140575409D, -0.39060062170028687D, -0.3901495039463043D, -0.38966214656829834D, -0.3891756236553192D, -0.3887067139148712D, -0.388319730758667D, -0.38788723945617676D, -0.3874429166316986D, -0.3869704306125641D, -0.38652777671813965D, -0.3860969543457031D, -0.38564804196357727D, -0.3851816952228546D, -0.3847781717777252D, -0.38431960344314575D, -0.38389864563941956D, -0.3834582567214966D, -0.383012592792511D, -0.3825145661830902D, -0.38205742835998535D, -0.3816487789154053D, -0.3812359869480133D, -0.38080450892448425D, -0.3803378641605377D, -0.3799078166484833D, -0.3794780373573303D, -0.3790120482444763D, -0.3785163164138794D, -0.37803179025650024D, -0.37758001685142517D, -0.37714439630508423D, -0.37673377990722656D, -0.3762897551059723D, -0.375853031873703D, -0.3754011392593384D, -0.37497463822364807D, -0.3745007812976837D, -0.37405502796173096D, -0.37361258268356323D, -0.3731582462787628D, -0.3727110028266907D, -0.3722643256187439D, -0.3717980980873108D, -0.37136033177375793D, -0.370922327041626D, -0.3704998791217804D, -0.3700500428676605D, -0.36958378553390503D, -0.36913618445396423D, -0.36870965361595154D, -0.368268221616745D, -0.3678186535835266D, -0.36736854910850525D, -0.3669017553329468D, -0.36642682552337646D, -0.3659965991973877D, -0.3655521273612976D, -0.3650961220264435D, -0.36464881896972656D, -0.36418700218200684D, -0.3637397885322571D, -0.3632592260837555D, -0.3628367483615875D, -0.36235979199409485D, -0.36191582679748535D, -0.3614809513092041D, -0.3609961271286011D, -0.36047661304473877D, -0.36004626750946045D, -0.3595779836177826D, -0.35911795496940613D, -0.35861992835998535D, -0.35819077491760254D, -0.35775429010391235D, -0.3572559058666229D, -0.3567827641963959D, -0.356319397687912D, -0.35587993264198303D, -0.3554006516933441D, -0.3549196124076843D, -0.35444262623786926D, -0.354030966758728D, -0.35353973507881165D, -0.35312512516975403D, -0.3526640236377716D, -0.3521788716316223D, -0.3517155945301056D, -0.35133352875709534D, -0.3508608043193817D, -0.3503953516483307D, -0.3499474823474884D, -0.34947678446769714D, -0.34898048639297485D, -0.3484885096549988D, -0.3480057716369629D, -0.34755030274391174D, -0.3470558226108551D, -0.34659838676452637D, -0.346110999584198D, -0.3456391990184784D, -0.34520697593688965D, -0.34475353360176086D, -0.34428736567497253D, -0.3437964916229248D, -0.3433292508125305D, -0.3428596258163452D, -0.34236952662467957D, -0.3418951630592346D, -0.3414383828639984D, -0.34095871448516846D, -0.3404501676559448D, -0.33999693393707275D, -0.3395421802997589D, -0.33909496665000916D, -0.3386416435241699D, -0.3381812274456024D, -0.33769848942756653D, -0.3371901512145996D, -0.33668965101242065D, -0.33621102571487427D, -0.3357529044151306D, -0.3353078067302704D, -0.33485859632492065D, -0.33441001176834106D, -0.3339252173900604D, -0.3334873914718628D, -0.33301955461502075D, -0.3325522541999817D, -0.33208945393562317D, -0.33160969614982605D, -0.3311447203159332D, -0.3306768536567688D, -0.3301656246185303D, -0.32972973585128784D, -0.3292653560638428D, -0.32879796624183655D, -0.3283538818359375D, -0.3278607130050659D, -0.32736411690711975D, -0.3268917202949524D, -0.3264242112636566D, -0.32594919204711914D, -0.3254433870315552D, -0.324996680021286D, -0.3245857357978821D, -0.32412344217300415D, -0.32368534803390503D, -0.32324400544166565D, -0.32283321022987366D, -0.3223881423473358D, -0.32192009687423706D, -0.32143840193748474D, -0.32099202275276184D, -0.3204992711544037D, -0.3200390934944153D, -0.31957361102104187D, -0.31912466883659363D, -0.3186745047569275D, -0.31821349263191223D, -0.3178000748157501D, -0.3173747658729553D, -0.3168794810771942D, -0.3164204955101013D, -0.31596946716308594D, -0.31547701358795166D, -0.3150102198123932D, -0.3145200312137604D, -0.31411561369895935D, -0.3136584758758545D, -0.31319522857666016D, -0.3127117455005646D, -0.31223630905151367D, -0.31175631284713745D, -0.31128260493278503D, -0.31085309386253357D, -0.31039923429489136D, -0.30996254086494446D, -0.3094765543937683D, -0.3090311288833618D, -0.30857518315315247D, -0.3081330358982086D, -0.3076905608177185D, -0.30722951889038086D, -0.3068021237850189D, -0.3063276410102844D, -0.3058644235134125D, -0.3054058253765106D, -0.30498620867729187D, -0.3045206069946289D, -0.30405446887016296D, -0.3035971522331238D, -0.3031606376171112D, -0.30267849564552307D, -0.30223074555397034D, -0.3017795979976654D, -0.30132225155830383D, -0.30085089802742004D, -0.3004004657268524D, -0.2999022901058197D, -0.2994162440299988D, -0.2989705502986908D, -0.2984963655471802D, -0.29802581667900085D, -0.2975752055644989D, -0.29712194204330444D, -0.2966841459274292D, -0.2962263226509094D, -0.29578348994255066D, -0.2953060269355774D, -0.2948493957519531D, -0.2943715751171112D, -0.2939140200614929D, -0.2934216856956482D, -0.29297780990600586D, -0.2924797832965851D, -0.2920304834842682D, -0.29154303669929504D, -0.2910688817501068D, -0.29058271646499634D, -0.2901535928249359D, -0.2897447347640991D, -0.28926438093185425D, -0.28879716992378235D, -0.28835800290107727D, -0.2878970801830292D, -0.28745236992836D, -0.28701406717300415D, -0.28658148646354675D, -0.2860986292362213D, -0.2856302857398987D, -0.28513821959495544D, -0.2846760153770447D, -0.28417059779167175D, -0.28370192646980286D, -0.28323373198509216D, -0.28278112411499023D, -0.2823112905025482D, -0.2818357050418854D, -0.28138846158981323D, -0.2808930575847626D, -0.28043779730796814D, -0.27998489141464233D, -0.27951040863990784D, -0.2790610194206238D, -0.27859342098236084D, -0.27810347080230713D, -0.2776254117488861D, -0.27716052532196045D, -0.2767277657985687D, -0.2762927711009979D, -0.2758132815361023D, -0.27532944083213806D, -0.27486521005630493D, -0.27437639236450195D, -0.27392253279685974D, -0.2734636664390564D, -0.2730155289173126D, -0.27252086997032166D, -0.27201488614082336D, -0.2715776860713959D, -0.27112340927124023D, -0.2706716060638428D, -0.27024176716804504D, -0.2697767913341522D, -0.2693377435207367D, -0.2688935697078705D, -0.2684306800365448D, -0.2679275572299957D, -0.26745349168777466D, -0.2669237554073334D, -0.2665085792541504D, -0.26604485511779785D, -0.26556864380836487D, -0.2651185989379883D, -0.2646579146385193D, -0.2641691565513611D, -0.26368823647499084D, -0.2632249593734741D, -0.2627500593662262D, -0.2623361349105835D, -0.2618766725063324D, -0.2614266276359558D, -0.26093974709510803D, -0.2604479491710663D, -0.2599739730358124D, -0.2594825029373169D, -0.2590617537498474D, -0.25859859585762024D, -0.25814205408096313D, -0.25771430134773254D, -0.25722840428352356D, -0.25672265887260437D, -0.25625374913215637D, -0.2558176815509796D, -0.25536519289016724D, -0.25488874316215515D, -0.2544580101966858D, -0.2539685368537903D, -0.25348523259162903D, -0.253075510263443D, -0.25262975692749023D, -0.2521655261516571D, -0.2516859173774719D, -0.2512474060058594D, -0.25079748034477234D, -0.25033846497535706D, -0.24987804889678955D, -0.2494303584098816D, -0.24893410503864288D, -0.24847693741321564D, -0.24801473319530487D, -0.2475225180387497D, -0.24707607924938202D, -0.24662980437278748D, -0.24618923664093018D, -0.24574166536331177D, -0.24528750777244568D, -0.24482272565364838D, -0.24436645209789276D, -0.24388155341148376D, -0.24341869354248047D, -0.24293887615203857D, -0.24248577654361725D, -0.24203507602214813D, -0.24156378209590912D, -0.2410905808210373D, -0.2406443953514099D, -0.24019907414913177D, -0.23976480960845947D, -0.23933319747447968D, -0.2388959676027298D, -0.23842927813529968D, -0.23793959617614746D, -0.23746173083782196D, -0.23699915409088135D, -0.23651842772960663D, -0.23605220019817352D, -0.235618457198143D, -0.23517906665802002D, -0.23475384712219238D, -0.23428522050380707D, -0.23381267488002777D, -0.23333056271076202D, -0.23285725712776184D, -0.232443168759346D, -0.23195216059684753D, -0.23147986829280853D, -0.2310148924589157D, -0.23055219650268555D, -0.23004120588302612D, -0.22958838939666748D, -0.2291288524866104D, -0.22862781584262848D, -0.22818373143672943D, -0.2277383655309677D, -0.22724731266498566D, -0.2267656922340393D, -0.2263106256723404D, -0.22584769129753113D, -0.22541046142578125D, -0.2249441146850586D, -0.22448818385601044D, -0.22402751445770264D, -0.22359701991081238D, -0.22311480343341827D, -0.2226535975933075D, -0.22214914858341217D, -0.2217063307762146D, -0.22119589149951935D, -0.2207522839307785D, -0.22028227150440216D, -0.2198103964328766D, -0.21932831406593323D, -0.2188776433467865D, -0.21837788820266724D, -0.21794435381889343D, -0.2174680083990097D, -0.2170126587152481D, -0.21653933823108673D, -0.2160915583372116D, -0.21563227474689484D, -0.21518409252166748D, -0.21474571526050568D, -0.2142743170261383D, -0.21381691098213196D, -0.21334433555603027D, -0.21288271248340607D, -0.2123873084783554D, -0.21193847060203552D, -0.2114948183298111D, -0.21100975573062897D, -0.21056903898715973D, -0.21009771525859833D, -0.20959174633026123D, -0.2091664969921112D, -0.20870351791381836D, -0.2082373946905136D, -0.2077392190694809D, -0.20726850628852844D, -0.2067907601594925D, -0.2063116431236267D, -0.20583796501159668D, -0.20534458756446838D, -0.20489037036895752D, -0.20444543659687042D, -0.2040008306503296D, -0.20351454615592957D, -0.20304752886295319D, -0.20254746079444885D, -0.2020740658044815D, -0.2015744149684906D, -0.20112964510917664D, -0.20067822933197021D, -0.200225830078125D, -0.19977039098739624D, -0.19926966726779938D, -0.19877131283283234D, -0.19831915199756622D, -0.1978578269481659D, -0.1973981410264969D, -0.19692765176296234D, -0.19644327461719513D, -0.19598513841629028D, -0.1955469399690628D, -0.19506791234016418D, -0.19460316002368927D, -0.1940772980451584D, -0.19364812970161438D, -0.1931820958852768D, -0.19273783266544342D, -0.1922660917043686D, -0.19177058339118958D, -0.1913253366947174D, -0.19083912670612335D, -0.1903299242258072D, -0.1898471564054489D, -0.18940511345863342D, -0.18894870579242706D, -0.18847599625587463D, -0.18803250789642334D, -0.18753890693187714D, -0.1870977133512497D, -0.1866195946931839D, -0.18615631759166718D, -0.1857069730758667D, -0.1852405071258545D, -0.18479567766189575D, -0.1843431293964386D, -0.1838725507259369D, -0.18344098329544067D, -0.1830095797777176D, -0.18253810703754425D, -0.18209238350391388D, -0.1816622018814087D, -0.18118171393871307D, -0.18071290850639343D, -0.180253803730011D, -0.179769366979599D, -0.1793292909860611D, -0.17883707582950592D, -0.178366020321846D, -0.1778915673494339D, -0.17741069197654724D, -0.17693915963172913D, -0.17645516991615295D, -0.17598532140254974D, -0.17547713220119476D, -0.1749715358018875D, -0.17450954020023346D, -0.1740640103816986D, -0.17359958589076996D, -0.1731225997209549D, -0.17268459498882294D, -0.1722080111503601D, -0.1717744767665863D, -0.17135664820671082D, -0.170857772231102D, -0.17039941251277924D, -0.16989468038082123D, -0.16943596303462982D, -0.16898159682750702D, -0.16854242980480194D, -0.16809329390525818D, -0.16760970652103424D, -0.16718792915344238D, -0.1666894555091858D, -0.1662272959947586D, -0.16578102111816406D, -0.16531381011009216D, -0.1648193895816803D, -0.16437332332134247D, -0.16389940679073334D, -0.1634543091058731D, -0.162981316447258D, -0.1625393033027649D, -0.16209138929843903D, -0.1616077572107315D, -0.16111062467098236D, -0.1606225222349167D, -0.16015741229057312D, -0.15968406200408936D, -0.15919706225395203D, -0.15878324210643768D, -0.1583307534456253D, -0.15784773230552673D, -0.1573367863893509D, -0.1568923145532608D, -0.15643681585788727D, -0.1559513509273529D, -0.1554512083530426D, -0.15502944588661194D, -0.15453824400901794D, -0.1541012078523636D, -0.15362413227558136D, -0.1531377136707306D, -0.152687206864357D, -0.15223318338394165D, -0.1517704725265503D, -0.1513061374425888D, -0.15085582435131073D, -0.15041625499725342D, -0.149865061044693D, -0.14939723908901215D, -0.1489189863204956D, -0.1484673172235489D, -0.14795278012752533D, -0.1475195735692978D, -0.1471049189567566D, -0.1466224193572998D, -0.14613521099090576D, -0.14566345512866974D, -0.14521154761314392D, -0.14471805095672607D, -0.14419704675674438D, -0.14375221729278564D, -0.14330840110778809D, -0.1428687870502472D, -0.14242301881313324D, -0.14195817708969116D, -0.14148111641407013D, -0.14101140201091766D, -0.14054565131664276D, -0.14008617401123047D, -0.13962242007255554D, -0.13913913071155548D, -0.1386719048023224D, -0.13822419941425323D, -0.13781346380710602D, -0.13734480738639832D, -0.1368473321199417D, -0.1363864243030548D, -0.1359218806028366D, -0.13546185195446014D, -0.13499535620212555D, -0.13451282680034637D, -0.13403449952602386D, -0.1335677057504654D, -0.13311335444450378D, -0.13265040516853333D, -0.13223102688789368D, -0.1318179965019226D, -0.13135839998722076D, -0.13091857731342316D, -0.1304430514574051D, -0.1299501210451126D, -0.12952110171318054D, -0.12904620170593262D, -0.12858985364437103D, -0.12813624739646912D, -0.12764878571033478D, -0.12717436254024506D, -0.12671279907226562D, -0.12626932561397552D, -0.1258126050233841D, -0.12532095611095428D, -0.12483920902013779D, -0.12435654550790787D, -0.12389810383319855D, -0.12345582246780396D, -0.12299700826406479D, -0.12249735742807388D, -0.1220179870724678D, -0.12155383825302124D, -0.12107869982719421D, -0.1206524446606636D, -0.12021951377391815D, -0.11980114877223969D, -0.11933659762144089D, -0.11889223009347916D, -0.11844123899936676D, -0.1179727166891098D, -0.11748640239238739D, -0.1170230507850647D, -0.11659178137779236D, -0.11614589393138885D, -0.11567246168851852D, -0.11520460993051529D, -0.1147543415427208D, -0.11429299414157867D, -0.11382859200239182D, -0.11335264891386032D, -0.11292024701833725D, -0.1124499961733818D, -0.11199361830949783D, -0.11152473092079163D, -0.11108040064573288D, -0.11064787954092026D, -0.11018948256969452D, -0.10975238680839539D, -0.10929903388023376D, -0.10885120928287506D, -0.10839029401540756D, -0.10796593129634857D, -0.1075151339173317D, -0.1070588231086731D, -0.10662193596363068D, -0.10614380240440369D, -0.10572738200426102D, -0.10525882989168167D, -0.10484708100557327D, -0.10437420755624771D, -0.10390757024288177D, -0.10347313433885574D, -0.1030469536781311D, -0.10260704159736633D, -0.10216134041547775D, -0.10169082880020142D, -0.10123983770608902D, -0.10074019432067871D, -0.10024909675121307D, -0.09978712350130081D, -0.09936016798019409D, -0.09888911992311478D, -0.09846487641334534D, -0.09800232201814651D, -0.09751661866903305D, -0.0970243439078331D, -0.09657711535692215D, -0.09613432735204697D, -0.0956689789891243D, -0.09518304467201233D, -0.09470118582248688D, -0.09423696994781494D, -0.09374787658452988D, -0.09331570565700531D, -0.09284882992506027D, -0.09236712008714676D, -0.0918976366519928D, -0.09143716841936111D, -0.09097806364297867D, -0.09050887823104858D, -0.09006129950284958D, -0.08960632979869843D, -0.08917775005102158D, -0.08866771310567856D, -0.08821896463632584D, -0.0877581313252449D, -0.08728067576885223D, -0.08678260445594788D, -0.08633118122816086D, -0.08584354817867279D, -0.0853717178106308D, -0.08489247411489487D, -0.08442585915327072D, -0.08395987749099731D, -0.08352631330490112D, -0.08305583149194717D, -0.08258084207773209D, -0.08210133016109467D, -0.08160284906625748D, -0.08113317936658859D, -0.08069101721048355D, -0.08020471036434174D, -0.07976270467042923D, -0.07930315285921097D, -0.07882215827703476D, -0.07839109003543854D, -0.07788340002298355D, -0.07738876342773438D, -0.07692108303308487D, -0.07646818459033966D, -0.07600755244493484D, -0.07554172724485397D, -0.0750839039683342D, -0.07462136447429657D, -0.07418619096279144D, -0.07369257509708405D, -0.07323087751865387D, -0.07274939864873886D, -0.07232934981584549D, -0.0718294009566307D, -0.0713631734251976D, -0.07090400904417038D, -0.07045546174049377D, -0.06996987015008926D, -0.0694737657904625D, -0.06901108473539352D, -0.06850951164960861D, -0.06804317235946655D, -0.0676044300198555D, -0.06714358180761337D, -0.06665648519992828D, -0.06620483845472336D, -0.06572776287794113D, -0.06529750674962997D, -0.06478378176689148D, -0.06431610882282257D, -0.06385191529989243D, -0.06336922943592072D, -0.0629018023610115D, -0.062440142035484314D, -0.061978090554475784D, -0.06151474267244339D, -0.061009474098682404D, -0.0605136975646019D, -0.06004589796066284D, -0.05957134813070297D, -0.059127721935510635D, -0.05862615630030632D, -0.058159153908491135D, -0.0576748289167881D, -0.05721447244286537D, -0.056762006133794785D, -0.05628581345081329D, -0.055841170251369476D, -0.0554051548242569D, -0.05493675544857979D, -0.05444927141070366D, -0.05396290495991707D, -0.05345846712589264D, -0.05297686532139778D, -0.052506621927022934D, -0.052009958773851395D, -0.051531676203012466D, -0.051076509058475494D, -0.0506112314760685D, -0.05013972148299217D, -0.04966387152671814D, -0.04918888956308365D, -0.04871213063597679D, -0.04824038967490196D, -0.04775635525584221D, -0.04728744924068451D, -0.046815820038318634D, -0.04631710797548294D, -0.04582008346915245D, -0.04536677524447441D, -0.04491899907588959D, -0.044470835477113724D, -0.04400596767663956D, -0.043535444885492325D, -0.04307795315980911D, -0.04260599613189697D, -0.042175114154815674D, -0.04172958806157112D, -0.04125590994954109D, -0.04082314670085907D, -0.04037400707602501D, -0.03990166634321213D, -0.039449382573366165D, -0.038977205753326416D, -0.03857160359621048D, -0.03812842443585396D, -0.0376502126455307D, -0.03714657574892044D, -0.03665357083082199D, -0.03620750829577446D, -0.035722747445106506D, -0.03526165336370468D, -0.03478018939495087D, -0.03431404381990433D, -0.033867765218019485D, -0.03341749310493469D, -0.03296608477830887D, -0.0324828140437603D, -0.03204398974776268D, -0.031582657247781754D, -0.031121470034122467D, -0.030629586428403854D, -0.03019966371357441D, -0.02972709760069847D, -0.029238028451800346D, -0.02879139594733715D, -0.02834215760231018D, -0.02785702981054783D, -0.027348829433321953D, -0.026903830468654633D, -0.026418806985020638D, -0.025951212272047997D, -0.02550702914595604D, -0.025065308436751366D, -0.02460712380707264D, -0.0241254810243845D, -0.02367357909679413D, -0.023214267566800117D, -0.02273659221827984D, -0.022288724780082703D, -0.021809976547956467D, -0.021356219425797462D, -0.02091222070157528D, -0.02044014073908329D, -0.019984910264611244D, -0.019542459398508072D, -0.019069962203502655D, -0.018573816865682602D, -0.018139785155653954D, -0.017709843814373016D, -0.01719387248158455D, -0.01673675887286663D, -0.01623465307056904D, -0.01578424498438835D, -0.015328689478337765D, -0.014845888130366802D, -0.014361053705215454D, -0.01387764047831297D, -0.013408266007900238D, -0.012936233542859554D, -0.012468288652598858D, -0.012004869058728218D, -0.01153097115457058D, -0.011026769876480103D, -0.01058868132531643D, -0.010118640959262848D, -0.009648044593632221D, -0.009180471301078796D, -0.00874828826636076D, -0.008231979794800282D, -0.007815088145434856D, -0.007339174393564463D, -0.006868409458547831D, -0.006415967363864183D, -0.00596375809982419D, -0.00553414411842823D, -0.005092580337077379D, -0.004615438170731068D, -0.004147601779550314D, -0.0036700163036584854D, -0.003234181785956025D, -0.002747706137597561D, -0.002275948878377676D, -0.0018008529441431165D, -0.0013390094973146915D, -9.023041930049658E-4D, -4.4535082997754216E-4D, 0.0D, 4.168656305409968E-4D, 8.610964869149029E-4D, 0.0013082061195746064D, 0.0017705500358715653D, 0.0022286938037723303D, 0.0027038094121962786D, 0.0031797823030501604D, 0.0036177479196339846D, 0.004092853982001543D, 0.00455115782096982D, 0.005024673882871866D, 0.0054508778266608715D, 0.005874452646821737D, 0.006345030386000872D, 0.006781958043575287D, 0.007221095263957977D, 0.007751896511763334D, 0.008183642290532589D, 0.008649589493870735D, 0.009099786169826984D, 0.009520403109490871D, 0.01000619400292635D, 0.01046296488493681D, 0.010907409712672234D, 0.011398875154554844D, 0.011837021447718143D, 0.012319699861109257D, 0.012789001688361168D, 0.013266430236399174D, 0.013758053071796894D, 0.014256741851568222D, 0.0147450752556324D, 0.015211586840450764D, 0.01564781181514263D, 0.016076650470495224D, 0.016586629673838615D, 0.017026731744408607D, 0.017525365576148033D, 0.01798558607697487D, 0.018427804112434387D, 0.018891869112849236D, 0.01935114525258541D, 0.019804034382104874D, 0.020264199003577232D, 0.020725706592202187D, 0.021203743293881416D, 0.021654309704899788D, 0.022142447531223297D, 0.02260545641183853D, 0.02308838628232479D, 0.023543886840343475D, 0.02397369220852852D, 0.024441862478852272D, 0.024915242567658424D, 0.025360191240906715D, 0.025840288028120995D, 0.02631484717130661D, 0.026808904483914375D, 0.02727837674319744D, 0.027765285223722458D, 0.028254829347133636D, 0.028705906122922897D, 0.029156357049942017D, 0.029635854065418243D, 0.030102955177426338D, 0.030535848811268806D, 0.03101063147187233D, 0.0314723402261734D, 0.03192717581987381D, 0.032385364174842834D, 0.03285473957657814D, 0.03331996127963066D, 0.033790718764066696D, 0.03424150124192238D, 0.03469865396618843D, 0.03515125438570976D, 0.035605255514383316D, 0.03608577698469162D, 0.03652714565396309D, 0.036979805678129196D, 0.03746131435036659D, 0.0379425548017025D, 0.038345664739608765D, 0.03882379084825516D, 0.0392477810382843D, 0.03971483185887337D, 0.0401901938021183D, 0.04066096618771553D, 0.041114721447229385D, 0.04158128425478935D, 0.0420382022857666D, 0.04248936101794243D, 0.042961087077856064D, 0.04341959208250046D, 0.043904419988393784D, 0.0443427637219429D, 0.04480225220322609D, 0.04524291679263115D, 0.04567072167992592D, 0.04613497108221054D, 0.04659995064139366D, 0.047081708908081055D, 0.04757154732942581D, 0.04803965613245964D, 0.048478204756975174D, 0.048989493399858475D, 0.049454182386398315D, 0.04991860315203667D, 0.050365593284368515D, 0.0508514903485775D, 0.05132327973842621D, 0.05179283022880554D, 0.052248794585466385D, 0.05268503352999687D, 0.053198836743831635D, 0.05368649214506149D, 0.05421089380979538D, 0.054658785462379456D, 0.05512617900967598D, 0.05555638298392296D, 0.0560036227107048D, 0.05645635724067688D, 0.05692245066165924D, 0.05738668516278267D, 0.05786433443427086D, 0.058321356773376465D, 0.05880298092961311D, 0.05926252529025078D, 0.05970615893602371D, 0.06018388643860817D, 0.06063615530729294D, 0.061135876923799515D, 0.06162475049495697D, 0.06207337975502014D, 0.06256981939077377D, 0.0630052387714386D, 0.0634310320019722D, 0.0638926699757576D, 0.06436608731746674D, 0.0648551806807518D, 0.06531759351491928D, 0.065772145986557D, 0.06625805050134659D, 0.06672851741313934D, 0.06720802187919617D, 0.06766702234745026D, 0.06809297949075699D, 0.06856777518987656D, 0.06906134635210037D, 0.0695035383105278D, 0.06995517015457153D, 0.07043462246656418D, 0.07087671756744385D, 0.07131607830524445D, 0.07179289311170578D, 0.07225023955106735D, 0.07268200069665909D, 0.07317853718996048D, 0.07361547648906708D, 0.07412286102771759D, 0.07458420842885971D, 0.07503563165664673D, 0.07551742345094681D, 0.07598724961280823D, 0.07641705870628357D, 0.07686413079500198D, 0.07736052572727203D, 0.07785376906394958D, 0.07831523567438126D, 0.07877857238054276D, 0.07922326028347015D, 0.07968610525131226D, 0.08015176653862D, 0.08060047775506973D, 0.08107147365808487D, 0.08151480555534363D, 0.08202660828828812D, 0.08250529319047928D, 0.08296989649534225D, 0.08345716446638107D, 0.08391540497541428D, 0.08433298021554947D, 0.08479931950569153D, 0.08524123579263687D, 0.08570325374603271D, 0.0861559808254242D, 0.08659818768501282D, 0.08707676082849503D, 0.08756472170352936D, 0.08801695704460144D, 0.08853187412023544D, 0.08898908644914627D, 0.08946547657251358D, 0.08992484211921692D, 0.0903463140130043D, 0.09079413115978241D, 0.09125514328479767D, 0.09171689301729202D, 0.09216631948947906D, 0.09262130409479141D, 0.09305017441511154D, 0.09349587559700012D, 0.09393535554409027D, 0.09437032788991928D, 0.09485276788473129D, 0.09533093869686127D, 0.09582594037055969D, 0.09629540890455246D, 0.09672483801841736D, 0.09716562926769257D, 0.09765120595693588D, 0.09813567996025085D, 0.0985914096236229D, 0.0990055575966835D, 0.09946183115243912D, 0.09987382590770721D, 0.10033174604177475D, 0.10079345107078552D, 0.10127578675746918D, 0.10172127932310104D, 0.10217364132404327D, 0.10263688117265701D, 0.10307306051254272D, 0.10350827872753143D, 0.10397220402956009D, 0.10442768037319183D, 0.10491803288459778D, 0.1053432822227478D, 0.10581864416599274D, 0.10627686977386475D, 0.1067519336938858D, 0.10721217095851898D, 0.10764270275831223D, 0.10811315476894379D, 0.10855291038751602D, 0.1089974045753479D, 0.10945462435483932D, 0.10991151630878448D, 0.11035595089197159D, 0.11079936474561691D, 0.11126214265823364D, 0.11171538382768631D, 0.11215132474899292D, 0.11261577159166336D, 0.11305342614650726D, 0.11349684000015259D, 0.11396090686321259D, 0.11440304666757584D, 0.1148676946759224D, 0.11534382402896881D, 0.11578971147537231D, 0.11626245826482773D, 0.11670893430709839D, 0.11717358231544495D, 0.11763584613800049D, 0.11809416860342026D, 0.1185641959309578D, 0.1190362498164177D, 0.11947569251060486D, 0.11995163559913635D, 0.12034139782190323D, 0.12079598009586334D, 0.12123335897922516D, 0.12171798199415207D, 0.12220712006092072D, 0.12266131490468979D, 0.12311149388551712D, 0.12358853965997696D, 0.12402278184890747D, 0.12447427213191986D, 0.12492292374372482D, 0.12536488473415375D, 0.1258557140827179D, 0.12631472945213318D, 0.12678931653499603D, 0.1272418200969696D, 0.1276789903640747D, 0.12812837958335876D, 0.12855777144432068D, 0.12901000678539276D, 0.1295066773891449D, 0.12997055053710938D, 0.13041932880878448D, 0.13086055219173431D, 0.13131678104400635D, 0.13173618912696838D, 0.13217733800411224D, 0.13257558643817902D, 0.13303515315055847D, 0.13347606360912323D, 0.1339293271303177D, 0.13438007235527039D, 0.1348496675491333D, 0.1352933943271637D, 0.13577623665332794D, 0.13623352348804474D, 0.13667674362659454D, 0.1371779888868332D, 0.13767582178115845D, 0.13814261555671692D, 0.13862669467926025D, 0.13910050690174103D, 0.13954664766788483D, 0.14002522826194763D, 0.1404792070388794D, 0.14095349609851837D, 0.14145132899284363D, 0.14194148778915405D, 0.14239490032196045D, 0.14285248517990112D, 0.14331306517124176D, 0.14375628530979156D, 0.14420928061008453D, 0.14471451938152313D, 0.1451774686574936D, 0.14563149213790894D, 0.14607255160808563D, 0.14652425050735474D, 0.1469966620206833D, 0.14742255210876465D, 0.14784209430217743D, 0.14830715954303741D, 0.14879651367664337D, 0.149237722158432D, 0.14971013367176056D, 0.15021756291389465D, 0.15068085491657257D, 0.15116679668426514D, 0.15161839127540588D, 0.152106374502182D, 0.1525515913963318D, 0.15302610397338867D, 0.15346159040927887D, 0.15394625067710876D, 0.15438704192638397D, 0.15487033128738403D, 0.1553371548652649D, 0.15580454468727112D, 0.156284898519516D, 0.15671078860759735D, 0.15717515349388123D, 0.15761828422546387D, 0.15807723999023438D, 0.15852780640125275D, 0.15896621346473694D, 0.1594497412443161D, 0.15990334749221802D, 0.1603526622056961D, 0.16084396839141846D, 0.16133654117584229D, 0.16182120144367218D, 0.16228310763835907D, 0.16274477541446686D, 0.1631993055343628D, 0.16370509564876556D, 0.16416113078594208D, 0.16461949050426483D, 0.16509303450584412D, 0.16555249691009521D, 0.16599228978157043D, 0.16644693911075592D, 0.16691160202026367D, 0.1673542857170105D, 0.16779595613479614D, 0.16828018426895142D, 0.16872042417526245D, 0.16914832592010498D, 0.1696404069662094D, 0.17009416222572327D, 0.17058154940605164D, 0.17106236517429352D, 0.17150871455669403D, 0.17193780839443207D, 0.1723848581314087D, 0.17284345626831055D, 0.17332123219966888D, 0.17382800579071045D, 0.17429354786872864D, 0.17473028600215912D, 0.1752118319272995D, 0.17569267749786377D, 0.17617307603359222D, 0.17664162814617157D, 0.17711058259010315D, 0.177546888589859D, 0.17802934348583221D, 0.17847880721092224D, 0.17895878851413727D, 0.17944811284542084D, 0.17991696298122406D, 0.18034568428993225D, 0.18083885312080383D, 0.18134140968322754D, 0.1817953884601593D, 0.18224695324897766D, 0.1827344000339508D, 0.18319717049598694D, 0.18362371623516083D, 0.18408402800559998D, 0.1845383197069168D, 0.18500585854053497D, 0.18543913960456848D, 0.18589206039905548D, 0.18638618290424347D, 0.18683254718780518D, 0.18729357421398163D, 0.1877458542585373D, 0.1881948709487915D, 0.18867141008377075D, 0.1891425997018814D, 0.1896383911371231D, 0.19008977711200714D, 0.19059477746486664D, 0.1910955309867859D, 0.19154046475887299D, 0.1920085996389389D, 0.1924976259469986D, 0.19297999143600464D, 0.19346415996551514D, 0.1938929706811905D, 0.19440758228302002D, 0.1948833465576172D, 0.1953524500131607D, 0.19580426812171936D, 0.19628435373306274D, 0.19678011536598206D, 0.1972467005252838D, 0.19772139191627502D, 0.19817455112934113D, 0.19861629605293274D, 0.19908666610717773D, 0.19956916570663452D, 0.20003587007522583D, 0.2004714459180832D, 0.20093294978141785D, 0.2013975977897644D, 0.20189401507377625D, 0.20238760113716125D, 0.20286208391189575D, 0.203344464302063D, 0.2038167268037796D, 0.20429755747318268D, 0.20473958551883698D, 0.20518158376216888D, 0.2056620866060257D, 0.20609739422798157D, 0.2065676748752594D, 0.20705540478229523D, 0.2075486183166504D, 0.2080535888671875D, 0.20851968228816986D, 0.20897184312343597D, 0.20944087207317352D, 0.20993351936340332D, 0.2104172706604004D, 0.210901141166687D, 0.2113402634859085D, 0.21182526648044586D, 0.21224695444107056D, 0.2126944214105606D, 0.21317575871944427D, 0.21366049349308014D, 0.2141040563583374D, 0.21457503736019135D, 0.2150408923625946D, 0.2154938280582428D, 0.2159576565027237D, 0.21639752388000488D, 0.2168862372636795D, 0.2173519879579544D, 0.2177966684103012D, 0.21821701526641846D, 0.21873435378074646D, 0.21923255920410156D, 0.21964925527572632D, 0.22016601264476776D, 0.22062964737415314D, 0.22109317779541016D, 0.22157219052314758D, 0.22205998003482819D, 0.22250258922576904D, 0.22299329936504364D, 0.22346089780330658D, 0.22386358678340912D, 0.22431528568267822D, 0.22480542957782745D, 0.2252291440963745D, 0.2257033735513687D, 0.2261507213115692D, 0.22663995623588562D, 0.227098748087883D, 0.22758157551288605D, 0.2280273586511612D, 0.2284591943025589D, 0.22891086339950562D, 0.2293635904788971D, 0.22981512546539307D, 0.2303115725517273D, 0.2307835817337036D, 0.2312321662902832D, 0.23169724643230438D, 0.23218663036823273D, 0.23266419768333435D, 0.23312914371490479D, 0.233600914478302D, 0.23405154049396515D, 0.23452113568782806D, 0.23498238623142242D, 0.2354474514722824D, 0.23587417602539062D, 0.23632276058197021D, 0.2367987036705017D, 0.23725953698158264D, 0.23771677911281586D, 0.23819883167743683D, 0.23865287005901337D, 0.23909300565719604D, 0.23953081667423248D, 0.23997336626052856D, 0.24042324721813202D, 0.24086444079875946D, 0.2413105070590973D, 0.24174147844314575D, 0.24222896993160248D, 0.24265654385089874D, 0.24309583008289337D, 0.2435549646615982D, 0.2439824342727661D, 0.24444152414798737D, 0.2448790967464447D, 0.24534952640533447D, 0.24579569697380066D, 0.24623432755470276D, 0.24664406478405D, 0.24708445370197296D, 0.24750955402851105D, 0.24798931181430817D, 0.24846124649047852D, 0.2489023059606552D, 0.24936534464359283D, 0.24984745681285858D, 0.2503180503845215D, 0.25077712535858154D, 0.25124165415763855D, 0.25171688199043274D, 0.25217753648757935D, 0.25262942910194397D, 0.2530757188796997D, 0.25351011753082275D, 0.25398433208465576D, 0.2544580101966858D, 0.2548938989639282D, 0.25534236431121826D, 0.25578323006629944D, 0.2562248408794403D, 0.2566409409046173D, 0.2571069300174713D, 0.25757265090942383D, 0.2580459415912628D, 0.25851020216941833D, 0.25894230604171753D, 0.25939860939979553D, 0.2598321735858917D, 0.26028236746788025D, 0.26076990365982056D, 0.26125451922416687D, 0.2616814374923706D, 0.2621334493160248D, 0.26258885860443115D, 0.2630382478237152D, 0.2634872794151306D, 0.2639560103416443D, 0.26442626118659973D, 0.26490315794944763D, 0.26534172892570496D, 0.2657735347747803D, 0.26625367999076843D, 0.26668620109558105D, 0.26711753010749817D, 0.26758676767349243D, 0.2680959403514862D, 0.26854223012924194D, 0.26900240778923035D, 0.2694344222545624D, 0.2698785364627838D, 0.2703325152397156D, 0.27079638838768005D, 0.27121323347091675D, 0.27164754271507263D, 0.2721148729324341D, 0.27261990308761597D, 0.2730520963668823D, 0.2735033929347992D, 0.27395889163017273D, 0.2744174897670746D, 0.2749277353286743D, 0.2753666937351227D, 0.27583181858062744D, 0.2762593924999237D, 0.27671781182289124D, 0.2771632969379425D, 0.27762773633003235D, 0.27808821201324463D, 0.2785561978816986D, 0.2790210247039795D, 0.2794676721096039D, 0.27997758984565735D, 0.2804442048072815D, 0.2809334099292755D, 0.2814132869243622D, 0.2819100320339203D, 0.2823738157749176D, 0.2828632891178131D, 0.2832971513271332D, 0.2837606370449066D, 0.2842257022857666D, 0.284706175327301D, 0.28517892956733704D, 0.2856413722038269D, 0.28612804412841797D, 0.2866162955760956D, 0.2870566248893738D, 0.28752243518829346D, 0.28795307874679565D, 0.2884029150009155D, 0.28882715106010437D, 0.2893234193325043D, 0.28977981209754944D, 0.29021215438842773D, 0.29065024852752686D, 0.29114648699760437D, 0.29163259267807007D, 0.29209470748901367D, 0.29254150390625D, 0.29303133487701416D, 0.29347801208496094D, 0.2939077317714691D, 0.29437002539634705D, 0.2948186695575714D, 0.2952706217765808D, 0.29571935534477234D, 0.29619288444519043D, 0.29662781953811646D, 0.2970706522464752D, 0.2975059449672699D, 0.2979780435562134D, 0.2984209656715393D, 0.2989175319671631D, 0.29936090111732483D, 0.29983457922935486D, 0.30030179023742676D, 0.3007870316505432D, 0.30124491453170776D, 0.3017134666442871D, 0.30218929052352905D, 0.30264225602149963D, 0.3031245768070221D, 0.30356884002685547D, 0.3040228486061096D, 0.3044879138469696D, 0.30492523312568665D, 0.30536073446273804D, 0.30580392479896545D, 0.3062219023704529D, 0.30666860938072205D, 0.3070964515209198D, 0.30755335092544556D, 0.30799052119255066D, 0.3084643483161926D, 0.3089260160923004D, 0.3093597888946533D, 0.3098238706588745D, 0.31024208664894104D, 0.31071120500564575D, 0.3111429512500763D, 0.31156468391418457D, 0.3120630085468292D, 0.31250911951065063D, 0.3129652738571167D, 0.3134596645832062D, 0.31389009952545166D, 0.3142957389354706D, 0.314715176820755D, 0.31520751118659973D, 0.3156639337539673D, 0.3161354660987854D, 0.31650006771087646D, 0.31700363755226135D, 0.3174765706062317D, 0.3179265558719635D, 0.31831637024879456D, 0.31879016757011414D, 0.3192623555660248D, 0.3196816146373749D, 0.32012230157852173D, 0.32058221101760864D, 0.32105132937431335D, 0.3214877247810364D, 0.321958065032959D, 0.3224197030067444D, 0.32287776470184326D, 0.3232984244823456D, 0.32375460863113403D, 0.32420462369918823D, 0.3246663212776184D, 0.3250793516635895D, 0.32551777362823486D, 0.32601094245910645D, 0.32646849751472473D, 0.3269194960594177D, 0.327384352684021D, 0.32789483666419983D, 0.32835909724235535D, 0.32883167266845703D, 0.3293091654777527D, 0.32977598905563354D, 0.330209881067276D, 0.3306809663772583D, 0.3311329483985901D, 0.33160221576690674D, 0.33207982778549194D, 0.3325675427913666D, 0.3330262303352356D, 0.3335005044937134D, 0.33391913771629333D, 0.33441251516342163D, 0.3348396420478821D, 0.3353181481361389D, 0.3357672095298767D, 0.33621659874916077D, 0.3367024064064026D, 0.3371727168560028D, 0.3376167416572571D, 0.3381151854991913D, 0.33856678009033203D, 0.339025616645813D, 0.33946481347084045D, 0.33994701504707336D, 0.3403969705104828D, 0.3408898115158081D, 0.34135758876800537D, 0.3418196737766266D, 0.34231361746788025D, 0.3427829146385193D, 0.3432021141052246D, 0.343667596578598D, 0.34414032101631165D, 0.34463152289390564D, 0.34506839513778687D, 0.3455321788787842D, 0.3459724187850952D, 0.3464416563510895D, 0.3468835651874542D, 0.3473498225212097D, 0.34777554869651794D, 0.34825536608695984D, 0.34872201085090637D, 0.3492021858692169D, 0.34968751668930054D, 0.35015514492988586D, 0.3506210446357727D, 0.35111862421035767D, 0.3515591323375702D, 0.35197773575782776D, 0.35246777534484863D, 0.35293281078338623D, 0.3533059060573578D, 0.35381144285202026D, 0.3542632758617401D, 0.35472649335861206D, 0.35519418120384216D, 0.3557141423225403D, 0.3561652600765228D, 0.3566296100616455D, 0.35712379217147827D, 0.35762926936149597D, 0.3580913543701172D, 0.35853779315948486D, 0.3590478003025055D, 0.3594883680343628D, 0.3599258363246918D, 0.3603578805923462D, 0.3608366549015045D, 0.36130017042160034D, 0.3617651164531708D, 0.3622173070907593D, 0.3626740574836731D, 0.36311766505241394D, 0.3635890483856201D, 0.36403384804725647D, 0.36449429392814636D, 0.3649645745754242D, 0.36542847752571106D, 0.3658938407897949D, 0.366346538066864D, 0.3668064475059509D, 0.3672544062137604D, 0.3676927983760834D, 0.3681465983390808D, 0.368583083152771D, 0.3690279722213745D, 0.36952367424964905D, 0.3699638843536377D, 0.370394766330719D, 0.3708454668521881D, 0.3712919354438782D, 0.3717401921749115D, 0.37220123410224915D, 0.37264400720596313D, 0.37307944893836975D, 0.37358567118644714D, 0.37402620911598206D, 0.3744513988494873D, 0.37491515278816223D, 0.37531962990760803D, 0.3757742941379547D, 0.3762052357196808D, 0.37664008140563965D, 0.37707191705703735D, 0.3775149881839752D, 0.3779565095901489D, 0.3784351944923401D, 0.3788757920265198D, 0.37933775782585144D, 0.37975525856018066D, 0.38018184900283813D, 0.3806290328502655D, 0.3810517489910126D, 0.3814375102519989D, 0.3818727433681488D, 0.3823419213294983D, 0.3828076124191284D, 0.3832823932170868D, 0.3837049901485443D, 0.3841449022293091D, 0.3846031129360199D, 0.3850502371788025D, 0.385475754737854D, 0.38596659898757935D, 0.3864104151725769D, 0.38683876395225525D, 0.3873252868652344D, 0.3877384662628174D, 0.388178288936615D, 0.3885806202888489D, 0.3890480697154999D, 0.3895305395126343D, 0.3900220990180969D, 0.39047881960868835D, 0.39091551303863525D, 0.39139822125434875D, 0.39183932542800903D, 0.392275869846344D, 0.392767995595932D, 0.3932383060455322D, 0.3937053978443146D, 0.3941604793071747D, 0.3946269154548645D, 0.39507585763931274D, 0.39548471570014954D, 0.3959529995918274D, 0.39645472168922424D, 0.39692774415016174D, 0.39741259813308716D, 0.39785870909690857D, 0.3983263075351715D, 0.3988035321235657D, 0.39925169944763184D, 0.3996838927268982D, 0.4001287519931793D, 0.4006178677082062D, 0.4010898768901825D, 0.4015604555606842D, 0.40202707052230835D, 0.40245679020881653D, 0.40293094515800476D, 0.4034392535686493D, 0.4039093255996704D, 0.4043821692466736D, 0.40486443042755127D, 0.4053739905357361D, 0.4058074355125427D, 0.40630874037742615D, 0.4067918658256531D, 0.4072363078594208D, 0.40767401456832886D, 0.4081343412399292D, 0.4085795283317566D, 0.4090270400047302D, 0.4094325006008148D, 0.4099096357822418D, 0.4103759229183197D, 0.4108376204967499D, 0.4113309681415558D, 0.4117901027202606D, 0.41226187348365784D, 0.41273775696754456D, 0.41322728991508484D, 0.4136919677257538D, 0.41412317752838135D, 0.4145846366882324D, 0.415062814950943D, 0.415499746799469D, 0.41598421335220337D, 0.4164329767227173D, 0.4168729782104492D, 0.4173301160335541D, 0.41776272654533386D, 0.4181908071041107D, 0.4186636209487915D, 0.4190938472747803D, 0.4195532202720642D, 0.4200260639190674D, 0.4205058813095093D, 0.4209406077861786D, 0.42138221859931946D, 0.421817421913147D, 0.4222801923751831D, 0.4227195084095001D, 0.4231964647769928D, 0.4236719608306885D, 0.42410510778427124D, 0.42456895112991333D, 0.42507311701774597D, 0.4255290925502777D, 0.4260011315345764D, 0.42646899819374084D, 0.42692455649375916D, 0.4274055063724518D, 0.42785710096359253D, 0.42829200625419617D, 0.4287801682949066D, 0.4292578399181366D, 0.4297063946723938D, 0.4301692843437195D, 0.430625319480896D, 0.4311210811138153D, 0.4315798580646515D, 0.4320110082626343D, 0.43246930837631226D, 0.4329104423522949D, 0.4333850145339966D, 0.43380045890808105D, 0.4342290759086609D, 0.43472087383270264D, 0.4351579248905182D, 0.4356578290462494D, 0.4361093044281006D, 0.43657541275024414D, 0.4369976818561554D, 0.43740877509117126D, 0.43785667419433594D, 0.4383409023284912D, 0.4387859106063843D, 0.4392130672931671D, 0.4396638870239258D, 0.4401101768016815D, 0.4405667185783386D, 0.4410354793071747D, 0.4415227770805359D, 0.44195571541786194D, 0.4424566924571991D, 0.44294804334640503D, 0.44344770908355713D, 0.4438609778881073D, 0.44431737065315247D, 0.4447491466999054D, 0.4451911747455597D, 0.44563400745391846D, 0.4461042881011963D, 0.4465523660182953D, 0.44701021909713745D, 0.44744202494621277D, 0.44790083169937134D, 0.44836023449897766D, 0.4487965404987335D, 0.44924411177635193D, 0.4496929347515106D, 0.45014363527297974D, 0.45060500502586365D, 0.4510105848312378D, 0.45146453380584717D, 0.4519331455230713D, 0.45240896940231323D, 0.45286038517951965D, 0.45329752564430237D, 0.4537377655506134D, 0.4542039632797241D, 0.45463576912879944D, 0.45509567856788635D, 0.4555233418941498D, 0.45594367384910583D, 0.4564257264137268D, 0.45684814453125D, 0.45732614398002625D, 0.45778998732566833D, 0.4582274556159973D, 0.4586721658706665D, 0.4591447114944458D, 0.45960500836372375D, 0.4600178301334381D, 0.46047934889793396D, 0.4609234929084778D, 0.46136897802352905D, 0.4618026316165924D, 0.462283194065094D, 0.4627189636230469D, 0.4631398916244507D, 0.4636479616165161D, 0.46408990025520325D, 0.46446308493614197D, 0.46488359570503235D, 0.4653341770172119D, 0.46579721570014954D, 0.46624305844306946D, 0.4666842520236969D, 0.4671739637851715D, 0.4676412045955658D, 0.4681183695793152D, 0.468619704246521D, 0.4690823554992676D, 0.4695432782173157D, 0.47002753615379333D, 0.47044625878334045D, 0.4709080457687378D, 0.4713667631149292D, 0.47178512811660767D, 0.4722518026828766D, 0.4727015495300293D, 0.4732007086277008D, 0.4736599624156952D, 0.47416114807128906D, 0.4746391177177429D, 0.4750903248786926D, 0.47553959488868713D, 0.4759838581085205D, 0.47645294666290283D, 0.47691580653190613D, 0.4773806631565094D, 0.47785019874572754D, 0.47835424542427063D, 0.4787907898426056D, 0.4792308509349823D, 0.47971123456954956D, 0.48016679286956787D, 0.4806031286716461D, 0.4810718894004822D, 0.4815417528152466D, 0.4820031523704529D, 0.48243653774261475D, 0.4828621745109558D, 0.4833242893218994D, 0.4837735593318939D, 0.48425227403640747D, 0.4847247004508972D, 0.48517146706581116D, 0.48558691143989563D, 0.48607468605041504D, 0.4865155518054962D, 0.48698723316192627D, 0.4874122142791748D, 0.4878520965576172D, 0.4882693886756897D, 0.4887109100818634D, 0.48919129371643066D, 0.48964065313339233D, 0.49008241295814514D, 0.49052369594573975D, 0.4909614324569702D, 0.4914078414440155D, 0.491849422454834D, 0.4922744333744049D, 0.49270620942115784D, 0.4931676983833313D, 0.49362602829933167D, 0.49406757950782776D, 0.49453216791152954D, 0.49497801065444946D, 0.4954409599304199D, 0.4958536922931671D, 0.4962973892688751D, 0.49675166606903076D, 0.49723342061042786D, 0.4976520836353302D, 0.4981245696544647D, 0.49855509400367737D, 0.49899476766586304D, 0.4994736909866333D, 0.49990856647491455D, 0.5003674030303955D, 0.50080406665802D, 0.5012417435646057D, 0.5017043948173523D, 0.5021814703941345D, 0.5026438236236572D, 0.5030980110168457D, 0.5035042762756348D, 0.503902018070221D, 0.5043559074401855D, 0.5048004388809204D, 0.5052796006202698D, 0.5057178735733032D, 0.5061670541763306D, 0.5066263675689697D, 0.5070849061012268D, 0.5075520873069763D, 0.5079953670501709D, 0.5084426999092102D, 0.5088971853256226D, 0.509351909160614D, 0.5097948312759399D, 0.5102611184120178D, 0.5107103586196899D, 0.5111591815948486D, 0.5115908980369568D, 0.5120378136634827D, 0.5124511122703552D, 0.5129324793815613D, 0.5134246945381165D, 0.5138871073722839D, 0.5143778324127197D, 0.5148214101791382D, 0.5152270793914795D, 0.5156940817832947D, 0.5161502361297607D, 0.5166060328483582D, 0.5170818567276001D, 0.517525315284729D, 0.5179942846298218D, 0.5183911919593811D, 0.5188703536987305D, 0.5193058252334595D, 0.5197564959526062D, 0.5202117562294006D, 0.5207022428512573D, 0.5211948156356812D, 0.5216438174247742D, 0.5221007466316223D, 0.5225681662559509D, 0.5230153203010559D, 0.5234923958778381D, 0.5239441990852356D, 0.5243942141532898D, 0.5248235464096069D, 0.5252488851547241D, 0.5256743431091309D, 0.526077926158905D, 0.5265212059020996D, 0.5269445180892944D, 0.5274064540863037D, 0.52787184715271D, 0.5283424854278564D, 0.5288335680961609D, 0.5292720198631287D, 0.5297167301177979D, 0.5302064418792725D, 0.5306571125984192D, 0.531088650226593D, 0.5315560102462769D, 0.5319926738739014D, 0.5324088931083679D, 0.532862663269043D, 0.5333322286605835D, 0.5337752103805542D, 0.5341958999633789D, 0.5346767902374268D, 0.5351715087890625D, 0.5356220602989197D, 0.5361113548278809D, 0.536573052406311D, 0.5370585322380066D, 0.5375128984451294D, 0.5379542112350464D, 0.538433849811554D, 0.5388942956924438D, 0.5393670201301575D, 0.5398485660552979D, 0.5402945876121521D, 0.5407204031944275D, 0.541131317615509D, 0.5416036248207092D, 0.5420829057693481D, 0.5425488948822021D, 0.5430117249488831D, 0.5434421896934509D, 0.54389888048172D, 0.5443391799926758D, 0.5447611212730408D, 0.545224130153656D, 0.545673131942749D, 0.5460936427116394D, 0.5465660691261292D, 0.5470452308654785D, 0.5475273728370667D, 0.5479429960250854D, 0.5484063625335693D, 0.5488631129264832D, 0.5493146181106567D, 0.549760639667511D, 0.5502592921257019D, 0.5507493019104004D, 0.5511957406997681D, 0.5516489744186401D, 0.5521084666252136D, 0.5525751709938049D, 0.5530290603637695D, 0.553477942943573D, 0.5539233684539795D, 0.5544093251228333D, 0.5548952221870422D, 0.5553575158119202D, 0.5558218359947205D, 0.5563178062438965D, 0.5567854642868042D, 0.5572537779808044D, 0.5577130317687988D, 0.5581837296485901D, 0.5586464405059814D, 0.5590561628341675D, 0.559502899646759D, 0.5599905848503113D, 0.5604462623596191D, 0.5608773231506348D, 0.5613529086112976D, 0.5618170499801636D, 0.5622658133506775D, 0.5627509355545044D, 0.5631857514381409D, 0.5636336207389832D, 0.5640740394592285D, 0.5644878149032593D, 0.5649570822715759D, 0.5654452443122864D, 0.5659193992614746D, 0.566391110420227D, 0.5668405294418335D, 0.5673339366912842D, 0.5678455829620361D, 0.5682653188705444D, 0.5687336325645447D, 0.5691594481468201D, 0.5696210861206055D, 0.5700470805168152D, 0.5705402493476868D, 0.5709607005119324D, 0.5714168548583984D, 0.5718520283699036D, 0.57235187292099D, 0.5728260278701782D, 0.5732724070549011D, 0.5737460255622864D, 0.574226438999176D, 0.5747095346450806D, 0.5751391649246216D, 0.5756227374076843D, 0.576072096824646D, 0.5765191316604614D, 0.5769604444503784D, 0.5774073600769043D, 0.5778785347938538D, 0.5783064365386963D, 0.5787573456764221D, 0.5792401432991028D, 0.5796770453453064D, 0.5801228880882263D, 0.580571711063385D, 0.5810607075691223D, 0.5815511345863342D, 0.5820316672325134D, 0.5824490785598755D, 0.5829075574874878D, 0.5833353400230408D, 0.583755612373352D, 0.5841545462608337D, 0.5846143960952759D, 0.5850520730018616D, 0.5855194926261902D, 0.5859699249267578D, 0.5864249467849731D, 0.5868760943412781D, 0.5873154401779175D, 0.5878191590309143D, 0.5882934927940369D, 0.5887097716331482D, 0.5891896486282349D, 0.5895995497703552D, 0.590004563331604D, 0.5904493927955627D, 0.5908958911895752D, 0.5913615226745605D, 0.5917897820472717D, 0.5922753810882568D, 0.5927274823188782D, 0.5931650400161743D, 0.5936287045478821D, 0.5940912365913391D, 0.594519317150116D, 0.5949195623397827D, 0.5953518152236938D, 0.5957903861999512D, 0.5961790680885315D, 0.5966396927833557D, 0.5971011519432068D, 0.5975552201271057D, 0.5979733467102051D, 0.5984484553337097D, 0.5989205837249756D, 0.5993812084197998D, 0.5998334288597107D, 0.6002959609031677D, 0.6007367968559265D, 0.6011759638786316D, 0.6016338467597961D, 0.6020973324775696D, 0.6025475859642029D, 0.6030203700065613D, 0.6034669876098633D, 0.6039260029792786D, 0.6043735146522522D, 0.6048296689987183D, 0.6052897572517395D, 0.6057608723640442D, 0.6062213778495789D, 0.606634259223938D, 0.6071000695228577D, 0.6075388789176941D, 0.6079697012901306D, 0.6084229946136475D, 0.608896791934967D, 0.6093420386314392D, 0.6098447442054749D, 0.6102806925773621D, 0.6107364296913147D, 0.611167311668396D, 0.6116251349449158D, 0.6120520830154419D, 0.6124976277351379D, 0.6129326224327087D, 0.613406777381897D, 0.6138620972633362D, 0.6143354177474976D, 0.6147979497909546D, 0.6152039766311646D, 0.6156638860702515D, 0.6161479353904724D, 0.6165993809700012D, 0.6170254349708557D, 0.6174780130386353D, 0.6178731918334961D, 0.6183233857154846D, 0.6187865734100342D, 0.6192396283149719D, 0.6197004318237305D, 0.6201303601264954D, 0.6205298900604248D, 0.6209881901741028D, 0.6214309930801392D, 0.6218465566635132D, 0.6223141551017761D, 0.622797966003418D, 0.6232821345329285D, 0.6237058043479919D, 0.6241947412490845D, 0.6246213912963867D, 0.6250787377357483D, 0.6255142092704773D, 0.6259811520576477D, 0.6264455914497375D, 0.6269148588180542D, 0.6274139881134033D, 0.6278729438781738D, 0.6283060908317566D, 0.6287518739700317D, 0.6292106509208679D, 0.6296188235282898D, 0.6300769448280334D, 0.6305136680603027D, 0.63094162940979D, 0.6313846707344055D, 0.6318341493606567D, 0.6322691440582275D, 0.63270103931427D, 0.6331589818000793D, 0.6335994601249695D, 0.6340522170066833D, 0.6345309615135193D, 0.6349889039993286D, 0.6354559659957886D, 0.6359289884567261D, 0.6363810896873474D, 0.6368818879127502D, 0.6373507976531982D, 0.6378063559532166D, 0.6382505893707275D, 0.6386348009109497D, 0.6391111016273499D, 0.6395545601844788D, 0.6399886608123779D, 0.6404418349266052D, 0.6408824920654297D, 0.6413149833679199D, 0.6417574882507324D, 0.6421859860420227D, 0.6426514387130737D, 0.6430553793907166D, 0.6434748768806458D, 0.6439327001571655D, 0.6443507075309753D, 0.6448029279708862D, 0.6452566385269165D, 0.6457155346870422D, 0.6461554765701294D, 0.646624743938446D, 0.6471140384674072D, 0.6475616097450256D, 0.6480266451835632D, 0.6484441757202148D, 0.6489031314849854D, 0.6492921113967896D, 0.6497485041618347D, 0.6501544713973999D, 0.6505953669548035D, 0.651073157787323D, 0.6515265703201294D, 0.6519653797149658D, 0.6524019837379456D, 0.6528423428535461D, 0.6533025503158569D, 0.6537554860115051D, 0.6541864275932312D, 0.6545959711074829D, 0.6550230979919434D, 0.6554749608039856D, 0.6558961272239685D, 0.6563379764556885D, 0.6567652225494385D, 0.6571946740150452D, 0.6576496362686157D, 0.6581230163574219D, 0.6585628390312195D, 0.6589741110801697D, 0.6594311594963074D, 0.65990149974823D, 0.6603091955184937D, 0.6607440114021301D, 0.6612043976783752D, 0.6616629362106323D, 0.6620782017707825D, 0.6625047326087952D, 0.6629456281661987D, 0.6633908152580261D, 0.6638535857200623D, 0.664313554763794D, 0.6647982597351074D, 0.6652121543884277D, 0.6656287312507629D, 0.6660541296005249D, 0.666519284248352D, 0.6669577360153198D, 0.667389452457428D, 0.6678563952445984D, 0.6683056950569153D, 0.6687613129615784D, 0.669194221496582D, 0.6696628928184509D, 0.6701160669326782D, 0.6705893874168396D, 0.671051561832428D, 0.6715012192726135D, 0.6719493865966797D, 0.6724033355712891D, 0.6728721857070923D, 0.6733037233352661D, 0.6737868189811707D, 0.6742551326751709D, 0.674736738204956D, 0.6752104759216309D, 0.6756134033203125D, 0.6760555505752563D, 0.6765036582946777D, 0.6769419312477112D, 0.6774052381515503D, 0.6778636574745178D, 0.678312361240387D, 0.6787456274032593D, 0.6792286038398743D, 0.6796970963478088D, 0.6801307201385498D, 0.6806089282035828D, 0.6810600757598877D, 0.6815366148948669D, 0.6819941997528076D, 0.6824822425842285D, 0.6829573512077332D, 0.6834262013435364D, 0.6839010715484619D, 0.6843841075897217D, 0.6848191618919373D, 0.6852960586547852D, 0.6857536435127258D, 0.6862004399299622D, 0.686630368232727D, 0.6870884299278259D, 0.6875705718994141D, 0.6880114674568176D, 0.6884872317314148D, 0.6889537572860718D, 0.6893516778945923D, 0.6898297667503357D, 0.6903215646743774D, 0.6907835602760315D, 0.6912608742713928D, 0.6916805505752563D, 0.6921491622924805D, 0.6926259398460388D, 0.693117082118988D, 0.6935994029045105D, 0.6940702795982361D, 0.6945260167121887D, 0.694933295249939D, 0.6953966617584229D, 0.695817232131958D, 0.6962674260139465D, 0.6967014074325562D, 0.6971595883369446D, 0.6976086497306824D, 0.6980371475219727D, 0.698500394821167D, 0.6989566683769226D, 0.6993935108184814D, 0.699805736541748D, 0.7002291083335876D, 0.7006635665893555D, 0.7011353373527527D, 0.7015767097473145D, 0.7020057439804077D, 0.7024185061454773D, 0.702873170375824D, 0.7033316493034363D, 0.7037590146064758D, 0.7041760683059692D, 0.7046096324920654D, 0.7050333023071289D, 0.705449640750885D, 0.7058889269828796D, 0.7063031196594238D, 0.7067270874977112D, 0.7071360945701599D, 0.7075799703598022D, 0.7080233097076416D, 0.708462119102478D, 0.7088784575462341D, 0.7093037962913513D, 0.7097235918045044D, 0.7101668119430542D, 0.710568904876709D, 0.7110000252723694D, 0.7114360928535461D, 0.7118644118309021D, 0.7122891545295715D, 0.712740421295166D, 0.7131741046905518D, 0.7136558294296265D, 0.714096188545227D, 0.7145424485206604D, 0.7150042057037354D, 0.7154485583305359D, 0.7159069776535034D, 0.7163503766059875D, 0.7168262600898743D, 0.7172953486442566D, 0.7177931666374207D, 0.7182849049568176D, 0.7187356948852539D, 0.7191860675811768D, 0.7196926474571228D, 0.7201302647590637D, 0.7206245064735413D, 0.721052885055542D, 0.7215341925621033D, 0.7220497131347656D, 0.7225143313407898D, 0.7229704260826111D, 0.7234534025192261D, 0.7239010334014893D, 0.7243943810462952D, 0.7248682379722595D, 0.7253683805465698D, 0.7258584499359131D, 0.7263447642326355D, 0.7268060445785522D, 0.727271556854248D, 0.7277473211288452D, 0.7282049059867859D, 0.7286691665649414D, 0.7291152477264404D, 0.7295757532119751D, 0.7300469875335693D, 0.7304925918579102D, 0.7309231758117676D, 0.7313723564147949D, 0.7318642139434814D, 0.7323406934738159D, 0.7328342795372009D, 0.7333183288574219D, 0.7338053584098816D, 0.7342978715896606D, 0.7347720861434937D, 0.735258936882019D, 0.7357116937637329D, 0.7361682653427124D, 0.7366530299186707D, 0.7371487617492676D, 0.7375858426094055D, 0.7380438446998596D, 0.7385260462760925D, 0.7389861345291138D, 0.7394406795501709D, 0.7399086356163025D, 0.7403405904769897D, 0.7408083081245422D, 0.7412325739860535D, 0.7416885495185852D, 0.7421688437461853D, 0.7426281571388245D, 0.7430750727653503D, 0.7435256242752075D, 0.7439917325973511D, 0.7444330453872681D, 0.7448722124099731D, 0.7452989816665649D, 0.7457219362258911D, 0.7461889982223511D, 0.7466121315956116D, 0.7470548748970032D, 0.7475171685218811D, 0.7479655742645264D, 0.7484027743339539D, 0.7488356828689575D, 0.7493087649345398D, 0.7497596144676208D, 0.7502181529998779D, 0.7506919503211975D, 0.751112699508667D, 0.7515501976013184D, 0.7520002126693726D, 0.7524545788764954D, 0.752912700176239D, 0.7533755302429199D, 0.7538471221923828D, 0.7542758584022522D, 0.7547116279602051D, 0.7551352381706238D, 0.7555804252624512D, 0.7560284733772278D, 0.7564794421195984D, 0.7569202184677124D, 0.7573555111885071D, 0.7578279376029968D, 0.7582671046257019D, 0.7587181925773621D, 0.7591692805290222D, 0.7595980763435364D, 0.760042130947113D, 0.7604596614837646D, 0.7608898282051086D, 0.7613398432731628D, 0.7617748975753784D, 0.7622143626213074D, 0.762671947479248D, 0.7631086707115173D, 0.7635783553123474D, 0.764057993888855D, 0.7645062208175659D, 0.7649529576301575D, 0.7654212713241577D, 0.765864372253418D, 0.7662825584411621D, 0.766756534576416D, 0.7671942114830017D, 0.7676814794540405D, 0.7680966854095459D, 0.7685232758522034D, 0.7689768671989441D, 0.7694152593612671D, 0.7698799967765808D, 0.7703273296356201D, 0.7707749009132385D, 0.7712304592132568D, 0.7716863751411438D, 0.7721555829048157D, 0.7726178765296936D, 0.7730773091316223D, 0.7735387086868286D, 0.77399080991745D, 0.7744596600532532D, 0.7749037146568298D, 0.7753519415855408D, 0.7757992744445801D, 0.7762538194656372D, 0.7767177820205688D, 0.7771676182746887D, 0.7776274681091309D, 0.7780811786651611D, 0.7785055637359619D, 0.778935968875885D, 0.7793811559677124D, 0.7798669338226318D, 0.7803198099136353D, 0.7807332277297974D, 0.7811895608901978D, 0.7816259860992432D, 0.7821038961410522D, 0.7825713157653809D, 0.7830300331115723D, 0.7834687829017639D, 0.7839145064353943D, 0.7843395471572876D, 0.7847908735275269D, 0.7852175235748291D, 0.7856557965278625D, 0.7861036658287048D, 0.7865192890167236D, 0.7869370579719543D, 0.7874005436897278D, 0.7878574728965759D, 0.7883076667785645D, 0.7887727618217468D, 0.7891872525215149D, 0.7896168231964111D, 0.7900912165641785D, 0.7905020713806152D, 0.7909590005874634D, 0.7913734912872314D, 0.7918078303337097D, 0.7922688722610474D, 0.792708158493042D, 0.7931526899337769D, 0.7935686707496643D, 0.7939856648445129D, 0.7944181561470032D, 0.7948570847511292D, 0.7952694892883301D, 0.7957113981246948D, 0.7961326837539673D, 0.7965633869171143D, 0.7970308065414429D, 0.7974699139595032D, 0.7978954315185547D, 0.798319399356842D, 0.798710286617279D, 0.799150288105011D, 0.799579918384552D, 0.8000137805938721D, 0.8004805445671082D, 0.8009114861488342D, 0.8013453483581543D, 0.8017767667770386D, 0.8022176027297974D, 0.8026309013366699D, 0.8030619621276855D, 0.8034893274307251D, 0.8039072751998901D, 0.8043564558029175D, 0.804783284664154D, 0.805206298828125D, 0.8056594729423523D, 0.8061367273330688D, 0.806596040725708D, 0.8070647716522217D, 0.8075343370437622D, 0.8080013394355774D, 0.8084481954574585D, 0.8088930249214172D, 0.8093382120132446D, 0.8098229169845581D, 0.8102787137031555D, 0.810730516910553D, 0.811210036277771D, 0.8116769790649414D, 0.812152624130249D, 0.8126338124275208D, 0.813092052936554D, 0.8135685324668884D, 0.8140095472335815D, 0.81447833776474D, 0.8149551749229431D, 0.8154143691062927D, 0.8158760666847229D, 0.8163301348686218D, 0.8167980313301086D, 0.817247211933136D, 0.8176859021186829D, 0.818127453327179D, 0.8185797333717346D, 0.8190116286277771D, 0.8194664716720581D, 0.8199171423912048D, 0.820368766784668D, 0.820813000202179D, 0.8212815523147583D, 0.8217201232910156D, 0.8221539855003357D, 0.822625458240509D, 0.8230755925178528D, 0.8235254287719727D, 0.823959469795227D, 0.8244135975837708D, 0.8248838186264038D, 0.8253191113471985D, 0.8257774114608765D, 0.82623690366745D, 0.8267050981521606D, 0.8271421194076538D, 0.8275777101516724D, 0.8280438184738159D, 0.828515350818634D, 0.8289567232131958D, 0.8294112086296082D, 0.8298828601837158D, 0.8303140997886658D, 0.8307706713676453D, 0.83122318983078D, 0.8316763639450073D, 0.8321682214736938D, 0.8326238393783569D, 0.8331080675125122D, 0.8335604071617126D, 0.8340092301368713D, 0.834452748298645D, 0.8349207639694214D, 0.8353868722915649D, 0.835853636264801D, 0.8363184332847595D, 0.8368146419525146D, 0.8372671604156494D, 0.8377043008804321D, 0.8381913900375366D, 0.8386459946632385D, 0.8391138911247253D, 0.8395722508430481D, 0.8400129675865173D, 0.8404837250709534D, 0.8409408330917358D, 0.8414034247398376D, 0.8418894410133362D, 0.8423717021942139D, 0.842841625213623D, 0.8433132171630859D, 0.8437666296958923D, 0.8442238569259644D, 0.8446865677833557D, 0.8451375961303711D, 0.8456094861030579D, 0.84608393907547D, 0.8465566635131836D, 0.8470044732093811D, 0.8474630117416382D, 0.8479244112968445D, 0.8483870625495911D, 0.8488436341285706D, 0.8492886424064636D, 0.8497526049613953D, 0.8502447009086609D, 0.8507117629051208D, 0.8511672616004944D, 0.8516263961791992D, 0.8520602583885193D, 0.8525027632713318D, 0.852948784828186D, 0.8534206748008728D, 0.8538854718208313D, 0.8543459177017212D, 0.8548005819320679D, 0.8552507162094116D, 0.8557122349739075D, 0.856152355670929D, 0.8566517233848572D, 0.8570873141288757D, 0.8575365543365479D, 0.857970654964447D, 0.8584120273590088D, 0.858855664730072D, 0.8592962622642517D, 0.8597331047058105D, 0.8601778149604797D, 0.8606115579605103D, 0.8610638380050659D, 0.8615244626998901D, 0.861991286277771D, 0.8624619841575623D, 0.862913191318512D, 0.8633754849433899D, 0.8638368844985962D, 0.8642979860305786D, 0.8647482395172119D, 0.8652056455612183D, 0.8656649589538574D, 0.866115927696228D, 0.8665704131126404D, 0.8670414090156555D, 0.8674944639205933D, 0.8679722547531128D, 0.8684281706809998D, 0.8689029216766357D, 0.86937415599823D, 0.8698508143424988D, 0.870283842086792D, 0.8707519769668579D, 0.8712092041969299D, 0.8716691732406616D, 0.8721535801887512D, 0.8726065158843994D, 0.8730449676513672D, 0.8734990954399109D, 0.8739246726036072D, 0.874381422996521D, 0.8748207092285156D, 0.875253438949585D, 0.875724196434021D, 0.876218318939209D, 0.8766701817512512D, 0.8771216869354248D, 0.8775990009307861D, 0.8780642747879028D, 0.8785414099693298D, 0.8790207505226135D, 0.8794875144958496D, 0.8799788355827332D, 0.880420446395874D, 0.880905270576477D, 0.881375253200531D, 0.8818048238754272D, 0.8822588920593262D, 0.8827162384986877D, 0.8831582069396973D, 0.8836075663566589D, 0.8840537667274475D, 0.8845331072807312D, 0.8850046992301941D, 0.8854608535766602D, 0.8858955502510071D, 0.8863389492034912D, 0.8867753744125366D, 0.8872137069702148D, 0.887676477432251D, 0.8881357908248901D, 0.8885685205459595D, 0.889004111289978D, 0.8894510865211487D, 0.8899015784263611D, 0.8903590440750122D, 0.890826940536499D, 0.8913052082061768D, 0.8918041586875916D, 0.8922762870788574D, 0.8927425742149353D, 0.8931938409805298D, 0.8936666250228882D, 0.894100546836853D, 0.894587516784668D, 0.8950610756874084D, 0.8955479264259338D, 0.8960167765617371D, 0.8965259790420532D, 0.896999716758728D, 0.8974786400794983D, 0.8979550004005432D, 0.8984525203704834D, 0.8989295959472656D, 0.8994243144989014D, 0.899922251701355D, 0.9004544615745544D, 0.900951087474823D, 0.9014334678649902D, 0.9019694924354553D, 0.9024796485900879D, 0.9030163288116455D, 0.9035549163818359D, 0.9041017293930054D, 0.9046435356140137D, 0.9052310585975647D, 0.905797004699707D, 0.9064053893089294D, 0.9070045351982117D, 0.9076210260391235D, 0.9082058668136597D, 0.908807635307312D, 0.9094119071960449D, 0.9100490212440491D, 0.9107301831245422D, 0.9113752245903015D, 0.9120429754257202D, 0.912749707698822D, 0.9134305119514465D, 0.9141203165054321D, 0.9147968888282776D, 0.9155049920082092D, 0.9162451028823853D, 0.9169884324073792D, 0.9177526235580444D, 0.9185255765914917D, 0.9192798137664795D, 0.9200562834739685D, 0.9208371639251709D, 0.9216248989105225D, 0.9224410653114319D, 0.9232978820800781D, 0.9241725206375122D, 0.9250988960266113D, 0.9260335564613342D, 0.9269416928291321D, 0.9278931617736816D, 0.9288076758384705D, 0.9297255873680115D, 0.9306380152702332D, 0.9316264986991882D, 0.9326559901237488D, 0.9336634874343872D, 0.9347042441368103D, 0.9357998967170715D, 0.9368151426315308D, 0.9378435015678406D, 0.9390134215354919D, 0.9402108788490295D, 0.9414093494415283D, 0.9425628185272217D, 0.9438204169273376D, 0.9450675249099731D, 0.9462559223175049D, 0.9474560022354126D, 0.9487866759300232D, 0.9501336812973022D, 0.9516785144805908D, 0.9532408714294434D, 0.9547208547592163D, 0.9561983942985535D, 0.9577432870864868D, 0.9593563675880432D, 0.9611396789550781D, 0.9630594849586487D, 0.9652234315872192D, 0.9678966403007507D, 0.9710233807563782D, 0.9745553135871887D, 0.9781689047813416D, 0.981545090675354D, 0.9869863986968994D, 0.9941355586051941D, 0.9998435378074646D}; - /** - * Normalize a double d to a value from zero to num.
- * This assumes that the value d was generated by a FastNoiseLite instance using SimplexFractal noise type with 4 Octaves. - * - * @param d The value to be normalized. - * @param num The maximum value. - * @return The normalized value. - */ - public static int normalize(double d, int num, int octaves) { - int start = 0; - double[] normalMap; - switch(octaves) { - case 1: - normalMap = normalMap1; - break; - case 4: - normalMap = normalMap4; - break; - default: throw new IllegalArgumentException("Illegal octave amount: " + octaves); - } - - int end = normalMap.length - 1; - while(start + 1 < end) { - int mid = start + (end - start) / 2; - if(normalMap[mid] <= d) { - start = mid; - } else { - end = mid; - } - } - double left = FastMath.abs(normalMap[start] - d); - double right = FastMath.abs(normalMap[end] - d); - if(left <= right) { - return start * (num) / (normalMap.length); - } - return end * (num) / (normalMap.length); - } -} diff --git a/common/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java b/common/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java index 4d3124ed3..c06ab9ceb 100644 --- a/common/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java +++ b/common/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java @@ -4,8 +4,7 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.api.world.generation.GenerationPhase; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; +import com.dfsek.terra.biome.BiomeProvider; import org.jetbrains.annotations.NotNull; import java.util.function.Consumer; @@ -15,8 +14,8 @@ import java.util.function.Consumer; */ public class AsyncBiomeFinder extends AsyncFeatureFinder { - public AsyncBiomeFinder(TerraBiomeGrid grid, TerraBiome target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, TerraPlugin main) { - super(grid, target, origin, startRadius, maxRadius, callback, main); + public AsyncBiomeFinder(BiomeProvider provider, TerraBiome target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, TerraPlugin main) { + super(provider, target, origin, startRadius, maxRadius, callback, main); } /** @@ -29,7 +28,7 @@ public class AsyncBiomeFinder extends AsyncFeatureFinder { @Override public boolean isValid(int x, int z, TerraBiome target) { int res = main.getTerraConfig().getBiomeSearchResolution(); - return getGrid().getBiome(x * res, z * res, GenerationPhase.POST_GEN).equals(target); + return getProvider().getBiome(x * res, z * res).equals(target); } @Override diff --git a/common/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java b/common/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java index c3c9f7941..374a8e6c6 100644 --- a/common/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java +++ b/common/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java @@ -4,13 +4,13 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; +import com.dfsek.terra.biome.BiomeProvider; import org.jetbrains.annotations.NotNull; import java.util.function.Consumer; public abstract class AsyncFeatureFinder implements Runnable { - protected final TerraBiomeGrid grid; + protected final BiomeProvider provider; protected final T target; protected final int startRadius; protected final int maxRadius; @@ -21,8 +21,8 @@ public abstract class AsyncFeatureFinder implements Runnable { protected int searchSize = 1; protected final TerraPlugin main; - public AsyncFeatureFinder(TerraBiomeGrid grid, T target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, TerraPlugin main) { - this.grid = grid; + public AsyncFeatureFinder(BiomeProvider provider, T target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, TerraPlugin main) { + this.provider = provider; this.target = target; this.main = main; this.startRadius = startRadius; @@ -83,8 +83,8 @@ public abstract class AsyncFeatureFinder implements Runnable { return world; } - public TerraBiomeGrid getGrid() { - return grid; + public BiomeProvider getProvider() { + return provider; } public int getSearchSize() { diff --git a/common/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java b/common/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java index 74fc0418a..fc2e3ee6a 100644 --- a/common/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java +++ b/common/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java @@ -6,8 +6,8 @@ import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.util.FastRandom; +import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.population.items.TerraStructure; import net.jafama.FastMath; import org.jetbrains.annotations.NotNull; @@ -16,8 +16,8 @@ import java.util.Random; import java.util.function.Consumer; public class AsyncStructureFinder extends AsyncFeatureFinder { - public AsyncStructureFinder(TerraBiomeGrid grid, TerraStructure target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, TerraPlugin main) { - super(grid, target, origin, startRadius, maxRadius, callback, main); + public AsyncStructureFinder(BiomeProvider provider, TerraStructure target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, TerraPlugin main) { + super(provider, target, origin, startRadius, maxRadius, callback, main); setSearchSize(target.getSpawn().getWidth() + 2 * target.getSpawn().getSeparation()); } @@ -29,7 +29,7 @@ public class AsyncStructureFinder extends AsyncFeatureFinder { @Override public boolean isValid(int x, int z, TerraStructure target) { Location spawn = target.getSpawn().getChunkSpawn(x, z, world.getSeed()).toLocation(world); - if(!((UserDefinedBiome) grid.getBiome(spawn)).getConfig().getStructures().contains(target)) return false; + if(!((UserDefinedBiome) provider.getBiome(spawn)).getConfig().getStructures().contains(target)) return false; Random random = new FastRandom(MathUtil.getCarverChunkSeed(FastMath.floorDiv(spawn.getBlockX(), 16), FastMath.floorDiv(spawn.getBlockZ(), 16), world.getSeed())); return target.getStructure().get(random).test(spawn.setY(target.getSpawnStart().get(random)), random, Rotation.fromDegrees(90 * random.nextInt(4))); } diff --git a/common/src/main/java/com/dfsek/terra/biome/BiomeProvider.java b/common/src/main/java/com/dfsek/terra/biome/BiomeProvider.java new file mode 100644 index 000000000..12f899651 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/biome/BiomeProvider.java @@ -0,0 +1,26 @@ +package com.dfsek.terra.biome; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector2; +import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.world.biome.TerraBiome; + +public interface BiomeProvider { + TerraBiome getBiome(int x, int z); + + default TerraBiome getBiome(Vector2 vector2) { + return getBiome(vector2.getBlockX(), vector2.getBlockZ()); + } + + default TerraBiome getBiome(Vector3 vector3) { + return getBiome(vector3.getBlockX(), vector3.getBlockZ()); + } + + default TerraBiome getBiome(Location location) { + return getBiome(location.getBlockX(), location.getBlockZ()); + } + + interface BiomeProviderBuilder { + BiomeProvider build(long seed); + } +} diff --git a/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java b/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java deleted file mode 100644 index 294dc0b66..000000000 --- a/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.dfsek.terra.biome; - -import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite; -import com.dfsek.terra.api.world.biome.BiomeGrid; -import com.dfsek.terra.api.world.biome.NormalizationUtil; -import com.dfsek.terra.config.base.ConfigPack; -import com.dfsek.terra.config.base.ConfigPackTemplate; -import com.dfsek.terra.image.ImageLoader; -import org.jetbrains.annotations.Nullable; - -import java.util.Objects; - -/** - * Holds 1D array of BiomeGrids. - */ -public class BiomeZone { - private final BiomeGrid[] grids; - private final FastNoiseLite noise; - @Nullable - private final ImageLoader imageLoader; - private final boolean useImage; - private final ImageLoader.Channel channel; - - public BiomeZone(long seed, ConfigPack wc, BiomeGrid[] grids) { - this.noise = new FastNoiseLite((int) seed + 2); - this.noise.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2); - this.noise.setFractalType(FastNoiseLite.FractalType.FBm); - this.noise.setFractalOctaves(4); - ConfigPackTemplate t = wc.getTemplate(); - this.noise.setFrequency(1D / (t.getZoneFreq() * grids.length)); - this.grids = grids; - imageLoader = t.getImageLoader(); - useImage = t.isFromImage(); - channel = t.getZoneChannel(); - } - - /** - * Get BiomeGrid at location - * - * @param x X coordinate - * @param z Z coordinate - * @return BiomeGrid at coordinates. - */ - public BiomeGrid getGrid(int x, int z) { - return grids[getNoise(x, z)]; - } - - /** - * Get the number of BiomeGrids this BiomeZone holds. - * - * @return Number of grids - */ - public int getSize() { - return grids.length; - } - - /** - * Get the normalized grid noise at location - * - * @param x X coordinate - * @param z Z coordinate - * @return Normalized noise at coordinates - */ - public int getNoise(int x, int z) { - return useImage ? Objects.requireNonNull(imageLoader).getNoiseVal(x, z, getSize() - 1, channel) : NormalizationUtil.normalize(noise.getNoise(x, z), grids.length, 4); - } - - /** - * Get raw grid noise at location - * - * @param x X coordinate - * @param z Z coordinate - * @return Raw noise at coordinates - */ - public double getRawNoise(int x, int z) { - return useImage ? Objects.requireNonNull(imageLoader).getNoiseVal(x, z, getSize() - 1, channel) : noise.getNoise(x, z); - } -} diff --git a/common/src/main/java/com/dfsek/terra/biome/StandardBiomeProvider.java b/common/src/main/java/com/dfsek/terra/biome/StandardBiomeProvider.java new file mode 100644 index 000000000..dbddf6360 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/biome/StandardBiomeProvider.java @@ -0,0 +1,65 @@ +package com.dfsek.terra.biome; + +import com.dfsek.terra.api.math.vector.Vector2; +import com.dfsek.terra.api.world.biome.TerraBiome; +import com.dfsek.terra.biome.pipeline.BiomeHolder; +import com.dfsek.terra.biome.pipeline.BiomePipeline; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import net.jafama.FastMath; +import org.jetbrains.annotations.NotNull; + +import java.util.concurrent.ExecutionException; +import java.util.function.Function; + +public class StandardBiomeProvider implements BiomeProvider { + private final BiomePipeline pipeline; + private final LoadingCache cache = CacheBuilder.newBuilder() + .maximumSize(1024) + .build( + new CacheLoader() { + @Override + public BiomeHolder load(@NotNull Vector2 key) { + return pipeline.getBiomes(key.getBlockX(), key.getBlockZ()); + } + } + ); + private int resolution = 4; + + protected StandardBiomeProvider(BiomePipeline pipeline) { + this.pipeline = pipeline; + } + + @Override + public TerraBiome getBiome(int x, int z) { + x /= resolution; + z /= resolution; + try { + return cache.get(new Vector2(FastMath.floorDiv(x, pipeline.getSize()), FastMath.floorDiv(z, pipeline.getSize()))).getBiome(FastMath.floorMod(x, pipeline.getSize()), FastMath.floorMod(z, pipeline.getSize())); + } catch(ExecutionException e) { + throw new RuntimeException(e); + } + } + + public int getResolution() { + return resolution; + } + + public void setResolution(int resolution) { + this.resolution = resolution; + } + + public static final class StandardBiomeProviderBuilder implements BiomeProviderBuilder { + private final Function pipelineBuilder; + + public StandardBiomeProviderBuilder(Function pipelineBuilder) { + this.pipelineBuilder = pipelineBuilder; + } + + @Override + public StandardBiomeProvider build(long seed) { + return new StandardBiomeProvider(pipelineBuilder.apply(seed)); + } + } +} diff --git a/common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java b/common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java index 2dc406ea1..0caa9a9ed 100644 --- a/common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java +++ b/common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java @@ -7,6 +7,7 @@ import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.builder.GeneratorBuilder; import com.dfsek.terra.config.templates.BiomeTemplate; +import java.util.HashSet; import java.util.Set; /** @@ -30,7 +31,7 @@ public class UserDefinedBiome implements TerraBiome { this.config = config; this.pack = pack; this.color = config.getColor(); - this.tags = config.getTags(); + this.tags = config.getTags() == null ? new HashSet<>() : config.getTags(); tags.add("BIOME:" + id); } diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java deleted file mode 100644 index 39ecf5b2f..000000000 --- a/common/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.dfsek.terra.biome.grid; - -import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.world.biome.BiomeGrid; -import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.api.world.generation.GenerationPhase; - -/** - * BiomeGrid implementation that holds a single biome. - */ -public class SingleBiomeGrid extends BiomeGrid { - private final TerraBiome biome; - - public SingleBiomeGrid(long seed, TerraBiome biome) { - super(seed, 0, 0, 1, 1); - this.biome = biome; - } - - @Override - public TerraBiome getBiome(int x, int z, GenerationPhase phase) { - return biome; - } - - @Override - public TerraBiome getBiome(Location l) { - return biome; - } -} diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java deleted file mode 100644 index 806b54f01..000000000 --- a/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.dfsek.terra.biome.grid; - -import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.world.biome.BiomeGrid; -import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.api.world.generation.GenerationPhase; -import com.dfsek.terra.config.base.ConfigPack; -import com.dfsek.terra.config.base.ConfigPackTemplate; -import com.dfsek.terra.image.ImageLoader; - -public class UserDefinedGrid extends BiomeGrid { - private final ImageLoader imageLoader; - private final boolean fromImage; - private final ImageLoader.Channel channelX; - private final ImageLoader.Channel channelZ; - - public UserDefinedGrid(long seed, double freq1, double freq2, TerraBiome[][] b, ConfigPack c) { - super(seed, freq1, freq2, b.length, b[0].length); - super.setGrid(b); - ConfigPackTemplate t = c.getTemplate(); - imageLoader = t.getImageLoader(); - fromImage = t.isFromImage(); - channelX = t.getBiomeXChannel(); - channelZ = t.getBiomeZChannel(); - } - - @Override - public TerraBiome getBiome(int x, int z, GenerationPhase phase) { - if(fromImage) { - int xi = imageLoader.getNoiseVal(x, z, getSizeX() - 1, channelX); - int zi = imageLoader.getNoiseVal(x, z, getSizeZ() - 1, channelZ); - return super.getGrid()[xi][zi]; - } - return super.getBiome(x, z, phase); - } - - @Override - public TerraBiome getBiome(Location l, GenerationPhase phase) { - return this.getBiome(l.getBlockX(), l.getBlockZ(), phase); - } -} diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java deleted file mode 100644 index 15ead5273..000000000 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.dfsek.terra.biome.grid.master; - -import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.world.biome.BiomeGrid; -import com.dfsek.terra.biome.BiomeZone; -import com.dfsek.terra.config.base.ConfigPack; -import com.dfsek.terra.config.base.ConfigPackTemplate; -import com.dfsek.terra.config.builder.biomegrid.BiomeGridBuilder; -import com.dfsek.terra.debug.Debug; - -public abstract class TerraBiomeGrid extends BiomeGrid { - protected final BiomeZone zone; - - public TerraBiomeGrid(long seed, int sizeX, int sizeZ, BiomeZone zone) { - super(seed, 0, 0, sizeX, sizeZ); - this.zone = zone; - } - - public BiomeZone getZone() { - return zone; - } - - public abstract BiomeGrid getGrid(int x, int z); - - public enum Type { - RADIAL, STANDARD - } - - public abstract boolean isEroded(int x, int z); - - public static final class TerraBiomeGridBuilder { - private final long seed; - private final ConfigPack config; - private final TerraPlugin main; - - public TerraBiomeGridBuilder(long seed, ConfigPack config, TerraPlugin main) { - this.seed = seed; - this.config = config; - this.main = main; - } - - public TerraBiomeGrid build() { - ConfigPackTemplate template = config.getTemplate(); - - int zoneSize = template.getGrids().size(); - - BiomeGrid[] definedGrids = new BiomeGrid[zoneSize]; - for(int i = 0; i < zoneSize; i++) { - String partName = template.getGrids().get(i); - try { - BiomeGridBuilder g = config.getBiomeGrid(partName); - BiomeGrid b = g.build(seed, config); - definedGrids[i] = b; - } catch(NullPointerException e) { - Debug.stack(e); - main.getLogger().severe("No such BiomeGrid " + partName); - main.getLogger().severe("Please check configuration files for errors. Configuration errors will have been reported during initialization."); - main.getLogger().severe("ONLY report this to Terra if you are SURE your config is error-free."); - main.getLogger().severe("Terrain will NOT generate properly at this point. Correct your config before using your server!"); - } - } - BiomeZone zone = new BiomeZone(seed, config, definedGrids); - - if(template.getGridType().equals(TerraBiomeGrid.Type.RADIAL)) { - BiomeGrid internal = config.getBiomeGrid(template.getRadialInternalGrid()).build(seed, config); - return new TerraRadialBiomeGrid(seed, zone, config, template.getRadialGridRadius(), internal); - } else return new TerraStandardBiomeGrid(seed, zone, config); - } - } -} diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java deleted file mode 100644 index 0ed49873c..000000000 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.dfsek.terra.biome.grid.master; - -import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.math.vector.Vector2; -import com.dfsek.terra.api.world.biome.BiomeGrid; -import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.api.world.generation.GenerationPhase; -import com.dfsek.terra.biome.BiomeZone; -import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.biome.postprocessing.CoordinatePerturb; -import com.dfsek.terra.biome.postprocessing.ErosionNoise; -import com.dfsek.terra.config.base.ConfigPack; -import com.dfsek.terra.config.base.ConfigPackTemplate; -import net.jafama.FastMath; - -public class TerraRadialBiomeGrid extends TerraBiomeGrid { - private final double radiusSq; - private final BiomeGrid internal; - private CoordinatePerturb perturb; - private ErosionNoise erode; - - public TerraRadialBiomeGrid(long seed, BiomeZone zone, ConfigPack c, double radius, BiomeGrid internal) { - super(seed, 0, 0, zone); - ConfigPackTemplate t = c.getTemplate(); - if(c.getTemplate().isBlend()) { - perturb = new CoordinatePerturb(t.getBlendFreq(), t.getBlendAmp(), seed); - } - if(c.getTemplate().isErode()) { - erode = new ErosionNoise(t.getErodeFreq(), t.getErodeThresh(), t.getErodeOctaves(), seed); - } - this.radiusSq = FastMath.pow2(radius); - this.internal = internal; - } - - @Override - public BiomeGrid getGrid(int x, int z) { - return zone.getGrid(x, z); - } - - @Override - public boolean isEroded(int x, int z) { - return erode != null && erode.isEroded(x, z); - } - - @Override - public TerraBiome getBiome(int x, int z, GenerationPhase phase) { - int xp = x, zp = z; - if(perturb != null && (phase.equals(GenerationPhase.PALETTE_APPLY) || phase.equals(GenerationPhase.POPULATE))) { - Vector2 perturbCoords = perturb.getShiftedCoords(x, z); - xp = (int) perturbCoords.getX(); - zp = (int) perturbCoords.getZ(); - } - - UserDefinedBiome b; - if(x * x + z * z > radiusSq) { - b = (UserDefinedBiome) zone.getGrid(xp, zp).getBiome(xp, zp, phase); - } else { - b = (UserDefinedBiome) internal.getBiome(xp, zp, phase); - } - if(isEroded(xp, zp)) return b.getErode(); - return b; - } - - @Override - public TerraBiome getBiome(Location l, GenerationPhase phase) { - return getBiome(l.getBlockX(), l.getBlockZ(), phase); - } -} diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java deleted file mode 100644 index d59df5d0d..000000000 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.dfsek.terra.biome.grid.master; - -import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.math.vector.Vector2; -import com.dfsek.terra.api.world.biome.BiomeGrid; -import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.api.world.generation.GenerationPhase; -import com.dfsek.terra.biome.BiomeZone; -import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.biome.postprocessing.CoordinatePerturb; -import com.dfsek.terra.biome.postprocessing.ErosionNoise; -import com.dfsek.terra.config.base.ConfigPack; -import com.dfsek.terra.config.base.ConfigPackTemplate; - -public class TerraStandardBiomeGrid extends TerraBiomeGrid { - private CoordinatePerturb perturb; - private ErosionNoise erode; - - public TerraStandardBiomeGrid(long seed, BiomeZone zone, ConfigPack c) { - super(seed, 0, 0, zone); - ConfigPackTemplate t = c.getTemplate(); - if(c.getTemplate().isBlend()) { - perturb = new CoordinatePerturb(t.getBlendFreq(), t.getBlendAmp(), seed); - } - if(c.getTemplate().isErode()) { - erode = new ErosionNoise(t.getErodeFreq(), t.getErodeThresh(), t.getErodeOctaves(), seed); - } - } - - @Override - public BiomeGrid getGrid(int x, int z) { - return zone.getGrid(x, z); - } - - @Override - public boolean isEroded(int x, int z) { - return erode != null && erode.isEroded(x, z); - } - - @Override - public TerraBiome getBiome(int x, int z, GenerationPhase phase) { - int xp = x, zp = z; - if(perturb != null && (phase.equals(GenerationPhase.PALETTE_APPLY) || phase.equals(GenerationPhase.POPULATE))) { - Vector2 perturbCoords = perturb.getShiftedCoords(x, z); - xp = (int) perturbCoords.getX(); - zp = (int) perturbCoords.getZ(); - } - - UserDefinedBiome b = (UserDefinedBiome) zone.getGrid(xp, zp).getBiome(xp, zp, phase); - if(isEroded(xp, zp)) return b.getErode(); - return b; - } - - - @Override - public TerraBiome getBiome(Location l, GenerationPhase phase) { - return getBiome(l.getBlockX(), l.getBlockZ(), phase); - } -} diff --git a/common/src/main/java/com/dfsek/terra/biome/pipeline/TerraBiomeHolder.java b/common/src/main/java/com/dfsek/terra/biome/pipeline/TerraBiomeHolder.java index eb3afa535..f49957b1c 100644 --- a/common/src/main/java/com/dfsek/terra/biome/pipeline/TerraBiomeHolder.java +++ b/common/src/main/java/com/dfsek/terra/biome/pipeline/TerraBiomeHolder.java @@ -30,8 +30,6 @@ public class TerraBiomeHolder implements BiomeHolder { biomes = new TerraBiome[newWidth][newWidth]; - System.out.println(biomes.length); - for(int x = 0; x < width; x++) { for(int z = 0; z < width; z++) { biomes[x * 2][z * 2] = old[x][z]; diff --git a/common/src/main/java/com/dfsek/terra/carving/CarverCache.java b/common/src/main/java/com/dfsek/terra/carving/CarverCache.java index 4fbd4a7f9..af0fab63a 100644 --- a/common/src/main/java/com/dfsek/terra/carving/CarverCache.java +++ b/common/src/main/java/com/dfsek/terra/carving/CarverCache.java @@ -8,9 +8,8 @@ import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.util.GlueList; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.carving.Worm; -import com.dfsek.terra.api.world.generation.GenerationPhase; +import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import java.util.Collections; import java.util.LinkedHashMap; @@ -38,7 +37,7 @@ public class CarverCache { public List getPoints(int chunkX, int chunkZ, UserDefinedCarver carver) { synchronized(carvers) { return carvers.computeIfAbsent(MathUtil.squash(chunkX, chunkZ), key -> { - TerraBiomeGrid grid = main.getWorld(w).getGrid(); + BiomeProvider provider = main.getWorld(w).getBiomeProvider(); if(carver.isChunkCarved(w, chunkX, chunkZ, new FastRandom(MathUtil.getCarverChunkSeed(chunkX, chunkZ, w.getSeed() + carver.hashCode())))) { long seed = MathUtil.getCarverChunkSeed(chunkX, chunkZ, w.getSeed()); carver.getSeedVar().setValue(seed); @@ -47,7 +46,7 @@ public class CarverCache { List points = new GlueList<>(); for(int i = 0; i < carving.getLength(); i++) { carving.step(); - TerraBiome biome = grid.getBiome(carving.getRunning().toLocation(w), GenerationPhase.POPULATE); + TerraBiome biome = provider.getBiome(carving.getRunning().toLocation(w)); if(!((UserDefinedBiome) biome).getConfig().getCarvers().containsKey(carver)) { // Stop if we enter a biome this carver is not present in return new GlueList<>(); } diff --git a/common/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java b/common/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java index 0f6e6c840..d81281ed7 100644 --- a/common/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java +++ b/common/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java @@ -8,7 +8,6 @@ import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.world.carving.Carver; import com.dfsek.terra.api.world.carving.Worm; -import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.config.templates.CarverTemplate; @@ -121,7 +120,7 @@ public class UserDefinedCarver extends Carver { @Override public boolean isChunkCarved(World w, int chunkX, int chunkZ, Random random) { - BiomeTemplate conf = ((UserDefinedBiome) main.getWorld(w).getGrid().getBiome((chunkX << 4) + 8, (chunkZ << 4) + 8, GenerationPhase.POPULATE)).getConfig(); + BiomeTemplate conf = ((UserDefinedBiome) main.getWorld(w).getBiomeProvider().getBiome((chunkX << 4) + 8, (chunkZ << 4) + 8)).getConfig(); if(conf.getCarvers().get(this) != null) { return new FastRandom(random.nextLong() + hash).nextInt(100) < conf.getCarvers().get(this); } diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index 94ea818c2..9118ee389 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -13,13 +13,11 @@ import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.tree.Tree; +import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.carving.UserDefinedCarver; -import com.dfsek.terra.config.builder.biomegrid.BiomeGridBuilder; import com.dfsek.terra.config.exception.FileMissingException; import com.dfsek.terra.config.factories.BiomeFactory; -import com.dfsek.terra.config.factories.BiomeGridFactory; import com.dfsek.terra.config.factories.CarverFactory; import com.dfsek.terra.config.factories.FloraFactory; import com.dfsek.terra.config.factories.OreFactory; @@ -31,8 +29,8 @@ import com.dfsek.terra.config.files.FolderLoader; import com.dfsek.terra.config.files.Loader; import com.dfsek.terra.config.files.ZIPLoader; import com.dfsek.terra.config.lang.LangUtil; +import com.dfsek.terra.config.loaders.config.BiomeProviderBuilderLoader; import com.dfsek.terra.config.templates.AbstractableTemplate; -import com.dfsek.terra.config.templates.BiomeGridTemplate; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.config.templates.CarverTemplate; import com.dfsek.terra.config.templates.FloraTemplate; @@ -43,7 +41,6 @@ import com.dfsek.terra.config.templates.TreeTemplate; import com.dfsek.terra.generation.math.SamplerCache; import com.dfsek.terra.population.items.TerraStructure; import com.dfsek.terra.population.items.ores.Ore; -import com.dfsek.terra.registry.BiomeGridRegistry; import com.dfsek.terra.registry.BiomeRegistry; import com.dfsek.terra.registry.CarverRegistry; import com.dfsek.terra.registry.FloraRegistry; @@ -82,7 +79,6 @@ public class ConfigPack implements LoaderRegistrar { private final ConfigPackTemplate template = new ConfigPackTemplate(); private final BiomeRegistry biomeRegistry = new BiomeRegistry(); - private final BiomeGridRegistry biomeGridRegistry = new BiomeGridRegistry(biomeRegistry); private final StructureRegistry structureRegistry = new StructureRegistry(); private final CarverRegistry carverRegistry = new CarverRegistry(); private final PaletteRegistry paletteRegistry; @@ -106,6 +102,7 @@ public class ConfigPack implements LoaderRegistrar { paletteRegistry = new PaletteRegistry(main); treeRegistry = new TreeRegistry(main); register(abstractConfigLoader); + register(selfLoader); main.register(selfLoader); main.register(abstractConfigLoader); @@ -128,6 +125,7 @@ public class ConfigPack implements LoaderRegistrar { paletteRegistry = new PaletteRegistry(main); treeRegistry = new TreeRegistry(main); register(abstractConfigLoader); + register(selfLoader); main.register(selfLoader); main.register(abstractConfigLoader); @@ -184,8 +182,7 @@ public class ConfigPack implements LoaderRegistrar { .open("structures/structures", ".yml").then(streams -> buildAll(new StructureFactory(), structureRegistry, abstractConfigLoader.load(streams, StructureTemplate::new), main)).close() .open("flora", ".yml").then(streams -> buildAll(new FloraFactory(), floraRegistry, abstractConfigLoader.load(streams, FloraTemplate::new), main)).close() .open("carving", ".yml").then(streams -> buildAll(new CarverFactory(this), carverRegistry, abstractConfigLoader.load(streams, CarverTemplate::new), main)).close() - .open("biomes", ".yml").then(streams -> buildAll(new BiomeFactory(this), biomeRegistry, abstractConfigLoader.load(streams, () -> new BiomeTemplate(this, main)), main)).close() - .open("grids", ".yml").then(streams -> buildAll(new BiomeGridFactory(), biomeGridRegistry, abstractConfigLoader.load(streams, BiomeGridTemplate::new), main)).close(); + .open("biomes", ".yml").then(streams -> buildAll(new BiomeFactory(this), biomeRegistry, abstractConfigLoader.load(streams, () -> new BiomeTemplate(this, main)), main)).close(); for(UserDefinedBiome b : biomeRegistry.entries()) { @@ -196,14 +193,6 @@ public class ConfigPack implements LoaderRegistrar { } } - for(String gridName : template.getGrids()) { - if(!biomeGridRegistry.contains(gridName)) throw new LoadException("No such BiomeGrid \"" + gridName + "\""); - } - - if(template.getGridType().equals(TerraBiomeGrid.Type.RADIAL) && !biomeGridRegistry.contains(template.getRadialInternalGrid())) { - throw new LoadException("No such BiomeGrid \"" + template.getRadialInternalGrid() + "\""); - } - LangUtil.log("config-pack.loaded", Level.INFO, template.getID(), String.valueOf((System.nanoTime() - start) / 1000000D), template.getAuthor(), template.getVersion()); } @@ -215,10 +204,6 @@ public class ConfigPack implements LoaderRegistrar { return biomeRegistry.get(id); } - public BiomeGridBuilder getBiomeGrid(String id) { - return biomeGridRegistry.get(id); - } - public List getBiomeIDs() { List biomeIDs = new ArrayList<>(); biomeRegistry.forEach(biome -> biomeIDs.add(biome.getID())); @@ -271,7 +256,8 @@ public class ConfigPack implements LoaderRegistrar { .registerLoader(Tree.class, treeRegistry) .registerLoader(StructureScript.class, scriptRegistry) .registerLoader(TerraStructure.class, structureRegistry) - .registerLoader(LootTable.class, lootRegistry); + .registerLoader(LootTable.class, lootRegistry) + .registerLoader(BiomeProvider.BiomeProviderBuilder.class, new BiomeProviderBuilderLoader(this)); } public ScriptRegistry getScriptRegistry() { diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java index 2d677c1e3..169a79956 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java @@ -5,9 +5,8 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; import com.dfsek.terra.api.math.MathUtil; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; +import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.generation.config.NoiseBuilder; -import com.dfsek.terra.image.ImageLoader; import net.jafama.FastMath; import java.util.HashMap; @@ -101,36 +100,12 @@ public class ConfigPackTemplate implements ValidatedConfigTemplate { @Default private String version = "0.1.0"; - @Value("grid-options.type") - @Default - private TerraBiomeGrid.Type gridType = TerraBiomeGrid.Type.STANDARD; - - @Value("grid-options.radial.radius") - @Default - private double radius = 1000D; - - @Value("grid-options.radial.internal-grid") - @Default - private String internalGrid = null; - - @Value("image.enable") - @Default - private boolean fromImage = false; - - @Value("image.channels.biome-x") - @Default - private ImageLoader.Channel biomeXChannel = ImageLoader.Channel.RED; - @Value("image.channels.biome-z") - @Default - private ImageLoader.Channel biomeZChannel = ImageLoader.Channel.GREEN; - @Value("image.channels.zone") - @Default - private ImageLoader.Channel zoneChannel = ImageLoader.Channel.BLUE; - - @Value("image") - @Default - private ImageLoader imageLoader = null; + @Value("biome-pipeline") + private BiomeProvider.BiomeProviderBuilder providerBuilder; + public BiomeProvider.BiomeProviderBuilder getProviderBuilder() { + return providerBuilder; + } public String getVersion() { return version; @@ -172,7 +147,6 @@ public class ConfigPackTemplate implements ValidatedConfigTemplate { return variables; } - public List getGrids() { return grids; } @@ -209,38 +183,6 @@ public class ConfigPackTemplate implements ValidatedConfigTemplate { return erodeOctaves; } - public double getRadialGridRadius() { - return radius; - } - - public String getRadialInternalGrid() { - return internalGrid; - } - - public TerraBiomeGrid.Type getGridType() { - return gridType; - } - - public ImageLoader.Channel getBiomeXChannel() { - return biomeXChannel; - } - - public ImageLoader.Channel getBiomeZChannel() { - return biomeZChannel; - } - - public boolean isFromImage() { - return fromImage; - } - - public ImageLoader.Channel getZoneChannel() { - return zoneChannel; - } - - public ImageLoader getImageLoader() { - return imageLoader; - } - public int getBaseBlend() { return baseBlend; } @@ -255,11 +197,6 @@ public class ConfigPackTemplate implements ValidatedConfigTemplate { @Override public boolean validate() throws ValidationException { - if(gridType.equals(TerraBiomeGrid.Type.RADIAL) && internalGrid == null) - throw new ValidationException("No internal BiomeGrid specified"); - if(biomeZChannel.equals(biomeXChannel) || zoneChannel.equals(biomeXChannel) || zoneChannel.equals(biomeZChannel)) - throw new ValidationException("2 objects share the same image channels: biome-x and biome-z"); - if(!MathUtil.equals(FastMath.log(baseBlend) / FastMath.log(2d), FastMath.round(FastMath.log(baseBlend) / FastMath.log(2d)))) { throw new ValidationException("TerraBiome base blend value \"" + baseBlend + "\" is not a power of 2."); } diff --git a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java deleted file mode 100644 index 7bd7fda29..000000000 --- a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.dfsek.terra.config.builder.biomegrid; - -import com.dfsek.terra.api.world.biome.BiomeGrid; -import com.dfsek.terra.config.base.ConfigPack; - -public interface BiomeGridBuilder { - BiomeGrid build(long seed, ConfigPack config); -} diff --git a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java deleted file mode 100644 index a74965b88..000000000 --- a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dfsek.terra.config.builder.biomegrid; - -import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.biome.grid.SingleBiomeGrid; -import com.dfsek.terra.config.base.ConfigPack; - -public class SingleGridBuilder implements BiomeGridBuilder { - private final TerraBiome biome; - - public SingleGridBuilder(TerraBiome biome) { - this.biome = biome; - } - - @Override - public SingleBiomeGrid build(long seed, ConfigPack config) { - return new SingleBiomeGrid(seed, biome); - } -} diff --git a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java deleted file mode 100644 index de8676106..000000000 --- a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.dfsek.terra.config.builder.biomegrid; - -import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.biome.grid.UserDefinedGrid; -import com.dfsek.terra.config.base.ConfigPack; - -public class UserDefinedGridBuilder implements BiomeGridBuilder { - private double xFreq; - private double zFreq; - - private TerraBiome[][] biomes; - - @Override - public UserDefinedGrid build(long seed, ConfigPack config) { - return new UserDefinedGrid(seed, 1D / xFreq, 1D / zFreq, biomes, config); - } - - public double getXFreq() { - return xFreq; - } - - public void setXFreq(double xFreq) { - this.xFreq = xFreq; - } - - public double getZFreq() { - return zFreq; - } - - public void setZFreq(double zFreq) { - this.zFreq = zFreq; - } - - public TerraBiome[][] getBiomes() { - return biomes; - } - - public void setBiomes(TerraBiome[][] biomes) { - this.biomes = biomes; - } -} diff --git a/common/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java deleted file mode 100644 index 9bc7ea963..000000000 --- a/common/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.dfsek.terra.config.factories; - -import com.dfsek.tectonic.exception.LoadException; -import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.config.builder.biomegrid.BiomeGridBuilder; -import com.dfsek.terra.config.builder.biomegrid.UserDefinedGridBuilder; -import com.dfsek.terra.config.templates.BiomeGridTemplate; - -import java.util.List; - -public class BiomeGridFactory implements TerraFactory { - - @Override - public UserDefinedGridBuilder build(BiomeGridTemplate config, TerraPlugin main) throws LoadException { - - UserDefinedGridBuilder holder = new UserDefinedGridBuilder(); - - int xSize = config.getGrid().size(); - int zSize = config.getGrid().get(0).size(); - - holder.setXFreq(config.getXFreq() * xSize); - holder.setZFreq(config.getZFreq() * zSize); - - TerraBiome[][] biomes = new UserDefinedBiome[xSize][zSize]; - - for(int x = 0; x < xSize; x++) { - List layer = config.getGrid().get(x); - if(!(layer.size() == zSize)) throw new LoadException("Expected " + zSize + " biomes in row " + x + ", found " + layer.size()); - for(int z = 0; z < zSize; z++) { - biomes[x][z] = layer.get(z); - } - } - holder.setBiomes(biomes); - - return holder; - } -} diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/ImageLoaderLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/ImageLoaderLoader.java deleted file mode 100644 index 46673c8e6..000000000 --- a/common/src/main/java/com/dfsek/terra/config/loaders/ImageLoaderLoader.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.dfsek.terra.config.loaders; - -import com.dfsek.tectonic.exception.LoadException; -import com.dfsek.tectonic.loading.ConfigLoader; -import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.image.ImageLoader; - -import java.io.File; -import java.io.IOException; -import java.lang.reflect.Type; -import java.util.Map; - -@SuppressWarnings("unchecked") -public class ImageLoaderLoader implements TypeLoader { - @Override - public ImageLoader load(Type type, Object o, ConfigLoader configLoader) throws LoadException { - Map map = (Map) o; - File image = new File((String) map.get("file")); - try { - return new ImageLoader(image, (ImageLoader.Align) configLoader.loadType(ImageLoader.Align.class, map.get("align"))); - } catch(IOException e) { - throw new LoadException("Unable to load image", e); - } - } -} diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/BiomeProviderBuilderLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/BiomeProviderBuilderLoader.java new file mode 100644 index 000000000..52d421971 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/BiomeProviderBuilderLoader.java @@ -0,0 +1,56 @@ +package com.dfsek.terra.config.loaders.config; + +import com.dfsek.tectonic.loading.ConfigLoader; +import com.dfsek.tectonic.loading.TypeLoader; +import com.dfsek.terra.api.math.ProbabilityCollection; +import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite; +import com.dfsek.terra.api.math.noise.samplers.NoiseSampler; +import com.dfsek.terra.api.world.biome.TerraBiome; +import com.dfsek.terra.biome.BiomeProvider; +import com.dfsek.terra.biome.StandardBiomeProvider; +import com.dfsek.terra.biome.pipeline.BiomePipeline; +import com.dfsek.terra.biome.pipeline.expand.FractalExpander; +import com.dfsek.terra.biome.pipeline.mutator.SmoothMutator; +import com.dfsek.terra.biome.pipeline.source.RandomSource; +import com.dfsek.terra.biome.pipeline.stages.ExpanderStage; +import com.dfsek.terra.biome.pipeline.stages.MutatorStage; +import com.dfsek.terra.config.base.ConfigPack; +import net.jafama.FastMath; + +import java.lang.reflect.Type; + +public class BiomeProviderBuilderLoader implements TypeLoader { + private final ConfigPack pack; + + public BiomeProviderBuilderLoader(ConfigPack pack) { + this.pack = pack; + } + + private static NoiseSampler whiteNoise(int seed) { + FastNoiseLite noiseLite = new FastNoiseLite(seed); + noiseLite.setNoiseType(FastNoiseLite.NoiseType.WhiteNoise); + return noiseLite; + } + + @Override + public BiomeProvider.BiomeProviderBuilder load(Type t, Object c, ConfigLoader loader) { + + + return new StandardBiomeProvider.StandardBiomeProviderBuilder(seed -> { + ProbabilityCollection biomes = new ProbabilityCollection<>(); + + biomes.add(pack.getBiome("PLAINS"), 1) + .add(pack.getBiome("SAVANNA"), 2); + BiomePipeline pipeline = new BiomePipeline.BiomePipelineBuilder(2) + .addStage(new ExpanderStage(new FractalExpander(whiteNoise(FastMath.toInt(seed))))) + .addStage(new ExpanderStage(new FractalExpander(whiteNoise(FastMath.toInt(seed + 1))))) + .addStage(new ExpanderStage(new FractalExpander(whiteNoise(FastMath.toInt(seed + 2))))) + .addStage(new MutatorStage(new SmoothMutator(whiteNoise(FastMath.toInt(seed + 3))))) + .addStage(new ExpanderStage(new FractalExpander(whiteNoise(FastMath.toInt(seed + 4))))) + .addStage(new ExpanderStage(new FractalExpander(whiteNoise(FastMath.toInt(seed + 5))))) + .build(new RandomSource(biomes, whiteNoise(FastMath.toInt(seed) + 4))); + System.out.println(pipeline.getSize()); + return pipeline; + }); + } +} diff --git a/common/src/main/java/com/dfsek/terra/config/templates/BiomeGridTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/BiomeGridTemplate.java deleted file mode 100644 index ea467de8c..000000000 --- a/common/src/main/java/com/dfsek/terra/config/templates/BiomeGridTemplate.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.dfsek.terra.config.templates; - -import com.dfsek.tectonic.annotations.Abstractable; -import com.dfsek.tectonic.annotations.Value; -import com.dfsek.terra.api.world.biome.TerraBiome; - -import java.util.List; - -@SuppressWarnings("unused") -public class BiomeGridTemplate extends AbstractableTemplate { - @Value("id") - private String id; - - /** - * A 2D array of {@link TerraBiome} IDs that make up this grid. - */ - @Value("grid") - @Abstractable - private List> grid; - - /** - * X frequency of noise function - */ - @Value("frequency.x") - @Abstractable - private double xFreq; - - /** - * Z frequency of noise function - */ - @Value("frequency.z") - @Abstractable - private double zFreq; - - public String getID() { - return id; - } - - public List> getGrid() { - return grid; - } - - public double getXFreq() { - return xFreq; - } - - public double getZFreq() { - return zFreq; - } -} diff --git a/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java index 2f6ef1e89..e5578da21 100644 --- a/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java @@ -15,9 +15,9 @@ import com.dfsek.terra.api.platform.world.BiomeGrid; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.profiler.ProfileFuture; import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.api.world.palette.Palette; +import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.palette.SinglePalette; import com.dfsek.terra.config.base.ConfigPack; @@ -88,7 +88,7 @@ public class MasterChunkGenerator implements TerraChunkGenerator { @SuppressWarnings({"try"}) public ChunkGenerator.ChunkData generateChunkData(@NotNull World world, Random random, int chunkX, int chunkZ, ChunkGenerator.ChunkData chunk) { TerraWorld tw = main.getWorld(world); - com.dfsek.terra.api.world.biome.BiomeGrid grid = tw.getGrid(); + BiomeProvider grid = tw.getBiomeProvider(); try(ProfileFuture ignore = tw.getProfiler().measure("TotalChunkGenTime")) { if(!tw.isSafe()) return chunk; int xOrig = (chunkX << 4); @@ -103,7 +103,7 @@ public class MasterChunkGenerator implements TerraChunkGenerator { int cx = xOrig + x; int cz = zOrig + z; - TerraBiome b = grid.getBiome(xOrig + x, zOrig + z, GenerationPhase.PALETTE_APPLY); + TerraBiome b = grid.getBiome(xOrig + x, zOrig + z); BiomeTemplate c = ((UserDefinedBiome) b).getConfig(); int sea = c.getSeaLevel(); @@ -211,12 +211,12 @@ public class MasterChunkGenerator implements TerraChunkGenerator { public void generateBiomes(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biome) { int xOrig = (chunkX << 4); int zOrig = (chunkZ << 4); - com.dfsek.terra.api.world.biome.BiomeGrid grid = main.getWorld(world).getGrid(); + BiomeProvider grid = main.getWorld(world).getBiomeProvider(); for(int x = 0; x < 4; x++) { for(byte z = 0; z < 4; z++) { int cx = xOrig + (x << 2); int cz = zOrig + (z << 2); - TerraBiome b = grid.getBiome(cx, cz, GenerationPhase.PALETTE_APPLY); + TerraBiome b = grid.getBiome(cx, cz); biome.setBiome(x << 2, z << 2, b.getVanillaBiome()); } diff --git a/common/src/main/java/com/dfsek/terra/generation/math/Sampler.java b/common/src/main/java/com/dfsek/terra/generation/math/Sampler.java index 7d1773008..581027616 100644 --- a/common/src/main/java/com/dfsek/terra/generation/math/Sampler.java +++ b/common/src/main/java/com/dfsek/terra/generation/math/Sampler.java @@ -1,7 +1,7 @@ package com.dfsek.terra.generation.math; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; +import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.generation.math.interpolation.ChunkInterpolator; import com.dfsek.terra.generation.math.interpolation.ElevationInterpolator; import net.jafama.FastMath; @@ -10,9 +10,9 @@ public class Sampler { private final ChunkInterpolator interpolator; private final ElevationInterpolator elevationInterpolator; - public Sampler(int x, int z, TerraBiomeGrid grid, World world, int elevationSmooth, int generationSmooth) { - this.interpolator = new ChunkInterpolator(world, x, z, grid, generationSmooth); - this.elevationInterpolator = new ElevationInterpolator(world, x, z, grid, elevationSmooth); + public Sampler(int x, int z, BiomeProvider provider, World world, int elevationSmooth, int generationSmooth) { + this.interpolator = new ChunkInterpolator(world, x, z, provider, generationSmooth); + this.elevationInterpolator = new ElevationInterpolator(world, x, z, provider, elevationSmooth); } public double sample(double x, double y, double z) { diff --git a/common/src/main/java/com/dfsek/terra/generation/math/SamplerCache.java b/common/src/main/java/com/dfsek/terra/generation/math/SamplerCache.java index 421a7d2e9..e71e18a9f 100644 --- a/common/src/main/java/com/dfsek/terra/generation/math/SamplerCache.java +++ b/common/src/main/java/com/dfsek/terra/generation/math/SamplerCache.java @@ -56,7 +56,7 @@ public class SamplerCache { public Sampler getChunk(int cx, int cz) { long key = MathUtil.squash(cx, cz); synchronized(cache) { - return cache.computeIfAbsent(key, k -> new Sampler(cx, cz, terraWorld.getGrid(), world, terraWorld.getConfig().getTemplate().getBaseBlend(), terraWorld.getConfig().getTemplate().getElevationBlend())); + return cache.computeIfAbsent(key, k -> new Sampler(cx, cz, terraWorld.getBiomeProvider(), world, terraWorld.getConfig().getTemplate().getBaseBlend(), terraWorld.getConfig().getTemplate().getElevationBlend())); } } } diff --git a/common/src/main/java/com/dfsek/terra/generation/math/interpolation/ChunkInterpolator.java b/common/src/main/java/com/dfsek/terra/generation/math/interpolation/ChunkInterpolator.java index e97e9d151..f66f9d955 100644 --- a/common/src/main/java/com/dfsek/terra/generation/math/interpolation/ChunkInterpolator.java +++ b/common/src/main/java/com/dfsek/terra/generation/math/interpolation/ChunkInterpolator.java @@ -2,8 +2,7 @@ package com.dfsek.terra.generation.math.interpolation; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.world.biome.Generator; -import com.dfsek.terra.api.world.generation.GenerationPhase; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; +import com.dfsek.terra.biome.BiomeProvider; import net.jafama.FastMath; /** @@ -20,18 +19,18 @@ public class ChunkInterpolator { /** * Instantiates a 3D ChunkInterpolator at a pair of chunk coordinates. * - * @param chunkX X coordinate of the chunk. - * @param chunkZ Z coordinate of the chunk. - * @param grid BiomeGrid to use for noise fetching. + * @param chunkX X coordinate of the chunk. + * @param chunkZ Z coordinate of the chunk. + * @param provider BiomeGrid to use for noise fetching. */ - public ChunkInterpolator(World w, int chunkX, int chunkZ, TerraBiomeGrid grid, int smooth) { + public ChunkInterpolator(World w, int chunkX, int chunkZ, BiomeProvider provider, int smooth) { int xOrigin = chunkX << 4; int zOrigin = chunkZ << 4; this.smooth = smooth; for(int x = -1; x < 6; x++) { for(int z = -1; z < 6; z++) { - gens[x + 1][z + 1] = grid.getBiome(xOrigin + (x * smooth), zOrigin + (z * smooth), GenerationPhase.BASE).getGenerator(w); + gens[x + 1][z + 1] = provider.getBiome(xOrigin + (x * smooth), zOrigin + (z * smooth)).getGenerator(w); } } diff --git a/common/src/main/java/com/dfsek/terra/generation/math/interpolation/ElevationInterpolator.java b/common/src/main/java/com/dfsek/terra/generation/math/interpolation/ElevationInterpolator.java index f037c7b94..a56f9a429 100644 --- a/common/src/main/java/com/dfsek/terra/generation/math/interpolation/ElevationInterpolator.java +++ b/common/src/main/java/com/dfsek/terra/generation/math/interpolation/ElevationInterpolator.java @@ -1,8 +1,7 @@ package com.dfsek.terra.generation.math.interpolation; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.world.biome.BiomeGrid; -import com.dfsek.terra.api.world.generation.GenerationPhase; +import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.generation.config.WorldGenerator; import net.jafama.FastMath; @@ -11,15 +10,15 @@ public class ElevationInterpolator { private final double[][] values = new double[18][18]; private final int xOrigin; private final int zOrigin; - private final BiomeGrid grid; + private final BiomeProvider provider; private final int smooth; private final int pow; private final World world; - public ElevationInterpolator(World world, int chunkX, int chunkZ, BiomeGrid grid, int smooth) { + public ElevationInterpolator(World world, int chunkX, int chunkZ, BiomeProvider provider, int smooth) { this.xOrigin = chunkX << 4; this.zOrigin = chunkZ << 4; - this.grid = grid; + this.provider = provider; this.smooth = smooth; this.pow = FastMath.log2(smooth); this.gens = new WorldGenerator[6 + 2 * pow][6 + 2 * pow]; @@ -28,7 +27,7 @@ public class ElevationInterpolator { for(int x = -pow; x < 6 + pow; x++) { for(int z = -pow; z < 6 + pow; z++) { - gens[x + pow][z + pow] = (WorldGenerator) grid.getBiome(xOrigin + (x * smooth), zOrigin + (z * smooth), GenerationPhase.BASE).getGenerator(world); + gens[x + pow][z + pow] = (WorldGenerator) provider.getBiome(xOrigin + (x * smooth), zOrigin + (z * smooth)).getGenerator(world); } } @@ -47,7 +46,7 @@ public class ElevationInterpolator { } private WorldGenerator getGenerator(int x, int z) { - return (WorldGenerator) grid.getBiome(xOrigin + x, zOrigin + z, GenerationPhase.BASE).getGenerator(world); + return (WorldGenerator) provider.getBiome(xOrigin + x, zOrigin + z).getGenerator(world); } private WorldGenerator getStoredGen(int x, int z) { diff --git a/common/src/main/java/com/dfsek/terra/image/ImageLoader.java b/common/src/main/java/com/dfsek/terra/image/ImageLoader.java deleted file mode 100644 index 1b2aec944..000000000 --- a/common/src/main/java/com/dfsek/terra/image/ImageLoader.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.dfsek.terra.image; - -import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.world.biome.NormalizationUtil; -import com.dfsek.terra.biome.BiomeZone; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; -import com.dfsek.terra.debug.gui.DebugGUI; -import net.jafama.FastMath; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; - -public class ImageLoader { - private final BufferedImage image; - private final Align align; - - public ImageLoader(File file, Align align) throws IOException { - image = ImageIO.read(file); - this.align = align; - } - - public static void debugWorld(boolean genStep, World w, TerraPlugin main) { - if(!main.isDebug()) return; - BufferedImage newImg = new WorldImageGenerator(w, 1024, 1024, main).drawWorld(0, 0).getDraw(); - if(genStep) newImg = redrawStepped(newImg, w, Align.CENTER, main); - DebugGUI debugGUI = new DebugGUI(newImg, main); - debugGUI.start(); - } - - private static BufferedImage redrawStepped(BufferedImage original, World w, Align align, TerraPlugin main) { - BufferedImage newImg = copyImage(original); - TerraBiomeGrid tb = main.getWorld(w).getGrid(); - BiomeZone zone = main.getWorld(w).getZone(); - for(int x = 0; x < newImg.getWidth(); x++) { - for(int y = 0; y < newImg.getHeight(); y++) { - double[] noise; - if(align.equals(Align.CENTER)) - noise = tb.getGrid(x - original.getWidth() / 2, y - original.getHeight() / 2).getRawNoise(x - original.getWidth() / 2, y - original.getHeight() / 2); - else noise = tb.getGrid(x, y).getRawNoise(x, y); - newImg.setRGB(x, y, new Color((int) (NormalizationUtil.normalize(noise[0], tb.getGrid(x, y).getSizeX(), 4) * ((double) 255 / tb.getGrid(x, y).getSizeX())), - (int) (NormalizationUtil.normalize(noise[1], tb.getGrid(x, y).getSizeZ(), 4) * ((double) 255 / tb.getGrid(x, y).getSizeZ())), - (int) (NormalizationUtil.normalize(zone.getNoise(x, y), zone.getSize(), 4) * ((double) 255 / zone.getSize()))) - .getRGB()); - } - } - return newImg; - } - - private static int normal(double val) { - return FastMath.floorToInt(FastMath.min(FastMath.max(val, 255), 0)); - } - - private static BufferedImage copyImage(BufferedImage source) { - BufferedImage b = new BufferedImage(source.getWidth(), source.getHeight(), source.getType()); - Graphics g = b.getGraphics(); - g.drawImage(source, 0, 0, null); - g.dispose(); - return b; - } - - public void debug(boolean genStep, World w, TerraPlugin main) { - if(!main.isDebug()) return; - BufferedImage newImg = copyImage(image); - if(genStep) { - newImg = redrawStepped(image, w, align, main); - } - DebugGUI debugGUI = new DebugGUI(newImg, main); - debugGUI.start(); - } - - public int getNoiseVal(int x, int y, int size, Channel channel) { - return (size * getChannel(x, y, channel)) / 255; - } - - public int getChannel(int x, int y, Channel channel) { - int rgb; - rgb = align.getRGB(image, x, y); - switch(channel) { - case RED: - return rgb >> 16 & 0xff; - case GREEN: - return rgb >> 8 & 0xff; - case BLUE: - return rgb & 0xff; - case ALPHA: - return rgb >> 24 & 0xff; - default: - throw new IllegalArgumentException(); - } - } - - public Align getAlign() { - return align; - } - - public enum Channel { - RED, GREEN, BLUE, ALPHA - } - - public enum Align { - CENTER { - @Override - public int getRGB(BufferedImage image, int x, int y) { - return Align.getRGBNoAlign(image, x - (image.getWidth() / 2), y - (image.getHeight() / 2)); - } - }, - NONE { - @Override - public int getRGB(BufferedImage image, int x, int y) { - return image.getRGB(FastMath.floorMod(x, image.getWidth()), FastMath.floorMod(y, image.getHeight())); - } - }; - - private static int getRGBNoAlign(BufferedImage image, int x, int y) { - return image.getRGB(FastMath.floorMod(x, image.getWidth()), FastMath.floorMod(y, image.getHeight())); - } - - public abstract int getRGB(BufferedImage image, int x, int y); - } -} diff --git a/common/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java b/common/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java deleted file mode 100644 index 3e3d0d8c5..000000000 --- a/common/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.dfsek.terra.image; - -import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.world.biome.NormalizationUtil; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; - -public class WorldImageGenerator { - private final World w; - private final BufferedImage draw; - private final TerraPlugin main; - - public WorldImageGenerator(World w, int width, int height, TerraPlugin main) { - draw = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); - this.w = w; - this.main = main; - } - - public WorldImageGenerator drawWorld(int centerX, int centerZ) { - TerraWorld tw = main.getWorld(w); - TerraBiomeGrid tb = tw.getGrid(); - int imY = 0; - for(int y = centerZ - (draw.getHeight() / 2); y < centerZ + (draw.getHeight() / 2); y++) { - int imX = 0; - for(int x = centerX - (draw.getWidth() / 2); x < centerX + (draw.getWidth() / 2); x++) { - int zone = NormalizationUtil.normalize(tw.getZone().getRawNoise(x, y), 256, 4); - double[] noise = tb.getGrid(x, y).getRawNoise(x, y); - Color c = new Color(NormalizationUtil.normalize(noise[0], 256, 4), NormalizationUtil.normalize(noise[1], 256, 4), zone); - draw.setRGB(imX, imY, c.getRGB()); - imX++; - } - imY++; - } - return this; - } - - public BufferedImage getDraw() { - return draw; - } - - public void save(File file) { - try { - ImageIO.write(draw, "png", file); - } catch(IOException e) { - e.printStackTrace(); - } - } -} diff --git a/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java b/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java index bd41d9851..5df49184a 100644 --- a/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java @@ -6,10 +6,9 @@ import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.profiler.ProfileFuture; -import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; +import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.population.items.flora.FloraLayer; import com.dfsek.terra.util.PopulationUtil; import org.jetbrains.annotations.NotNull; @@ -35,11 +34,11 @@ public class FloraPopulator implements TerraBlockPopulator { TerraWorld tw = main.getWorld(world); try(ProfileFuture ignored = tw.getProfiler().measure("FloraTime")) { if(!tw.isSafe()) return; - TerraBiomeGrid grid = tw.getGrid(); + BiomeProvider provider = tw.getBiomeProvider(); Map> layers = new HashMap<>(); for(int x = 0; x < 16; x++) { for(int z = 0; z < 16; z++) { - UserDefinedBiome biome = (UserDefinedBiome) grid.getBiome((chunk.getX() << 4) + x, (chunk.getZ() << 4) + z, GenerationPhase.POPULATE); + UserDefinedBiome biome = (UserDefinedBiome) provider.getBiome((chunk.getX() << 4) + x, (chunk.getZ() << 4) + z); Vector2 l = new Vector2(x, z); layers.put(l, biome.getConfig().getFlora()); } diff --git a/common/src/main/java/com/dfsek/terra/population/OrePopulator.java b/common/src/main/java/com/dfsek/terra/population/OrePopulator.java index f21b4c6ed..eab933d5e 100644 --- a/common/src/main/java/com/dfsek/terra/population/OrePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/OrePopulator.java @@ -9,7 +9,6 @@ import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.profiler.ProfileFuture; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.world.biome.TerraBiome; -import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.templates.BiomeTemplate; @@ -35,7 +34,7 @@ public class OrePopulator implements TerraBlockPopulator { Random random = new FastRandom(MathUtil.getCarverChunkSeed(chunk.getX() + cx, chunk.getZ() + cz, world.getSeed())); int originX = ((chunk.getX() + cx) << 4); int originZ = ((chunk.getZ() + cz) << 4); - TerraBiome b = tw.getGrid().getBiome(originX + 8, originZ + 8, GenerationPhase.POPULATE); + TerraBiome b = tw.getBiomeProvider().getBiome(originX + 8, originZ + 8); BiomeTemplate config = ((UserDefinedBiome) b).getConfig(); int finalCx = cx; int finalCz = cz; diff --git a/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java b/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java index 9bf55e86d..5b91041ce 100644 --- a/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java @@ -10,8 +10,8 @@ import com.dfsek.terra.api.profiler.ProfileFuture; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; +import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.population.items.TerraStructure; import net.jafama.FastMath; @@ -34,12 +34,12 @@ public class StructurePopulator implements TerraBlockPopulator { int cx = (chunk.getX() << 4); int cz = (chunk.getZ() << 4); if(!tw.isSafe()) return; - TerraBiomeGrid grid = tw.getGrid(); + BiomeProvider provider = tw.getBiomeProvider(); ConfigPack config = tw.getConfig(); for(TerraStructure conf : config.getStructures()) { Location spawn = conf.getSpawn().getNearestSpawn(cx + 8, cz + 8, world.getSeed()).toLocation(world); - if(!((UserDefinedBiome) grid.getBiome(spawn)).getConfig().getStructures().contains(conf)) + if(!((UserDefinedBiome) provider.getBiome(spawn)).getConfig().getStructures().contains(conf)) continue; Random random = new FastRandom(MathUtil.getCarverChunkSeed(FastMath.floorDiv(spawn.getBlockX(), 16), FastMath.floorDiv(spawn.getBlockZ(), 16), world.getSeed())); conf.getStructure().get(random).execute(spawn.setY(conf.getSpawnStart().get(random)), chunk, random, Rotation.fromDegrees(90 * random.nextInt(4))); diff --git a/common/src/main/java/com/dfsek/terra/population/TreePopulator.java b/common/src/main/java/com/dfsek/terra/population/TreePopulator.java index 70bf9164b..964cc92bb 100644 --- a/common/src/main/java/com/dfsek/terra/population/TreePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/TreePopulator.java @@ -6,10 +6,9 @@ import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.profiler.ProfileFuture; -import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; +import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.population.items.tree.TreeLayer; import com.dfsek.terra.util.PopulationUtil; import net.jafama.FastMath; @@ -35,11 +34,11 @@ public class TreePopulator implements TerraBlockPopulator { TerraWorld tw = main.getWorld(world); try(ProfileFuture ignored = tw.getProfiler().measure("TreeTime")) { if(!tw.isSafe()) return; - TerraBiomeGrid grid = tw.getGrid(); + BiomeProvider provider = tw.getBiomeProvider(); Random random = PopulationUtil.getRandom(chunk); for(int x = 0; x < 16; x += 2) { for(int z = 0; z < 16; z += 2) { - UserDefinedBiome biome = (UserDefinedBiome) grid.getBiome((chunk.getX() << 4) + x, (chunk.getZ() << 4) + z, GenerationPhase.POPULATE); + UserDefinedBiome biome = (UserDefinedBiome) provider.getBiome((chunk.getX() << 4) + x, (chunk.getZ() << 4) + z); for(TreeLayer layer : biome.getConfig().getTrees()) { if(layer.getDensity() >= random.nextDouble() * 100) layer.place(chunk, new Vector2(offset(random, x), offset(random, z))); diff --git a/common/src/main/java/com/dfsek/terra/registry/BiomeGridRegistry.java b/common/src/main/java/com/dfsek/terra/registry/BiomeGridRegistry.java deleted file mode 100644 index b3f3a88c5..000000000 --- a/common/src/main/java/com/dfsek/terra/registry/BiomeGridRegistry.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.dfsek.terra.registry; - -import com.dfsek.terra.config.builder.biomegrid.BiomeGridBuilder; -import com.dfsek.terra.config.builder.biomegrid.SingleGridBuilder; - -public class BiomeGridRegistry extends TerraRegistry { - private final BiomeRegistry biomeRegistry; - - public BiomeGridRegistry(BiomeRegistry biomeRegistry) { - this.biomeRegistry = biomeRegistry; - } - - @Override - public BiomeGridBuilder get(String id) { - if(id.startsWith("BIOME:")) return new SingleGridBuilder(biomeRegistry.get(id.substring(6))); - return super.get(id); - } - - @Override - public boolean contains(String name) { - if(name.startsWith("BIOME:")) return biomeRegistry.contains(name.substring(6)); - return super.contains(name); - } -} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/TerraCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/TerraCommand.java index ba3f16e96..15c84485a 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/TerraCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/TerraCommand.java @@ -5,7 +5,6 @@ import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.command.Command; import com.dfsek.terra.bukkit.command.command.biome.BiomeCommand; import com.dfsek.terra.bukkit.command.command.geometry.GeometryCommand; -import com.dfsek.terra.bukkit.command.command.image.ImageCommand; import com.dfsek.terra.bukkit.command.command.profile.ProfileCommand; import com.dfsek.terra.bukkit.command.command.structure.StructureCommand; import com.dfsek.terra.config.lang.LangUtil; @@ -22,7 +21,6 @@ public class TerraCommand extends Command { new ProfileCommand(this), new SaveDataCommand(this), new StructureCommand(this), - new ImageCommand(this), new GeometryCommand(this), new FixChunkCommand(this), new VersionCommand(this), diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeCommand.java index f7d131903..d43e16bb8 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeCommand.java @@ -1,8 +1,7 @@ package com.dfsek.terra.bukkit.command.command.biome; -import com.dfsek.terra.api.world.generation.GenerationPhase; +import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.bukkit.command.WorldCommand; import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.config.lang.LangUtil; @@ -23,8 +22,8 @@ public class BiomeCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World w) { - TerraBiomeGrid grid = getMain().getWorld(BukkitAdapter.adapt(sender.getWorld())).getGrid(); - UserDefinedBiome biome = (UserDefinedBiome) grid.getBiome(BukkitAdapter.adapt(sender.getLocation()), GenerationPhase.POPULATE); + BiomeProvider grid = getMain().getWorld(BukkitAdapter.adapt(sender.getWorld())).getBiomeProvider(); + UserDefinedBiome biome = (UserDefinedBiome) grid.getBiome(BukkitAdapter.adapt(sender.getLocation())); LangUtil.send("command.biome.in", BukkitAdapter.adapt(sender), biome.getID()); return true; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeLocateCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeLocateCommand.java index 28d4faa7c..2f1ebf43f 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeLocateCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeLocateCommand.java @@ -48,7 +48,7 @@ public class BiomeLocateCommand extends WorldCommand { LangUtil.send("command.biome.invalid", BukkitAdapter.adapt(sender), id); return true; } - Bukkit.getScheduler().runTaskAsynchronously((TerraBukkitPlugin) getMain(), new AsyncBiomeFinder(getMain().getWorld(BukkitAdapter.adapt(world)).getGrid(), b, BukkitAdapter.adapt(sender.getLocation().clone().multiply((1D / ((TerraBukkitPlugin) getMain()).getTerraConfig().getBiomeSearchResolution()))), 0, maxRadius, location -> { + Bukkit.getScheduler().runTaskAsynchronously((TerraBukkitPlugin) getMain(), new AsyncBiomeFinder(getMain().getWorld(BukkitAdapter.adapt(world)).getBiomeProvider(), b, BukkitAdapter.adapt(sender.getLocation().clone().multiply((1D / ((TerraBukkitPlugin) getMain()).getTerraConfig().getBiomeSearchResolution()))), 0, maxRadius, location -> { if(location != null) { ComponentBuilder cm = new ComponentBuilder(String.format("The nearest %s is at ", id.toLowerCase())) .append(String.format("[%d, ~, %d]", location.getBlockX(), location.getBlockZ()), ComponentBuilder.FormatRetention.NONE) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/ImageCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/ImageCommand.java deleted file mode 100644 index 8f9f2cb08..000000000 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/ImageCommand.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.dfsek.terra.bukkit.command.command.image; - -import com.dfsek.terra.bukkit.BukkitCommandSender; -import com.dfsek.terra.bukkit.command.WorldCommand; -import com.dfsek.terra.bukkit.command.command.image.gui.GUICommand; -import com.dfsek.terra.config.lang.LangUtil; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -public class ImageCommand extends WorldCommand { - public ImageCommand(com.dfsek.terra.bukkit.command.Command parent) { - super(parent); - } - - @Override - public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World w) { - LangUtil.send("command.image.main-menu", new BukkitCommandSender(sender)); - return true; - } - - @Override - public String getName() { - return "image"; - } - - @Override - public List getSubCommands() { - return Arrays.asList(new RenderCommand(this), new GUICommand(this)); - } - - @Override - public int arguments() { - return 1; - } - - @Override - public List getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) { - return Collections.emptyList(); - } -} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/RenderCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/RenderCommand.java deleted file mode 100644 index 7e4355d3d..000000000 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/RenderCommand.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.dfsek.terra.bukkit.command.command.image; - -import com.dfsek.terra.bukkit.command.WorldCommand; -import com.dfsek.terra.bukkit.world.BukkitAdapter; -import com.dfsek.terra.config.lang.LangUtil; -import com.dfsek.terra.image.WorldImageGenerator; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -import java.io.File; -import java.util.Collections; -import java.util.List; - -public class RenderCommand extends WorldCommand { - public RenderCommand(com.dfsek.terra.bukkit.command.Command parent) { - super(parent); - } - - @Override - public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - try { - WorldImageGenerator g = new WorldImageGenerator(BukkitAdapter.adapt(world), Integer.parseInt(args[0]), Integer.parseInt(args[1]), getMain()); - g.drawWorld(sender.getLocation().getBlockX(), sender.getLocation().getBlockZ()); - File file = new File(getMain().getDataFolder() + File.separator + "export" + File.separator + "map" + File.separator + "map_" + System.currentTimeMillis() + ".png"); - //noinspection ResultOfMethodCallIgnored - file.mkdirs(); - //noinspection ResultOfMethodCallIgnored - file.createNewFile(); - g.save(file); - LangUtil.send("command.image.render.save", BukkitAdapter.adapt(sender), file.getAbsolutePath()); - return true; - } catch(Exception e) { - e.printStackTrace(); - LangUtil.send("command.image.render.error", BukkitAdapter.adapt(sender)); - return true; - } - } - - @Override - public String getName() { - return "render"; - } - - @Override - public List getSubCommands() { - return Collections.emptyList(); - } - - @Override - public int arguments() { - return 2; - } - - @Override - public List getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) { - return Collections.emptyList(); - } -} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/GUICommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/GUICommand.java deleted file mode 100644 index 13d9fee7f..000000000 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/GUICommand.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.dfsek.terra.bukkit.command.command.image.gui; - -import com.dfsek.terra.bukkit.BukkitCommandSender; -import com.dfsek.terra.bukkit.command.DebugCommand; -import com.dfsek.terra.bukkit.command.WorldCommand; -import com.dfsek.terra.config.lang.LangUtil; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -public class GUICommand extends WorldCommand implements DebugCommand { - public GUICommand(com.dfsek.terra.bukkit.command.Command parent) { - super(parent); - } - - @Override - public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - LangUtil.send("command.image.gui.main-menu", new BukkitCommandSender(sender)); - return true; - } - - @Override - public String getName() { - return "gui"; - } - - @Override - public List getSubCommands() { - return Arrays.asList(new StepGUICommand(this), new RawGUICommand(this)); - } - - @Override - public int arguments() { - return 1; - } - - @Override - public List getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) { - return Collections.emptyList(); - } -} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/RawGUICommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/RawGUICommand.java deleted file mode 100644 index c52e56ca6..000000000 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/RawGUICommand.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.dfsek.terra.bukkit.command.command.image.gui; - -import com.dfsek.terra.bukkit.command.DebugCommand; -import com.dfsek.terra.bukkit.command.WorldCommand; -import com.dfsek.terra.bukkit.world.BukkitAdapter; -import com.dfsek.terra.image.ImageLoader; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -import java.util.Collections; -import java.util.List; - -public class RawGUICommand extends WorldCommand implements DebugCommand { - public RawGUICommand(com.dfsek.terra.bukkit.command.Command parent) { - super(parent); - } - - @Override - public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - ImageLoader loader = getMain().getWorld(BukkitAdapter.adapt(world)).getConfig().getTemplate().getImageLoader(); - if(loader != null) loader.debug(false, BukkitAdapter.adapt(sender.getWorld()), getMain()); - else ImageLoader.debugWorld(false, BukkitAdapter.adapt(world), getMain()); - return true; - } - - @Override - public String getName() { - return "raw"; - } - - @Override - public List getSubCommands() { - return Collections.emptyList(); - } - - @Override - public int arguments() { - return 0; - } - - @Override - public List getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) { - return Collections.emptyList(); - } -} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/StepGUICommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/StepGUICommand.java deleted file mode 100644 index ae082d7d2..000000000 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/StepGUICommand.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.dfsek.terra.bukkit.command.command.image.gui; - -import com.dfsek.terra.bukkit.command.DebugCommand; -import com.dfsek.terra.bukkit.command.WorldCommand; -import com.dfsek.terra.bukkit.world.BukkitAdapter; -import com.dfsek.terra.image.ImageLoader; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -import java.util.Collections; -import java.util.List; - -public class StepGUICommand extends WorldCommand implements DebugCommand { - public StepGUICommand(com.dfsek.terra.bukkit.command.Command parent) { - super(parent); - } - - @Override - public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - ImageLoader loader = (getMain()).getWorld(BukkitAdapter.adapt(world)).getConfig().getTemplate().getImageLoader(); - if(loader != null) loader.debug(true, BukkitAdapter.adapt(sender.getWorld()), getMain()); - else ImageLoader.debugWorld(true, BukkitAdapter.adapt(world), getMain()); - return true; - } - - @Override - public String getName() { - return "step"; - } - - @Override - public List getSubCommands() { - return Collections.emptyList(); - } - - @Override - public int arguments() { - return 0; - } - - @Override - public List getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) { - return Collections.emptyList(); - } -} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java index c884f97af..71dbb410c 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java @@ -51,7 +51,7 @@ public class LocateCommand extends WorldCommand { LangUtil.send("command.structure.invalid", BukkitAdapter.adapt(sender), id); return true; } - Bukkit.getScheduler().runTaskAsynchronously((TerraBukkitPlugin) getMain(), new AsyncStructureFinder(getMain().getWorld(BukkitAdapter.adapt(world)).getGrid(), s, BukkitAdapter.adapt(sender.getLocation()), 0, maxRadius, (location) -> { + Bukkit.getScheduler().runTaskAsynchronously((TerraBukkitPlugin) getMain(), new AsyncStructureFinder(getMain().getWorld(BukkitAdapter.adapt(world)).getBiomeProvider(), s, BukkitAdapter.adapt(sender.getLocation()), 0, maxRadius, (location) -> { if(sender.isOnline()) { if(location != null) { ComponentBuilder cm = new ComponentBuilder(String.format("The nearest %s is at ", id.toLowerCase())) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java index 9d4e52065..1ef967671 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java @@ -41,7 +41,7 @@ public class SpigotListener implements Listener { TerraStructure config = tw.getConfig().getStructure(tw.getConfig().getTemplate().getLocatable().get("STRONGHOLD")); if(config != null) { Debug.info("Overriding Ender Signal..."); - AsyncStructureFinder finder = new AsyncStructureFinder(tw.getGrid(), config, BukkitAdapter.adapt(e.getLocation()), 0, 500, location -> { + AsyncStructureFinder finder = new AsyncStructureFinder(tw.getBiomeProvider(), config, BukkitAdapter.adapt(e.getLocation()), 0, 500, location -> { if(location != null) signal.setTargetLocation(BukkitAdapter.adapt(location.toLocation(BukkitAdapter.adapt(signal.getWorld())))); Debug.info("Location: " + location); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java index 529cec805..c77798b8d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java @@ -1,8 +1,7 @@ package com.dfsek.terra.fabric.world; -import com.dfsek.terra.api.world.generation.GenerationPhase; +import com.dfsek.terra.biome.BiomeProvider; import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.mojang.serialization.Codec; @@ -28,14 +27,14 @@ public class TerraBiomeSource extends BiomeSource { private final Registry biomeRegistry; private final long seed; - private final TerraBiomeGrid grid; + private final BiomeProvider grid; private final ConfigPack pack; public TerraBiomeSource(Registry biomes, long seed, ConfigPack pack) { super(biomes.stream().collect(Collectors.toList())); this.biomeRegistry = biomes; this.seed = seed; - this.grid = new TerraBiomeGrid.TerraBiomeGridBuilder(seed, pack, TerraFabricPlugin.getInstance()).build(); + this.grid = pack.getTemplate().getProviderBuilder().build(seed); this.pack = pack; } @@ -51,7 +50,7 @@ public class TerraBiomeSource extends BiomeSource { @Override public Biome getBiomeForNoiseGen(int biomeX, int biomeY, int biomeZ) { - UserDefinedBiome biome = (UserDefinedBiome) grid.getBiome(biomeX * 4, biomeZ * 4, GenerationPhase.BASE); + UserDefinedBiome biome = (UserDefinedBiome) grid.getBiome(biomeX * 4, biomeZ * 4); return biomeRegistry.get(new Identifier("terra", TerraFabricPlugin.createBiomeID(pack, biome))); }